1. 개요
1.1 Transport (전송 계층)
- WebRTC 연결에서 미디어 데이터가 오고 가는 통로
- mediasoup에서는 서버와 클라이언트 양쪽에 각각 Transport 객체를 생성해야 함
- 서버에서
router.createWebRtcTransport() 를 호출하면 서버 측 Transport 객체 생성
- 이 객체의 정보를 클라이언트에게 보내야 클라이언트도 자신의 Transport를 설정하고 서버에 연결할 수 있음
1.2 ICE (Interactive Connectivity Establishment) Candidate
- 통신 가능한 네트워크 경로(IP주소와 포트) 후보
- 대부분의 PC는 직접 공인 IP주소를 사용하지 않음
- WebRTC는 연결 가능한 모든 경로를 수집하여 ICE Candidate로 만듬
- 서버와 클라이언트는 각자 수집한 ICE Candidate들을 시그널링 서버를 통해 서로 교환
- 양측은 교환된 후보들을 하나씩 테스트하여 가장 효율적인 통신 경로를 찾아 P2P 연결 수립
2. 흐름
- 클라이언트 요청: 음성 채팅방에 참여하기 위해 Transport 생성 요청
- 서버 Transport 생성:
createWebRtcTransport 메서드 호출
- mediasoup 라우터가 Transport 생성
- 생성과 동시에
icecandidate 이벤트 리스너 등록 (Transport가 ICE 후보를 찾을 때마다 실행)
- 서버 Transport 응답: 생성된 Transport 초기 정보 응답
- 클라이언트 Transport 생성: 클라이언트는 서버로부터 받은 정보로 자신의 Transport 생성
- ICE Candidate 교환(양방향):
- 서버 → 클라이언트
- 서버의 Transport가 새로운 ICE 후보를 찾으면
icecandidate 이벤트 발생
- 이벤트 리스너가 이를 잡아 클라이언트로 전송
- 클라이언트 → 서버
- 클라이언트의 Transport도 새로운 ICE 후보를 찾으면 클라이언트 코드가 이를 잡아 서버로 전송
- 서버의
voice.gateway.ts 에서 받아 transport.addIceCandidate() 와 같은 메서드를 호출하여 후보 등록
- 연결 수립: 양측이 충분한 ICE 후보를 교환하고 성공적으로 통신 경로를 확인하면
dtls 핸드셰이크 등의 과정을 걸쳐 Transport 연결이 connected 상태가 되고 미디어를 주고 받을 수 있음