- TSval指明了发送端在发送TCP Segment时的Timestamp;接收端在对该TCP Segment做ACK时,将TSval值回显在TSecr字段中 。
- 注意:由于TCP连接是双向的,接收端在ACK中回显TSecr时,也会把自己当前的Timestamp放入TSval字段 。
- Timestamp是一个随时间单调递增的值,由于TCP接收端只需要在ACK中将TSval简单地回显,因此通信双方并不需要进行时间同步等操作 。
- 通过Timestamp Option,发送端再也不需要在内存中保存发送Segment的时间了,只需要将其放入TSval,然后接收端将其回显在ACK Segment即可 。当发送端收到ACK Segment后,取出TSscr,和当前时间做算术差,即可完成一次RTT的测量 。
- 若非通过Timestamp Option来计算RTT,大部分TCP实现只会以“每个Window采样一次”的频率来测算RTT 。因此通过Timestamp Option,可以实现更密集的RTT采样,使RTT的测算更精确 。
序列号回绕冲突只会出现在高速连接上 。
序列号回绕冲突是指序列号seq[0,2^32],即是最大4G 。如果在高速的连接中,某段数据A因为路由问题出现重传(此时网络是可能出现2个以上时间段A),收到一个时间段A后继续接收 。seq溢出,轮回第二次序列号seq[0,2^32],如果此时上一轮回重传的数据段A也到达了,那怎么判断当前序列号seq是本次轮回的还是上次轮回的?(当然,一次seq的轮回需要在MSL内,否则这个报文段在它的TTL到期时会被某个路由器丢弃)
Timestamp Option能解决这个冲突 。
参考以下例子来理解:
- 假设TCP Window Size为1GB(使用Window Scale),发送者每发送一个Window的数据Timestamp值加100,数据的发送情况如下所示:
在时间点5,序列号开始回绕 。
在时间点6,已经被认为“丢包”的Segment延迟到达了 。
那怎么判断这个序列号seq为[1G:2G]的报文是上一轮回的还是现在需要接收的?
通过Timestamp Option字段的时间戳去区别 。由于最近生效的时间戳都超500了 。所以比这个时间戳前的字段都视为过期字段,PAWS机制将其丢弃 。
- 注意理解这句话 。窗口1GB,说明没有收到确认的数据后面最多能发送不超过1GB的数据 。看上表,时间点5都已经接收完毕了,说明时间点5之前的数据都已经全部接收完了 。后面重传只会出现在[5G:6G]中间 。如果这里收到的数据的时间戳比时间点5的时间戳500还要少,说明是过期重传的数据,我们不需要 。
- 最近有效的时间戳:参考下图理解 。所以只要收到的数据的时间戳少于有效时间戳,就视为过期数据 。
文章插图
12.10.5 UTOUTO:User Timeout (UTO) Option
UserTimeout值表明了TCP发送者等待ACK的时间,如果在指定时间内没收到ACK,就会认为对端挂掉 。
对于传统TCP(RFC 793)而言,UserTimeout是本地配置的 。
RFC 1122建议,当TCP重传3次后,应该通知应用程序,100s后,应该删除连接 。
通过UTO,可以让TCP将UserTimeout值“告知”给对端,UTO格式如下所示:
Kind(28)Length(4)G bit(Granularity bit)UserTimeout
经验总结扩展阅读
- 哪个星座是是天蝎座的情劫
- 水表最后一位红色是1吨还是0.1吨
- 龙舌兰酒为什么不能直接喝
- 长虫是什么动物
- 烈火军校董小姐扮演者是谁?
- 牛仔裤38码是多少尺?
- 小丑女的电影是哪一个?
- 唐艺昕演的穿越剧叫什么名字?
- 霉茶叶有什么用途
- bollycon是哪个国家的美瞳品牌?