本节我们看具体tcp场景下,拥塞算法如何计算cwnd和ssthresh。 一个拥塞算法的模型对于一个tcp连接,如果mss=256,那么cwnd和ssthresh的初始值分别为 Cwnd=256 Ssthresh=65535 每次收到一个ack,cwnd增加一个mss,即增加256,那么cwnd的变化值分别为: 256、768、1024、1280等等。 假如不会发生拥塞,那么cwnd会继续增加,最终cwnd会大于window size,那么发送的流量就按照window size大小为准。 Syn报文丢失情景的拥塞算法1、初始化 Cwnd=256 Ssthresh=65535 2、syn丢失,超时重传syn Ssthresh=2*mss(ssthresh的最小值就是两倍的mss,不能再小了) Cwnd维持不变,cwnd保持初始化的256 3、收到syn ack Cwnd和ssthresh维持不变,因为没有发送任何数据,这个ack不是数据的ack,不会更新算法参数 Cwnd=256 Ssthresh=512 数据传送阶段拥塞算法1、发送第一个数据报文,即发送报文1的时候, Cwnd=256 Ssthresh=512 Cwnd<ssthresh,这个状态处于“慢启动” 2、客户端收到第一个ack(报文2),慢启动cwnd++ Cwnd=512 Ssthresh=512 3、客户端收到第二个ack(报文5),当前仍然处于慢启动状态,cwnd++ Cwnd=768 Ssthresh=512 不再是慢启动状态了。 由于SYN报文丢失,sstrhesh发生了变化(设置为最小值2*mss = 512),所以,这一步就进入了拥塞避免。 而cwnd也不会出现下面所列的递增关系 256、768、1024、1280 4、客户端收到第三个ack(报文8),这个时候已经不在慢启动状态,cwnd按照拥塞避免算法变化 Cwnd = cwnd + (segsize * segsize)/cwnd + segsize/8 Cwnd = 768 + (256*256)/768 + 256/8 = 885 5、客户端收到第四个ack(报文10),拥塞避免 Cwnd = 885 + (256*256)/885 + 256/8 = 991 6、客户端收到第五个ack(报文12),拥塞避免 Cwnd = 991 + (256*256)/991 + 256/8 = 1089 |
|