2. 远程I/O通信间歇中断:利用交换机端口镜像抓包定位丢包环节

为什么选端口镜像而不是在控制器上抓

远程I/O与控制器之间的间歇中断,最难判断的是“丢在哪一段”。在控制器本机抓包只能看到控制器网卡收发的报文,看不到交换机端口上到底有没有把帧转发出去;在现场I/O侧抓包又往往没有可用的抓包点。中控交换机支持端口镜像(SPAN/Port Mirroring)时,把“控制器所连端口”和“远程I/O所连端口”的流量同时复制到一个空闲观察端口,就能在同一时间轴上对比两侧报文,从而把丢包环节切分成三段:现场侧(I/O未发出或未收到)、网络侧(交换机未转发或链路丢帧)、控制器侧(控制器未发出或未处理)。

镜像方案与抓包点布置

本例假设一台三层中控交换机,控制器接 Gi1/0/24,远程I/O接 Gi1/0/8,观察口用 Gi1/0/48 接一台笔记本。采用“双向镜像两个源端口到一个目的端口”,即把 Gi1/0/24 与 Gi1/0/8 的 ingress+egress 都复制到 Gi1/0/48。这样观察口上会同时出现四类帧:控制器发出、控制器收到、I/O发出、I/O收到,靠源/目的 MAC 与 IP 即可区分方向。

关键约束:观察口不能再承载业务,且镜像流量可能远超端口带宽,务必先估算流量。以 200 个 I/O 站、每站 1 ms 级周期、单帧约 120 字节估算,双向镜像后观察口峰值可能达到数百 Mbps,建议观察口使用千兆并开启抓包侧限速或只镜像单向。

端口镜像抓包拓扑:两个源端口 → 一个观察口 控制器 PLC IP 10.20.1.10 MAC …:A1 远程 I/O 机架 IP 10.20.2.31 MAC …:B7 中控交换机(端口镜像) Gi1/0/24 源端口·控制器 Gi1/0/8 源端口·远程I/O Gi1/0/48 目的端口·观察口 ingress+egress 复制 抓包笔记本 Wireshark · 混杂模式 丢包环节判定 现场侧 I/O 端口无请求帧 或请求后无响应帧 网络侧 入口有帧、出口无帧 或帧序出现缺口 控制器侧 控制器未发出请求 或收到后未回 ACK 判据:同一时间窗内两侧帧的 源/目的地址与序号是否配对

交换机侧配置(以常见 CLI 逻辑为例)

不同厂商命令不同,但语义一致:定义镜像会话、指定源端口与方向、指定目的端口。下面给出通用语义与一段可直接套用的配置骨架,参数按本例拓扑填写。

# 语义骨架(按厂商语法替换关键字)
monitor session 1 source interface Gi1/0/24 both
monitor session 1 source interface Gi1/0/8  both
monitor session 1 destination interface Gi1/0/48

# 验证
show monitor session 1
# 期望:Source Ports = Gi1/0/24(Both), Gi1/0/8(Both)
#       Destination Ports = Gi1/0/48

配置完成后先在观察口确认能看到双向流量,再开始正式抓包。若交换机不支持多源同会话,可建两个会话分别镜像,但需保证两个会话的时间基准一致(同一台交换机,时钟同源,天然满足)。

抓包与过滤:把四类帧分开

观察口上流量混杂,必须用显示过滤器把“控制器→I/O 请求”和“I/O→控制器 响应”分离。以 PROFINET RT 为例,可用 pn_io 或按 MAC 过滤;以 Modbus TCP 为例用 modbus 或端口 502。核心是构造两条互补过滤器:

# 控制器 → 远程I/O(请求方向)
eth.src == a0:11:22:33:44:a1 && eth.dst == b0:55:66:77:88:b7

# 远程I/O → 控制器(响应方向)
eth.src == b0:55:66:77:88:b7 && eth.dst == a0:11:22:33:44:a1

把两条过滤器分别着色(如请求蓝色、响应绿色),在同一窗口内观察时间轴。正常时应看到“请求—响应”成对出现,间隔稳定;中断发生时,时间轴上会出现一段只有请求没有响应,或请求本身消失的空洞。

用丢包时序定位环节

把中断窗口内的帧按时间排列,对照下表判断。表中“入口”指源端口镜像到的帧,“出口”指对端源端口镜像到的帧,二者在同一观察口上以源/目的地址区分。

观察现象含义判定环节
控制器侧有请求帧,I/O 侧无对应请求帧帧在交换机内或链路上丢失网络侧
I/O 侧有请求帧,但无响应帧I/O 收到请求但未处理或未回现场侧
I/O 侧有响应帧,控制器侧无对应响应帧响应帧在回程丢失网络侧
控制器侧既无请求也无响应,I/O 侧同样静默控制器未发起通信控制器侧
请求与响应成对,但周期抖动大、重传多链路质量或负载问题网络侧(时延类)

一次示例判读

假设抓包 60 s,在第 23.4 s 至 24.1 s 出现中断。用上述过滤器统计:控制器→I/O 请求帧在该窗口内为 0,I/O→控制器响应帧也为 0;而中断前后请求周期均为 4 ms,无重传。两侧同时静默,说明控制器在这 0.7 s 内没有发起请求,问题在控制器侧(如扫描周期阻塞、任务优先级被抢占),而非网络或现场 I/O。反之,若控制器侧请求正常、I/O 侧请求缺失,则指向网络侧,需进一步查交换机端口错包、CRC、光模块或环网收敛。

抓包前先记录交换机端口的错包计数(如 show interface Gi1/0/8 counters errors),抓包前后各取一次,若 CRC/Align 计数在中断窗口内增长,可直接佐证物理层或链路层问题,避免把网络侧误判为现场侧。
镜像会话会占用交换机 CPU 与背板带宽,海上平台中控交换机负载较高时,建议在低负荷时段短时开启,抓包完成后立即删除会话;观察口务必接隔离的抓包设备,避免引入新的广播或环回。

可复用的抓包判读记录表

把每次抓包的关键字段固化下来,便于与后续案例对比、也便于交接班复现:

字段本例填写示例用途
镜像源端口Gi1/0/24、Gi1/0/8(both)确认抓包覆盖范围
观察口Gi1/0/48复现抓包点
中断时间窗23.4 s – 24.1 s对齐两侧帧
请求帧数(窗内)0判断控制器是否发起
响应帧数(窗内)0判断 I/O 是否回应
端口错包增量CRC +0,Align +0排除物理层
判定环节控制器侧转交对应专业处理

按此流程,端口镜像把“间歇中断”从不可见的偶发事件,变成可在同一时间轴上比对的双侧证据链;判定的关键不是抓到了多少包,而是两侧帧在时间窗内是否配对、缺口出现在哪一侧。