WebRTC 우선순위 제어 API

W3C 후보 권고안 스냅샷,

현재 버전:
https://www.w3.org/TR/2021/CR-webrtc-priority-20210318/
최신 공개 버전:
https://www.w3.org/TR/webrtc-priority/
편집자 초안:
https://w3c.github.io/webrtc-priority/
이전 버전:
구현 보고서:
https://wpt.fyi/results/webrtc-priority?label=experimental&label=master&aligned
테스트 스위트:
https://github.com/web-platform-tests/wpt/tree/master/webrtc-priority
이슈 추적:
GitHub
편집자:
(Google)

초록

이 API는 나가는 WebRTC 패킷의 네트워크 제어 비트(DSCP 비트)와, 혼잡 상황에서 나가는 WebRTC 패킷의 큐잉 우선순위를 조작하기 위한 제어 표면을 정의한다.

이 문서의 상태

이 절은 발행 시점의 이 문서 상태를 설명한다. 다른 문서가 이 문서를 대체할 수 있다. 현재 W3C 발행물 목록과 이 기술 보고서의 최신 개정판은 https://www.w3.org/TR/의 W3C 기술 보고서 색인에서 찾을 수 있다.

이 문서는 Web Real-Time Communications Working Group에서 후보 권고안 스냅샷으로 발행했다. 이 문서는 W3C 권고안이 되는 것을 목적으로 한다. 이 문서는 폭넓은 검토 기회를 보장하기 위해 적어도 까지 후보 권고안으로 유지된다.

이 문서에 관해 의견을 제출하려면 이슈를 등록하거나 public-webrtc@w3.org로 보내라 (구독, 아카이브). 전자우편을 보낼 때는 제목에 “webrtc-priority”라는 텍스트를 넣어야 하며, 가능하면 다음과 같이 작성하는 것이 좋다: “[webrtc-priority] …의견 요약…”. 모든 의견을 환영한다.

후보 권고안으로 발행되었다고 해서 W3C 회원의 승인을 의미하지는 않는다. 후보 권고안 스냅샷은 폭넓은 검토를 받았으며, 구현 경험을 수집하기 위한 것이다.

이 문서가 제안 권고안 단계로 진입하기 위한 진입 기준은 이 명세의 모든 기능에 대해 최소 두 개의 독립적이고 상호운용 가능한 구현을 갖추는 것이며, 이는 작업 그룹이 개발한 테스트 스위트에 정의된 테스트를 통과함으로써 판단된다. 작업 그룹은 진행 상황을 추적하기 위해 구현 보고서를 준비할 것이다.

이 문서는 W3C 특허 정책에 따라 운영되는 그룹에서 작성했다. W3C는 해당 그룹의 산출물과 관련해 이루어진 모든 특허 공개의 공개 목록을 유지한다. 그 페이지에는 특허를 공개하기 위한 지침도 포함되어 있다. 개인이 필수 청구항을 포함한다고 믿는 특허를 실제로 알고 있는 경우, 그 개인은 Essential Claim(s)에 해당하는 정보를 W3C 특허 정책 제6절에 따라 공개해야 한다.

이 문서는 2020년 9월 15일 W3C 프로세스 문서의 적용을 받는다.

1. 소개

이 문서는 WEBRTC RTCRtpEncodingParameters 구조의 일부로 "priority" 필드를 정의하며, 가능한 값은 "very-low", "low", "medium" 및 "high"이다.

이 기능은 원래 [WEBRTC] 명세의 일부였지만, 구현 경험이 부족해 2019년 11월에 제거되었다. 이제 이 문서의 일부가 되었다.

또한 이 명세는 RTCRtpEncodingParameters에 필드를 추가하여 로컬 우선순위 지정에는 영향을 주지 않고 DSCP 마킹을 제어하거나, 그 반대로 제어할 수 있게 한다.

2. 우선순위 및 QoS 모델

