TCP拥塞控制
TCP必须使用端到端拥塞控制而不是使网络辅助的拥塞控制,因为IP层不向端系统提供显式的网络拥塞反馈。TCP所采用的方法是让每一个发送方根据所感知到的网络拥塞程度来限制其能向连接发送流量的速率。如果感觉到没什么拥堵,就加快发送速度,如果有拥堵,就减少。
怎么限制发送速率:TCP发送方的拥塞控制需要一个额外的变量,拥塞窗口。发送方中已发送但是未被确认的数据量不会超过拥塞窗口(cwnd)和rwnd的最小值。该约束限制了发送方中未被确认的数据量,因此间接地限制了发送方的发送速率。
如何感知拥堵:TCP发送方的丢包事件定义是,要么超时,要么收到接收方3个冗余的ACK。当出现过度拥堵时,路径上的一台或多台路由器缓存会溢出,引起数据包被丢弃,然后发送方会得知丢包事件,然后就会认为出现了拥塞。
简单来说,当正确收到接收方的ACK时,会认为网络没有拥堵,慢慢调大拥塞窗口,增加发送速率。当出现丢包时,就认为网络拥堵,减小拥塞窗口,减小发送速率。
TCP拥塞控制算法包括三部分:
- 慢启动
- 拥塞避免
- 快速恢复
慢启动
在刚开始建立连接时,拥塞窗口的大小比较小,而每当正确接收到ACK确认时,就增加拥塞窗口的大小。

何时结束这种指数增长:
1、在此过程中,如果出现拥堵,即出现丢包,那就重新开始慢启动,把拥塞窗口置为1。此时阈值会被设置为出现拥堵时窗口大小的一半。比如说出现拥堵时窗口大小为50,那么就将阈值设置为25。
2、一切正常时,当拥塞窗口大小到达拥塞窗口阈值时,结束慢启动并转移到拥塞避免模式。
3、如果检测到3个冗余ACK,这时TCP执行一种快速重传,并进入快速恢复状态。
拥塞避免
一旦进入拥塞避免状态,拥塞窗口的值大约是上次遇到拥塞时的值的一半,而且在增加拥塞窗口大小时,它并不会像启动那样一次翻一倍,而是每次增加1。
合适结束这种线性增长:
1、当出现超时丢包时,就将阈值设置为拥塞窗口的一半。
2、当出现3个冗余ACK所确认的丢包时,TCP将拥塞窗口的值减半,然后将阈值设置为拥塞窗口的一半。此时拥塞窗口和阈值大小一样,将不会再增加。
之后就进入快速恢复阶段。
快速恢复
总结:出现 网络拥塞 之后 , 拥塞窗口 不降为 1 , 而是降低到 慢开始门限值 , 即当前的 拥塞窗口大小的 1/2 , 然后线性增加 拥塞窗口 ;
如下图:没有快速恢复时,出现拥堵窗口会将为1,然后开始增长,到达阈值每次增加1。
有快速恢复时,出现拥堵窗口大小降为之前的阈值,然后每次增加1。
三个过程的转换
参考
《计算机网络:自顶向下》