TCP报文解析


TCP报文解析

在这里插入图片描述


源端口和目的端口字段
TCP源端口(Source Port):源计算机上的应用程序的端口号,占 16 位。
TCP目的端口(Destination Port):目标计算机的应用程序端口号,占 16 位。
序列号字段
CP序列号(Sequence Number):占 32 位。它表示本报文段所发送数据的第一个字节的编号。在 TCP 连接中,所传送的字节流的每一个字节都会按顺序编号。当SYN标记不为1时,这是当前数据分段第一个字母的序列号;如果SYN的值是1时,这个字段的值就是初始序列值(ISN),用于对序列号进行同步。这时,第一个字节的序列号比这个字段的值大1,也就是ISN加1。
确认号字段
TCP 确认号(Acknowledgment Number,ACK Number):占 32 位。它表示接收方期望收到发送方下一个报文段的第一个字节数据的编号。其值是接收计算机即将接收到的下一个序列号,也就是下一个接收到的字节的序列号加1。
数据偏移字段
TCP 首部长度(Header Length):数据偏移是指数据段中的“数据”部分起始处距离 TCP 数据段起始处的字节偏移量,占 4 位。其实这里的“数据偏移”也是在确定 TCP 数据段头部分的长度,告诉接收端的应用程序,数据从何处开始。
保留字段
保留(Reserved):占 4 位。为 TCP 将来的发展预留空间,目前必须全部为 0。
标志位字段
CWR(Congestion Window Reduce):拥塞窗口减少标志,用来表明它接收到了设置 ECE 标志的 TCP 包。并且,发送方收到消息之后,通过减小发送窗口的大小来降低发送速率。
ECE(ECN Echo):用来在 TCP 三次握手时表明一个 TCP 端是具备 ECN 功能的。在数据传输过程中,它也用来表明接收到的 TCP 包的 IP 头部的 ECN 被设置为 11,即网络线路拥堵。
URG(Urgent):表示本报文段中发送的数据是否包含紧急数据。URG=1 时表示有紧急数据。当 URG=1 时,后面的紧急指针字段才有效。
ACK:表示前面的确认号字段是否有效。ACK=1 时表示有效。只有当 ACK=1 时,前面的确认号字段才有效。TCP 规定,连接建立后,ACK 必须为 1。
PSH(Push):告诉对方收到该报文段后是否立即把数据推送给上层。如果值为 1,表示应当立即把数据提交给上层,而不是缓存起来。
RST:表示是否重置连接。如果 RST=1,说明 TCP 连接出现了严重错误(如主机崩溃),必须释放连接,然后再重新建立连接。
SYN:在建立连接时使用,用来同步序号。当 SYN=1,ACK=0 时,表示这是一个请求建立连接的报文段;当 SYN=1,ACK=1 时,表示对方同意建立连接。SYN=1 时,说明这是一个请求建立连接或同意建立连接的报文。只有在前两次握手中 SYN 才为 1。
FIN:标记数据是否发送完毕。如果 FIN=1,表示数据已经发送完成,可以释放连接。
窗口大小字段
窗口大小(Window Size):占 16 位。它表示从 Ack Number 开始还可以接收多少字节的数据量,也表示当前接收端的接收窗口还有多少剩余空间。该字段可以用于 TCP 的流量控制。
TCP 校验和字段
校验位(TCP Checksum):占 16 位。它用于确认传输的数据是否有损坏。发送端基于数据内容校验生成一个数值,接收端根据接收的数据校验生成一个值。两个值必须相同,才能证明数据是有效的。如果两个值不同,则丢掉这个数据包。Checksum 是根据伪头 + TCP 头 + TCP 数据三部分进行计算的。
紧急指针字段
紧急指针(Urgent Pointer):仅当前面的 URG 控制位为 1 时才有意义。它指出本数据段中为紧急数据的字节数,占 16 位。当所有紧急数据处理完后,TCP 就会告诉应用程序恢复到正常操作。即使当前窗口大小为 0,也是可以发送紧急数据的,因为紧急数据无须缓存。
可选项字段
选项(Option):长度不定,但长度必须是 32bits 的整数倍。