많은 애플리케이션에는 같은 데이터 유형의 여러 미디어 흐름이 있으며, 종종 일부 흐름은 다른 흐름보다 더 중요하다. WebRTC는 [rfc8835][rfc8837]에 설명된 우선순위와 서비스 품질(QoS) 프레임워크를 사용하여, 일부 네트워킹 환경에서 QoS 제공을 돕는 패킷 우선순위와 DSCP 마킹을 제공한다. 우선순위 설정은 다양한 흐름의 상대적 우선순위를 나타내는 데 사용할 수 있다. 우선순위 API는 JavaScript 애플리케이션이 priority 속성을 설정하여 특정 미디어 흐름이 애플리케이션에 얼마나 중요한지, 즉 high, medium, low 또는 very low인지 브라우저에 알릴 수 있게 한다. 이 속성은 RTCRtpEncodingParameters 객체에서 아래에 정의된 값 중 하나로 설정된다.

3. 미디어 우선순위를 위한 확장

3.1. RTCPriorityType 열거형

enum RTCPriorityType {
  "very-low",
  "low",
  "medium",
  "high"
};
열거형 설명
very-low [rfc8835]의 4.1절과 4.2절을 참조하라. [rfc8831]에 정의된 "below normal"에 해당한다.
low [rfc8835]의 4.1절과 4.2절을 참조하라. [rfc8831]에 정의된 "normal"에 해당한다.
medium [rfc8835]의 4.1절과 4.2절을 참조하라. [rfc8831]에 정의된 "high"에 해당한다.
high [rfc8835]의 4.1절과 4.2절을 참조하라. [rfc8831]에 정의된 "extra high"에 해당한다.

이 API를 사용하는 애플리케이션은, 중요한 항목의 우선순위를 높이기보다는 덜 중요한 항목의 우선순위를 낮추는 편이 종종 더 나은 전체 사용자 경험을 제공한다는 점을 알고 있어야 한다.

3.2. RTCRtpEncodingParameters에 대한 확장

partial dictionary RTCRtpEncodingParameters {
  RTCPriorityType priority = "low";
  RTCPriorityType networkPriority;
};
priority, RTCPriorityType 유형, 기본값은 "low"

RTCRtpSender의 우선순위를 나타내며, 이는 RTCRtpSender 객체들 사이의 대역폭 할당에 영향을 준다. 이는 [rfc8835] 4절에 명시되어 있다. 사용자 에이전트는 RTCRtpSender의 인코딩들 사이에서 대역폭을 자유롭게 하위 할당할 수 있다.

networkPriority, RTCPriorityType 유형
이것은 priority와 같은 효과를 갖지만, [rfc8835] 4.2절에 설명된 것처럼 생성된 패킷의 DSCP 마킹에만 영향을 준다.

networkPriority가 설정되지 않은 경우, 생성된 패킷의 DSCP 마킹은 priority 멤버에 의해 제어된다.

4. RTCDataChannel을 위한 확장

partial interface RTCDataChannel {
  readonly attribute RTCPriorityType priority;
};

partial dictionary RTCDataChannelInit {
  RTCPriorityType priority = "low";
};

4.1. 새 RTCDataChannel 속성

priority, RTCPriorityType 유형, readonly

priority 속성은 이 RTCDataChannel의 우선순위를 반환한다. 우선순위는 채널 생성 시 사용자 에이전트가 할당한다. 가져올 때 이 속성은 [[DataChannelPriority]] 슬롯의 값을 반드시 반환해야 한다.

4.2. 새 RTCDataChannelInit 멤버

priority, RTCPriorityType 유형, 기본값은 "low"

이 채널의 우선순위.

4.3. RTCDataChannel 처리 단계

다음 단계들은 DataChannel 초기화 단계에 추가된다:

DataChannel이 내부 슬롯 [[DataChannelPriority]]을 갖도록 하라.

DataChannel을 초기화하는 처리 단계에서, option 인수를 처리하는 곳에 다음 단계를 삽입한다:

configuration 우선순위 값 RTCPriorityType
0에서 128까지 very-low
129에서 256까지 low
257에서 512까지 medium
513 이상 high

5. 보안 및 개인정보 보호 고려사항

이 API 확장은 그 자체로 새로운 정보를 노출하지 않으며, 이 확장을 통해 처리되는 어떤 데이터도 민감한 정보나 개인 식별 정보로 간주될 수 없다.

