참고한 블로그
webRTC란 ?
ICE
- peer를 통한 연결이 가능하도록 해주는 프레임워크
- peer간 단순 연결을 한다고 작동하는건 아님
방화벽 통과
단말에 public IP가 없으면 주소값 할당해야함
라우터가 peer간의 직접연결을 불허할때
- 위 이유들 때문에 STUN 서버나 TURN 서버 둘다 혹은 하나 사용함
STUN
- 클라이언트의 자신의 public address를 알려줌
- 라우터의 제한 결정 (peer간의 직접연결을 막는지 등)
- 클라이언트는 STUN 서버한테 자신의 public address와 라우터의 NAT 뒤에 있는 다른 클라이언트에 접근 가능한지 여부를 물어봄
NAT
- 단말에 public IP 주소를 할당하기 위해 사용
- 라우터는 공개 IP 주소가 있고 모든 단말들은 비공개 IP 주소를 갖고 라우터에 연결됨
- 라우터의 공개 주소 + 포트번호로 request를 처리
- 일부 라우터들은 Symmetric NAT(제한을 위한 NAT) 채용. peer들이 이전에 연결한 적 있는 연결만 허용. 따라서 STUN 서버로 공개 IP 주소를 알아내도 무조건 연결이 가능한 것이 아님
- 이를 위해 TURN 필요
TURN
- Symmetric NAT 제한을 우회하기 위해 TURN 서버와 연결함
SDP
- 해상도, 형식, 코덱, 암호화등 멀티미디어 콘텐츠의 연결을 설명하기 위한 표준
- 두 peer가 데이터가 전송되고 있다는 것을 알게해줌
- 디바이스간 미디어를 공유하기 위한 연결을 설명하는데 사용
서버의 종류
webRTC를 위해 개발자가 구현할 수 있는 서버는 3가지 종류
Signaling, SFU, MCU 이다

Signaling 서버 (그림의 Mesh)
- peer 간의 offer, answer라는 session 정보 signal 만을 중계함. 따라서 최초에 webRTC가 peer간의 정보를 중계할 때만 서버에 부하 발생
- peer 간 연결이 완료된 후에는 서버에 별도의 부하가 없음 (서버 자원이 적게듬)
- 1:1 연결에 적합함
- p2p여서 실시간성 보장
- N:N으로 연결시 클라이언트의 과부하
SFU 서버
- 종단 간 미디어 트래픽을 중계하는 중앙 서버 방식
- 클라이언트간 peer 방식이 아닌 서버와 클라이언트 간 연결
- 1:1, 1:N, N:N 등 모든 연결 형식에서 클라이언트는 서버에게만 데이터를 보냄. 즉 uplink는 1개로 고정
- 하지만 상대방의 수만큼 받는 downlink (받는 링크) 필요
- 1:N 형식 또는 소규모 N:M에 적합
- Signaling과 비슷한 수준의 실시간성을 유지함
- Signaling에 비해 클라이언트가 받는 부하 감소
- Signaling에 비해 서버 비용 증가, 대규모 N:M에서는 여전히 클라이언트에 부하 큼
MCU 서버
- 다수의 송출 미디어를 중앙 서버에서 혼합 또는 가공해서 수신측으로 전달하는 중앙 서버 방식
예시 ) 5인이 webRTC 연결하면 자신을 제외한 다른 4인의 video 데이터를 하나의 video 데이터로 편집. audio 데이터도 마찬가지로 편집해서 보냄
- 서버와 클라이언트 간 연결
- 클라이언트는 서버에게만 데이터 보냄 uplink 1개
- 서버에게 하나의 데이터 받음 downlink 1개
- 중앙 서버의 높은 컴퓨팅 파워 요구
- 클라이언트의 부하 감소 , 다른 서버들에 비해 N:M에 적합
- 실시간성이 저해됨 , video, audio 결합 과정에서 비용이 많이듬
1:1 p2p
- 사용자의 카메라, 마이크 같은 데이터 스트림에 접근
- getUserMedia()의 매개변수
제약 오브젝트 (video audio 사용 여부)
성공 시 콜백(MediaStream)
실패 시 콜백(error)
- getUserMedia는 반드시 로컬 시스템 파일이 아닌 서버에서 사용되어야 함. 어길 경우 PERMISSION_DENIED:1 에러 발생
RTCPeerConnection
- 암호화 및 대역폭 관리 기능, 오디오 또는 비디오 연결
- Peer들 간 데이터를 안정적, 효율적으로 통신하게 처리함
구현 방식

Caller가 Signalig 서버를 통해 자신의 SessionDescription을 보내면 Calle도 Signaling 서버를 통해 자신의 SessionDescription을 보냄
ICECandidate를 Signaling 서버를 통해 주고받으며 peer간 연결을 완료하고 Caller와 Callee 간의 Media 데이터를 주고받음
STUN 서버 동작

주고 받는 데이터

