ARTICLE DETAIL

资讯详情

深耕网站建设、视觉设计与SEO优化的一线实战洞察。

Modbus TCP协议详解:从报文结构到三菱FX5U主从站实战

Modbus TCP协议详解:从报文结构到三菱FX5U主从站实战 工业自动化领域里提到以太网通信Modbus TCP永远是绕不开的那一个。它没有Profinet那么“挑设备”也没有EtherCAT那么依赖专用主站很多PLC、传感器、变送器、触摸屏甚至智能电表开箱就带Modbus TCP从站功能。你不需要懂复杂的实时以太网原理也不用被厂商生态绑死只要会看报文、会排IP就能在半小时内让一套设备跟上位机跑通数据。这篇文章我打算从协议底层逻辑、报文结构、硬件电路、以及三菱FX5U的主从站实战这几个角度把Modbus TCP彻底掰开揉碎讲明白。适合刚入门自动化通信的调试工程师也适合那些平时只调过串口、第一次被要求“把设备接进局域网”的人。1. Modbus TCP到底是什么在自动化网络里的定位1.1 从Modbus家族说起RTU/ASCII/TCP的区别Modbus协议最初是Modicon在1979年搞出来的当时是给PLC之间通信用的串行协议走RS232或者RS485。后来施耐德把这个协议开放出来它就成了工业现场最常见的一种“通用语言”。早期的Modbus有两种帧形式一种叫Modbus RTU二进制传输紧凑高效另一种叫Modbus ASCII把每个字节拆成两个ASCII字符传人眼能读但效率几乎减半。如今你还能在很多老旧仪表上看到这两种模式的选择开关。Modbus TCP是后来跟着以太网流行起来的变种。它把原来Modbus的应用层报文PDU原封不动地打包到TCP/IP协议栈里外面套上一个简单明了的MBAP报文头就可以在标准以太网上跑了。重点在于应用层的寄存器模型、功能码、数据格式都没变。做过Modbus RTU的人切换到Modbus TCP几乎没有学习成本唯一的区别是以前用串口线现在用网线以前要设从站地址和波特率现在要设IP和端口。我见过很多工程师觉得“Modbus TCP不就是Modbus RTU换了根网线吗”这话其实对了一半。底层传输机制完全不一样了RTU是半双工、一主多从、轮询TCP是全双工、点对点、本质上是多主多从的客户端-服务器模型。你要还是用“轮询所有从站”的思路去写程序虽然也能跑但根本没有发挥以太网的优势。后面我会详细讲这两种模型思路上的区别这直接影响你能不能稳定地实现“多台设备同时读写”。1.2 为什么是TCP而不是UDP工程师的选择逻辑有人会问工业现场讲究实时性怎么不选UDPUDP快啊开销小啊。但Modbus TCP偏偏选了TCP这里面的逻辑值得说道说道。TCP提供了可靠传输、乱序重排、流量控制和连接管理。这些特性在IT世界里是Web浏览的基础在工业现场同样重要。你想一下这个场景你在上位机上发一条“把3号阀门的开度设为50%”的命令如果这条指令因为网络抖动丢了而你的程序没有感知阀门就可能停在错误的位置。TCP虽然会占用一些握手和确认开销但它能保证要么对方收到要么你明确知道没收到。对于绝大多数工业过程控制来说确定性比极限速度更重要。而且TCP连接本身有状态上位机一断开PLC马上能感知到这在安全联锁里非常有用。UDP不是不能用但那是给Profinet RT、EtherCAT这些实时协议留的路子。它们把实时性和同步性下沉到了网卡和从站硬件上靠的是专用芯片和精确时钟同步不是单纯地把UDP裸跑。Modbus TCP要兼容普通电脑、普通交换机、普通网线就只能依托TCP这种“大众化”可靠传输。所以Modbus官方从来没把UDP作为正式映射标准就是TCP端口502。1.3 设计上最大优势没有“帧格式地狱”直接复用应用层Modbus TCP最讨喜的一点是它几乎不引入新的标准。TCP层有成熟的网络栈应用层沿用原来的PDU结构你只需要学会一个MBAP头。相比Modbus RTU里那套CRC校验、帧间隔、地址冲突、总线仲裁这些麻烦事TCP把这些问题都揽到协议栈内部解决了。CRC校验不再需要因为TCP有校验和重传从站地址也弱化了因为IP本身就是地址。从软件开发的角度看这意味着你可以用任何支持Socket的语言写测试工具。Python、C#、Java、Node.js甚至浏览器的WebSocket都能轻松拼一个Modbus TCP报文出来。我在项目里经常用Python的pymodbus库快速验证从站设备几百行代码就能模拟一个完整的主站这在调试阶段省了太多时间。如果你只是想在办公室测试设备能不能通用网络调试助手这类工具就够了不需要装任何厂商软件。我还想强调一点Modbus TCP的设备端硬件成本极低。现在很多单片机和嵌入式处理器自带以太网MAC外挂一个几十块钱的PHY芯片就能实现网口。PLC则更简单基本是标配以太网口。这也是为什么这个老协议到今天依然有强大的生命力。2. 协议报文拆解与“读写”的应用层实现思路2.1 MBAP报文头那7个字节到底在做什么Modbus TCP的报文结构是这样的MBAP头 PDU功能码 数据。MBAP头一共7个字节名字很唬人翻译过来就是“Modbus应用协议报文头”。它由四个字段组成事务处理标识符、协议标识符、长度、单元标识符。事务处理标识符Transaction Identifier占2个字节。它是主站用来匹配请求和响应的。因为TCP是字节流没有天然的消息边界你发出去的多个请求和收回来的多个响应顺序可能不完全对应。有了事务ID你发请求时打个标签响应回来能识别出这是对应哪条指令。实际项目里我习惯把它做成自增计数器每发一条请求自动加1。30303那边响应时会原样返回这个字段。协议标识符Protocol Identifier占2个字节目前固定是0x0000。它存在的意义是将来可能在同一端口上跑不同协议现在你可以直接忽略。长度Length占2个字节它表示“从单元标识符开始到报文末尾的所有字节数量”。记住这个长度字段不含自身也不含事务ID和协议ID。计算方式很简单单元标识符1字节 PDU全部字节数。比如一条读保持寄存器请求PDU是功能码1字节 起始地址2字节 寄存器数量2字节共5个字节那么长度字段就是156十六进制写成0x0006。单元标识符Unit Identifier占1字节它相当于Modbus RTU里的从站地址。但在这里要分清两种情况如果设备直接通过以太网接入单元标识符一般填0x00或者0xFF很多设备根本不校验它如果后面挂着一个Modbus串行网关这个字段就用来指定网关后面那个串口从站的地址。这个设计让Modbus TCP能无缝兼容老的RS485总线设备。2.2 PDU与功能码对照表读取、写入、读写混合的指令设计PDU就是Modbus的功能核心里面包含功能码和数据。我给你整理一份实际项目里最常碰到的功能码对照表熟记这几个95%的调试场景你都能应付。功能码十六进制含义典型用途010x01读线圈状态读取DO输出状态020x02读离散输入状态读取DI输入点030x03读保持寄存器读取模拟量输出/参数寄存器040x04读输入寄存器读取模拟量输入/测量值050x05写单个线圈控制单个DO点060x06写单个保持寄存器设置单个参数150x0F写多个线圈批量控制DO点160x10写多个保持寄存器批量下发参数230x17读/写多个寄存器一次事务中同时读取和写入功能码背后的模型很简单线圈和离散输入都是“位”对应开关量保持寄存器和输入寄存器都是“字”对应16位模拟量或参数。保持寄存器可读可写输入寄存器通常只读。记住这个模型你在面对不同厂家的设备时脑子里要迅速判断这个数据是状态还是控制量是16位还是32位地址映射到哪个寄存器区。这些判断往往比协议本身更影响调试效率。2.3 怎么实现“同时读又同时写”事务调度与组合指令很多人第一次写Modbus TCP程序时会困惑我的需求是读一批数据马上根据读到的结果写回一些数据能不能“一个请求同时搞定”答案是可以但你要看设备支持不支持。Modbus协议本身是请求-响应模式一个主站同一时间只能发一条请求在收到响应前不应该再发新的请求。这就是为什么很多人说“Modbus天生是串行的”。所谓“同时读又写”在协议层面有两种实现思路。第一种是直接用功能码230x17读多个寄存器和写多个寄存器可以在同一条报文中完成。请求报文中同时携带读起始地址、读数量、写起始地址、写数量、写字节计数和写入数据。从站执行完写操作后马上把读到的数据返回给主站。这样做的好处是读和写在一个事务里完成时序逻辑非常连贯不会出现“写完还没读到”的中间态。很多支持Modbus的高级仪表和PLC都实现了这个功能码但不是所有设备都支持用之前一定要查手册。第二种是主站通过事务调度实现“看起来同时”。因为TCP是全双工的理论上一个连接上可以并行发多条请求。但我不推荐你这么做原因在于TCP连接上的响应可能乱序到达而Modbus TCP没有消息帧长度字段之外的解析线索如果你的程序没有按事务ID严格匹配很容易发生响应串数据的事故。稳妥的做法是单连接上严格按顺序发请求通过高速轮询把读和写交错执行。比如你每100ms扫描一轮在一个扫描周期内先发写请求紧接着发读请求两个请求间隔只有几毫秒宏观上看就是“边写边读”。这种方法不依赖设备功能码支持最通用。我还要提醒一句不要用多个TCP连接同时访问同一个从站设备除非设备手册明确支持。很多嵌入式从站实现非常简陋同一个寄存器数据集在多连接访问时没有互斥保护可能出现写冲突或数据错乱。用手头稳定的单连接模型比搞花活更可靠。3. 硬件电路、接线与设备选型别把网口当串口用3.1 PLC/仪表侧硬件形态RJ45、以太网口收发器Modbus TCP在硬件上跟普通以太网没有任何区别标准是IEEE 802.3物理层是10/100BASE-T(X)接口几乎全是RJ45。PLC、DCS、仪表厂商在设计硬件时一般在主控板上集成MAC控制器外挂一颗以太网PHY芯片再通过RJ45连接器和磁性变压器引出到机箱外部。这里面有个嵌入式朋友需要注意的点如果你是自己画板子做Modbus TCP从站设备PHY芯片和主控之间的接口通常是MII或者RMII。MII需要16根数据线速率快但占用引脚多RMII只要8根线更常用。布局时候PHY芯片的TX±、RX±是差分对需要做100欧姆差分阻抗控制一般在变压器附近会串联终端电阻和共模电感。RJ45连接器如果是带变压器的那最好能省掉不少EMC设计上的麻烦。很多工程师习惯性地把Modbus TCP的“物理层”想复杂了其实它就是一个普通网口。你完全可以用办公室剩下的超五类网线、普通千兆交换机去连设备。当然工业现场的网线建议至少用工业级超五类屏蔽双绞线接头要压制可靠网线屏蔽层要单端接地这些是现场抗干扰的基本功课。3.2 串口Modbus设备如何接入以太网网关的正确使用方式现实中存在大量只有RS485串口的老设备智能电表、温湿度变送器、老旧变频器、LED控制卡。你不可能给它们全换成带网口的型号成本太高。正规做法是加一个Modbus网关把串口Modbus RTU转化为Modbus TCP。网关的典型接法是串口侧接RS485的A/B两根线以太网侧接交换机。有些网关还需要接GND特别是通信距离远的时候GND能拉平设备间的参考电位减少共模干扰。RS485总线的终端电阻一般120欧姆位于总线两端。这里有个电磁兼容的小细节网关和PLC最好不要挂在同一台没接地的小型开关电源上否则浪涌容易把485芯片打坏。网关内部其实就是一个协议翻译器。Modbus TCP主站发过来的请求会包含单元标识符网关根据这个字段找到对应的串口从站地址然后转换成Modbus RTU帧通过串口发出去。从站响应的RTU帧再被网关翻译回TCP响应。这意味着你从上位机看来挂了多少台Modbus TCP设备取决你的IP规划而实际上每一个IP背后可能是一整个485总线网络。这种“IP单元标识符”的二级寻址结构是Modbus TCP在工厂里最典型的部署方式。3.3 接线与网络设计中的常见坑实际部署Modbus TCP网络时我踩过不少坑列几个最有代表性的。第一个坑是IP地址冲突。工厂里设备很多有些老设备支持DHCP有些只能写死静态IP一旦两台设备撞了IP整个网络里会出现时通时断的诡异故障。规矩做法是设计一张IP分配表自动化网段单独划分比如用192.168.10.x并且网内所有自动化设备都用静态IP只有上位机才考虑用DHCP保留地址。第二个坑是网络规模失控。有的项目图方便把Modbus TCP设备直接接到管理办公网。这很危险办公网的广播风暴、病毒扫描、大流量下载都会影响自动化通信的实时性甚至导致PLC通信超时。设计上一定要物理隔离或VLAN隔离自动化网络用独立交换机需要跟MES等上位系统联动时再通过工业防火墙做访问控制。第三个坑是网线质量和长度。以太网双绞线的有效传输距离是100米这是规范上限。如果超过这个距离要么用工业级交换机级联要么用光纤收发器转光通信。我在现场遇到过一根看起来好好的成品网线压接工艺差导致线对接触不良设备时好时坏排查了大半天。后来养成习惯竣工前所有网线都拿测线仪测过别省这一步。第四个坑是接地。工业现场变频器、伺服驱动器启停时会产生很强的电磁干扰网线屏蔽层如果两端都接地反而可能形成地环路电流干扰更严重。标准做法是屏蔽层单端接地通常在实际靠近控制柜那端接地。4. 三菱FX5U主从站Modbus TCP实战配置记录4.1 配置前的准备GX Works3里的网络参数设置要拿三菱FX5U做Modbus TCP通信最核心的是理解它的以太网端口配置。FX5U本体集成一个以太网口默认情况下启用SLMP协议也就是三菱原生的无缝消息协议。但很多项目要求对接第三方设备或上位机对方只认Modbus TCP这时候就要在GX Works3里把模块参数改好。打开GX Works3导航到“参数”-“FX5UCPU”-“模块参数”-“以太网端口”。这里首先要设置IP地址、子网掩码和默认网关。IP地址规划好之后关键是通信协议支持设置。FX5U本身从软件角度直接支持MODBUS/TCP作为从站也就是上位机可以主动读FX5U的数据寄存器。如果你需要FX5U作为主站去读别家的设备则要使用Socket通信功能或者调用相应的功能块。这里要提一个很多人忽略的点FX5U的以太网端口默认开启了很多服务比如SLMP、FTP、Web服务器、MELSOFT连接。在自动化环境里建议把用不到的服务全部关闭只保留你实际使用的协议通道。这不仅能减少安全暴露面还能避免某些服务占用额外内存和扫描时间。4.2 把FX5U做成Modbus TCP从站三步走如果你只是想把FX5U接入上位机组态软件让WinCC、组态王或者自研SCADA来读写数据那FX5U做从站最简单基本不需要写什么程序逻辑。第一步在GX Works3的以太网端口设置里把“MODBUS/TCP通信”相关的支持项启用。第二步规划好你要被上位机访问的软元件映射关系。FX5U的软元件都有对应的Modbus地址规则比如D区作为保持寄存器被映射为Modbus地址40001起M点作为线圈被映射为00001起。具体对应表你在软件帮助里搜“MODBUS/TCP 功能”就能查到。第三步写一个简单的初始化程序比如上电后设置一些初始值其余时间CPU会自动响应来自网口的Modbus请求。也就是说FX5U做从站时通信自行处理你只需要管业务逻辑。我实际在项目里Down程序后直接用Modbus Poll工具测试读写响应时间基本在12ms级别非常稳定。从站模式适合那种“PLC作为现场采集端上位机做监控”的结构。但如果你有两台PLC之间要交换数据或者PLC需要主动去读智能仪表那就得让FX5U做主站走编程这条路。4.3 让FX5U做主站Socket通信编程思路FX5U做Modbus TCP主站严格说并没有直接封装好的“MODBUS主站指令”通用的做法是用Socket指令自己拼报文自己解析响应。听起来好像很底层但其实只要抓住Modbus TCP的报文结构写起来并不难。用到的指令主要是这几条SP.SOCOPEN打开TCP连接SP.SOCSND发送数据SP.SOCRCV接收数据SP.SOCCLOSE关闭连接。在GX Works3里这些指令一般出现在“指令”-“以太网通信”菜单下。编程前你要先在以太网端口参数里新建一个Socket通信的“打开设置”指定对方IP地址和端口号比如常见的502分配一个通信协议代码并预留发送和接收缓冲区。然后在主程序里按“打开连接 - 拼接报文 - 发送 - 等待接收 - 解析报文 - 关闭或复用连接”的流程编写梯形图或ST程序。我要特别提醒TCP连接打开是有时间开销的不要每发一条请求就打开一次连接那样效率极低。正确的是上电时打开一次然后循环里反复使用同一个Socket除非断线才重新连接。4.4 一个完整的读保持寄存器报文示例与解析比如你想读取从站地址为1、起始寄存器地址40001、数量2个保持寄存器的数据。对应Modbus功能码是03寄存器地址在报文里要换算成从0开始的地址40001对应地址0所以起始地址写0x0000数量写0x0002。请求报文如下事务ID 0x0001 协议ID 0x0000 长度 0x0006 单元标识 0x01 功能码 0x03 起始地址 0x0000 寄存器数 0x0002完整发送数据就是00 01 00 00 00 06 01 03 00 00 00 02。注意长度字段等于单元标识1字节PDU 5字节6字节。这个报文你要是不介意事务ID是多少用网络调试助手发给FX5U从站它就会回你类似下面这样的报文00 01 00 00 00 07 01 03 04 00 64 00 0A对应解析事务ID 0x0001长度0x0007单元标识0x01功能码0x03随后是字节计数0x04表示后面有4字节数据再后面两个寄存器值分别是0x0064十进制100和0x000A十进制10。看到没Modbus TCP的响应数据是标准的“大字端”高字节在前低字节在后解析时千万别弄反。4.5 写操作与批量读改写指令报文示例写单个寄存器用功能码06。比如向地址0x0001写入0x00C8十进制200报文是00 02 00 00 00 06 01 06 00 01 00 C8写多个寄存器用功能码160x10。假设要向地址0x0000开始连续写两个寄存器值分别是0x1111和0x2222报文是00 03 00 00 00 0B 01 10 00 00 00 02 04 11 11 22 22长度字段0x000B11来源单元标识1 功能1 起始地址2 寄存器数量2 字节数1 数据4 11。如果要“又读又写”检查设备是否支持功能码230x17。请求报文的结构是读起始地址、读数量、写起始地址、写数量、写字节计数、写入数据。举个例子读地址0读2个寄存器同时写地址10写1个寄存器0x123400 04 00 00 00 0F 01 17 00 00 00 02 00 0A 00 01 02 12 34长度是15字节计算方式就是单元标识1 功能1 读地址2 读数量2 写地址2 写数量2 写字节数1 数据2 13等等我算一下11222212 130x0D。刚才我写0x0F就错了这里要特别小心。实际调试中这类长度算错是低级但常见的错误用报文调试工具时一眼就能发现问题。4.6 上位机/触摸屏/SCADA并行访问注意事项一个FX5U从站往往会被多个客户端同时读比如现场有触摸屏、中控室有上位机、远程还有数据网关。FX5U自己的以太网口支持多个连接但每个连接都消耗资源而且如果你用的是Socket通信功能占用的连接是有限的。我建议的架构是设置一台设备作为“主控制器”其他设备通过它中转数据而不是所有客户端都直接对PLC频繁读写。尤其是触摸屏它与PLC之间的通信频率不低如果同时再挂一台组态软件频繁读写同一片D区PLC的扫描周期可能被拉长。实测遇到过一种情况触摸屏每秒读几十个寄存器没问题但上位机也以100ms周期读同样区域PLC的通信处理时间显著上升导致逻辑程序在一个扫描周期内处理不完循环时间从5ms涨到20ms。解决方案就是降低上位机轮询频率或者把数据区拆分让不同客户端访问不同寄存器区域。5. 踩坑记录与排查技巧5.1 常见故障速查表连接失败/超时/数据不对这几个问题是我在Modbus TCP调试中被问得最多、也是自己踩得最多的。现象可能原因排查手段上位机连不上设备的502端口设备未上电/网线不通/IP不在同一网段先ping设备IP再检查网线链路指示灯连接正常但请求超时设备程序没初始化好/单元标识符错误/报文长度算错用网络调试助手手动发报文抓包看响应能通信但数据都是0寄存器地址映射错误/读写区域不对确认Modbus地址起始关系比如40001对应地址0还是1数据时好时坏事务ID匹配混乱/多个连接并发访问改为单连接单事务模型开启抓包分析偶尔出现乱码大数字节序错误/32位数据高低字交换按设备手册调整word order和byte order掉线后无法重连Socket未关闭/资源泄漏检查PLC程序里连接管理逻辑确保断线执行关闭这里我要单拎出“ping通但Modbus不通”的情况。以太网层是通的不代表应用层正常。有可能是设备Modbus功能没使能有可能是防火墙拦截了502端口有可能是上位机的Socket请求里带了非法字段被设备静默丢弃。排查这种事情最有效的工具就是抓包。Wireshark打开过滤tcp.port 502把请求和响应报文一条条对比问题基本立刻现形。5.2 字节序和数据类型转换32位浮点最容易翻车Modbus寄存器是16位一个32位浮点数要占用两个寄存器。不同厂家在存放浮点数时有两种约定一种是高16位在前大端模式一种是低16位在前。更麻烦的是同样是大端模式有的设备把浮点数的字序列和字节序列都按大端处理有的则混合排列比如“字大端、字节小端”。这直接导致同一个设备的两个寄存器读回来如果按错误顺序拼装数值完全对不上而且是“看起来合理但不正确”的那种错法特别坑。我在对接一个进口温控器时温度读出来变成了几千万的乱数检查半天才发现是寄存器字序反了。解决办法是调通之前先看设备手册里的“数据映射表”它会说明寄存器地址对应什么数据、几个寄存器、何种字节序。如果没有说明你就写一个测试程序写入一个已知的小数比如0x3F800000IEEE 754的1.0然后读回来看它落在哪两个寄存器的什么位置。这种“写已知值再读回比对”的方式是万能的。5.3 实测心得多连接、扫描周期、并发读写的优化说实话Modbus TCP作为工业以太网通信协议它的“技术天花板”不高速度也不算快但它赢在简单、通用、不容易出错。实际做项目我总结了几条容易忽略但能提升稳定性的心得。第一没有必须用奇奇怪怪方式并行读写就坚持单连接单请求。主站轮询100个寄存器点别每个点发一条请求能用功能码03一次把连续区域读完就一次读完能用16批量写就批量写。报文越少出错概率越低。第二通信超时时间要设置得合理不要太短。PLC与上位机之间的以太网通信正常响应时间在几毫秒到几十毫秒之间但如果上位机系统繁忙或者网络经过多级交换可能出现几百毫秒的延迟。我一般把主站请求超时设为500ms到1秒重试次数2次这样既有实时性又不会因为偶发延迟导致连锁报警。第三TCP连接异常断开后设备端有时候需要几十秒才能感知并释放资源如果你立即重连可能被拒绝。这时候程序里要做“断线重连”的退避策略第一次立即重连失败后隔1秒再试再失败隔5秒、10秒防止疯狂重连把设备端口堵死。5.4 一个现场排查的真实记录最后给你分享一个我印象很深的排错案例。某个车间用FX5U作为Modbus TCP主站去读48台智能电表电表挂在交换机下面的多个串口网关上。系统运行几个小时后部分电表的数据开始不刷新重启上位机程序又能恢复一段时间。我抓包看了一下发现上位机发出的请求里事务ID是连续的但某些响应回来也正常偏偏有几个电表对应的请求发出去后TCP层显示对端回复了RST包连接被直接中断。进一步排查发现那几个网关设备在长时间运行后TCP栈的内存碎片化连接超过一定数量后新连接被拒绝。这是网关固件的问题最终联系厂家升级了固件同时把上位机轮询周期从100ms放宽到300ms并把一个网关下的电表数量拆成两个网关分担问题才彻底解决。从这个案例能看到Modbus TCP虽然协议本身很稳但设备端的嵌入式实现质量参差不齐你作为集成工程师必须有抓包和协议分析的基本功。多留一份心眼不要把问题仅归咎于“协议不行”多数时候是设备实现细节或者工程配置问题。6. 我最后想补的一个小建议如果你现在正准备在项目里用Modbus TCP我强烈建议你动手做一遍实验用网络调试助手或者Python脚本手动拼接一个读保持寄存器的请求报文发给任意一台支持Modbus TCP的设备再把响应报文逐字节解析出来。这个过程看起来原始但比我见过任何高深理论都更能帮你建立对协议的感觉。等你亲手拼过一条请求、亲眼看到响应里数据的字节排列以后再面对各种厂家的“兼容性问题”你就不会慌了因为你知道底层无非就是那个7字节的MBAP头加PDU无论包装成什么样子根都在那里。
返回列表