Linux下TCP延迟确认(Delayed Ack)机制导致的时延问题分析_产生原因(延迟确认机制和Nagle算法及
(2015-04-26 23:03:33)
标签:
股票 |
分类: TCP/IP |
Linux下TCP延迟确认(Delayed
Ack)机制导致的时延问题分析_产生原因(延迟确认机制和Nagle算法及拥塞控制),解决办法(收到数据包后setsockopt(fd,
IPPROTO_TCP, TCP_QUICKACK, (int*){1},
sizeof(int));)
案例:
产生问题的原因:
解决办法:
产生问题原因的详细分析:
1、延迟确认机制及作用
2、TCP的延迟确认机制怎么会导致recv延时呢?
3、延迟确认机制与Nagle算法:
Nagle算法的规则(可参考tcp_output.c文件里tcp_nagle_check函数注释):
1)如果包长度达到MSS(MSS是最大分段大小Maxitum Segment Size
,MTC是最大传输单元Maxitum Transmission Unit ),则允许发送;
2)如果该包含有FIN,则允许发送;
3)设置了TCP_NODELAY选项,则允许发送;
4)未设置TCP_CORK选项时,若所有发出去的包均被确认,或所有发出去的小数据包(包长度小于MSS)均被确认,则允许发送。
对于规则4),就是说一个TCP连接上最多只能有一个未被确认的小数据包,在该分组的确认到达之前,不能发送其他的小数据包。如果某个小分组的确认被延迟了(案例中的40ms),那么后续小分组的发送就会相应的延迟。
也就是说延迟确认影响的并不只是被延迟确认的那个数据包,而是后续所有的应答包。
4、关于TCP_NODELAY和TCP_CORK选项:
5、为什么TCP_QUICKACK需要在每次recv后重新设置?