- 论坛徽章:
- 0
|
请教牛人,TCP中的一段代码
tp->;snd_cwnd是当前拥塞窗口的大小,是个不断变化的值。
tp->;snd_ssthresh是从慢启动到拥塞避免的阀值。
tp->;snd_cwnd_clamp是拥塞窗口的阀值
tp->;snd_cwnd_cnt是当tp->;snd_cwnd达到tp->;snd_ssthresh后,开始线性增长时用到的一个计数值。
主要分两个过程,tp->;snd_cwnd达到tp->;snd_ssthresh前,是慢启动过程:
每收到一个ack响应,tp->;snd_cwnd增加一(见1704 ),也即增加了一个packet. 实际上, 每次收到一个ack响应,窗口增加了两个packet,因为即要再产生一个原来位置的packet,又要增加一个packet. 这样下来,一个RTT时间,窗口则扩大为原来的两倍. 所以窗口大小是随RTT时间指数增加的.
tp->;snd_cwnd达到tp->;snd_ssthresh后是在线性增长阶段:
若当前的拥塞窗口的大小为cwnd,要保证一个RTT时间里tp->;snd_cwnd增加一个packet,则应当每收到一个ack响应时,tp->;snd_cwnd增加1/cwnd(这里应当理解,一个大小为cwnd的窗口在一个RTT时间里能够产生最多cwnd个ack响应)。其方法就是把tp->;snd_cwnd_cnt初始值设为0(见1712),然后每次收到ack响应就增一(见1714),当tp->;snd_cwnd_cnt的值达到当前的tp->;snd_cwnd值(见1709 ),就意味着一个RTT时间到,此时tp->;snd_cwnd就应该增加一个packet(见1711 ).而因为tp->;snd_cwnd的改变又会导致新的一轮tp->;snd_cwnd_cnt递增,则tp->;snd_cwnd_cnt应当再设为0(见1712),迎接下一轮的递增. 在这个过程里,每个RTT时间,窗口增加一个packet,因此是线性增加的. |
|