TCP/UDP 缓冲区问题

http://blog.csdn.net/u011402017/article/details/53089648
1.发送缓冲区问题:
TCP:每个TCP套接字都有一个发送缓冲区,可以用SO_SNDBUF套接口选项来改变这一缓冲区的大小。
当某个应用进程调用write往套接字写数据时,内核从应用进程缓冲区中拷贝所有数据到套接口的发送缓冲区,
如果套接口发送缓冲区容不下应用程序的所有数据,或者是应用进程的缓冲区大于套接口的发送缓冲区,或者是套接口的
发送缓冲区中有别的数据,应用进程将被挂起。内核将不从write返回。直到应用进程缓冲区中的所有数据都拷贝到套接口发送缓冲区。
所以,从写一个 TCP套接口的write调用成功返回仅仅表示我们可以重新使用应用进程缓冲区,它并不是告诉我们对方收到数据。
TCP发给对方的数据,对方在收到数据时 必须给矛确认,只有在收到对方的确认时,本方TCP才会把TCP发送缓冲区中的数据删除。


UDP:UDP因为是不可靠连接,不必保存应用进程的数据拷贝,应用进程中的数据在沿协议栈向下传递时,以某种形式拷贝到内核缓冲区,
当数据链路层把数据传出后就把内核缓冲区中数据拷贝删除。因此它不需要一个真正意义上的发送缓冲区,但是任何UDP套接字还是
有发送缓冲区的,并且我们可以使用SO_SNDBUF套接字选项更改它,不过它仅仅是可写到该套接字的UDP数据包的大小上限。如果一个应用进程写一个大于
套接字发送缓冲区大小的数据包,内核将返回该进程一个EMSGSIZE错误。


2.接受缓冲区
TCP:对于TCP来说,套接字接收缓冲区中可用空间的大小限定了TCP通告对端的窗口大小,TCP套接字的接收缓冲区不可能溢出,
因为不允许对端发出超过本端所通告窗口大小的数据,这就是TCP的流量控制。如果对端无视窗口大小而发出超过该窗口大小的数据,
本端TCP将丢弃它们。


UDP:当收到的数据包装不进套接字接收缓冲区时,该数据包就被丢弃。UDP是没有流量控制的,较快的发送端可以很容易地淹没较慢的接收端,导
致接收端的UDP丢弃数据包。


提示:
1.因为TCP的窗口规模选项是在建立连接时用SYN分节与对端互换得到对,所以函数的调用顺序很重要:对于客户,SO_RCVBUF选项必须在
调用connect之前设置,对于服务器,该选项必须在调用listen之前给监听套接字设置
2.关于缓冲区大小的设置范围是有规定的。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值