从wireshark抓包看TCP头部时间戳

article/2025/4/25 23:10:14

本文于2020年8月23日首发于个人公众号“码农的修炼之道”,欢迎关注。

不知道大家有没有注意到,wireshark抓取tcp报文的时候,大部分时候的报文是如下图所示的,其中带了Seq,Win和Len字段,分别对应了报文序列号、滑动窗口和tcp报文长度。
wireshark抓包1
有时候,也会在报文中看到TSval 和 TSecr 这两个参数,如下图所示。
wireskark抓包2
那么这个参数来源于哪里呢?又有什么作用呢?

1、原理

时间戳(TCP Timestamps Option,TSopt)来源于TCP报文头部的Option选项。这个选项在 TCP 头部的位置如下所示。
在这里插入图片描述
比如下图,我们抓包的报文中的时间戳选项在option中。
在这里插入图片描述
TCP的时间戳由四部分构成:类别(kind)、长度(Length)、发送方时间戳(TS value)、回显时间戳(TS Echo Reply)。时间戳选项类别(kind)的值等于 8,用来与其它类型的选项区分。长度(length)等于 10。两个时间戳相关的选项都是 4 字节。
在这里插入图片描述
是否使用时间戳选项是在三次握手里面的 SYN 报文里面确定的。那么这个时间戳选项有什么作用吗?主要有两个作用:

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

2、RTT原理

由于在真实的网络中,各种丢包情况普遍存在,因此有一套超时重传机制,也就是我们以前说的 TCP中的几种定时器 《聊聊TCP中的几个定时器》,那么超时重传的时间如何设置呢?

为了动态地设置,TCP引入了RTT(Round Trip Time),也就是一个数据包从发出去到回来的时间。这样发送端就大约知道需要多少的时间,从而可以方便地设置Timeout——RTO(Retransmission TimeOut),以让我们的重传机制更高效。

但是实际上RTT的计算比较复杂,如下图a所示,发生了重传,如果按照第一次的报文和ACK计算出来的RTT就比较大了,不合理。如图b所示,重传后收到了原始报文的ACK,这样计算出来的RTT偏小,也不合理。
RTT原理
因此,在启用 Timestamps 选项以后,因为 ACK 包里包含了 TSval 和 TSecr,这样无论是正常确认包,还是重传确认包,都可以通过这两个值计算出 RTT。关于RTO计算算法,资料也比较多了。比如RFC793中定义的经典算法是这样的:
RFC793
比如目前Linux下使用的RTO计算算法为Jacobson / Karels 算法:
RFC2988

3、序列号回绕PAWS

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

如果有 Timestamps 的存在,内核会维护一个为每个连接维护一个 ts_recent 值,记录最后一次通信的的 timestamps 值,当收到的数据包中 timestamps 值小于 ts_recent 值,就会丢弃掉这个数据包。等收到的数据包的timestamps 值大于 ts_recent,这个包可以被正常接收。

实际上timestamps 值是一个单调递增的值,这个选项不要求两台主机进行时钟同步。两端 timestamps 值增加的间隔也可能步调不一致,比如一条主机以每 1ms 加一的方式递增,另外一条主机可以以每 200ms 加一的方式递增。此外,timestamps 是一个双向的选项,如果只要有一方不开启,双方都将停用。

在Linux下可以通过下面方式开启或关闭timestamp功能。

//0表示关闭,1表示打开功能
cat /proc/sys/net/ipv4/tcp_timestamps


http://chatgpt.dhexx.cn/article/bbrTY8WG.shtml

相关文章

TCP、UDP、IP头部结构

数据传输在TCP/IP网络模型中,经过一层便会添加一层头部,其中TCP(网络传输协议),UDP处于传输层,IP(网间协议)处于网络层。 数据进入协议栈的封装过程 TCP/IP协议族 TCP 传输控制协议 应用程序之间通信 建立的全双工通信UDP 用户数…

TCP头部结构

