-
TCP 粘包及分段研究 - [Networking]
2007-07-11
版权声明:转载时请以超链接形式标明文章原始出处和作者信息及本声明
http://morningsun.blogbus.com/logs/6616233.html
这两天碰到一个TCP read buffer 满,而发送Zero window message 给Server, Server 在收到多次这样的message后断开该缓慢连接的问题。想到了几个问题,查证后特记录如下:
1. TCP Zero Window message 与 RST ACK:Zero Window message 通常在本地recieve buffer 满时发出,向server通知"已经不能再向我发数据了,已经处理不过来了",server收到这样的notify则会暂停向该client发数据。长此以往,有些防火墙的规则会发RST message将这些慢连接干掉。
2. TCP MSS 与 MTU 分段:MSS叫Maxitum Segment Size ,通常的实现就是按照MTU来的,因此MSS一般来说大小为1500-20-20=1460。如果应用层数据太大,大于一个MSS,则TCP将作分段处理。MTU基于物理层而言,ethnet的MTU为1500,PPPoe为1492,上层的message大小如果大于MTU,则将在IP层被分片。有的TCP报文为保证顺序要求,设置了Dont fragment 位,指示IP层不要分片,如果这段网络上的MTU < MSS + headers 的大小,则将丢弃该报文。
3. 阻塞和非阻塞套接字,阻塞套接字会将所有的data拷贝到发送缓冲区后才返回,也就是如果窗口为16K,要发送32k的数据返回时,至少有16K的数据已经到达对端,还有部分数据在本地缓冲区内。如果为非阻塞模式,发送32K数据将马上返回,返回的nbyte小于32K,需要通过循环将所有数据发完。
随机文章:
根据域名获取IP地址的可重入版本gethostbyname_r 2007-07-17TCP window size (zz) 2007-07-10VoWLAN && IPv6 Security 2004-09-182.5G和WLAN的融合 2004-09-06SMIPv6 Overview 2004-06-10
收藏到:Del.icio.us







