ModbusTCP不是“协议”,是裸奔的工业数据管道
你有没有在Wireshark里点开一个ModbusTCP包,看着那一串明晃晃的0x03 0x00 0x01 0x00 0x0a发过呆?
——功能码0x03(读保持寄存器)、起始地址0x0001(即寄存器40001)、数量0x000a(10个)……
所有字段,一字不落,全在以太网帧里摊开晾着。没有密码,没有签名,没有“请出示工牌”,甚至连个“您确定要写这个寄存器吗?”的确认弹窗都没有。
这不是设计疏忽,而是时代烙印:Modbus诞生于1979年,TCP/IP栈还没成形;ModbusTCP定型于1999年,那时工厂车间连防火墙都少见,“网络”和“控制”还住在两个山头。它本就不是为联网而生,却被推上了工业互联网的第一线——成了全球60%以上中低端控制器默认的“通用语言”,也成了黑客眼里最省力的突破口。
所以,别再把它当“协议”来学了。把它当成一根裸露的工业数据管道来理解:水流(数据)怎么进、往哪流、谁在管闸门、有没有人偷偷接旁路……这才是真正决定产线安危的关键。
看清这根管道:MBAP头不是装饰,是唯一的“门禁卡”
ModbusTCP没有“握手”,没有“会话密钥”,甚至没有“连接状态”。它的全部逻辑,压在7个字节的MBAP头上——这是整条管道上唯一能被设备主动识别并响应的结构。
+----------------+--------+----------------+----------+ | Transaction ID | Proto | Length | Unit ID | | (2B) | ID(2B) | (2B) | (1B) | +----------------+--------+----------------+----------+- Transaction ID