RTCDataChannel의 개요
RTCDataChannel은 WebRTC (Web Real-Time Communication) API의 구성 요소 중 하나로, 브라우저 간 또는 피어 간의 데이터 전송을 담당하는 양방향 통신 채널이다. RTCDataChannel은 비디오, 오디오 스트림 외에 텍스트, 파일, 바이너리 데이터를 포함한 다양한 형태의 데이터를 교환할 수 있도록 설계되었다. 이러한 데이터 전송은 낮은 지연시간과 높은 신뢰성을 요구하는 애플리케이션에 적합한다.
RTCDataChannel의 초기화와 설정
RTCDataChannel은 RTCPeerConnection 객체를 통해 생성된다. RTCPeerConnection은 WebRTC의 핵심 클래스 중 하나로, 피어 간의 연결을 관리하고 다양한 미디어 및 데이터 스트림을 설정하는 역할을 한다. RTCDataChannel을 초기화할 때, 사용자는 특정 옵션을 설정할 수 있으며, 이는 데이터 전송의 특성과 채널의 동작에 영향을 미친다.
- ordered: 이 옵션은 데이터가 전송된 순서대로 도착해야 하는지 여부를 결정한다. 기본값은
true
이며,false
로 설정하면 순서가 보장되지 않지만 성능이 향상될 수 있다. - maxPacketLifeTime: 이 옵션은 패킷의 최대 수명을 밀리초 단위로 정의한다. 패킷이 이 시간 내에 도착하지 않으면 버려진다.
- maxRetransmits: 이 옵션은 패킷의 재전송 횟수를 제한한다. 특정 횟수 이상으로 패킷을 재전송하지 않는다.
- protocol: 이 필드는 사용자가 정의한 데이터 전송 프로토콜을 명시한다.
- negotiated: 이 옵션이
true
로 설정되면, RTCDataChannel의 생성과 관리를 수동으로 조정할 수 있다. 기본값은false
로 자동 협상이 이루어진다. - id:
negotiated
옵션이true
일 경우, 데이터 채널의 고유 ID를 명시적으로 설정할 수 있다.
RTCDataChannel의 전송 방식
RTCDataChannel은 데이터 전송에 있어 UDP 기반의 SRTP (Secure Real-time Transport Protocol) 또는 SCTP (Stream Control Transmission Protocol)을 사용한다. 특히 SCTP는 RTCDataChannel에서의 전송을 위해 채택된 프로토콜로, 다양한 스트림을 지원하며 데이터 전송 중 일부 패킷이 손실되더라도 다른 스트림에 영향을 미치지 않도록 설계되었다. SCTP는 또한 신뢰성, 순서 보장, 전송 오류 처리 등 TCP와 유사한 기능을 제공하지만, 실시간 전송 요구 사항에 맞게 최적화되어 있다.
RTCDataChannel을 통해 전송되는 데이터는 크게 세 가지 유형으로 나눌 수 있다:
- 텍스트 데이터: 문자열 형식의 데이터로, 보통 UTF-8로 인코딩된 텍스트 메시지이다.
- 바이너리 데이터: 파일, 이미지, 오디오 등 다양한 형태의 바이너리 데이터를 포함한다. 이 데이터는 ArrayBuffer나 Blob 형태로 전송된다.
- 오브젝트 데이터: JavaScript 객체를 JSON 형식으로 직렬화하여 전송할 수 있다.
RTCDataChannel의 이벤트와 핸들러
RTCDataChannel은 다양한 이벤트를 통해 상태 변화를 감지하고 대응할 수 있도록 설계되었다. 대표적인 이벤트로는 open
, message
, bufferedamountlow
, close
, error
등이 있다.
- open: 데이터 채널이 성공적으로 열리면 발생한다. 이 이벤트를 통해 데이터 전송을 시작할 수 있다.
- message: 상대 피어로부터 메시지가 도착했을 때 발생한다. 수신한 데이터를 처리하는 핸들러를 연결하여 사용한다.
- bufferedamountlow: 전송된 데이터가 특정 임계값 이하로 내려갔을 때 발생한다. 이를 통해 네트워크 병목 현상을 모니터링하고 제어할 수 있다.
- close: 데이터 채널이 정상적으로 닫힐 때 발생한다. 채널 자원을 정리하는데 사용된다.
- error: 데이터 전송 중 오류가 발생했을 때 발생한다. 오류 처리를 위한 핸들러를 정의할 수 있다.
RTCDataChannel의 보안
RTCDataChannel에서 전송되는 모든 데이터는 DTLS (Datagram Transport Layer Security)로 암호화된다. DTLS는 데이터그램 전송에 적합한 TLS의 변형으로, 데이터 무결성, 인증, 기밀성을 보장한다. 이러한 암호화 과정은 중간자 공격(man-in-the-middle attack) 등 다양한 보안 위협으로부터 데이터를 보호한다. 또한, WebRTC 자체가 보안을 매우 중요하게 다루는 구조로 설계되어 있기 때문에, RTCDataChannel의 보안성도 매우 높은 편이다.
RTCDataChannel의 상태 모니터링과 관리
RTCDataChannel은 상태(state) 관리를 통해 채널의 현재 상태를 추적할 수 있다. RTCDataChannel.readyState
프로퍼티를 사용하면 데이터 채널의 현재 상태를 알 수 있다. 주요 상태로는 다음이 있다:
- connecting: 데이터 채널이 설정 중인 상태로, 아직 사용할 수 없다.
- open: 데이터 채널이 성공적으로 설정되어 데이터 전송이 가능한 상태이다.
- closing: 데이터 채널이 닫히는 중으로, 이 상태에서는 더 이상 데이터 전송이 불가능한다.
- closed: 데이터 채널이 완전히 닫힌 상태로, 모든 통신이 종료되었다.
이 외에도 bufferedAmount
프로퍼티를 통해 현재 대기 중인 데이터의 양을 확인할 수 있으며, 이를 활용해 데이터 전송의 효율성을 관리할 수 있다.
관련 자료: - WebRTC 1.0: Real-Time Communication Between Browsers, W3C Editor's Draft, https://www.w3.org/TR/webrtc/ - Data channels, MDN Web Docs, https://developer.mozilla.org/en-US/docs/Web/API/RTCDataChannel