간헐적으로 WebRTC 연결이 안되는 경우가 있었습니다.시그널링 서버를 통해 offer, answer, candidate 메세지를 잘 주고 받은 이력도 확인하였습니다. 특이한 점은 발견하지 못했습니다. 서버에는 문제가 없었기에 프론트엔드를 확인해 보았습니다. 아래와 같은 오류가 확인되네요. Failed to execute 'addIceCandidate' on 'RTCPeerConnection': The remote description is null간헐적으로 발생하니 해당 에러를 발견하기 까지 꽤 긴 시간을 할애하였습니다. (프론트엔드에서 발생하는 예외도 서버에서 로그 관리를 해야 하는 이유이기도 합니다.) 오류 메세지를 읽어보면 remote description이 null이라서 addIceCandid..
집에 있는 NAS에 TURN 서버를 구축해 보았습니다. TURN 서버는 https://hub.docker.com/r/coturn/coturn 4.6.3 도커 이미지를 이용하였습니다. 서버 구축 및 실행우선 turnserver.conf 설정 파일을 생성합니다.# TURN 서버가 클라이언트 요청을 수신할 포트 설정listening-port=3478# TURN 서버에서 TLS 암호화된 요청을 처리할 포트 설정tls-listening-port=5349# TURN 서버가 미디어 데이터 전송에 사용할 동적 포트 범위min-port=49100max-port=49900# WebRTC에서 사용되는 패킷의 지문(Fingerprint) 계산을 활성화fingerprint# 인증을 위한 Realm 설정 (서버 도메인 또는 IP..
TURN 서버를 통하여 Realy 통신하는 원리에 대해서 설명해 보겠습니다.Peer A의 영상을 Peer B에게 전송한다는 가정이고, TURN 서버를 통한 relay 통신을 실험하기 위해서 host, stun 후보군은 제외하였습니다.턴서버의 주소는 172.28.0.10 입니다. 실제 서비스 환경에서는 public ip 로 되어 있지만 여기서는 로컬에 턴서버를 구축한 관계로 사설 아이피 대역으로 설정되어 있습니다. ICE Candidate Type Relay 후보 추출WebRTC 핸드쉐이킹이 시작되면 Peer A에서 relay candidate를 추출하게 됩니다.candidate:4028790502 1 udp 33562623 172.28.0.10 49160 typ relay raddr 0.0.0.0 rp..
NAT의 종류를 알고 있더라도 실제 WebRTC 에서의 홀펀칭을 대입해 보면 생각보다 복잡하고, 머릿속에서 잘 정리되지 않습니다.이때 가장 쉽게 이해하는 법은 NAT의 매핑 테이블을 기준으로 홀펀칭을 이해하는 방법이 가장 좋다고 생각합니다.각 NAT별 홀펀칭을 설명하기에 앞서 Peer에서 UDP 소켓을 생성하여 패킷을 전송하고 수신하는 코드를 잠시 살펴보겠습니다. Java를 예제로 한 샘플 코드입니다.import java.net.DatagramSocket;import java.net.DatagramPacket;import java.net.InetAddress;public class UdpClientExample { public static void main(String[] args) { ..
WebRTC를 이용하여 서비스를 하게 되면 NAT 동작 원리에 대한 깊은 이해를 요구하게 된다.처음 WebRTC 스트리밍 서비스를 개발할 때에는 NAT 동작 원리에 대해서 신경쓰지 못했다. 막연하게 NAT에서 UDP 홀펀칭을 지원하고, WebRTC 라이브러리를 사용하면 P2P 통신이 가능하다고 이해했을 뿐이다. P2P 통신이 불가능한 상황이 발생할 수 있으므로 이럴 때에는 relay 통신을 지원하기 위한 turn 서버가 필요하다고만 생각했다. 서비스를 운영하고, 고도화 하는 과정에서 P2P 연결에 대한 의문점들이 계속 쏟아져 나왔다.개발 환경에서 테스트 할 때 항상 relay 통신만 되는 이유?회사 안에 있는 peer와 회사 밖에 있는 peer가 서로 스트리밍 연결이 될 때 항상 relay 통신만 되는 ..
Docker 환경 구축WebRTC를 테스트 하기 위해서는 로컬에 테스트 환경을 구축해야 합니다.윈도우 PC에 docker desktop이 설치되어 있다는 가정하에 turn 서버와 nginx를 docker 컨테이너로 구성해 보겠습니다. docker0 인터페이스docker는 호스트 머신의 네트워크와 격리된 가상 네트워크 환경을 제공하기 위해 docker0 브리지를 사용합니다.이 브리지는 Docker 컨테이너들이 호스트 머신과 외부 네트워크와 통신할 수 있도록 해줍니다. Host의 eth0 인터페이스호스트의 이더넷 인터페이스 입니다.Docker 컨테이너들이 외부 네트워크에 접근할 때 호스트의 eth0을 사용합니다. veth (virtual ethernet)docker 컨테이너를 생성하면 docker0 브리지와..