我们为什么要关闭 TCP timestamp

sysctl -w net.ipv4.tcp_timestamps=0

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

查看原文

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 年,我不相信这样的
事情真会发生。

  1. 可以帮助计算 RTT。Selective ACK 也可以啊。

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

  1. TCP Cookie 可以利用 TSval 保存 cookie,减少哈希冲突。是个有吸引力的理由,但

SYN FLOOD 也不是每时每刻都在发生的。

为什么要关闭 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 选项。

你可能感兴趣的:(linux网络运维sre)