时间戳选项是什么
TCP 时间戳选项(RFC 7323,早期版本为 RFC 1323)在每个报文里带两个 32 位字段:TSval 是发送方自己的当前时间戳,TSecr 回显最近一次收到的对端时间戳。有了它,发送方不必靠重传去猜,就能精确测出往返时延;同时借助 PAWS 机制丢弃序号回绕后仍残留在网络里的旧报文,避免老数据被当成新数据交付。Linux 上由 net.ipv4.tcp_timestamps 控制,默认开启并在握手中协商。
基本信息
| 规范 | RFC 7323 |
|---|---|
| 字段 | TSval 发送方时间戳,TSecr 回显对端时间戳 |
| 占用空间 | 每个报文 10 字节选项,另加 2 字节对齐 |
| 启用方式 | SYN 中协商,双方都支持才生效 |
| 内核开关 | net.ipv4.tcp_timestamps,默认 1 |
| 主要用途 | 精确 RTT 测量、PAWS 防旧包 |
查看与验证
查看与验证
sysctl net.ipv4.tcp_timestamps # 1 为开启
ss -ti state established | grep -i rtt # 看内核给出的 RTT 估计
tcpdump -nn -v 'tcp port 8080' -c 4 | grep -i ts # 抓包看 TSval 与 TSecr三项作用对照
| 作用 | 做法 | 没开启时的影响 |
|---|---|---|
| 精确 RTT 测量 | 用 TSecr 回显直接算出往返时延 | 只能按重传与定时器估算,误差偏大 |
| PAWS 防旧包 | 丢弃时间戳早于已确认数据的报文 | 极端情况下旧重复包会被接收 |
| 重传超时更准 | 基于采样值调整 RTO | RTO 偏保守,恢复更慢 |
典型使用场景
- 排障时区分「时延高」与「丢包」:RTT 与重传计数一起看才有结论
- 路径存在序号回绕可能的极高速链路:PAWS 是必要保护
- 老设备兼容性验证:个别实现与时间戳选项不兼容,关闭后问题消失即可定位
- 内核加固审查:确认 tcp_timestamps 与相关参数是否被历史调优脚本改过
内核参数 tcp_tw_recycle 曾与时间戳配合使用,但在 NAT 环境下会造成大量连接异常,该参数已在 Linux 4.12 中移除。在仍在运行老内核的系统上排查 NAT 场景连接失败时,需要确认这一历史配置是否还存在于调优脚本里。关闭时间戳在个别老设备上确实能解决兼容问题,但应作为特例记录在案,不要变成默认动作。