MBAP 头解决什么问题
Modbus TCP 在以太网上承载 Modbus 请求,报文由 7 字节的 MBAP 头加 PDU 组成。MBAP 头处理了串行链路不需要处理的问题:事务配对、协议识别与长度界定,并保留单元标识,使网关能把请求转发给串行链路上的从站。由于 TCP 已经提供校验与重传,Modbus TCP 报文中没有 CRC 字段,这是抓包分析时最容易误判的一点。
MBAP 的七个字节
| 事务标识 | 2 字节,用于请求与响应配对,由客户端生成并原样返回 |
|---|---|
| 协议标识 | 2 字节,Modbus 固定为 0x0000 |
| 长度 | 2 字节,表示其后的字节数,包含单元标识与 PDU |
| 单元标识 | 1 字节,直连设备时常为固定值,经网关时用于指定后端从站地址,以设备手册为准 |
| PDU | 功能码与数据,长度上限受协议约束 |
| 校验方式 | 依赖 TCP 校验与重传,报文内没有 CRC 字段 |
读保持寄存器示例
读保持寄存器示例
# MBAP(7 字节):事务 0001,协议 0000,长度 0006,单元 01
00 01 00 00 00 06 01 03 00 00 00 02 # 其后为 PDU:03 00 00 00 02
# 长度为 6,表示单元标识 1 字节加 PDU 5 字节
# 响应中事务标识与协议标识应与请求一致,便于客户端配对字段判读
| 字段 | 长度 | 含义 | 常见问题 |
|---|---|---|---|
| 事务标识 | 2 字节 | 请求响应配对 | 多客户端下未正确配对导致响应错位 |
| 协议标识 | 2 字节 | 固定为 0 | 非 0 时通常被直接丢弃 |
| 长度 | 2 字节 | 其后字节数 | 与实际不符会被拒绝或截断 |
| 单元标识 | 1 字节 | 目标从站或网关路由 | 经网关时填写错误导致异常或无响应 |
| PDU | 不定长 | 功能码与数据 | 长度或数量超限返回异常码 |
排错观察点
- 无响应:先确认端口、单元标识与目标设备是否一致
- 连接被拒或被重置:检查设备是否限制并发连接数
- 响应内容与请求不匹配:多客户端场景下事务标识配对是否正常
- 网关后端设备无响应:核对单元标识映射与串口参数
- 抓包发现协议标识非 0:该报文不会被当作 Modbus 处理
单元标识在不同实现中的语义并不统一:直连设备时可能被忽略或要求固定填写,经串口网关时用于指定后端从站地址。跨网关调试前必须先确认其含义,否则容易出现 TCP 侧可达而后端设备无响应的情况。
Modbus TCP 没有认证机制,能建立连接的一方通常可以直接读写数据区,因此它不应跨越信任边界暴露。跨区访问必须由防火墙或网关做来源与功能码限制。