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 的变化来判断,因此能更精确地预测网络的可利用带宽,其公平性、
效率都较好。