# WebRTC : RTCDataChannel

#### 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>
