超时重传与RTT
RTT :round trip time
往返时间
1 | struct tcp_pcb { |
rttest
: 测算报文段的 往返时间
rtseq
: rttest 测试的报文段的序号
rtime
: 重传定时器,单位为500ms, 与 rto对比判断是否需要重传
rto
: 根据 rttest 动态设置 重传超时时间
nrtx
: 报文段重传次数
总结:
rtime 是定时器,rto是超时时间 ,其他几个变量决定了rto的计算
超时重发相关的代码位置: 3个
tcp_recive : 接收到应答包的处理
tcp_output_segment : 发送数据包
tcp_slowtmr: 超时定时器处理函数
超时定时器的起始位置
因为超时定时器与 TCP_TCB一一对应,所以在 TCB数据包发送函数中启动,且只自动一次,除非定时器被关闭
逻辑分析
超时时间如何确定
超时定时器属于 TCP_TCB
共用同一个定时器
开启超时计时 : 出现第一个报文段
链接对应的TCP_TCB中出现第一个 报文段
超时计时器更新 :500ms 定时器达到
关闭超时计时 : unack 链表为空
复位超时计时器 : 收到应答包 超时时间到达
超时时间计算 [RTT] : 收到比
rtseq
大的应答号RTO的计算:依赖往返时间的 平均值和方差,
而平均值与方差 在每次 往返时间更新时,得到更新
往返时间开启: 出现第一个报文段
往返时间更新 : 收到比
rtseq
大的应答号往返时间关闭: 收到比
rtseq
大的应答号
关键:
TCP采用
累计确认
,只要确认号包含了正在进行RTT估计的报文段,就可以进行RTT计算确认号: 接收方成功接收的数据包序号
A + 1
,而且保证 小于确认号的报文段都是接收成功的发送序号: 当前报文段中第一个数据的字节序号
慢启动与拥塞避免
基础知识
报文段: TCP数据包