Modbus TCP报文详解与wireshark抓包分析

目录

Modbus TCP报文详解

1、MBAP(报文头)

2、PDU(帧结构)

 2.1 PDU=功能码+数据。

2.2 功能码:

2.3 报文的详细解读

1、 0x01:读线圈

2、0x03:读保持寄存器

Modbustcp通过wireshark抓包分析

扩展 知识:

linux系统下通过tcpdump命令抓包 

longCDAB与longABCD的区别


Modbus TCP报文详解

原文地址:https://www.cnblogs.com/piaoyidianhong/p/16927070.html

Modbus=报文头(MBAP)+帧结构(PDU) 

下载Modbus Slave(服务器)和Modbus Poll(客户端)两个软件测试了解一下Modbus。其实Modbus TCP就是使用TCP协议传输数据,传输的数据是Modbus格式。

客户端传输数据时是以十六进制发送,每次发送两位;服务器接收数据时也是以十六进制的形式接收,每次接收两位。 如:0X00,两位十六进制数是8位二进制数(1字节)。

1、MBAP(报文头)

 (1)事务标识符:可以解释为报文的序列号,由于我们测试使用的Modbus Poll客户端是一直发送数据,所以每发送一次数据标识符就加一。服务器接收时会把这个数据原封返回。

 (2)协议表示:00 00代表TCP协议。
 (3)长度:表示从单元标识符开始后面数据的长度。如:00 06表示后面有0X06个字节长度的数据。
 (4)单元标识符:相当于设备的地址。一般为01。

2、PDU(帧结构)

 2.1 PDU=功能码+数据。

2.2 功能码:

(1)modbus的操作对象有四种:线圈、离散输入、输入寄存器、保持寄存器。
线圈:相当于开关,在MODBUS中可读可写,数据只有00和01。
离散量:输入位,开关量,在MODBUS中只读。
输入寄存器:只能从模拟量输入端改变的寄存器,在MODBUS中只读。
保持寄存器:用于输出模拟量信号的寄存器,在MODBUS中可读可写。

(2)根据对象的不同,modbus的功能码有:
0x01:读线圈
0x05:写单个线圈
0x0F:写多个线圈
0x02:读离散量输入
0x04:读输入寄存器
0x03:读保持寄存器
0x06:写单个保持寄存器
0x10:写多个保持寄存器

2.3 报文的详细解读

这里只介绍读线圈和保持寄存器内容,以下数据全部位16进制数据。

1、 0x01:读线圈

请求:00 01 00 00 00 06 01 01 00 02 00 04(客户端)
00 01:事务标识符
00 00:Modbus TCP协议
00 06:后面有00 06个字节数据
01:单元标识符
01:功能码(读线圈)
00 02:开始读的数据的地址。从00 02开始读数据。
00 04:注意这里不是读到00 04,而是从开始位置读00 04个数据。
这段报文就是请求读从 00 00 开始的 00 08 个数据。

回应:00 01 00 00 00 04 01 01 01 0E(服务器)
00 01:事务标识符
00 00:Modbus TCP协议
00 04:后面有00 04个字节数据
01:单元标识符
01:功能码
01:后面有01个字节的数据
0E:表示所读地址的线圈全是2的位置是0,其余是1
说明:线圈是只有00和01两种格式,所以图中从2的位置开始读到的4位数据是:1110(二进制),转化为十六进制就是0E。

 线圈读取

2、0x03:读保持寄存器

请求:00 01 00 00 00 06 01 03 00 02 00 04(客户端)
00 01:事务标识符
00 00:Modbus TCP协议
00 06:后面有00 06个字节数据
01:单元标识符
03:功能码(读保持寄存器)
00 02:开始读的数据的地址。从00 02开始读数据。
00 04:注意这里不是读到00 04,而是从开始位置读00 04个寄存器数据。
回应:00 01 00 00 00 0B 01 03 08 00 00 00 37 00 00 00 00(服务器)
00 01:事务标识符
00 00:Modbus TCP协议
00 09:后面有00 09个字节数据
01:单元标识符
03:功能码
08:后面有08个字节的数据,后面的数据每两位表示一个寄存器数据。(此处数据为16位)
00 00:第一个寄存器数据
00 37:第二个寄存器数据,图中我写入的数据是55(十进制),这里是十六进制数据
00 00:第三个寄存器数据
00 00:第四个寄存器数据

读保持寄存器

Modbustcp通过wireshark抓包分析

从站
 
 主站

报文如下
Tx:034-00 13 00 00 00 06 01 03 00 00 00 14 
Rx:035-00 13 00 00 00 03 01 83 01 
Tx:036-00 14 00 00 00 06 01 03 00 00 00 14 
Rx:037-00 14 00 00 00 03 01 83 01 
Tx:038-00 15 00 00 00 06 01 03 00 00 00 14 
Rx:039-00 15 00 00 00 03 01 83 01 
Tx:040-00 16 00 00 00 06 01 04 00 00 00 14 
Rx:041-00 16 00 00 00 2B 01 04 28 00 00 00 00 00 37 00 06 00 00 00 00 FF FE 00 00 FF FF 00 00 00 00 FF FF 00 00 00 08 00 00 00 00 FF FF 00 00 FF FF FF FE 
Tx:042-00 17 00 00 00 06 01 04 00 00 00 14 
Rx:043-00 17 00 00 00 2B 01 04 28 00 00 00 00 00 37 00 06 00 00 00 00 FF FE 00 00 FF FF 00 00 00 00 FF FF 00 00 00 08 00 00 00 00 FF FF 00 00 FF FF FF FE 
Tx:044-00 18 00 00 00 06 01 04 00 00 00 14 
Rx:045-00 18 00 00 00 2B 01 04 28 00 00 00 00 00 37 00 06 00 00 00 00 FF FE 00 00 FF FF 00 00 00 00 FF FF 00 00 00 08 00 00 00 00 FF FF 00 00 FF FF FF FE 
Tx:046-00 19 00 00 00 06 01 04 00 00 00 14 
Rx:047-00 19 00 00 00 2B 01 04 28 00 00 00 00 00 37 00 06 00 00 00 00 FF FE 00 00 FF FF 00 00 00 00 FF FF 00 00 00 08 00 00 00 00 FF FF 00 00 FF FF FF FE (此寄存器数据为32位占4字节)

