当前位置: 首页 > news >正文

从报文到实战:手把手带你用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

注意:生产环境中建议使用端口镜像或网络分光器获取流量,避免直接在主通道上抓包影响业务

关键配置步骤:

  1. 网卡选择:在"Capture"菜单下选择连接SCADA系统的物理网卡或虚拟接口
  2. 捕获过滤器:设置tcp port 2404限定只抓取IEC 104默认端口流量
  3. 显示过滤器:预设tcp.port == 2404 && iec60870_104快速定位规约报文

1.2 IEC 104规约报文结构速览

IEC 104采用典型的APDU结构,每个数据单元包含:

字段长度(字节)说明示例值
启动字符1固定0x6868
APDU长度1控制域+ASDU总长1C
控制域4传输控制信息00 00 00 00
ASDU可变实际业务数据01 8F 14 00...

控制域格式解析:

  • I格式:信息帧,包含发送/接收序号(占4字节)
  • S格式:确认帧,仅含接收序号(占2字节)
  • U格式:控制帧,用于启停连接(占1字节)

2. 连接建立与维持机制

2.1 TCP三次握手与104会话启动

通过Wireshark观察完整的连接建立过程:

  1. TCP层握手

    No. 时间 源IP 目标IP 协议 长度 信息 1 0.000000 192.168.1.1 192.168.1.2 TCP 66 [SYN] Seq=0 Win=8192 2 0.000042 192.168.1.2 192.168.1.1 TCP 66 [SYN, ACK] Seq=0 Ack=1 3 0.000053 192.168.1.1 192.168.1.2 TCP 54 [ACK] Seq=1 Ack=1
  2. 104规约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] Rx=36

关键参数说明:

  • t0超时:心跳间隔,默认30秒
  • t1超时:发送帧等待确认时间,默认15秒
  • t2超时:收到数据后确认延迟,默认10秒

3. 业务数据传输分析

3.1 总召唤过程报文解析

完整的总召唤(GI)流程包含四个阶段:

  1. 主站发起召唤

    # 类型标识100,传送原因6(激活) 68 0E 00 00 02 00 64 01 06 00 01 00 00 00 00 14
  2. 子站确认召唤

    # 类型标识100,传送原因7(激活确认) 68 0E 00 00 04 00 64 01 07 00 01 00 00 00 00 14
  3. 数据传输阶段

    • 单点遥信(类型1):68 1C 00 00 06 00 01 8F 14 00...
    • 双点遥信(类型3):68 1C 00 00 08 00 03 8F 14 00...
  4. 结束确认

    # 类型标识100,传送原因10(激活终止) 68 0E 00 00 0A 00 64 01 0A 00 01 00 00 00 00 14

3.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:可变结构限定词(SQ=0,4个信息体)
  • 03 00:传送原因(3=突发)
  • 01 00:公共地址(站号1)
  • 02 07 00:信息体地址(0x0702)

4. 典型故障诊断案例

4.1 接收序号不连续问题

当出现以下报文序列时表明存在丢包:

No. 时间 源IP 目标IP 协议 长度 信息 123 15:30:22 192.168.1.1 192.168.1.2 IEC104 [I] Tx=50 Rx=42 124 15:30:23 192.168.1.2 192.168.1.1 IEC104 [S] Rx=50 125 15:30:25 192.168.1.1 192.168.1.2 IEC104 [I] Tx=52 Rx=42

诊断步骤:

  1. 检查125帧的Rx序号仍为42,说明50-51帧未被确认
  2. 使用tcp.stream eq 0过滤器定位TCP层是否发生重传
  3. 统计iec60870_104.nr != iec60870_104.expected_nr异常计数

4.2 超时断连问题排查

当通信中断时,按以下顺序检查:

  1. 物理层ping -t 192.168.1.2观察延迟与丢包
  2. TCP层netstat -ano | findstr 2404确认连接状态
  3. 应用层:过滤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内置的统计功能:

  1. 会话统计Statistics → Conversations → TCP查看各连接数据量
  2. IO图表Statistics → IO Graphs绘制报文速率曲线
  3. 专家信息Analyze → Expert Info汇总错误与警告

关键性能指标:

指标健康阈值测量方法
端到端延迟<100ms过滤tcp.time_delta
吞吐量>50帧/秒IO图表统计
重传率<0.1%tcp.analysis.retransmission过滤

在实际变电站自动化系统中,我们曾通过报文分析发现某设备在发送超过120字节的ASDU时会概率性丢包,最终确认为嵌入式处理器的TCP窗口配置问题。这类深层次问题只有通过原始报文分析才能准确定位。

http://www.jsqmd.com/news/824721/

相关文章:

  • ARM架构TLB失效指令详解与应用场景
  • 广元白发养黑理疗机构哪家好?黑奥秘20年品牌沉淀,慢病管理养黑更科学 - 美业信息观察
  • 使用Taotoken后我的月度Token消耗与成本变得清晰可见
  • 0501第五卷:EUV光源系统(S级 长期死磕突破)第1小节:核心技术原理(13.5nm极紫外光产生·等离子体激发·多层膜反射·全真空传输)
  • 保姆级教程:在Ubuntu 20.04上为RK3588交叉编译OpenCV 3.4.5(含离线安装CMake指南)
  • 别再只会用zip了!Ubuntu下tar.gz、tar.bz2压缩命令实战对比与选型指南
  • SystemVerilog与OVM在现代芯片验证中的核心价值与实践
  • Transformer模型推理加速:操作融合技术解析
  • 机器人抓取动力学追踪工具:从数据采集到可视化分析全流程解析
  • 别再只懂RAID了!用Minio纠删码搭建高可用存储,实测硬盘坏一半数据照样能读
  • MoneyPrinterTurbo终极指南:3分钟学会AI短视频自动生成,让创意变现从未如此简单![特殊字符]
  • BetaFlight飞控AOCODARC-F7MINI固件编译实战:从环境搭建到烧录验证
  • 2026.5.14-团队博客
  • 开源技能模块开发实战:基于OpenProject API的智能集成与自动化
  • CDN防护的薄弱环节:实战中寻找真实IP的多种思路
  • Maven组件化发布实战:从私服配置到版本管理全解析
  • BilibiliDown:跨平台B站视频下载解决方案完全指南
  • Taotoken平台OpenAI兼容API调用基础教程与Python示例
  • 开源容器镜像安全扫描器Quaid:从漏洞检测到CI/CD集成实战
  • 不止是记事本!Win10右键新建菜单终极自定义指南:排序、删除、添加任意文件类型
  • 别再只测SSRF读文件了!用BurpSuite+Redis打造你的内网横向移动跳板
  • 车载毫米波雷达超分辨DOA算法:从理论到工程落地的挑战与选型
  • 从零到一:uni push2.0全链路配置与实战推送指南
  • 告别‘丑’结构:用RDKit的ETKDG算法,5分钟搞定分子3D构象生成(附Python代码)
  • 从空调到手机充电器:拆解5个日常电器,看功率型NTC如何默默守护你的设备安全
  • AttentionEngine框架:模块化注意力机制的高效实现
  • Beyond Compare 5本地化激活终极指南:三步实现专业文件对比工具永久使用
  • Perplexity企业版真正杀手锏不是搜索——而是这4个未公开的Enterprise API扩展点(含内部文档截图级解析)
  • Kiboru开源平台:快速构建AI应用的模块化解决方案
  • 本地AI智能体框架Dragon-Brain:从原理到实战部署指南