2.2.4 동적 노드 탐색(Discovery) 및 피어 간 세션 협상(Negotiation) 절차

2.2.4 동적 노드 탐색(Discovery) 및 피어 간 세션 협상(Negotiation) 절차

버전 알림: 본 문서는 Zenoh 1.0.0 (및 1.0.0-rc 분기) 코어 아키텍처 커뮤니케이션 규격을 기준으로 작성되었다.

인터넷 체급(Internet-scale)의 방대한 분산 시스템이 붕괴 없이 실시간으로 작동하려면, 물리적 네트워크 단절선(Air-gap) 너머에 매일 새로 부팅되는 수천 대의 이기종 단말기들이 인간의 개입(Human Intervention) 없이 자동으로 서로를 인지하고 통신 파이프라인(Pipeline)을 뚫어야 한다. 데브옵스 관리자가 컨피그 스크립트에 상대방의 IP를 일일이 하드 코딩(Hard-coding)하여 연결해주던 낡은 시대의 허수아비 같은 아키텍처로는, 차량이나 드론이 고속 이동하며 수시로 와이파이(Wi-Fi) 기지국을 넘나드는 동적 결합망을 결코 버텨낼 수 없다.

본 절에서는 이러한 IP 의존성의 사슬을 끊고 네트워크 권력을 말단 디바이스(Edge Device)로 완전히 이양하기 위해, Zenoh(제노) 엔진이 어떠한 무결점 런북(Runbook) 시나리오 위에서 동적 노드 탐색(Dynamic Discovery)을 전개하고, 수 킬로바이트(KB) 남짓한 페이로드 안에서 이질적인 단말 간 세션 규약을 협상(Session Negotiation)해 내는지 그 기저 원리를 철저히 해부한다.

1. 핑-퐁 디스커버리(Discovery) 메커니즘과 피어 자생망 스캐닝

IP 주소를 모르는 낯선 방에 들어간 로봇(Peer)이 다른 로봇과 대화하기 위한 첫 번째 아키텍처적 본능은, 허공을 향해 소리치며(Beacon Broadcast/Multicast) 돌아오는 반사 신호음(Echo)을 낚아채는 스캐닝(Scanning) 메커니즘이다.

새롭게 전원이 인가된 Zenoh 피어 노드 데몬(zenohd)이 부팅 루틴에 돌입하면, 가장 먼저 자기가 밟고 서 있는 로컬 이더넷 보드와 와이파이 랜(LAN) 인터페이스를 향해 UDP 멀티캐스트(Multicast) 스카우트 메시지를 폭풍처럼 난사하기 시작한다. 이 수 마이크로초 단위의 첫 울음소리, 즉 Hello 패킷에는 자신의 고유한 글로벌 식별자(Zenoh ID: ZID)와 피어 모드 권한(Peer Type Role) 플래그가 선명하게 인코딩(Encoding)되어 있다.

이 소리를 들은 같은 망 내의 수많은 기존 생존 피어(Alive Peers)들과 라우터(Router) 노드 군단은 씹어 삼키던 퍼블리시 작업을 잠시 멈추고, 즉각적으로 자신의 ZID와 살아있음을 알리는 Hello 응답 비콘 역발송 포워딩(Unicast Ping-back)을 갈겨준다. 이 디스커버리 교신이 채 1초도 안 되는 찰나에 오고 가고 나면, 갓 태어난 신생 피어의 메모리 위에는 눈앞을 맴도는 주변 생태계 로봇 동료들의 모든 IP 정보와 맥(MAC) 레이어 연결 엔드포인트(Endpoints Endpoint)가 그물망(Dynamic Routing Map)처럼 환하게 펼쳐져 메모리 테이블에 아로새겨진다. 중앙 네임 서버(Name Server)가 없이도, 통신망에 생태학적 진화가 자생하는 무차별적 분산 스캐닝의 기염이다.

2. 세션 핸드셰이크(Session Handshake): 이기종 언어 및 프로토콜 핏(Fit) 검증