wireshark抓取的数据包

实际应用中请求的数据可能并不连续,分析如下:

首先找到序列号为1的报文

扩展 知识:

Modbus报文下载
链接:https://pan.baidu.com/s/1MXzsB2DDVl4CT5DqVWmFng?pwd=1221 
提取码:1221 

若从站使用端口为默认502端口报文协议会显示Modbus

linux系统下通过tcpdump命令抓包 

tcpdump是一个用于截取网络分组,并输出分组内容的工具,简单说就是数据包抓包工具。tcpdump凭借强大的功能和灵活的截取策略,使其成为Linux系统下用于网络分析和问题排查的首选工具。可以将tcpdump命令输出保存到文件后利用wireshark软件进行数据分析
# tcpdump -D
1.bluetooth0 (Bluetooth adapter number 0)
2.nflog (Linux netfilter log (NFLOG) interface)
3.nfqueue (Linux netfilter queue (NFQUEUE) interface)
4.usbmon1 (USB bus number 1)
5.usbmon2 (USB bus number 2)
6.ens33
7.any (Pseudo-device that captures on all interfaces)
8.lo [Loopback]
-D 打印出系统中所有可以用tcpdump截包的网络接口
# tcpdump -i ens33 -c 200 -w xxx.pcap  注释:只获取监听网卡ens33的200帧数据并将结果保存到文件xxx.pcap(可使用绝对路径)
-c 在收到指定的数量的分组后,tcpdump就会停止
-i 指定监听的网络接口
-w 直接将分组写入文件中,而不是分析并打印出来

longCDAB与longABCD的区别

  • 10
    点赞
  • 42
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: TCP三次握手和四次挥手是TCP协议建立和关闭连接时所采用的步骤。 三次握手是在客户端和服务器之间建立TCP连接时的过程。首先,客户端向服务器发送一个请求连接的数据包,该数据包包含一个随机生成的序列号(SYN),表示客户端希望建立连接。服务器接收到该请求后,向客户端回复一个确认连接的数据包,该数据包包含其自己生成的一个随机序列号(SYN-ACK),表示服务器同意建立连接。最后,客户端再次向服务器发送一个确认连接的数据包,该数据包中包含服务器的序列号加一(ACK),表示客户端接受服务器的连接请求。这样,TCP连接就建立起来了。 四次挥手是在客户端和服务器关闭TCP连接时的过程。首先,客户端发送一个关闭连接的请求数据包(FIN),表示客户端想要关闭连接。服务器收到该请求后,向客户端回复一个确认关闭连接的数据包(ACK),但自己的数据可能没有发送完毕。服务器等到自己的数据发送完毕后,发送一个自己的关闭连接请求数据包(FIN),表示服务器也希望关闭连接。客户端收到服务器的请求后,回复一个确认关闭连接的数据包(ACK),然后等待一段时间,确保服务器收到了该数据包。最后,客户端和服务器都关闭连接,四次挥手过程完成。 通过Wireshark抓包分析TCP三次握手和四次挥手可以观察到每个数据包的源地址、目标地址、序列号、确认号等信息。可以通过Wireshark的过滤功能筛选出TCP协议相关的数据包进行分析。通过分析数据包的交互过程,可以确认连接建立和关闭的状态是否符合预期,并可以进一步分析网络延迟、丢包等问题。 综上所述,Wireshark抓包分析TCP三次握手和四次挥手可以帮助我们深入理解TCP连接的建立和关闭过程,以及发现网络故障的根源。 ### 回答2: TCP是一种常用的传输层协议,它通过进行三次握手来建立连接,并进行四次挥手来终止连接。 三次握手的过程如下: 1. 客户端发送一个SYN标志位的TCP报文段给服务器,表示请求建立连接; 2. 服务器收到请求后,回复一个带有SYN和ACK标志位的TCP报文段给客户端,表示同意建立连接; 3. 客户端收到服务器的回复后,再次发送一个带有ACK标志位的TCP报文段给服务器,表示连接建立成功。 四次挥手的过程如下: 1. 客户端发送一个FIN标志位的TCP报文段给服务器,表示希望断开连接; 2. 服务器收到请求后,回复一个带有ACK标志位的TCP报文段给客户端,表示确认收到断开请求; 3. 服务器完成数据的发送后,发送一个带有FIN标志位的TCP报文段给客户端,表示自己也要断开连接; 4. 客户端收到服务器的断开请求后,发送一个带有ACK标志位的TCP报文段给服务器,表示确认断开,并进入TIME_WAIT状态。 在三次握手的过程中,第一次握手是客户端发起的,第二次握手是服务器回复同意建立连接,第三次握手是客户端回复确认连接。这个过程是为了确保双方都同意建立连接,以保证数据传输的可靠性。 在四次挥手的过程中,首先客户端发送断开请求,服务器回复确认,然后服务器发送断开请求,客户端回复确认。这个过程是为了保证双方都断开连接,并确保数据完整性。 Wireshark是一款网络抓包分析工具。使用Wireshark可以捕获网络数据包,并对数据包进行解析分析。通过Wireshark,我们可以看到每个TCP报文段的具体内容,并对三次握手和四次挥手的过程进行详细分析

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值