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