TCP状态处理与拥塞控制详解
1. SACK实现与拥塞控制
SACK(Selective Acknowledgment)实现对拥塞状态有很好的控制能力。我们可以根据立即被SACK确认的段的数量来决定是否进入恢复状态。
2. tcp_check_sack_reneging()函数
该函数用于检查是否需要销毁从对端接收到的所有SACK块,因为这些块可能存在错误。如果需要销毁,我们会进入丢失状态,因为所有被SACK确认的段都会被标记为丢失。判断的依据是,写队列中的第一个段在第1032行被标记为SACK确认。但这种情况不应该发生,因为如果写队列中第一个未确认的段已经到达接收端,它应该被按顺序确认。如果这个段被SACK确认,意味着这个按顺序的段仍然在乱序队列中,即使在这个段之前接收的数据没有空洞。在这种情况下,我们会在第1035行调用tcp_enter_loss()函数,将重传队列中的所有段标记为丢失。调用该函数时,第二个参数设为1,表示我们希望将重传队列中的所有段标记为丢失,同时不初始化tp→undo_marker。tp→undo_marker保持未初始化状态,意味着我们不想从丢失状态恢复,因为我们知道接收端出现了问题,到目前为止它无法正确处理未确认的段,我们需要再次重传所有段。在这里我们启动慢启动算法,在第1037行传输重传队列中的第一个段,并在第1038行重置重传定时器。
3. TCP状态的默认处理
对于TCP状态的默认处理,我们有一段通用代码。当TCP进入任何拥塞状态,并且我们收到对低于tp→high_seq(进入拥塞状态时记录)的数据的确认时,会进入这里。在不同的TCP状态下,会有不同的条件。另外,当我们处于OPEN状态并收到第一个
TCP状态与拥塞控制详解
超级会员免费看
订阅专栏 解锁全文
1703

被折叠的 条评论
为什么被折叠?