TCP头部信息出现再每个TCP报文段中,用于指定通信的 源端端口,目的端口,管理TCP连接等。 1、TCP固定头部结构 16位端口号:告知主机该报文段是来自哪里(源端口)以及传给哪个上层协议或应用程序(目…

TCP头部解析

一一解析 SourcePort(源端口)和DestinationPort(目的端口):各占2个字节,端口是运输层与应用层的服务接口,运输层的复用和分用功能都要通过端口才能实现。 注:TCP的包是没有IP地址的,那是IP层上的事。但是有源端口和目标端口。 SequenceNumber(序号):占4个字节,TCP连…

以太网,IP, TCP, UDP头部格式

1.以太网帧的格式 以太网封装格式 2.IP报头格式 IP是TCP/IP协议簇中最为重要的协议。所有的TCP,UDP, ICMP和IGMP数据都以IP数据报格式传输。IP提供的是不可靠、无连接的协议。 普通的IP首部长为20个字节,除非含有选项字段。 4位版本:目前协…

网络知识入门,什么是以太网包,TCP/IP包,MAC头部,IP头部以及TCP头部(六)

目录 一、以太网包 二、协议栈中IP模块的工作方式 1.TCP委托IP模块 2.IP模块的工作方式 三、mac头部 四、何为以太网 1.以太网的定义 2.如何收发以太网包 3.以太网接收网络包详细 4.收到网络包后,协议如何工作 一、以太网包 TCP 模块在执行连接、收发、断开…

IP、TCP、UDP、HTTP头部信息

IP头部信息 ip报文段格式 版本: 占4位,表明IP协议实现的版本号,当前一般为IPv4,即0100。报头长度 : 占4位,因为头部长度不固定(Option可选部分不固定),所以需要标识…

为什么TCP头部没有数据长度信息而UDP有

先让我们看看IP,TCP,UDP的头部结构 1. IPv4 头部 2. TCP和UDP头部 可以看到IP的头部包换数据的长度,TCP的头部不包含数据长度,UDP的头部则包含。 从信息冗余的角度来看,UDP的长度信息是不需要的。 因为IPv4的头部…

TCP头部格式和封装

文章目录 12.3 TCP头部和封装12.3.1 端口号12.3.2 序列号12.3.3 头部长度12.3.4 相关控制位12.3.5 窗口大小12.3.6 校验和12.3.7 选项字段 12.3 TCP头部和封装 ​ 下图显示了TCP在IP数据报中的封装: ​ TCP头部紧跟着IP头部或者IPv6扩展头部,经常是20字…

封装与解封装(TCP头部格式)

封装和解封装: 应用层---HTTP --超文本传输协议--- TCP 80 HTTPS --- TCP 443 FTP ---文件传输协议---TCP 20/21 ITFTP ---简单文件传输协议--- UDP 69 TELNET---远程控制协议---TCP23 SSH ---TCP 22 DNS---域名解析协议---UDP和TCP 53 HDCP---动态主机配置…

TCP头部信息与UDP头部信息

TCP头部信息 源端口号以及目的端口号: 各占2个字节,端口是传输层和应用层的服务接口,用于寻找发送端和接收端的进程,通过这两个端口号和IP头部的ip发送和接收号,可以唯一的确定一个连接。    一般来讲,通…

TCP协议--TCP头部

《Linux高性能服务器编程》阅读笔记: 1. TCP协议的概念 TCP和UDP是传输层的两个主要协议。TCP相对于UDP来说,是面向连接、字节流和可靠传输。 (1) 面向连接   使用TCP通信的双方必须先建立起连接,然后才能开始数据的读写。建立连接后双方…

#TCP/IP# TCP头部选项功能详解

简单回顾下TCP报文格式 1)TCP报文:由 TCP首部 和 TCP数据 组成。2)TCP首部:由 20字节的固定长度 和 可变长字段(选项和填充)组成。3)TCP首部总长度:由TCP头中的“数据偏移”字段决定…

TCP头部格式的了解

tcp头部格式如下图所示: 1.源端口号,16位,发送方的端口号。 2.目标端口号,16位,发送方的目标端口号。 3. 32为序列号,sequence number,保证网络传输数据的顺序性。 4. 32位确认号,acknowledgment num…

TCP头部结构信息

TCP 头部结构信息 tcp头部信息出现在每个tcp报文段中,用于指定通信的源端端口,目的端口,管理tcp连接等。tcp头部结构如下图所示: tcp头部结构 1、16位端口号:告知主机该报文段来自哪里(源端口)以及传给…

计算机网络—IP头部结构,TCP头部结构,UDP头部结构

文章目录 IP头部结构TCP头部结构UDP头部结构TCP和UDP的区别MAC地址、IP地址、端口号数据传输过程图解 IP头部结构 IP头部结构图如下 注意:一行32bit为4字节,扩展的时候总是一行一行的拓展,也就是4个字节4个字节的扩展 版本号(Ve…

TCP的头部格式,详细信息都在这

重要的TCP头部格式来啦: 序列号:在建立连接时,由计算机生成的随机数作为初始值,通过SYN包传给接收方主机,每发送一次数据,就会累加一次这个数据字节数的大小,用来解决网络包乱序问题。确认应答号…

tcp 头部格式是怎样的?都有哪些字段?TCP 与 UDP 的区别

传输控制协议(Transmission Control Protocol,TCP)是一种传输层协议。TCP使数据包从源到目的地的传输更加顺畅。它是一种面向连接的端到端协议。每个数据包由TCP包裹在一个报头中,该报头由10个强制字段共20个字节和一个0到40 字节的可选数据字段组成 1…

【网络】TCP报文头部

目录 源端口、目的端口 序号()Seq 确认号 数据偏移(头部长度) URG ACK PSH RST SYN FIN 窗口大小 校验和 紧急指针 选项部分 最大报文段长度 MSS 窗口扩大 时间戳 最大报文段长度(MSS) 窗口…

TCP头部结构详解

tcp头部信息出现在每个tcp报文段中,用于指定通信的源端端口,目的端口,管理tcp连接等。tcp头部结构如下图所示: tcp头部结构 1、16位端口号:告知主机该报文段来自哪里(源端口)以及传给哪个上层协议或应用程…

TCP头部详解

1. TCP的定义 TCP提供一种面向连接的、可靠的字节流服务。 面向连接: 两个使用TCP的应用(通常是一个客户和一个服务)在彼此交换数据之前必须建立一个TCP连接。 TCP提供可靠性的方式: 1)应用数据被分割成TCP认为最适合发送的数据块; 2)当…