1.Timestamps 选项的组成部分


时间戳选项占10个字节= kind(1字节) + length(1字节) + info (8字节),其中kind=8,length=10,info由timestamp(TS value)和timestamp echo(TS Echo Reply)两个值组成,各4个字节的长度。

2. Timestamps 选项工作原理

以一次抓包为例:

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

3. Timestamps 选项的作用

时间戳选项主要的功能有两个

3.1 用来计算往返时间RTT

发送方在发送报文段时把当前时钟的时间值放入时间戳字段,接收方在确认该报文段时把时间戳字段值复制到时间戳回送回答字段。因此,发送方在收到确认报文后,可以准确计算出RTT。时间戳是一个单调增长的值,接收方只需要回显收到的内容,因此是不需要关注时间戳的单元是什么,也不需要连接双发的时钟同步。


例如:主机a向主机b发送一个报文s1,在发送时将内核时刻ta1记录到报文s1的选项字段时间戳timestamp区域;主机b接收到报文s1后,从s1的时间戳timestamp区域将ta1取出来,复制到应答报文s2的时间戳timestampecho区域。如此一来,主机a收到s2时,此时的内核时刻是ta2,那么RTT = ta2 - ta1。这在一定程度上就能反映网络的拥堵情况了。

为什么需要用Timestamps计算RTT

TCP 在发送一个包时,会记录这个包的发送的时间 t1,用收到这个包的确认包时 t2 减去 t1 就可以得到这次的 RTT。这里有一个问题,如果发出的包出现重传,计算就变得复杂起来。无法得知收到的确认 ACK 是对第一次包还是重传包的的确认

3.2 PAWS:防止回绕的序号

我们知道序列号只有32位,而每增加2^32个序列号后就会重复使用原来用过的序列号。假设我们有一条高速网络,通信的主机双方有足够大的带宽用来快速的传输数据。例如1Gb/s(TCP 的窗口经过窗口缩放可以最高到 1GB(2^30))的速率发送报文段,则不到35秒钟数据字节的序列号就会重复。这样对TCP传输带来混乱的情况。这种情况之出现在高速链路上。而采用时间戳选项,可以很容易的分辨出相同序列号的数据报,哪个是最近发送,哪个是以前发送的。

4. Timestamps 选项在三次握手中造成的RST

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

5.使用Timestamps 选项的注意事项

  • Timestamps是双向的,必须双方都开启才有效
  • Timestamps也会溢出回绕
  • timestamps 值是一个单调递增的值,但是两端 timestamps 值增加的间隔也可能步调不一致

重学TCP协议(7) Timestamps 选项相关推荐

  1. 重学TCP协议(12)SO_REUSEADDR、SO_REUSEPORT、SO_LINGER

    1. SO_REUSEADDR 假如服务端出现故障,主动断开连接以后,需要等 2 个 MSL 以后才最终释放这个连接,而服务重启以后要绑定同一个端口,默认情况下,操作系统的实现都会阻止新的监听套接字绑 ...

  2. 重学TCP协议(11)TFO(Tcp Fast Open)

    1. TFO 为了改善web应用相应时延,google发布了通过修改TCP协议利用三次握手时进行数据交换的TFO(TCP fast open,RFC 7413). TFO允许在TCP握手期间发送和接收 ...

  3. 重学TCP协议(4) 三次握手

    1. 三次握手 请求端(通常称为客户)发送一个 S Y N段指明客户打算连接的服务器的端口,以及初始序号.这个S Y N段为报文段1. 服务器发回包含服务器的初始序号的 S Y N报文段(报文段2)作 ...

  4. 重学TCP协议(3) 端口号及MTU、MSS

    1. 端口相关的命令 1.1 查看端口是否打开 使用 nc 和 telnet 这两个命令可以非常方便的查看到对方端口是否打开或者网络是否可达.如果对端端口没有打开,使用 telnet 和 nc 命令会 ...

  5. 重学TCP协议(10)SYN flood 攻击

    1.SYN flood 攻击 SYN Flood(半开放攻击)是一种拒绝服务(DDoS)攻击,其目的是通过消耗所有可用的服务器资源使服务器不可用于合法流量.通过重复发送初始连接请求(SYN)数据包,攻 ...

  6. 重学TCP协议(6) 四次挥手

    1. 四次挥手 客户端进程发出连接释放报文,并且停止发送数据.释放数据报文首部,FIN=1,其序列号为seq=u(等于前面已经传送过来的数据的最后一个字节的序号加1),此时,客户端进入FIN-WAIT ...

  7. 重学TCP协议(5) 自连接

    1.自连接是什么 在发起连接时,TCP/IP的协议栈会先选择source IP和source port,在没有显示调用bind()的情况下,source IP由路由表确定,source port由TC ...

  8. 重学TCP协议(8) TCP的11种状态

    TCP的11种状态 为了逻辑更加清晰,假设主动打开连接和关闭连接皆为客户端,被动打开连接和关闭连接皆为服务端 客户端独有的:(1)SYN_SENT (2)FIN_WAIT1 (3)FIN_WAIT2 ...

  9. 重学TCP协议(9) 半连接队列、全连接队列

    1. 半连接队列.全连接队列基本概念 三次握手中,在第一步server收到client的syn后,把相关信息放到半连接队列中,同时回复syn+ack给client(第二步),同时开启一个定时器,如果超 ...

最新文章

  1. python学精通要多久-学习Python从入门到精通需要多长时间
  2. c#操作XML文件 1614260503
  3. notifier chain — 内核通知链【转】
  4. grafana入门学习
  5. 分布式事务处理--消息发送一致性的异常流程处理
  6. 教你如何选择网络机顶盒
  7. android 屏幕尺寸适配实现方案
  8. 许晓斌_Maven实战(二)——POM重构之增还是删
  9. 企业邮箱邮件的服务器地址是什么?企业邮箱服务器出错怎么办?
  10. GPS从入门到放弃(十七) --- 对流层延时
  11. 情绪满盈,心猿似马,人生80%的时间都在自我内耗
  12. 【已解决】Python安装TensorFlow报错“Consider adding this directory to PATH or, if you prefer to suppress this
  13. 数据仓库介绍(一) - 数据来源
  14. 电脑蓝屏代码解释与解决方案
  15. Unity赛车码表原理
  16. Gitee配置静态页面
  17. Web服务器群集——部署AWStats基于Apache的日志管理
  18. 2t移动硬盘linux无法格式化,移动硬盘无法格式化怎么办实际解决方法
  19. 邮箱如何发邮件,邮箱如何清理发信,VIP邮箱靓号是什么?
  20. Go语言实现枚举方法,const和iota结合轻松实现

热门文章

  1. IDEA快速修改类名和文件名
  2. Vivado软件(用VerilogHDL)如何使用$readmemh和$readmemb函数
  3. 1092 最好吃的月饼 (20 分
  4. Python内置数据类型之Tuple
  5. 2G、3G 和 4G
  6. ASP.NET MVC中在Action获取提交的表单数据方法总结 (4种方法,转载备忘)
  7. LeetCode 105. Construct Binary Tree from Preorder and Inorder Traversal 由前序和中序遍历建立二叉树 C++...
  8. 【Tensorflow】 Object_detection之训练PASCAL VOC数据集
  9. shell:多个文件按行合并
  10. 微信客户端<->腾讯微信服务器<->开发者服务器