[WebRTC Mesh] P2P Mesh가 화상통화에서 무너지는 순간
피어 투 피어 그물은 처음 보면 정직하다. 서버가 미디어를 안 나르고 브라우저끼리 직접 붙는다. 구조가 단순하니 구현도 단순해 보인다. 작은 방 데모에서는 그 정직함이 매력으로 남는다.
화상통화에서 그 단순함은 빨리 부메랑이 된다. 연결은 됐는데 화면이 얼고 연결됨 표시와 실제 통화 체감이 어긋난다. 이 글은 그물이 왜 화상통화에서 특히 취약한지, 어느 순간 연결 성공이 체감 실패로 바뀌는지 정리한다.

연결은 됐는데 통화는 안 되는 지점
그물 구조에서는 참여자마다 서로에게 영상을 보낸다. 사람이 늘수록 각 기기의 업로드가 가파르게 커진다. 한쪽 네트워크가 흔들리면 그 흔들림이 방 전체 체감으로 퍼진다.
사용자는 프로토콜 상태를 보지 않는다. 얼굴이 멈추고 소리가 갈라지면 그건 그냥 실패다. 작은 미디어 실패가 전체 회의 경험으로 읽힌다.
연결 계층의 초록불과 체감 계층의 빨간불이 공존할 수 있다는 사실이 핵심이다. 이 공존을 인정하지 않으면 모든 실패를 연결 문제로 오진한다.
오진은 처방을 망친다. 재연결만 반복하고 화질 하향이나 역할 분리 같은 미디어 처방을 놓친다.

처음에는 연결 성공이 곧 통화 성공이라 봤다
초기에는 연결 완료면 충분하다고 생각했다. 미디어 품질은 나중 문제, 먼저 붙는 게 우선이었다.
로그가 보여 준 반례는 연결됨인데 프레임이 크게 떨어지는 세션이었다. 연결 계층과 체감 계층이 따로 놀았다.
참여자가 조금만 늘어도 팬 소음과 발열이 먼저 반응했다. 중앙 서버가 미디어를 안 나를수록 비용은 각 노트북으로 이동한다.
비용 이동을 제품 문장으로 번역하지 않으면 피어 투 피어라서 가볍다는 말과 실제 경험이 충돌한다.

그물이 숨기는 비용
매력은 서버 미디어 비용 절감이다. 대신 업링크 대역, 부호화 연산, 배터리, 네트워크 환경 차이, 한 명 불안정이 전체에 미치는 전파 비용이 클라이언트로 이동한다.
이 비용을 숨긴 채 기능을 늘리면 어느 순간 통화 품질이 기능 확장의 천장에 닿는다.
천장을 파라미터 튜닝만으로 올리려 하면 시간이 꺾인다. 토폴로지 한계는 토폴로지 변경으로 풀어야 하는 구간이 있다.
그 구간을 인정하는 것이 선택적 전달 서버 검토의 시작이다. 혐오가 아니라 경계 설정이다.
책임을 세 층으로 나누기
다시 그은 경계는 연결과 미디어와 체감을 분리하는 것이다. 한 문장의 통화 실패 안에 세 층의 원인이 섞이지 않게 한다.
| 층 | 책임 | 실패 문장 |
|---|---|---|
| 연결 | 연결 협상 | 연결되지 않음 |
| 미디어 | 트랙과 비트레이트 | 화면이나 소리가 끊김 |
| 체감 | 버퍼와 지연 | 통화가 불안함 |
층이 나뉘면 다음 행동이 달라진다. 연결 실패면 재초대, 미디어 실패면 화질 하향, 체감 실패면 참여자 수 정책이나 구조 전환을 본다.
로그 필드도 층에 맞춰 나눈다. 한 덩어리 오류 코드로는 운영이 불가능하다.
구현·운영에 남긴 조건
모든 화상통화에 선택적 전달이 필요한 건 아니다. 일인 대 일인이나 아주 작은 방에서는 그물이 충분히 정직하다.
참여자 수 증가와 업링크 포화, 한 명의 약한 네트워크가 방 전체를 흔드는 현상, 연결 성공률은 높은데 체감 만족이 낮은 패턴이 반복되면 경계를 옮겨야 한다.
그물을 더 튜닝만 반복하는 함정에 빠지지 않는다. 토폴로지 한계를 파라미터로 이기려 하지 않는다.
전환 시점은 감이 아니라 정책으로 적는다. 정책이 없으면 매번 논쟁만 반복된다.
마치며
그물이 화상통화를 깨뜨리는 지점은 대개 연결 실패가 아니라 연결 성공 착각이다.
지금은 연결됨과 통화 성공을 다른 층으로 본다. 다음에 화상 경로를 다시 만지면 미디어 품질 층을 먼저 설계하겠다.
참여자 수에 따른 전환 시점도 숫자 없는 감이 아니라 정책으로 고정하겠다.
그 정책이 있어야 단순한 구조의 장점을 지키면서도 무너지는 순간을 늦출 수 있다.