问题描述
- nagle算法疑问 tcp/ip nagle 网络
-
最近在学习tcp/ip,在拥塞控制部分出现了nagle算法,网上看了一些资料
http://b.baidu.com/view/2468335.htmNagle算法的基本定义是任意时刻,最多只能有一个未被确认的小段。 所谓“小段”,指的是小于MSS尺寸的数据块,所谓“未被确认”,是指一个数据块发送出去后,没有收到对方发送的ACK确认该数据已收到。
Nagle算法的规则(可参考tcp_output.c文件里tcp_nagle_check函数注释):
(1)如果包长度达到MSS,则允许发送;
(2)如果该包含有FIN,则允许发送;
(3)设置了TCP_NODELAY选项,则允许发送;
(4)未设置TCP_CORK选项时,若所有发出去的小数据包(包长度小于MSS)均被确认,则允许发送;
(5)上述条件都未满足,但发生了超时(一般为200ms),则立即发送。问题:
关于nagle算法的第五点,假设有如下场景
client发送第一个字节package1(200ms超时)后,产生了第一个未确认ack,现假设网络异常,client迟迟未收到对package1的ack,但同时client这边产生了第二个字节需要发送,现在client端总共有2字节的待发送数据<mss(1500),经过一段时间后,package1的ack还未到达,但此时tcp缓冲区的2字节已经再次触发条件5,现在client端会发送新的package吗?如果发送后,未确认的ack数会变成2吗(违反nagle算法)?或者是进行了 tcp重新分组后,即使发送了这个两个字节的package未被确认ack仍然为1(怎么感觉这就是答案呢)?求大神解答,3Q
解决方案
这个应该会触发TCP重传计时器超时而把第一个和第二个放在同一个包里重新传输吧?
时间: 2024-09-30 17:37:24