← 전체 글
네트워킹/약 12분 읽기/ 조회

PRP와 HSR는 무손실 이중화를 주는 대신, 죽은 LAN을 숨긴다

IEC 62439-3 PRP와 HSR이 SCADA와 IEC 61850에 무손실 네트워크 이중화를 주는 원리, 한쪽 LAN 장애가 왜 아무도 모르게 지나가는지, 시운전 때 무엇을 감시해야 하는지 정리한다.

네트워킹SCADA문제 해결프로젝트 노트

3주 전에 죽어 있던 LAN

변전소 게이트웨이는 폴링이 멀쩡했다. GOOSE도 흐르고, HMI도 녹색이고, 아무 불만도 없었다. 관계없는 스위치 교체 작업 중에 기술자가 우연히, 이중화된 두 네트워크 중 하나인 LAN B가 패치 패널에서 물리적으로 빠져 있는 걸 발견했다. 약 3주 동안 변전소 전체가 이중화 없이 단일 네트워크로 돌고 있었는데, 경보는 단 하나도 뜨지 않았다.

이건 버그가 아니다. PRP가 원래 그렇게 동작하도록 만들어진 것이고, 이걸 이해하는 게 시운전 전에 가장 먼저 해야 할 일이다. IEC 62439-3에 정의된 Parallel Redundancy Protocol(PRP)과 High-availability Seamless Redundancy(HSR)는 복구 시간이 0인 failover를 준다. 재수렴도 없고 프레임 손실도 없다. 대가는, 한쪽 장애가 애플리케이션 입장에서 설계상 보이지 않는다는 점이다. 이중화 자체를 감시하지 않으면, 이중화가 사라진 사실을 두 번째 경로마저 죽어서 모든 게 한꺼번에 멈춘 다음에야 알게 된다.

RSTP와 MRP로는 왜 부족한가

이 사이트의 링 이중화 글에서 RSTP와 MRP를 다뤘고, 플랜트 제어 네트워크라면 대개 그걸로 충분하다. RSTP는 1~2초 안에 재수렴하고, MRP는 수백 밀리초 초반까지 내려간다. 그동안은 프레임이 실제로 손실되는 구간이다.

GOOSE를 나르는 station bus, 특히 IEC 61850-9-2 sampled value를 나르는 process bus에서는 그 손실 구간을 허용할 수 없다. Sampled value는 초당 4000~4800 샘플로 도착하고, 보호 기능은 spanning-tree 재계산을 200 ms씩 기다려 줄 수 없다. 그래서 IEC 62439-3은 접근을 뒤집는다. 장애에서 복구하려 하지 말고, 항상 두 경로로 모든 걸 두 번 보내고, 수신 측이 필요 없는 사본을 버리게 한다. 한 경로가 죽어도 복구할 게 없다. 다른 사본이 이미 도착해 있기 때문이다.

PRP: 독립된 두 LAN에 모든 걸 이중 송신

PRP 노드, 즉 Doubly Attached Node(DANP)는 이더넷 포트 두 개를 완전히 독립된 두 네트워크 LAN A와 LAN B에 연결한다. 송신할 때는 같은 프레임을 두 포트로 동시에 내보낸다. FCS 앞에 6바이트짜리 Redundancy Control Trailer(RCT)를 붙이는데, 16비트 시퀀스 번호, 4비트 LAN 식별자(0xA 또는 0xB), 12비트 프레임 크기, 그리고 PRP 접미어 0x88FB로 이루어진다.

수신 측은 소스 MAC을 키로 하는 작은 테이블을 유지한다. 특정 (소스, 시퀀스 번호) 조합의 첫 사본은 애플리케이션으로 올려 보내고, 몇 마이크로초 뒤 다른 LAN으로 도착하는 중복 사본은 버린다. 테이블 항목은 짧은 시간(EntryForgetTime, 약 400 ms) 뒤 만료되므로 시퀀스 번호가 안전하게 순환·재사용된다.

기존 설비 개조에서 PRP가 매력적인 이유는 두 가지다.

  • 두 LAN이 평범한 스위치드 이더넷이다. 특수 스위치가 필요 없다. LAN A와 LAN B는 이미 쓰던 관리형 스위치 아무거나면 된다. 이중화는 스위치 패브릭이 아니라 단말 노드에 들어 있다.
  • 두 LAN이 동일할 필요가 없다. 지연이 달라도, 토폴로지가 달라도, 벤더가 달라도 상관없다. PRP는 어느 사본이 이기든 신경 쓰지 않는다.

깨면 안 되는 규칙은 하나다. LAN A와 LAN B는 절대 서로 닿으면 안 된다. 둘 사이 트렁크도, 둘을 이어주는 공유 VLAN도, "관리용으로 코어 스위치 두 개만 잠깐 연결해 두자"도 안 된다. 두 LAN을 브리지하는 순간 중복 프레임이 두 네트워크 사이를 돌면서 브로드캐스트 문제가 생기고, 누군가 그 업링크 한 가닥까지 추적하기 전까지는 원인 모를 현상처럼 보인다.

