

那么这个参数来源于哪里呢?又有什么作用呢?
1、原理
时间戳(TCP Timestamps Option,TSopt)来源于TCP报文头部的Option选项。这个选项在 TCP 头部的位置如下所示。

比如下图,我们抓包的报文中的时间戳选项在option中。


是否使用时间戳选项是在三次握手里面的 SYN 报文里面确定的。那么这个时间戳选项有什么作用吗?主要有两个作用:
两端往返时延测量(RTT)
序列号回绕(PAWS)
2、RTT原理
由于在真实的网络中,各种丢包情况普遍存在,因此有一套超时重传机制,也就是我们以前说的 TCP中的几种定时器 《聊聊TCP中的几个定时器》,那么超时重传的时间如何设置呢?
为了动态地设置,TCP引入了RTT(Round Trip Time),也就是一个数据包从发出去到回来的时间。这样发送端就大约知道需要多少的时间,从而可以方便地设置Timeout——RTO(Retransmission TimeOut),以让我们的重传机制更高效。
但是实际上RTT的计算比较复杂,如下图a所示,发生了重传,如果按照第一次的报文和ACK计算出来的RTT就比较大了,不合理。如图b所示,重传后收到了原始报文的ACK,这样计算出来的RTT偏小,也不合理。


比如目前Linux下使用的RTO计算算法为Jacobson / Karels 算法:

3、序列号回绕PAWS
TCP 的序列号用 32bit 来表示,因此在 2^32 字节的数据传输后序列号就会溢出回绕。TCP 的窗口经过窗口缩放可以最高到 2^30,也就是1G,在高速网络中,序列号在很短的时间内就会被重复使用。
如果有 Timestamps 的存在,内核会维护一个为每个连接维护一个 ts_recent 值,记录最后一次通信的的 timestamps 值,当收到的数据包中 timestamps 值小于 ts_recent 值,就会丢弃掉这个数据包。等收到的数据包的timestamps 值大于 ts_recent,这个包可以被正常接收。
//0表示关闭,1表示打开功能cat /proc/sys/net/ipv4/tcp_timestamps




