工业通信协议深度解析Wireshark抓包实战IEC 104规约全流程在电力自动化系统中IEC 60870-5-104规约作为TCP/IP网络上的关键通信标准承载着遥测、遥信、遥控等核心功能的实时数据传输。本文将带您深入理解如何通过Wireshark这一专业网络分析工具从底层报文交互的视角完整解析IEC 104规约的工作机制。不同于简单的协议介绍我们将聚焦实际运维中遇到的连接异常、数据丢包、时序错乱等典型问题提供可立即应用于生产环境的诊断方法论。1. 环境准备与基础配置1.1 Wireshark抓包环境搭建工欲善其事必先利其器。在进行IEC 104规约分析前需要确保Wireshark正确配置# 在Linux系统安装最新版Wireshark sudo apt update sudo apt install wireshark # 将当前用户加入wireshark组避免权限问题 sudo usermod -aG wireshark $USER注意生产环境中建议使用端口镜像或网络分光器获取流量避免直接在主通道上抓包影响业务关键配置步骤网卡选择在Capture菜单下选择连接SCADA系统的物理网卡或虚拟接口捕获过滤器设置tcp port 2404限定只抓取IEC 104默认端口流量显示过滤器预设tcp.port 2404 iec60870_104快速定位规约报文1.2 IEC 104规约报文结构速览IEC 104采用典型的APDU结构每个数据单元包含字段长度(字节)说明示例值启动字符1固定0x6868APDU长度1控制域ASDU总长1C控制域4传输控制信息00 00 00 00ASDU可变实际业务数据01 8F 14 00...控制域格式解析I格式信息帧包含发送/接收序号占4字节S格式确认帧仅含接收序号占2字节U格式控制帧用于启停连接占1字节2. 连接建立与维持机制2.1 TCP三次握手与104会话启动通过Wireshark观察完整的连接建立过程TCP层握手No. 时间 源IP 目标IP 协议 长度 信息 1 0.000000 192.168.1.1 192.168.1.2 TCP 66 [SYN] Seq0 Win8192 2 0.000042 192.168.1.2 192.168.1.1 TCP 66 [SYN, ACK] Seq0 Ack1 3 0.000053 192.168.1.1 192.168.1.2 TCP 54 [ACK] Seq1 Ack1104规约U帧交互主站发送STARTDT激活指令68 04 07 00 00 00子站回复STARTDT确认68 04 0B 00 00 00典型故障若5秒内未收到STARTDT确认主站会重发U帧连续3次失败将断开TCP连接2.2 心跳机制与链路维护正常通信时双方通过S帧进行链路维护No. 时间 源IP 目标IP 协议 长度 信息 45 12.342.111 192.168.1.2 192.168.1.1 IEC104 12 [S] Rx36关键参数说明t0超时心跳间隔默认30秒t1超时发送帧等待确认时间默认15秒t2超时收到数据后确认延迟默认10秒3. 业务数据传输分析3.1 总召唤过程报文解析完整的总召唤GI流程包含四个阶段主站发起召唤# 类型标识100传送原因6激活 68 0E 00 00 02 00 64 01 06 00 01 00 00 00 00 14子站确认召唤# 类型标识100传送原因7激活确认 68 0E 00 00 04 00 64 01 07 00 01 00 00 00 00 14数据传输阶段单点遥信类型168 1C 00 00 06 00 01 8F 14 00...双点遥信类型368 1C 00 00 08 00 03 8F 14 00...结束确认# 类型标识100传送原因10激活终止 68 0E 00 00 0A 00 64 01 0A 00 01 00 00 00 00 143.2 循环数据传输模式子站主动上传的遥测数据典型结构68 22 5E 0C 08 00 09 04 03 00 01 00 02 07 00 FF 7F 01 06 07 00 2D 20 00 0E 07 00 DD 1C 00字段解析09类型标识归一化测量值04可变结构限定词SQ04个信息体03 00传送原因3突发01 00公共地址站号102 07 00信息体地址0x07024. 典型故障诊断案例4.1 接收序号不连续问题当出现以下报文序列时表明存在丢包No. 时间 源IP 目标IP 协议 长度 信息 123 15:30:22 192.168.1.1 192.168.1.2 IEC104 [I] Tx50 Rx42 124 15:30:23 192.168.1.2 192.168.1.1 IEC104 [S] Rx50 125 15:30:25 192.168.1.1 192.168.1.2 IEC104 [I] Tx52 Rx42诊断步骤检查125帧的Rx序号仍为42说明50-51帧未被确认使用tcp.stream eq 0过滤器定位TCP层是否发生重传统计iec60870_104.nr ! iec60870_104.expected_nr异常计数4.2 超时断连问题排查当通信中断时按以下顺序检查物理层ping -t 192.168.1.2观察延迟与丢包TCP层netstat -ano | findstr 2404确认连接状态应用层过滤iec60870_104.type 0x03查看TESTFR心跳帧常见超时参数配置建议参数默认值(秒)推荐范围调整影响t03020-60值越小心跳越频繁t11510-30影响命令响应速度t2105-15关系确认延迟5. 高级分析与优化技巧5.1 自定义Wireshark解析插件对于非标准端口或私有扩展可编写Lua解析脚本-- 保存为iec104_custom.lua local iec104_proto Proto(IEC104_Custom, IEC 60870-5-104 Custom) local fields iec104_proto.fields fields.extension ProtoField.uint16(iec104.ext, Extension Field, base.HEX) function iec104_proto.dissector(buffer, pinfo, tree) local offset 0 local ext_tree tree:add(iec104_proto, buffer(), Custom Fields) ext_tree:add(fields.extension, buffer(offset, 2)) offset offset 2 end -- 注册到104端口 local tcp_port DissectorTable.get(tcp.port) tcp_port:add(2405, iec104_proto)5.2 流量统计与性能分析使用Wireshark内置的统计功能会话统计Statistics → Conversations → TCP查看各连接数据量IO图表Statistics → IO Graphs绘制报文速率曲线专家信息Analyze → Expert Info汇总错误与警告关键性能指标指标健康阈值测量方法端到端延迟100ms过滤tcp.time_delta吞吐量50帧/秒IO图表统计重传率0.1%tcp.analysis.retransmission过滤在实际变电站自动化系统中我们曾通过报文分析发现某设备在发送超过120字节的ASDU时会概率性丢包最终确认为嵌入式处理器的TCP窗口配置问题。这类深层次问题只有通过原始报文分析才能准确定位。
从报文到实战:手把手带你用Wireshark抓包分析IEC 104规约的TCP交互过程
工业通信协议深度解析Wireshark抓包实战IEC 104规约全流程在电力自动化系统中IEC 60870-5-104规约作为TCP/IP网络上的关键通信标准承载着遥测、遥信、遥控等核心功能的实时数据传输。本文将带您深入理解如何通过Wireshark这一专业网络分析工具从底层报文交互的视角完整解析IEC 104规约的工作机制。不同于简单的协议介绍我们将聚焦实际运维中遇到的连接异常、数据丢包、时序错乱等典型问题提供可立即应用于生产环境的诊断方法论。1. 环境准备与基础配置1.1 Wireshark抓包环境搭建工欲善其事必先利其器。在进行IEC 104规约分析前需要确保Wireshark正确配置# 在Linux系统安装最新版Wireshark sudo apt update sudo apt install wireshark # 将当前用户加入wireshark组避免权限问题 sudo usermod -aG wireshark $USER注意生产环境中建议使用端口镜像或网络分光器获取流量避免直接在主通道上抓包影响业务关键配置步骤网卡选择在Capture菜单下选择连接SCADA系统的物理网卡或虚拟接口捕获过滤器设置tcp port 2404限定只抓取IEC 104默认端口流量显示过滤器预设tcp.port 2404 iec60870_104快速定位规约报文1.2 IEC 104规约报文结构速览IEC 104采用典型的APDU结构每个数据单元包含字段长度(字节)说明示例值启动字符1固定0x6868APDU长度1控制域ASDU总长1C控制域4传输控制信息00 00 00 00ASDU可变实际业务数据01 8F 14 00...控制域格式解析I格式信息帧包含发送/接收序号占4字节S格式确认帧仅含接收序号占2字节U格式控制帧用于启停连接占1字节2. 连接建立与维持机制2.1 TCP三次握手与104会话启动通过Wireshark观察完整的连接建立过程TCP层握手No. 时间 源IP 目标IP 协议 长度 信息 1 0.000000 192.168.1.1 192.168.1.2 TCP 66 [SYN] Seq0 Win8192 2 0.000042 192.168.1.2 192.168.1.1 TCP 66 [SYN, ACK] Seq0 Ack1 3 0.000053 192.168.1.1 192.168.1.2 TCP 54 [ACK] Seq1 Ack1104规约U帧交互主站发送STARTDT激活指令68 04 07 00 00 00子站回复STARTDT确认68 04 0B 00 00 00典型故障若5秒内未收到STARTDT确认主站会重发U帧连续3次失败将断开TCP连接2.2 心跳机制与链路维护正常通信时双方通过S帧进行链路维护No. 时间 源IP 目标IP 协议 长度 信息 45 12.342.111 192.168.1.2 192.168.1.1 IEC104 12 [S] Rx36关键参数说明t0超时心跳间隔默认30秒t1超时发送帧等待确认时间默认15秒t2超时收到数据后确认延迟默认10秒3. 业务数据传输分析3.1 总召唤过程报文解析完整的总召唤GI流程包含四个阶段主站发起召唤# 类型标识100传送原因6激活 68 0E 00 00 02 00 64 01 06 00 01 00 00 00 00 14子站确认召唤# 类型标识100传送原因7激活确认 68 0E 00 00 04 00 64 01 07 00 01 00 00 00 00 14数据传输阶段单点遥信类型168 1C 00 00 06 00 01 8F 14 00...双点遥信类型368 1C 00 00 08 00 03 8F 14 00...结束确认# 类型标识100传送原因10激活终止 68 0E 00 00 0A 00 64 01 0A 00 01 00 00 00 00 143.2 循环数据传输模式子站主动上传的遥测数据典型结构68 22 5E 0C 08 00 09 04 03 00 01 00 02 07 00 FF 7F 01 06 07 00 2D 20 00 0E 07 00 DD 1C 00字段解析09类型标识归一化测量值04可变结构限定词SQ04个信息体03 00传送原因3突发01 00公共地址站号102 07 00信息体地址0x07024. 典型故障诊断案例4.1 接收序号不连续问题当出现以下报文序列时表明存在丢包No. 时间 源IP 目标IP 协议 长度 信息 123 15:30:22 192.168.1.1 192.168.1.2 IEC104 [I] Tx50 Rx42 124 15:30:23 192.168.1.2 192.168.1.1 IEC104 [S] Rx50 125 15:30:25 192.168.1.1 192.168.1.2 IEC104 [I] Tx52 Rx42诊断步骤检查125帧的Rx序号仍为42说明50-51帧未被确认使用tcp.stream eq 0过滤器定位TCP层是否发生重传统计iec60870_104.nr ! iec60870_104.expected_nr异常计数4.2 超时断连问题排查当通信中断时按以下顺序检查物理层ping -t 192.168.1.2观察延迟与丢包TCP层netstat -ano | findstr 2404确认连接状态应用层过滤iec60870_104.type 0x03查看TESTFR心跳帧常见超时参数配置建议参数默认值(秒)推荐范围调整影响t03020-60值越小心跳越频繁t11510-30影响命令响应速度t2105-15关系确认延迟5. 高级分析与优化技巧5.1 自定义Wireshark解析插件对于非标准端口或私有扩展可编写Lua解析脚本-- 保存为iec104_custom.lua local iec104_proto Proto(IEC104_Custom, IEC 60870-5-104 Custom) local fields iec104_proto.fields fields.extension ProtoField.uint16(iec104.ext, Extension Field, base.HEX) function iec104_proto.dissector(buffer, pinfo, tree) local offset 0 local ext_tree tree:add(iec104_proto, buffer(), Custom Fields) ext_tree:add(fields.extension, buffer(offset, 2)) offset offset 2 end -- 注册到104端口 local tcp_port DissectorTable.get(tcp.port) tcp_port:add(2405, iec104_proto)5.2 流量统计与性能分析使用Wireshark内置的统计功能会话统计Statistics → Conversations → TCP查看各连接数据量IO图表Statistics → IO Graphs绘制报文速率曲线专家信息Analyze → Expert Info汇总错误与警告关键性能指标指标健康阈值测量方法端到端延迟100ms过滤tcp.time_delta吞吐量50帧/秒IO图表统计重传率0.1%tcp.analysis.retransmission过滤在实际变电站自动化系统中我们曾通过报文分析发现某设备在发送超过120字节的ASDU时会概率性丢包最终确认为嵌入式处理器的TCP窗口配置问题。这类深层次问题只有通过原始报文分析才能准确定位。