拥塞控制用来避免网络过分拥挤导致的丢包严重、网络效率降低的问题。
以交通为例:高速公路同一时间可通行的汽车数量是一定的,当节假日时,会发生严重的堵车。在 TCP 中,数据包超时会进行重传。就像是本就堵车的公路进入了更多的汽车,导致的结果是网络中不断地 丢包 - 重传 - 丢包 - 重传。直至网络瘫痪。
拥塞控制通过限制发送方的滑动窗口大小来限制流量。当然,拥塞控制的手段不只是流量控制,导致拥塞的因素有:路由器缓存、带宽、处理器处理速度等等。提升硬件能力(四车道改成八车道)是其中一个方法,但毕竟硬件提升是有瓶颈的,没办法不断提升,还是需要从 TCP 本身来增加算法,解决拥塞。
拥塞控制的重点有四个:慢开始、快恢复、快重传、拥塞避免。
慢开始和拥塞避免算法Y 轴表示的是发送方窗口大小,X 轴表示的是发送的轮次(不是字节编号)。
- 最开始的时候,拥塞窗口的值较小,然后每轮变为原来的两倍,这是慢开始
- 当窗口值达到 ssthresh(slow start threshold)时,开始进入拥塞避免,每轮把窗口值提升 1,慢慢试探网络的底线。ssthresh 是根据实时网络情况设置的一个窗口限制值
- 如果发生了数据超时,表示极可能发生了拥塞,此时回到慢开始,重复上面的步骤
- 如果收到三个相同的确认回复,表示现在的网络情况不太好,把 ssthresh 值设置为原来的一半,继续拥塞避免。这部分称为快恢复
- 如果收到丢包信息,应该尽快把丢失的包重传一次,这是快重传
- 窗口的最终上限是不能无限上涨的,他不能超过接收方的缓存区大小
通过这个算法,可以在很大程度上避免网络拥挤。
除此之外,还可以让路由器在缓存即将满的时候,通知发送方我快满了,而不是等到出现了超时再进行处理,这被称为主动队列管理 AQM(Active Queue Management)。
网友评论