相比UDP,TCP有拥塞控制。《计算机网络》这本书以Tahoe与Reno为例介绍了TCP的拥塞控制。
1、慢启动和拥塞避免是必须的。这两点不同之处在于拥塞窗口 cwnd 增速不同。慢启动以指数增长,拥塞避免则以线性增长。
2、拥塞丢包的判断主要两种方式:1)发送发超时;2)发送方收到3次冗余ACK
3、与Tahoe相比,Reno还具有快速恢复。对与以上两种丢包,Tahoe都将慢启动阈值设为当前 cwnd/2 ,并将拥塞窗口 cwnd 重置为1,然后进入慢启动。而Reno则对于这两种丢包区别对待。对于1)的解决方式是一样的,不同的是对于2),Reno将慢启动阈值设为 cwnd/2,然后将 cwnd 变为 cwnd / 2 + 3(来自3次冗余ACK,快速恢复的规则之一),接着进入快速恢复,对于收到的每个冗余ACK,cwnd都加一,直到收到一个新的ACK,拥塞窗口 cwnd 变为 慢启动阈值,进入拥塞避免。在这期间假如出现超时,则进入 1) 的处理方式。
这里的一个疑问:快速恢复中,为什么在收到冗余ACK后增加cwnd?
答案:在检测到丢包时,窗口为cwnd。这时候网络中最多有cwnd个包(RTT时间内)。每当收到一个重复的ACK,则说明有数据包离开网络,达到接收端了。那么,此时网络中还可以再容纳1个包。由于发送端滑动窗口不能移动了,使cwnd++,这样一来,可以提高吞吐量。而实际上,在fast recovery期间发送的新数据包比起发生丢包的cwnd来说,已经是大大减少了。