LWIP-TCP

超时重传与RTT

RTTround trip time 往返时间

1
2
3
4
5
6
7
8
9
10
11
struct tcp_pcb {
/* Retransmission timer. */
s16_t rtime;
/* RTT (round trip time) estimation variables */
u32_t rttest; /* RTT estimate in 500ms ticks */
u32_t rtseq; /* sequence number being timed */
s16_t sa, sv; /* @todo document this */

s16_t rto; /* retransmission time-out */
u8_t nrtx; /* number of retransmissions */
}

rttest: 测算报文段的 往返时间

rtseq: rttest 测试的报文段的序号

rtime : 重传定时器,单位为500ms, 与 rto对比判断是否需要重传

rto : 根据 rttest  动态设置 重传超时时间

nrtx : 报文段重传次数

总结: 

  1. rtime 是定时器,rto是超时时间 ,其他几个变量决定了rto的计算

  2. 超时重发相关的代码位置: 3个

    tcp_recive : 接收到应答包的处理

    tcp_output_segment : 发送数据包

    tcp_slowtmr: 超时定时器处理函数

  3. 超时定时器的起始位置

    因为超时定时器与 TCP_TCB一一对应,所以在 TCB数据包发送函数中启动,且只自动一次,除非定时器被关闭

逻辑分析

  • 超时时间如何确定

  • 超时定时器属于 TCP_TCB

    共用同一个定时器

  • 开启超时计时 : 出现第一个报文段

    链接对应的TCP_TCB中出现第一个 报文段

  • 超时计时器更新 :500ms 定时器达到

  • 关闭超时计时 : unack 链表为空

  • 复位超时计时器  : 收到应答包 超时时间到达

  • 超时时间计算 [RTT] : 收到比 rtseq 大的应答号

    RTO的计算:依赖往返时间的 平均值和方差,

    而平均值与方差 在每次 往返时间更新时,得到更新

  • 往返时间开启: 出现第一个报文段

  • 往返时间更新 : 收到比 rtseq 大的应答号

  • 往返时间关闭: 收到比 rtseq 大的应答号

关键:

  1. TCP采用累计确认,只要确认号包含了正在进行RTT估计的报文段,就可以进行RTT计算

    确认号: 接收方成功接收的数据包序号A + 1,而且保证 小于确认号的报文段都是接收成功的

    发送序号: 当前报文段中第一个数据的字节序号

慢启动与拥塞避免

基础知识

报文段: TCP数据包

undefined