TCP慢启动中cwnd的增长问题?

应该这样理解,
1. 最开始cwnd=1,发送方只发送一个mss大小的数据包,在一个rtt后,会收到一个ack,cwnd加一,cwnd=2
2.此时cwnd=2,则发送方要发送两个mss大小的数据包,发送方会收到两个ack,则cwnd会进行两次加一的操作,则也就是cwnd+2,则cwnd=4,也就是cwnd = cwnd * 2
【TCP慢启动中cwnd的增长问题?】 3.此时cwnd=4,则发送方要发送四个mss大小的数据包,发送方会收到四个ack,则cwnd会加4,则 cwnd = 8,也就是cwnd = cwnd * 2.
。。。。
以此类推,在每次rtt后,cwnd都会变成一次数据包发送前的cwnd的两倍,这是一个等比数列,则此等比数列的推导公式就是cwnd(n) = cwnd(1) * 2^(n-1) . n\u0026gt;=1
因此慢启动开始cwnd是以指数形式增长的,也解决了你的第一个问题。

■网友
// 以下为一个简单的例子,sender为发送端,receiver为接收端 // px为包号为x的包,ack x为对第x个包的确认 // snd_cwnd为拥塞窗口 // sender receiver // RTT-1 // p1 (snd_cwnd 1) ---------------------------\u0026gt; // // \u0026lt;--------------------------- ack 1 // snd_cwnd++ (2) // RTT-2 // p2 (snd_cwnd 2) ---------------------------\u0026gt; // p3 (snd_cwnd 2) ---------------------------\u0026gt; // // \u0026lt;--------------------------- ack 2 // snd_cwnd++ (3) // \u0026lt;--------------------------- ack 3 // snd_cwnd++ (4) // RTT-3 // p4 (snd_cwnd 4) ---------------------------\u0026gt; // p5 (snd_cwnd 4) ---------------------------\u0026gt; // p6 (snd_cwnd 4) ---------------------------\u0026gt; // p7 (snd_cwnd 4) ---------------------------\u0026gt; // // \u0026lt;--------------------------- ack 4 // snd_cwnd++ (5) // \u0026lt;--------------------------- ack 5 // snd_cwnd++ (6) // \u0026lt;--------------------------- ack 6 // snd_cwnd++ (7) // \u0026lt;--------------------------- ack 7 // snd_cwnd++ (8) // send with snd_cwnd = 8 (p8 - p15) // 每一个ack对应增加一个窗口大小,不丢包的场景下相当于窗口以指数上升 // 1 --\u0026gt; 2 --\u0026gt; 4 --\u0026gt; 82: 会返回5,这时候会认为5之前的包都收到了,可以算出这个RTT收到的是1、2、3、4、5,丢包的话返回的是最后一个连续的包。比如4丢了就返回3,4重传完或者延迟到达后会返回5(不考虑SACK).
■网友
第一个问题你仔细想就明白了,假设当前窗口是n,那么可以发送n个包,每一个包都回一个ack,经过一个rtt时间后,这n个包的ack都依次回来了,每个把窗口增加1,一共增加了n,变成2n,所以是每个rtt翻倍。 第2个问题,简单说如果不启用延迟ack,是每个包都回ack,因为从程序实现角度虽然看着是一批包一起到了,但是每一个包都会调用相同的函数处理,这个函数中发ack。如果启用了延迟ack,发送端会判断回应的字节数来增长窗口,还是不影响窗口增长


    推荐阅读