当前位置: 首页 > Linux

为什么我们要关闭TCP时间戳

时间:2023-04-07 00:02:45 Linux

sysctl-wnet.ipv4.tcp_timestamps=0可以看到,我们使用上面的命令在所有Linux服务器上关闭了TCP时间戳。什么是TCP时间戳?时间戳是TCP协议包头中的一个可选项。它包含2个值,分别是发送消息的时间(TSval),以及从对等方收到的TSval原样返回(TSecr)。+--------+--------+--------------------+--------------------+|种类=8|10|TS值(TSval)|TS回显回复(TSecr)|+--------+--------+---------------------+--------------------+1144RFC-7323给出了详细的说明和使用,这篇文章也有一个很好的标题,值得一读。根据RFC-7323的描述,TCPTimestamp有两个重要的原因,但这两个原因都没有说服我们:PAWS,ProtectionAgainstWrapped-AroundSequence-Numbers。在超高速网络中,可能需要很大的TCP窗口。在这种情况下,当重传某些数据包时,可以将重传的旧数据包视为新数据包。假设TCP接收窗口大到4G,因为序号是4字节,当一个序号为x的数据包丢失重传时,这个数据包可以认为是位置x+4G的数据包。现在是2022年,我不相信这样的事情会发生。可以帮助计算RTT。选择性ACK也是可能的。另外,我还发现了一个原因:TCPCookie可以使用TSval来保存cookie,减少哈希冲突。是一个有吸引力的原因,但SYNFLOOD并不是每时每刻都在发生。为什么要关闭TCPTimestamp既然TCPTimestamp存在的理由还没有让我们信服,那就没必要特地开启了。但是我们仍然需要一个令人信服的理由来关闭它。TSval的值是递增的,所以有人靠这个来计算服务器的启动时间。这个问题在2016年修复了。打开Timestamp后,每个数据包比原来的20字节多了12字节。在linux源码include/net/tcp.h中可以看到TCPOLEN_TSTAMP_ALIGNED。有人尝试关闭Timestamp,带宽增加了大约1%。S3在使用Timestamp时遇到了奇怪的问题。最后,我们关闭了TCP时间戳选项。