Timestamps 选项是什么

image.png

Timestamps 选项的组成部分

TCP Timestamps Option 由四部分构成:

  1. 类别(kind)
  2. 长度(Length)
  3. 发送方时间戳(TS value, TSval)
  4. 回显时间戳(TS Echo Reply, TSecr)

image.png

是否使用时间戳选项是在三次握手里面的 SYN 报文里面确定的:

image.png

  1. 发送方发送数据时,将一个发送时间戳 1734581141 放在发送方时间戳TSval中
  2. 接收方收到数据包以后,将收到的时间戳 1734581141 原封不动的返回给发送方,放在TSecr字段中,同时把自己的时间戳 3303928779 放在TSval中
  3. 后面的包以此类推

image.png

Timestamps 选项的作用

  • 两端往返时延测量(RTTM)
  • 序列号回绕(PAWS)

测量 RTTM

未启用 timestamp 前的普通测量 RTTM 方法:

image.png

重传使计算 RTT 变得复杂:

image.png

  • 无法得知收到的确认 ACK 是对第一次包还是重传包的的确认
  • TCP RFC6298 对这种行为的处理是不对重传包进行 RTT 计算,这样计算不会带来错误,但当所有包都出现重传的情况下,将没有包可用来计算 RTT。

在启用 Timestamps 选项以后,因为 ACK 包里包含了 TSval 和 TSecr,这样无论是正常确认包,还是重传确认包,都可以通过这两个值计算出 RTT。(t3-ACK 包携带了 t1/t2 的时间戳)

PAWS

TCP 的序列号用 32bit 来表示,因此在 2^32 字节的数据传输后序列号就会溢出回绕。TCP 的窗口经过窗口缩放可以最高到 1GB(2^30),在高速网络中,序列号在很短的时间内就会被重复使用。

image.png

如果有 Timestamps 的存在,内核会维护一个为每个连接维护一个 ts_recent 值,记录最后一次通信的的 timestamps 值,在 t7 时间点收到迷途数据包 2 时,由于数据包 2 的 timestamps 值小于 ts_recent 值,就会丢弃掉这个数据包。等 t8 时间点真正的数据包 6 到达以后,由于数据包 6 的 timestamps 值大于 ts_recent,这个包可以被正常接收。

补充说明

  • timestamps 值是一个单调递增的值,与我们所知的 epoch 时间戳不是一回事,这个选项不要求两台主机进行时钟同步。两端 timestamps 值增加的间隔也可能步调不一致,比如一条主机以每 1ms 加一的方式递增,另外一条主机可以以每 1s 加一的方式递增。
  • 与序列号一样,既然是递增 timestamps 值也是会溢出回绕的
  • timestamps 是一个双向的选项,如果只要有一方不开启,双方都将停用 timestamps

image.png

Timestamps 选项造成的 RST

三次握手中的第二步,如果服务端回复 SYN+ACK 包中的 TSecr 不等于握手第一步客户端发送 SYN 包中的 TSval,客户端在对 SYN+ACK 回复 RST。示例包如下所示。

image.png