PRP를 못 하는 장치 — 노트북, 프린터, 구형 IED — 는 Singly Attached Node(SAN)이고 RedBox(Redundancy Box)에 물려서 RedBox가 대신 이중 송신을 해준다. RedBox 뒤에서 이들은 네트워크에 VDAN(Virtual DAN)으로 보인다.

HSR: 같은 발상을 링으로 접은 것

HSR은 병렬 두 LAN 대신 단일 링을 쓰는 대신 배선을 아낀다. 각 노드(DANH)는 포트 두 개를 갖고 링 자체의 일부가 된다. 트래픽을 통과 전달하므로 링을 위한 외부 스위치가 필요 없다.

HSR 노드가 프레임을 만들면 링의 양방향으로 사본을 하나씩 보내고, 각각에 6바이트 HSR 태그를 소스 MAC 바로 뒤에 삽입한다. HSR EtherType 0x892F, 경로/크기 필드, 16비트 시퀀스 번호로 구성된다. 두 사본은 링을 반대 방향으로 돌고, 목적지는 먼저 온 걸 취하고 나중 걸 버린다. 노드는 자기 것이 아닌 프레임도 전달하고, 이미 전달한 적 있다고 인식한 프레임은 버린다(그래서 프레임이 영원히 돌지 않는다).

HSR은 무손실이면서 전용 스위치가 필요 없어서 process bus에 흔히 쓰이지만, 실제 제약이 있다. 링 안의 모든 장치가 HSR을 지원해야 하고(비-HSR 장치는 RedBox가 필요), 노드마다 전달 지연이 조금씩 쌓이므로 아주 큰 링은 공짜가 아니다. 여러 HSR 링을 잇거나 HSR 링을 PRP 네트워크에 브리지하려면 커플링 노드(QuadBox / RedBox)를 쓴다.

사람들이 건너뛰는 부분: 트래픽이 아니라 이중화를 감시하라

다시 죽은 LAN B 이야기로. PRP와 HSR은 무손실이기 때문에, 평소 감시 항목 — ping, 폴링 성공, 태그 품질 — 은 이중화 상태에 대해 아무것도 알려주지 않는다. 한쪽 경로만 살아 있어도 전부 녹색이다. 이중화 계층을 직접 봐야 한다.

  • PRP supervision 프레임. 모든 DANP와 RedBox는 약 2초(기본 LifeCheckInterval)마다 supervision 프레임을 멀티캐스트 01-15-4E-00-01-XX로 보내며, 자신의 존재와 어느 LAN이 보이는지를 알린다. 한 노드가 어떤 LAN에서 상대의 프레임을 더 못 들으면, 그 LAN이 (그 상대에 대해) 열화됐음을 안다. 이 프레임을 감시로 끌어와라 — 노드의 이중화 상태 객체든, LAN별로 세는 프로토콜 분석기든. LAN B의 supervision 트래픽이 0으로 떨어지면 LAN B는 죽은 것이다. 끝.
  • 단말 노드의 LAN별 카운터. 관리형 PRP 장치는 "LAN A / LAN B 수신 프레임 수", "wrong-LAN" 또는 discard 카운터를 노출한다. 두 LAN의 수치가 엇비슷하면 건강한 것이다. 한쪽 LAN이 0에 머물고 discard가 올라가면 단일 경로로 돌고 있는 것이다.
  • 각 LAN별 RedBox·스위치 링크 상태를 따로. 두 네트워크를 NMS에서 별개 객체로 트렌드하라. 둘을 "네트워크 OK" 태그 하나로 합치지 마라 — 그게 바로 죽은 LAN이 숨는 방식이다.

시운전에서는 지루한 방식으로 증명하라. 시스템을 살려 트래픽이 흐르는 상태에서 한 DANP의 LAN A 케이블을 뽑고, 애플리케이션에서 프레임 손실이 없음을 확인하고(돌고 있는 sampled-value나 GOOSE 구독자가 끊김을 안 보임), 그다음 LAN 상실에 대한 경보가 어딘가에서 실제로 뜨는지 확인하라. 복구하고 LAN B에서 반복하라. 케이블을 뽑았는데 운전원이 보는 증상이 0이고 경보도 0이라면, 동작하는 이중화와 동작하지 않는 감시를 가진 것이다 — LAN B를 3주 동안 숨긴 그 조용한 함정과 똑같은 상태다.

시간을 2분 쓸 가치가 있는 현장 점검이 하나 더 있다. 두 LAN이 정말 분리돼 있는지 확인하라. LAN A에 분석기를 걸고, RCT의 LAN 식별자가 0xB라고 말하는 프레임이 있는지 찾아보라. LAN-B로 태그된 프레임이 LAN A에 나타나면, 두 네트워크가 있으면 안 될 어딘가에서 브리지된 것이다 — 부하가 걸려 중복 스톰으로 번지기 전에 그 연결을 찾아라.