WebRTC 서비스 중 Kurento의 모식도다.
두 번째 그림을 보면, 클라이언트는 앱서버와 시그널링을, 미디어 서버와는 미디어 트래픽을 주고 받는다.
이렇게 두 가지 통신을 진행하는데, 각 통신은 사용하는 프로토콜과 전송되는 루트가 다르다.
프로토콜
TCP와 UDP를 이용한다.
transport 계층의 프로토콜이고, 차이점만 들고 왔다.
TCP는 전송 도중 분실된 패킷에 대해 재전송 요청을 날리고, 각각의 패킷에 붙은 시퀀스 넘버를 이용해 온전한 데이터뭉치로 정렬한다. error correction까지 가능하므로 UDP보다 느리고 컴퓨터 자원도 더 잡아먹지만 신뢰성이 높다.
UDP의 경우는 일단 날린다. 중간에 뭐가 분실되든 말든 일단 날리고 신경을 꺼버리기 때문에 TCP에 비해 신뢰성은 낮지만 속도가 굉장히 빠르고 컴퓨터 자원을 덜 잡아먹는다.
WebRTC에서는 TCP와 UDP를 모두 이용한다.
그렇다면 어떤 경우에 무슨 프로토콜을 이용할까?
TCP-Web
웹에서 이루어지는 대부분의 통신이 TCP다.
https도 TLS 기반이고, ajax같은 XHR 요청도 모두 TCP다.
WebSocket도 TCP다.
UDP-VoIP
UDP는 VoIP(Voice over Internet Protocol)에서 사용된다. 음성과 미디어 전송에서는 지연성능이 굉장히 중요한 이슈이며, 패킷이 조금 손실되더라도 별 문제가 생기지 않으므로 UDP를 사용한다.
WebRTC에서의 차이
WebRTC에서 시그널은 TCP로, 영상과 미디어는 UDP로 날린다.
최초 iceCandidate는 TCP로 주고 받지만, 이후 진행되는 핵심적인 미디어 파트는 여타 VoIP기술처럼 UDP 프로토콜 기반이라고 해도 과언이 아니다.
WebRTC를 적용한 서비스에서 채팅을 구현한다고 해 보자.
사용자들은 서로의 영상과 음성을 주고 받는 중이다.
그런데 만일 어떤 사용자가 채팅창에 0만 죽어라 도배한다면 어떨까?
TCP는 UDP보다 우선순위가 높다.
UDP로 한참 통신하던 와중에 기하급수적인 TCP 요청이 쏟아지면 순위가 낮은 UDP는 뒤로 밀린다는 뜻이다.
채팅 예시를 다시 보자.
사용자들은 UDP로 서로의 미디어를 주고 받는 중이다.
누군가 메세지를 TCP로 시그널링 서버에 날린다면, 서버는 해당 메세지를 사용자들에게 뿌려 줄 거다.
웹소켓으로 날리든 REST로 요청하든 전송 자체는 TCP 프로토콜이므로, 당연히 채팅은 UDP보다 우선순위가 높다.
그러면 사용자의 영상이나 음성이 끊길 가능성이 있다.
❓ 유튜브에서 채팅을 너무 날리면 스트리밍 영상이 끊기는 경우가 있는데, 그것도 이런 경우에 해당할까?
시그널과 미디어트래픽을 따로 전송한다는 사실은 또 다른 측면에서도 생각해 볼 수 있다.
만약 turn서버 없이 배포한다면 어떨까?
turn서버는 WebRTC 배포 환경에서 peer가 다른 peer와 직접적으로 미디어를 주고 받기 위해 사용하는 친구다.
TCP인 채팅이나 iceCandidate는 시그널링 서버를 거쳐 다른 사용자들에게 전달되기 때문에 turn서버를 거치지 않는다. 정상적으로 전달될 것이다.
하지만 미디어는 다르다. turn서버가 없다면 peer간의 직접적인 연결이 불가능하므로 미디어를 전송할 수 없다.
그러므로 turn서버가 없다면 시그널로 주고 받는 참여자 목록이나 iceCandidate는 제대로 받아 오지만, 실질적인 미디어가 뜨지 않는 것을 확인할 수 있다.
시그널 | 미디어 트래픽 | |
프로토콜 | TCP | UDP |
우선순위 | 높음 | 낮음 |
TURN/STUN 필수 | x | o |
이렇게 WebRTC에서는 TCP로 전송하는 데이터와 UDP로 전송하는 데이터가 다르다.
이 차이를 감안하다보면 발생하는 이슈의 원인을 짐작하기가 좀 편했다.
(사용자 데이터가 오는데 영상이 안 보이면 아 이거 코턴문제다 하는 식...)
WebRTC 프로그램을 개발할 때 불가피한 부분만 TCP로 날리도록 개발했었는데, 실제로 얼마나 날려야 우리 서비스에서 유의미하게 영상이 끊기는지는 테스트해보지 못했다.
'Web > WebRTC' 카테고리의 다른 글
[Kurento] 이게 MCU일까 SFU일까 (0) | 2022.02.28 |
---|---|
[Kurento] 배포 가이드/네트워크 구성 (0) | 2022.02.28 |
[WebRTC] 무조건 Openvidu를 사용하자 -2 (OpenVidu vs Kurento) (0) | 2022.02.26 |
[WebRTC] 무조건 Openvidu를 사용하자 -1 (WebRTC란) (0) | 2022.02.26 |
[Kurento] Websocket이 갑자기 끊겨버림 (0) | 2022.02.10 |
댓글