重要变量

HighACK

在一个给定的时间,已经被累计确认的数据的最高字节的序列号。

HighData

在一个给定的时间,已经被发送的数据的最高的序列号。

HighRxt

在当前的丢包恢复阶段,已经被重传的最高的序列号。

RescueRxt

“RescueRxt”是最高的序列号,它已经被乐观地重发,以防止在窗口结束时丢失并且没有新数据可用于传输时ACK时钟停止。

Pipe

发送方对于处于网络中的字节数的估计,在恢复阶段,这被用来限制发送方的发送速率。这个管道变量允许TCP拥塞控制算法使用,使用了这个变量的拥塞控制算法经常被称作“管道算法”。

DupAcks

自从上一次累计确认以来,接收到的冗余的ACK的数量。

一些函数

为了引出下面定义的算法,scoreboard应该实现下面的几个函数。

Update()

给定ACK提供的一些信息,在数据结构scoreboard中,每个累计确认或者选择确认的字节应该相应地被标记,选择确认的字节总数也应当被记录。

IsLost(SeqNum)

这个函数返回是否给定的序列号已经丢失。

  • 返回真的条件:DupThresh个超过SeqNum的不连续的SACKed序号到达,或者超过(DupThresh - 1) * SMSS字节的序列号被选择性应答。
  • 返回假的条件:其他情况。

算法详情

在接收到任何含有SACK信息的ACK后,必须更新通过Update()函数。

如果这个ACK是一个累计确认,那么变量DupAcks需要被归零。

如果这个ACK是一个冗余变量,而TCP目前没有处于丢包恢复阶段,TCP必须将变量DupAcks的值增加1,并且采取以下措施:

  1. 如果DupAcks >= DupThresh,这暗示着冗余量已经超过了先前设置的阈值,那么转到第四步。

  2. 如果DupAcks < DupThresh,但是函数IsLost返回了是,这暗示着已经有三个段超过了目前的累计确认点,这也暗示着丢包,