我正在尝试了解 RTO 机制。我已阅读 RFC 6298,但它没有指定进行第一次 RTT 测量的时间。
考虑以下数据包交换
- 客户端 ----- 同步 -----> 服务器
- 客户端<---Syn+Ack---服务器
- 客户端---数据+确认-->服务器
- 客户端<--数据+确认---服务器
对于客户端,是在接收到 Syn+Ack(#2)还是 Data+Ack(#4)后测量的第一个 RTT?
对于服务器端,是不是在收到Data+Ack(#3)后进行测量?
我正在尝试了解 RTO 机制。我已阅读 RFC 6298,但它没有指定进行第一次 RTT 测量的时间。
考虑以下数据包交换
对于客户端,是在接收到 Syn+Ack(#2)还是 Data+Ack(#4)后测量的第一个 RTT?
对于服务器端,是不是在收到Data+Ack(#3)后进行测量?
RTT是在传输段时测量的,所以发送的数据包中必须有数据,所以SYN和SYNACK不能提供测量。RFC 说:
(5.1) 每次发送一个包含数据的包(包括一次重传),如果定时器没有运行,就启动它运行...
因此,由于在您的示例中,客户端发送第一个数据,然后是 #4 确认它并提供 RTT 测量。同样,服务器 RTT 测量是在 #4 被确认时进行的,一个你没有显示的数据包(可能是 #5)
它在第一个 TCP RFC,RFC 793,传输控制协议,第 3.7 节数据通信中说:
示例重传超时过程
测量发送具有特定序列号的数据八位字节和接收覆盖该序列号的确认之间经过的时间(发送的段不必与接收的段匹配)。此测量的经过时间是往返时间 (RTT)。接下来计算平滑往返时间(SRTT)为:
SRTT = ( ALPHA * SRTT ) + ((1-ALPHA) * RTT)
并基于此,计算重传超时 (RTO) 为:
RTO = min[UBOUND,max[LBOUND,(BETA*SRTT)]]
其中 UBOUND 是超时的上限(例如,1 分钟),LBOUND 是超时的下限(例如,1 秒),ALPHA 是平滑因子(例如,0.8 到 0.9),而 BETA 是延迟方差因子(例如,1.3 到 2.0)。
我没有在更新中遵循这一点,所以可能会有更好或更明确的参考。