Tahoe 是最早的 TCP 版本,它包括了 3 个最基本的拥塞控制算法:“慢启动”、“拥塞避免”和
“快速重传”。慢启动中,拥塞窗口大小按指数规律增长,直到它到达一个门限,拥塞避免
开始,此过程中拥塞窗口大小安照加法规律增长,直到拥塞被检测到。Tahoe 用超时来检
测丢包,丢包被看做出现拥塞的信号,Tahoe 算法把慢启动门限设置为当前拥塞窗口的一
半,将拥塞窗口设置为一个报文段,然后又重新开始一个慢启动过程。当收到三个重复
ACK 不必等到超时,就认为丢包,并且马上重传。
Reno 是 Tahoe 后出现的 TCP 版本。除了包含了 Tahoe 的“慢启动”、“拥塞避免”和“快速重传”
三个机制,Reno 多了另外一个机制:快速恢复:当收到三个重复的 ACK,Reno 会认为有丢包,
并且认定网络发生拥塞。Reno 会把慢启动门限设为目前拥塞窗口的一半,但并不会回到慢
启动的状态,而是设定拥塞窗口值为门限值,之后又开始拥塞避免阶段拥塞窗口维持线性
成长,直到拥塞被检测到。
New Reno 是在 Reno 基础上做了一些修改的 TCP 版本。NewReno 对 TCP Reno 中的“快速恢
复”算法进行了修正,它考虑了一个发送窗口内多个数据包丢失的情况。在 Reno 版中,发
送端收到一个新的 ACK 后就退出“快速恢复” 阶段,而在 NewReno 版中,只有当进入快速
恢复阶段时还未确认的所有数据包都被确认后才退出“快速恢复”阶段。当一个新的 ACK 被
收到时,会有两种情况:1、如果这个 ACK 是进入开苏恢复阶段时还未确认的所有数据包
的 ACK,那么直接退出快速恢复阶段,并且将拥塞窗口设为慢启动门限值,然后进入拥塞
避免阶段。2、如果这个 ACK 是部分数据的 ACK,那么推断之后的数据丢失了,然后重传
这些数据,并且把重复收到的 ACK 数置为 0,直到窗口中所有数据被确认,才退出快速恢
复阶段。
SACK 是前一版本 NewReno 的扩展,它保持了之前版本的慢启动,拥塞避免,快速重传的
机制,但是 SACK 关注的是一个窗口内多个数据包丢失的情况,它避免了之前版本的 TCP
重传一个窗口内所有数据包的情况,包括那些已经被接收端正确接收的数据包,而只是选
择性地重传那些被丢弃的数据包。
Vegas 是在 1994 年,L.S.Brakmo 等提出了一种新的拥塞控制策略。Vegas 通过观察 TCP 连
接中 RTT 值改变感知网络是否发生拥塞,从而控制拥塞窗口大小。如果发现 RTT 值变大,
Vegas 就认为网络正在发生拥塞,于是开始减小拥塞窗口;另一方面,如果 RTT 变小,
Vegas 就认为网络拥塞正在解除,于是再次增加拥塞窗口。这样,拥塞窗口在理想情况下
就会稳定在一个合适的值上。Vegas 在快重传方面也做了改进,当收到一个重复的 ACK 时,
Vegas 计算从发送该数据到当前时间的间隔时间,并与计算的 RTT 比较,如果大于 RTT 那
么不等到超时或者收到 3 个 ACK 就直接重传该数据包。TCP Vegas 的最大优点在于拥塞机
制的触发只与 RTT 的改变有关,而与包的具体传输时延无关。由于 TCP Vegas 不是利用丢
包来判断网络可用带宽,而是以 RTT 的变化来判断,因此能更精确地预测网络的可利用带
宽,其公平性、效率都较好。