나의 존재를 알리고 너의 존재를 시각화한 것만으로는 데이터 버스(Data Bus) 위에서 의미 있는 패킷을 밀어 넣을 수 없다. 저 수많은 상대 노드 중 하나를 골라 진짜로 텔레메트리 스트림(TCP/UDP Stream)을 개통하려면, 양쪽 노드가 이기종(Heterogeneous)의 물리적인 한계를 서로 찌르고 들어가는 지독한 세션 협상(Session Initialization Negotiation) 관문을 거쳐야만 한다.

막강한 AWS 클라우드의 1티어 백본 망에 서 있는 라우터와, 빈약한 로봇 끝단에 달린 녹슨 센서 MCU를 구동하는 피어가 연결 파이프를 뚫는다고 가정해 보라. 이들은 Init 패킷 바이트를 서로 밀고 당기며 아주 섬세한 외교 협상을 벌인다. 첫째, “우리 패킷 바디를 얼마나 잘게 조각내서(Fragmentation) 보낼까? 최대 버퍼 단위(MTU)는 얼마니?” 둘째, “둘 다 가변 인코딩(Variable Integer 1바이트) 압축 헤더를 해석할 수 있니, 아니면 네이티브 C 로직의 고정 바디로 쏴줄까?” 셋째, “TCP의 신뢰성을 강제할까(Reliability QOS), 오버헤드를 까부수기 위해 잦은 드롭이 일어나도 상관없는 베어메탈 직렬 UDP로 쏠까?”

1바이트조차 아까운 와이어 스펙 하에서 양측의 Zenoh 엔진은 이러한 프로토콜 컴플라이언스(Protocol Compliance)를 런타임에 동적으로 타결(Convergence)한다. 양쪽이 공통으로 지원하는 가장 극한의 얇고 빠른 최저 지연 규약이 자동 스위칭(Auto-Switching) 되며, 통신망의 척추에 합의된 단일한 Session ID가 낙인찍히고 마침내 데이터 스트림의 문이 개방되는 것이다.

3. 라우팅 테이블(FIB) 병합 교환과 무중단 위치 투명성(Location Transparency) 동기화

세션 연결이 TCP 커넥션 혹은 보안 TLS 터널 파이프 위로 단단하게 봉합(Connect)되고 난 후 펼쳐지는 광경이 동적 탐색의 최종 목적지인 구독 관심사 동기화(Subscription & Routing Knowledge Exchange)이다. 단순히 상대방 장비의 연결만 확립한 것은 과거 IP 레벨의 전근대적 미들웨어에서나 성취로 부를 수 있는 일이다. 진정한 데이터 중심(Data-Centric) 철학 하에서 피어는 이제 자신이 이 세상에서 원하는 논리적인 데이터의 이름, 전 지구적 네임스페이스 트레이서(Name Registry)를 상대에게 전가시킨다.

“내 클라이언트 애플리케이션 코더가 /factory/robot/battery 값을 달라고 구독(Subscribe) 선언서를 썼어. 그 데이터가 너에게 혹은 네 너머 누군가에게 있다면 이쪽으로 펀칭(Punching)해라!”

이 선언 패킷(Declare/Subscribe Message)이 상대 노드를 찌르는 순간, 상대의 라우터 데몬 속 텅 빈 포워딩 테이블(FIB, Forwarding Information Base)에는 거대한 방향성 간선 하나가 추가 삽입(Add Route Branch) 조각으로 새겨진다. 만일 양쪽 노드가 각자 50개씩 얽혀 있던 과거의 거미줄 메쉬(Mesh) 망의 분절된 대장급 피어 덩어리들이었다면, 이 세션 한 번의 융합 찰나에 50여 개 단말기가 품고 있던 글로벌 통신 정보 테이블 덤프들이 통째로 쏟아지며 상호 복제 동기화(Full Replication Bypass)된다. 시스템이 스핀오프(Spinoff) 되거나 파편화된 그랜드 스케일의 지형지물에서 한 장의 완벽한 교통지도 포워딩 지맥(Universal Routing Hub)으로 통일되는 이 경이로운 자가 결합 과정은, Zenoh 패러다임이 네트워크 분할 단절 오류를 두려워하지 않는 치명적 방패임을 증명한다.