Modbus TCP报文详解与wireshark抓包分析 | 您所在的位置:网站首页 › modbus规约报文分析 › 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=功能码+数据。(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 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的区别 |
CopyRight 2018-2019 实验室设备网 版权所有 |