使用wireshark进行捕获,设置TCP过滤条件:

在这里插入图片描述

图一

第一行对应的是第一次握手,其中[SYN]出现表明为三次握手的开始的标志。
ecwcfg向http发送一个标志为SYN=1且含有初始化序列值seq=0的数据包,开始建立会话,在初始化会话过程中,通信双方还在窗口大小Win、最大报文段长度MSS等方面进行协商。同时Source port为61131,Destination port为443,打开编号为1所示的下拉菜单,会出现对应项的更加详细的解析,如图二所示。
在这里插入图片描述

图二

第二行对应的[SYN,ACK]表明为二次握手,是对建立的确认。
http向ecwcfg发送包含确认值的数据段,如图三总Transmission Control Protocol(TCP)所示,其值等于所收到的序列值加一,即ACK=1,其自身的序列号为0;并对MSS更改为1452。源端口号Src Port为443,目的端口号Dst Port为61131。
在这里插入图片描述

图三
第三行对应的是第三次握手
ecwcfg向http发送确认值Seq=1、Ack=1(ecwcfg接收到的序列值加1),这便完成了三次握手的建立。如图7所示对应答的应答为第三次握手。

在这里插入图片描述

TCP序列号和确认号详解

在网络分析中,读懂TCP序列号和确认号在的变化趋势,可以帮助我们 学习TCP协议以及排查通讯故障,如通过查看序列号和确认号可以确定数据传输是否乱序。但我在查阅了当前很多资料后发现,它们大多只简单介绍了TCP通讯 的过程,并没有对序列号和确认号进行详细介绍,结合实例的讲解就更没有了。近段时间由于工作的原因,需要对TCP的序列号和确认号进行深入学习,下面便是 我学习后的一些知识点总结,希望对TCP序列号和确认号感兴趣的朋友有一定帮助。

  1. 序列号和确认号的简介及作用

TCP 协议工作在OSI的传输层,是一种可靠的面向连接的数据流协议,TCP之所以可靠,是因为它保证了传送数据包的顺序。顺序是用一个序列号来保证的。响应包 内也包括一个序列号,表示接收方准备好这个序列号的包。在TCP传送一个数据包时,它会把这个数据包放入重发队列中,同时启动计时器,如果收到了关于这个 包的确认信息,便将此数据包从队列中删除,如果在计时器超时的时候仍然没有收到确认信息,则需要重新发送该数据包。另外,TCP通过数据分段中的序列号来 保证所有传输的数据可以按照正常的顺序进行重组,从而保障数据传输的完整。

  1. TCP的通讯过程

在TCP通讯中主要有连接的建立、数据的传输、连接的关闭三个过程!每个过程完成不同的工作,而且序列号和确认号在每个过程中的变化都是不同的。

2.1 TCP建立连接

TCP建立连接,也就是我们常说的三次握手,它需要三步完成。在TCP的三次握手中,发送第一个SYN的一端执行的是主动打开。而接收这个SYN并发回下一个SYN的另一端执行的是被动打开。

这里以客户端向服务器发起连接来说明。

  1. 第1步 :客户端向服务器发送一个同步数据包请求建立连接,该数据包中,初始序列号(ISN)是客户端随机产生的一个值,确认号是0;

  2. 第2步 :服务器收到这个同步请求数据包后,会对客户端进行一个同步确认。这个数据包中,序列号(ISN)是服务器随机产生的一个值,确认号是客户端的初始序列号+1;

  3. 第3步 :客户端收到这个同步确认数据包后,再对服务器进行一个确认。该数据包中,序列号是上一个同步请求数据包中的确认号值,确认号是服务器的初始序列号+1。

注意 :因为一个SYN将占用一个序号,所以要加1。

初始序列号(ISN)随时间而变化的,而且不同的操作系统也会有不同的实现方式,所以每个连接的初始序列号是不同的。TCP连接两端会在建立连接时,交互一些信息,如窗口大小、MSS等,以便为接着的数据传输做准备。

