RFC 6675
重要变量
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,并且采取以下措施:
-
如果
DupAcks >= DupThresh
,这暗示着冗余量已经超过了先前设置的阈值,那么转到第四步。 -
如果
DupAcks < DupThresh
,但是函数IsLost
返回了是,这暗示着已经有三个段超过了目前的累计确认点,这也暗示着丢包,
🗞️ Recent Posts