sysctl -w net.ipv4.tcp_timestamps=0
如君所见,我们在所有的 Linux 服务器上,使用上述命令关闭了 TCP timestamp。
查看原文
TCP Timestamp 是什么 【我们为什么要关闭 TCP timestamp】Timestamp 是 TCP 协议包首部的可选项,包含 2 个值,分别是报文发送的时间 (TSval),
以及收到的对端发送来的 TSval 原样返回 (TSecr)。
+-------+-------+---------------------+---------------------+
|Kind=8 |10|TS Value (TSval)|TS Echo Reply (TSecr)|
+-------+-------+---------------------+---------------------+
1144
RFC-7323 给出了详细的说明和用途,这篇文章也有个好名字,值得一读。照 RFC-7323 描
述,TCP Timestamp 由两个重要的理由,然而这两个理由都没有说服我们:
- PAWS, Protection Against Wrapped-Around Sequence-Numbers。在超高速网络中,可
新的包。假设 TCP 接收窗口有 4G 那么大,因为序列号是 4 字节的,有一个序列号是 x
的包丢失重传的时候,这个包可能被当作 x+4G 位置的包。现在是 2022 年,我不相信这样的
事情真会发生。
- 可以帮助计算 RTT。Selective ACK 也可以啊。
- TCP Cookie 可以利用 TSval 保存 cookie,减少哈希冲突。是个有吸引力的理由,但
为什么要关闭 TCP Timestamp 既然 TCP Timestamp 存在的理由没有说服我们,那就没有必要特地打开它。但要我们将它
关闭,仍然需要令人信服的理由。
- TSval 的值是递增的,这就有人靠这个推算服务器的启动时间。
这个问题在 2016 年修复了。 - 打开了 Timestamp 之后每个包多了 12 字节,原本是 20 字节。在 Linux 源码
include/net/tcp.h
可以看到TCPOLEN_TSTAMP_ALIGNED
。
有人实验过关掉 Timestamp 之后带宽增加了约 1% - S3 遇到过关于 Timestamp 的诡异问题。