我们为什么要关闭 TCP timestamp

Table of Contents

sysctl -w net.ipv4.tcp_timestamps=0

如君所见,我们在所有的 Linux 服务器上,使用上述命令关闭了 TCP timestamp。

1 TCP Timestamp 是什么

Timestamp 是 TCP 协议包首部的可选项,包含 2 个值,分别是报文发送的时间 (TSval),以及收到的对端发送来的 TSval 原样返回 (TSecr)。

+-------+-------+---------------------+---------------------+
|Kind=8 |  10   |   TS Value (TSval)  |TS Echo Reply (TSecr)|
+-------+-------+---------------------+---------------------+
    1       1              4                     4

RFC-7323 给出了详细的说明和用途,这篇文章也有个好名字,值得一读。照 RFC-7323 描述,TCP Timestamp 由两个重要的理由,然而这两个理由都没有说服我们:

  1. PAWS, Protection Against Wrapped-Around Sequence-Numbers。在超高速网络中,可能需要一个大的 TCP 窗口,这种情况下,有些包重传的时候,这个重传的旧包可能会当成新的包。假设 TCP接收窗口有 4G 那么大,因为序列号是 4 字节的,有一个序列号是 x的包丢失重传的时候,这个包可能被当作 x+4G 位置的包。现在是 2022 年,我不相信这样的事情真会发生。
  2. 可以帮助计算 RTT。Selective ACK 也可以啊。

此外,我还找到一个理由:

  1. TCP Cookie 可以利用 TSval 保存 cookie,减少哈希冲突。是个有吸引力的理由,但SYN FLOOD 也不是每时每刻都在发生的。

2 为什么要关闭 TCP Timestamp

既然 TCP Timestamp 存在的理由没有说服我们,那就没有必要特地打开它。但要我们将它关闭,仍然需要令人信服的理由。

  1. TSval 的值是递增的,这就有人靠这个推算服务器的启动时间。 这个问题在 2016 年修复了
  2. 打开了 Timestamp 之后每个包多了 12 字节,原本是 20 字节。在 Linux 源码 include/net/tcp.h 可以看到 TCPOLEN_TSTAMP_ALIGNED有人实验过关掉 Timestamp 之后带宽增加了约 1%
  3. S3 遇到过关于 Timestamp 的诡异问题

最终,我们关闭了 TCP Timestamp 选项。


By .