네트워크 트래픽을 모니터링하는 기능과 함께 사용하면, 이 확장을 이용해 구현이 명세의 어떤 부분을 실제로 준수하는지, 특히 우선순위 설정이 생성된 패킷의 DSCP 마킹 변경을 유발하는지 파악할 수 있다.

이 명세는 네트워크 트래픽의 우선순위 지정에 흔히 사용되는 네트워크 헤더의 일부 (DSCP 마킹)에 대한 일정한 제어를 허용한다. UA가 연결된 네트워크가 잘못 구성되었거나 과소 프로비저닝된 경우, 구성에서 예상하지 않은 DSCP 마킹이 포함된 패킷을 내보냄으로써 로컬 네트워크 환경에 영향을 줄 수 있다.

이 위험에 대한 대응책에는 적절한 구성이 포함된다. 가장 단순한 구성은 DSCP 블리칭, 즉 DSCP 마킹을 항상 0으로 만들거나 무시하는 것이다. 혼잡 제어(WebRTC에서는 항상 필수)는 대부분의 경우 네트워크 과부하를 방지한다.

적합성

문서 규약

적합성 요구사항은 서술적 단언과 RFC 2119 용어를 함께 사용하여 표현된다. 이 문서의 규범적 부분에서 쓰이는 핵심 단어 “MUST”, “MUST NOT”, “REQUIRED”, “SHALL”, “SHALL NOT”, “SHOULD”, “SHOULD NOT”, “RECOMMENDED”, “MAY”, 및 “OPTIONAL”은 RFC 2119에 설명된 대로 해석해야 한다. 다만 가독성을 위해, 이 명세에서는 이러한 단어들이 모두 대문자로 표시되지는 않는다.

이 명세의 모든 텍스트는 규범적이다. 단, 명시적으로 비규범으로 표시된 절, 예제 및 참고는 제외한다. [RFC2119]

이 명세의 예제는 “예를 들어”라는 말로 도입되거나 class="example"을 사용하여 규범적 텍스트와 구분된다. 다음과 같다:

이것은 정보성 예제의 한 예이다.

정보성 참고는 “참고”라는 말로 시작하며 class="note"를 사용하여 규범적 텍스트와 구분된다. 다음과 같다:

참고, 이것은 정보성 참고이다.

적합한 알고리즘

알고리즘의 일부로 명령형으로 표현된 요구사항 (예: "strip any leading space characters" 또는 "return false and abort these steps")은 해당 알고리즘을 도입할 때 사용된 핵심 단어 ("must", "should", "may" 등)의 의미로 해석해야 한다.

색인

이 명세에서 정의하는 용어

참조로 정의되는 용어

참고문헌

규범적 참고문헌

[RFC2119]
S. Bradner. RFC에서 요구 수준을 나타내기 위해 사용하는 핵심 단어. 1997년 3월. 현행 모범 사례. URL: https://tools.ietf.org/html/rfc2119
[RFC8831]
R. Jesup; S. Loreto; M. Tüxen. WebRTC 데이터 채널. 2021년 1월. 제안 표준. URL: https://datatracker.ietf.org/doc/html/rfc8831
[RFC8835]
H. Alvestrand. WebRTC를 위한 전송. 2021년 1월. 제안 표준. URL: https://datatracker.ietf.org/doc/html/rfc8835
[RFC8837]
P. Jones; et al. WebRTC QoS를 위한 Differentiated Services Code Point (DSCP) 패킷 마킹. 2021년 1월. 제안 표준. URL: https://datatracker.ietf.org/doc/html/rfc8837
[WEBRTC]
Cullen Jennings; Henrik Boström; Jan-Ivar Bruaroey. WebRTC 1.0: 브라우저 간 실시간 통신. 2021년 1월 26일. REC. URL: https://www.w3.org/TR/webrtc/

IDL 색인

enum RTCPriorityType {
  "very-low",
  "low",
  "medium",
  "high"
};

partial dictionary RTCRtpEncodingParameters {
  RTCPriorityType priority = "low";
  RTCPriorityType networkPriority;
};

partial interface RTCDataChannel {
  readonly attribute RTCPriorityType priority;
};

partial dictionary RTCDataChannelInit {
  RTCPriorityType priority = "low";
};