sgcWebSockets 2022.8.0부터 sgcWebSockets 라이브러리에 TsgcRTCPeerConnection 컴포넌트가 추가됐어요.
TsgcRTCPeerConnection은 UDP를 통해 P2P로 피어를 연결하는 클라이언트 컴포넌트예요. 흐름은 4단계로 나뉘어요:- Signaling
- Connecting
- Securing
- Communicating
이 단계들을 구현하기 위해 클라이언트는 다음 프로토콜을 사용해요:
- WebSocket: 시그널링에 사용되는 프로토콜로, 클라이언트는 SDP와 로컬, 공용, 릴레이 IP 주소를 교환해요.
- UDP: 전송 프로토콜로, 클라이언트는 UDP를 사용해 피어 간 메시지를 주고받아요.
- DTLS: TLS와 유사하게, 피어 간 메시지를 보호하는 암호화 규격으로 제3자가 메시지를 읽거나 쓰는 것을 방지해요.
- STUN: 공용 IP 주소를 획득하는 프로토콜이에요.
- TURN: 피어가 NAT 뒤에 있을 때 IP 주소를 릴레이하는 프로토콜이에요.
- ICE: 피어 간 접근 가능한 IP 주소와 포트를 찾는 프로토콜이에요.
시그널링
클라이언트가 시작될 때는 누구와 무엇을 통신할지 알 수 없어요. 시그널링은 다음과 같은 세부 정보를 포함하는 SDP(세션 설명 프로토콜)를 사용해요:
- 피어에 접근 가능한 IP 및 포트
- 통신 보안에 사용되는 지문 인증서.
- 사용자 이름 및 비밀번호.
- ...
The Signaling makes use of the WebSocket protocol to exchange the data, it works through a subprotocol and it's implemented in the TsgcWSPServer_RTCPeerConnection component on server side.
TsgcRTCPeerConnection은 내부적으로 TsgcWSPClient_RTCPeerConnection이 연결된 WebSocket 클라이언트를 자동으로 생성해요.
IP 및 포트를 얻기 위해 클라이언트는 STUN/TURN 프로토콜을 사용해요. 따라서 STUN/TURN 서버도 필요해요.
링크:
- RTCPeerConnection WebSocket Server
- RTCPeerConnection WebSocket Client
- RTCPeerConnection STUN TURN
- RTCPeerConnection Signaling
연결
두 피어가 후보와 SDP를 알게 되면 클라이언트는 ICE라는 또 다른 표준 프로토콜을 사용해요.
ICE(Interactive Connection Establishment)는 두 피어 간의 연결을 수립해요. 피어는 동일한 네트워크에 있거나 NAT 뒤에 있을 수 있어요. ICE는 중앙 서버 없이 직접 연결을 수립하는 솔루션이에요. P2P 연결이 불가능한 경우 ICE는 TURN 서버를 통해 데이터를 릴레이해요.
두 피어 간 연결 가능한 유효한 후보를 ICE가 찾으면 다음 단계는 통신을 암호화하는 것이에요.
링크:
보안
피어가 연결된 후에는 통신을 보호해야 해요. 이는 UDP를 통한 통신을 보호하는 암호화 프로토콜인 DTLS를 사용해 처리해요.
DTLS 핸드셰이크가 성공적으로 완료되면 SRTP(Secure Real-Time Transport Protocol)라는 또 다른 프로토콜이 사용돼요. 현재 SRTP는 구현되어 있지 않아요.
링크:
통신
두 피어가 보안 프로토콜을 사용하게 되면 다음 두 프로토콜로 통신해요:
- RTP: 실시간 전송 프로토콜: SRTP로 암호화된 미디어를 교환하는 데 사용해요.
- SCTP: 스트림 제어 전송 프로토콜, dTLS로 암호화된 DataChannel 메시지를 주고받는 데 사용해요.
현재 이 프로토콜들은 구현되어 있지 않지만, UDP를 통한 DTLS로 데이터를 주고받을 수 있어요.
