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,建议观察口使用千兆并开启抓包侧限速或只镜像单向。
交换机侧配置(以常见 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 计数在中断窗口内增长,可直接佐证物理层或链路层问题,避免把网络侧误判为现场侧。可复用的抓包判读记录表
把每次抓包的关键字段固化下来,便于与后续案例对比、也便于交接班复现:
| 字段 | 本例填写示例 | 用途 |
|---|---|---|
| 镜像源端口 | Gi1/0/24、Gi1/0/8(both) | 确认抓包覆盖范围 |
| 观察口 | Gi1/0/48 | 复现抓包点 |
| 中断时间窗 | 23.4 s – 24.1 s | 对齐两侧帧 |
| 请求帧数(窗内) | 0 | 判断控制器是否发起 |
| 响应帧数(窗内) | 0 | 判断 I/O 是否回应 |
| 端口错包增量 | CRC +0,Align +0 | 排除物理层 |
| 判定环节 | 控制器侧 | 转交对应专业处理 |
按此流程,端口镜像把“间歇中断”从不可见的偶发事件,变成可在同一时间轴上比对的双侧证据链;判定的关键不是抓到了多少包,而是两侧帧在时间窗内是否配对、缺口出现在哪一侧。