一般说到协议栈的书,说到慢启动,都会简单的描述为拥塞窗口呈指数增长,但实际上是如何实现的呢?功能非常简单。内核函数:u32tcp_slow_start(structtcp_sock*tp,u32acked)u32tcp_slow_start(structtcp_sock*tp,u32acked){u32cwnd=tp->snd_cwnd+acked;//当前窗口值+已确认数据包数if(cwnd>tp->snd_ssthresh)//新窗口大于慢启动阈值cwnd=tp->snd_ssthresh+1;//重新分配给慢启动阈值+1acked-=cwnd-tp->snd_cwnd;//返回值=原值-窗口增加值tp->snd_cwnd=min(cwnd,tp->snd_cwnd_clamp);//窗口不能超过最大值returnacked;//返回慢启动阶段不起作用的acked数的值,增加到拥塞避免阶段的窗口}aboutackedDefinitionof:intacked=0;/*newackedpackets数量*/(1)初始窗口为1,然后第一个acked为1,窗口变为2。(2)发出2个数据包,无论是delayack还是一个一个ack,acked为2,window变为4。(3)以此类推,最后类似指数增长。
