首页 / 资讯中心 / 文章详情

IEC 62439-3-2016 高可用性无缝冗余 HSR 与 PRP 实战指南

IEC 62439-3-2016 高可用性无缝冗余 HSR 与 PRP 实战指南 ★ FEATURED ARTICLE
简介IEC 62439-3:2016 是工业通信网络高可用性自动化领域的国际标准第三版聚焦平行冗余协议PRP与高可用性无缝冗余HSR两大核心技术面向从事工业以太网、电力自动化、轨道交通控制等关键系统设计的工程师与研究人员。标准正文共358页系统阐述PRP双路径冗余与HSR双环网传输的实现细节、配置方法、诊断测试流程以及与其它工业通信协议的集成方式可帮助读者理解零停机切换与单点故障实时处理的完整技术框架。资源包为1个PDF文件大小约6.65MB内容为英文原版标准全文便于直接查阅条款与图表。目前已有390人学习下载适合需要依据标准开展冗余网络设计、设备选型或方案验证的技术人员作为权威参考。1. IEC 62439-3-2016为什么变电站里那根网线断了系统还能活如果你在电力自动化、工业控制或者轨道交通的现场待过大概率听过一句话网络可以慢但不能断。IEC 62439-3-2016 这份标准解决的正是这个痛点——它定义了高可用性无缝冗余HSR和并行冗余协议PRP两种机制让以太网在链路故障时做到零切换时间。注意是零不是 50ms也不是 20ms。我第一次在实验室里拔掉一台交换机的光纤抓包看到业务报文一帧没丢的时候说实话有点不敢相信。这份标准适合谁做变电站过程层网络、工业环网、列车控制网络、任何对丢包零容忍的场景的工程师。它不教你 TCP 怎么重传它教你在物理链路层面就把冗余做掉让上层协议根本感知不到故障发生过。接下来我会把这份标准的两个核心机制拆开讲清楚怎么选、怎么配、怎么验证以及我在实际项目里踩过的那些坑。2. HSR 与 PRP 的选型逻辑先搞清楚你的网络拓扑长什么样2.1 两种机制的本质区别HSR 和 PRP 经常被放在一起讲但它们的适用场景其实差别很大。PRP 的思路是「双网并行发送」每个节点有两个独立的以太网接口分别接入两个完全独立的局域网发送时同一帧从两个口同时发出接收端对先到的帧做去重后到的直接丢弃。两个网络之间不需要任何连接是完全隔离的。HSR 的思路是「环网内逐跳转发」节点同样有两个口但它们构成一个环发送时帧从两个方向沿环传播每个中间节点收到后先判断是否已处理过没处理过就继续往另一个方向转发直到到达目的节点。这个区别决定了选型如果你的现场已经有两套独立布线或者两个交换网络天然隔离PRP 更简单不需要改交换机普通交换芯片就能跑。如果你只有一条环网路径或者布线成本不允许你拉两套线HSR 更合适但它要求每个节点都支持 HSR 转发对硬件有额外要求。2.2 冗余帧的封装格式与去重逻辑HSR 和 PRP 都在原始以太帧前面插入一个冗余标签RCTRedundancy Control Trailer 实际上是在帧尾但习惯上叫 tag。HSR 的标签是 6 字节PRP 是 4 字节。HSR 标签里包含路径标识、序列号、LAN ID 和帧大小PRP 标签里包含序列号和 LAN ID。接收端靠序列号加源 MAC 地址做去重维护一个滑动窗口窗口大小通常是 16 到 64 帧。这里有个容易翻车的点序列号是 16 位的会回绕。如果网络里存在大量广播或组播流量去重窗口设置不当回绕后的旧帧可能被误判为新帧。我一般会把窗口设成 32并且在节点启动时强制序列号从随机值开始避免多个节点同时上电导致序列号同步。2.3 最小验证环境的搭建步骤要验证 HSR 或 PRP 是否正常工作你不需要一整套变电站设备。两台带双网口的 Linux 机器加一台可管理交换机就能跑通。下面是搭建 PRP 验证环境的关键步骤# 在 Linux 上创建 PRP 接口需要内核支持 prp 模块 # 先加载模块 sudo modprobe prp # 假设两个物理网口是 eth1 和 eth2 # 创建 PRP 实例实例名 prp0 sudo ip link add name prp0 type prp slave1 eth1 slave2 eth2 \ protocol 0x88fb \ primary eth1 # 启动接口 sudo ip link set prp0 up sudo ip addr add 192.168.10.1/24 dev prp0 # 查看 PRP 状态和统计 cat /sys/class/net/prp0/prp_stats这段命令的逻辑是内核的 prp 模块会把两个物理口绑定成一个逻辑接口上层协议栈只看到 prp0。发送时帧自动复制到两个物理口接收时自动去重。protocol 0x88fb是 PRP 的以太类型HSR 是 0x892f。primary eth1指定主口用于发送非冗余的管理帧。prp_stats里重点看duplicate_discarded和wrong_lan两个计数前者说明去重在工作后者说明有帧从错误的 LAN 口进来了。2.4 参数配置的边界条件PRP 和 HSR 对网络参数有几个硬性要求不满足就会出玄学问题。第一两个 LAN 的延迟差不能太大PRP 标准建议不超过 1ms实际我建议控制在 500us 以内否则去重窗口要开很大浪费内存。第二所有节点的 MTU 要一致因为冗余标签会增加帧长度HSR 加 6 字节PRP 加 4 字节如果路径上某个设备 MTU 设成 1500 而帧实际到了 1506会被静默丢弃。第三组播过滤要关掉或者配好因为冗余帧的源 MAC 可能被交换机学习到错误的端口上。3. 在 Linux 上跑通 HSR 环网从模块加载到流量验证3.1 内核支持与模块编译Linux 内核从 4.x 开始就有 HSR 支持但发行版默认不一定编译进去。先确认# 检查内核是否支持 hsr modinfo hsr # 如果没有输出需要重新编译内核或安装对应模块包 # 在 Ubuntu 上可以尝试 sudo apt install linux-modules-extra-$(uname -r)如果modinfo hsr有输出说明模块可用。HSR 模块依赖hsr和prp两个实际上它们共享大部分代码。加载后可以用lsmod | grep hsr确认。3.2 创建 HSR 接口并接入环网假设你有三台机器组成一个环每台机器两个网口。以其中一台为例# 加载模块 sudo modprobe hsr # 创建 HSR 接口slave1 和 slave2 是环的两个方向 sudo ip link add name hsr0 type hsr slave1 eth1 slave2 eth2 \ supervision 45 version 1 # supervision 45 表示每 45ms 发一次监督帧 # version 1 对应 IEC 62439-3:2016version 0 是旧版 sudo ip link set hsr0 up sudo ip addr add 10.0.0.1/24 dev hsr0 # 查看节点状态 cat /sys/class/net/hsr0/hsr_statssupervision参数控制监督帧的发送间隔单位是毫秒。监督帧用来检测环网是否完整如果环断了节点会进入环回模式把从一侧收到的帧从另一侧发回去。这个值设太小会增加网络负担设太大故障检测会变慢。45ms 是常见默认值实际项目里我会根据环上网关数量和流量密度调到 20 到 100 之间。3.3 用 ping 和抓包验证零丢包验证 HSR 是否真的无缝最直接的方法是一边持续 ping 一边拔线# 在一台机器上持续 ping 另一台间隔 10ms ping -i 0.01 10.0.0.2 | tee ping_log.txt # 同时在另一台机器上抓包看 HSR 标签 sudo tcpdump -i eth1 -e -c 100 ether proto 0x892f # 拔掉 eth1 的网线观察 ping 是否中断 # 再插回去观察恢复过程如果配置正确拔线期间 ping 不会丢包因为流量自动切到了 eth2 方向。抓包时你会看到每个帧都有 HSR 标签标签里的序列号连续递增。注意tcpdump抓到的帧长度会比普通以太帧多 6 字节这是正常的。3.4 监督帧与环回模式的排查HSR 节点通过监督帧判断环网状态。每个节点定期从两个口发出监督帧如果从某个口收不到其他节点的监督帧就认为该方向断了进入环回模式。排查时重点看这几个地方# 查看 HSR 统计 cat /sys/class/net/hsr0/hsr_stats # 关键字段 # supervision_frames_rx: 收到的监督帧数 # supervision_frames_tx: 发出的监督帧数 # ring_errors: 环网错误计数 # lost_frames: 丢失帧计数如果supervision_frames_rx一直不增长说明监督帧被阻断了常见原因是交换机把 HSR 的组播 MAC 地址过滤掉了。HSR 监督帧用的目的 MAC 是01:15:4e:00:01:00到01:15:4e:00:01:ff这个范围普通交换机默认会泛洪但有些可管理交换机会做组播抑制需要手动放行。4. 避坑指南HSR/PRP 部署中最容易翻车的五个地方4.1 现象拔线后业务中断了 200ms 才恢复原因不是 HSR 本身的问题而是上层协议栈感知到了链路抖动。HSR 接口的物理口 down 时内核会通知上层某些 TCP 连接会触发重传。解决把 HSR 接口的carrier状态和物理口解绑或者用ip link set eth1 down之前先确认 HSR 已经进入环回模式。更彻底的做法是在应用层用 UDP 或者把 TCP 的retries参数调大。4.2 现象去重统计里 duplicate_discarded 一直是 0原因两个 LAN 的延迟差太大后到的帧在去重窗口之外了。或者两个口的 MAC 地址被交换机学习到了同一个端口。解决检查两个 LAN 的路径延迟用ping -I eth1和ping -I eth2分别测。如果延迟差超过 1ms需要优化网络路径。另外确认交换机的 MAC 学习表HSR 帧的源 MAC 是原始节点的 MAC不是 HSR 接口的 MAC如果两个口接在同一台交换机上交换机会看到同一个 MAC 从两个口进来产生 MAC 漂移。4.3 现象环网里节点多了之后广播风暴原因HSR 环网里如果有一个节点的转发逻辑出错帧会在环里无限循环。虽然 HSR 有 TTL 机制但 TTL 默认是 255环大了之后来不及丢弃。解决把 TTL 调小在ip link add时加ttl 20参数。另外确保每个节点的去重窗口足够大能覆盖环上所有节点的序列号范围。4.4 现象监督帧正常但业务帧丢原因监督帧是短帧业务帧可能是长帧。如果路径上某个设备的 MTU 不匹配短帧能过长帧被丢。解决统一所有节点的 MTUHSR 接口的 MTU 要比物理口小 6 字节PRP 小 4 字节。用ip link set hsr0 mtu 1494显式设置。4.5 现象Linux 上 HSR 接口起来了但 ping 不通原因防火墙或者 rp_filter 把冗余帧当成了异常流量。解决关闭反向路径过滤# 临时关闭 sudo sysctl -w net.ipv4.conf.all.rp_filter0 sudo sysctl -w net.ipv4.conf.hsr0.rp_filter0 # 永久生效写入 /etc/sysctl.conf另外检查 iptables 规则确保没有 DROP 掉0x892f或0x88fb以太类型的帧。5. 进阶技巧用硬件时间戳验证 HSR 的切换时间到底是不是零标准里说零切换但实际测量时你会发现如果用软件抓包总能看到几十微秒的抖动。这不是 HSR 的问题是软件时间戳的精度不够。要真正验证需要用支持硬件时间戳的网卡比如 Intel I210 或 I350。# 启用硬件时间戳 sudo ethtool -T eth1 # 用 ptp4l 或者专门的抓包工具带硬件时间戳 sudo tcpdump -i eth1 -j adapter_unsynced -e ether proto 0x892f # -j adapter_unsynced 表示用网卡硬件时钟打时间戳抓到的帧里对比从 eth1 和 eth2 收到的同一序列号的帧时间差就是两个 LAN 的路径延迟差。如果这个差值是负的说明 eth2 先到是正的说明 eth1 先到。切换时间实际上就是去重窗口的滑动时间只要窗口覆盖了延迟差上层就感知不到。我自己的习惯是每次部署完 HSR 环网先跑 24 小时的压力测试用iperf打满带宽同时每 10 秒拔插一次网线看hsr_stats里的lost_frames是不是一直为 0。如果 24 小时后这个计数还是 0我才敢让系统上线。这个习惯帮我省掉了至少三次现场返工。希望帮到你。本文还有配套的精品资源点击获取
阅读完成 · 觉得有帮助?
咨询建站