TCP 流分析82 条

TCP 时间戳选项

TSopt(RFC 7323)在握手协商后为每个包携带时间戳,用于更精确的 RTT 测量与防丢失序号回绕(PAWS);抓包可见 tcp.options.timestamp。

TCP 时间戳选项

时间戳选项在握手阶段协商成功后,每个报文都会携带两个时间戳值:本端发送时刻,以及对端最近一次发送时刻的回显。它既能让往返时延的测量更精确,也能在序列号回绕时防止旧报文被误收。抓包时可以直接看到对应的选项字段。

基本信息

适用平台TCP 选项,主流 Linux 与 Windows 默认启用
Wireshark 字段tcp.options.timestamp.tsval 与 tsecr
协议依据RFC 7323(时间戳选项与防回绕)
协商时机三次握手阶段,双方在 SYN 与 SYN-ACK 中互报支持

典型使用场景

  • 检查是否协商:看握手报文里有没有携带该选项
  • 精确测量往返:用回显值计算,不受确认延迟策略影响
  • 防止序号回绕:高速链路上避免旧报文被误收
  • 排查中间设备干扰:部分设备会剥离该选项,造成两端口径不一致
  • 与其他字段配合:结合序列号与确认号一起判读

常用过滤

常用过滤
tcp.options.timestamp                                        # 携带该选项的报文
tcp.flags.syn == 1 && tcp.options.timestamp                  # 握手阶段是否协商
tcp.options.timestamp.tsval && tcp.options.timestamp.tsecr   # 回显值配对

字段读法

字段含义用途
发送时间戳本端发出该报文时的取值与对端回显配对计算时延
回显时间戳对端最近一次发送的取值反映对端的时间基准
是否协商握手报文中是否出现决定后续报文能否携带
时间戳的数值本身没有可比性,各端的取值基准是随机初始化的。它只能用于做差值计算,不能当成真实时钟读数。
部分中间设备会剥离时间戳选项,造成链路两端观测口径不一致。跨设备对比时如果一端有一端没有,先怀疑设备行为。
这个选项在序列号回绕的场景下价值明显:高速链路上可以避免把旧报文误判为新数据,因此在现代实现中普遍默认启用。

易错点

  • 部分中间设备剥离时间戳选项,导致两端口径不一致
  • 时间戳数值不具可比性(各端时钟随机偏移),只用于差值计算
  • 把选项存在与否当成故障判据:协商不成功时会正常禁用,不代表异常
  • 手工读取数值算时延却不确认配对关系,容易得出错误结果

数据来源与参考

  • RFC 7323(TSopt)
  • Wireshark 显示过滤器参考
​‌‌​​‌​​​‌‌​‌‌‌‌​‌‌​​​‌‌​‌‌‌​​‌‌​​‌​‌‌‌​​‌‌‌​​​‌​‌‌​‌​​‌​‌‌‌​​​‌​‌‌​‌​​‌​‌‌​​​‌‌​‌‌‌​‌​​​‌‌​‌‌‌‌​​‌​‌‌‌​​‌‌​​​‌‌​‌‌​‌‌‌‌​‌‌​‌‌​‌