RFC793指出ISN可以看作是一个32bit的计数器,每4ms加1,这样选择序号的目的在于防止在网络中被延迟的分组在以后被重复传输,而导致某个连接的一端对它作错误的判断。

2.2 TCP传输数据

在TCP建立连接后,就可以开始传输数据了。TCP工作在全双工模式,它可以同时进行双向数据传输。这里为了简化,我们只谈服务器向客户端发送数据的情况,而客户端向服务器发送数据的原理和它是类似的,这里便不重复说明。
服务器向客户端发送一个数据包后,客户端收到这个数据包后,会向服务器发送一个确认数据包。

传输数据的简要过程如下:

  1. 发送数据 :服务器向客户端发送一个带有数据的数据包,该数据包中的序列号和确认号与建立连接第三步的数据包中的序列号和确认号相同;

  2. 确认收到 :客户端收到该数据包,向服务器发送一个确认数据包,该数据包中,序列号是为上一个数据包中的确认号值,而确认号为服务器发送的上一个数据包中的序列号+所该数据包中所带数据的大小。
    数据分段中的序列号可以保证所有传输的数据按照正常的次序进行重组,而且通过确认保证数据传输的完整性。

2.3 TCP关闭连接

前 面我们提到,建立一个连接需要3个步骤,但是关闭一个连接需要经过4个步骤。因为TCP连接是全双工的工作模式,所以每个方向上需要单独关闭。在TCP关 闭连接时,首先关闭的一方(即发送第一个终止数据包的)将执行主动关闭,而另一方(收到这个终止数据包的)再执行被动关闭。

关闭连接的4个步骤如下:

  1. 第1步 :服务器完成它的数据发送任务后,会主动向客户端发送一个终止数据包,以关闭在这个方向上的TCP连接。该数据包中,序列号为客户端发送的上一个数据包中的确认号值,而确认号为服务器发送的上一个数据包中的序列号+该数据包所带的数据的大小;

  2. 第2步 :客户端收到服务器发送的终止数据包后,将对服务器发送确认信息,以关闭该方向上的TCP连接。这时的数据包中,序列号为第1步中的确认号值,而确认号为第1步的数据包中的序列号+1;

  3. 第3步 :同理,客户端完成它的数据发送任务后,就也会向服务器发送一个终止数据包,以关闭在这个方向上的TCP连接,该数据包中,序列号为服务器发送的上一个数据包中的确认号值,而确认号为客户端发送的上一个数据包中的序列号+该数据包所带数据的大小;

  4. 第4步 :服务器收到客户端发送的终止数据包后,将对客户端发送确认信息,以关闭该方向上的TCP连接。这时在数据包中,序列号为第3步中的确认号值,而确认号为第3步数据包中的序列号+1;

  • 2
    点赞
  • 45
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Modbus TCP是基于TCP/IP协议的Modbus协议的一种实现方式。在Modbus TCP中,报文采用了标准的Modbus协议格式,并通过TCP/IP进行传输。 Modbus TCP报文解析包括以下几个步骤: 1. 解析TCP首部:首先需要解析TCP首部,包括源端口号、目标端口号、序列号、确认号等信息。这些信息可以用来确定报文的发送者和接收者。 2. 解析Modbus应用协议头:Modbus报文的应用层协议头包括从站地址、功能码、数据长度等字段。从站地址用于标识Modbus设备,功能码用于指示所要执行的操作,数据长度表示后续数据的长度。 3. 解析数据部分:根据数据长度字段可以确定数据部分的长度,然后按照功能码的不同进行解析。例如,如果功能码是读取保持寄存器的操作,那么需要解析请求的起始地址和寄存器数量。如果功能码是写单个保持寄存器的操作,那么需要解析要写入的寄存器地址和数值。 4. 校验和验证:Modbus协议中包含了一个校验和字段,用于验证报文的完整性。通常使用CRC校验算法对报文进行校验。 需要注意的是,Modbus TCP报文是以字节流的形式进行传输的,因此在解析过程中需要按照字节的顺序进行解析。此外,由于Modbus协议支持多种功能码和数据类型,对不同类型的报文需要采用不同的解析方式。具体的解析方法可以参考Modbus协议的相关文档或库。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值