理清udp,tcp 缓存区的

来源:互联网 发布:java 秒杀 并发 代码 编辑:程序博客网 时间:2024/06/15 11:56

1.UDP

 首先这里说的缓存区不是指的我们在调用recv 或send函数时的我们自己分配的 内存(buf)

  _1 UDP没有UDP发送缓存区,  其原因是因为UDP是不可靠的连接方式, 应用程序的数据(也就是我们send()函数发出去的数据)是沿着协议栈向下传递,以系统约定的方式拷贝到内核缓存区, 当数据从链路层发送出去后,就删除内核缓存区中数据。当我们调用send 返回的字节数表示的是数据进入链路层的数据大小。

_2 上面提到了 UDP 内存缓存区,这个是系统规定的,我们可以通过

 rmem_default — 默认的接收窗口大小。

 rmem_max — 接收窗口的最大大小。

 wmem_default — 默认的发送窗口大小。

 wmem_max — 发送窗口的最大大小

可以通过 sysctl 命令设置下面值

net.core.rmem_default = 256960

net.core.rmem_max = 256960

net.core.wmem_default = 256960

net.core.wmem_max = 256960

//下面提到的缓存区多少指的是 内存缓存区

UDP缺乏流量控制

1 UDP缺乏流量控制的概念

       UDP协议没有TCP协议所具有的滑动窗口概念,接收数据的时候直接将数据放到缓冲区中。如果用户不有及时地从缓冲区中将数据复制出来,后面到来的数据会接着向缓冲区中放入。当缓冲区满的时候,后面到来的数据会覆盖之前的数据造成数据的丢失。

2 缓冲区溢出对策

       解决UDP接收缓冲区溢出的现象需要根据实际情况确定,一般可以用增大接收数据缓冲区和接收方接收单独处理的方法来解决局部的UDP数据接收缓冲区溢出问题。

UDP协议中的数据报文截断

       当使用UDP协议接收数据的时候,如果应用程序传入的接收缓冲区的大小小于到来的数据大小时,接收缓冲区会保存最大可能接收到的数据,其他的数据将会丢失,并且有MSG_TRUNC的标志。

http://www.cnblogs.com/li-hao/archive/2011/11/21/2257596.html

http://www.isnowfy.com/udp-buffer/ 

http://blog.chinaunix.net/uid-20382483-id-3793066.html

参考

0 0
原创粉丝点击