rfc9725.original | rfc9725.txt | |||
---|---|---|---|---|
wish S. Murillo | Internet Engineering Task Force (IETF) S. Murillo | |||
Internet-Draft Millicast | Request for Comments: 9725 Millicast | |||
Updates: 8842, 8840 (if approved) A. Gouaillard | Updates: 8840, 8842 A. Gouaillard | |||
Intended status: Standards Track CoSMo Software | Category: Standards Track CoSMo Software | |||
Expires: 22 February 2025 21 August 2024 | ISSN: 2070-1721 January 2025 | |||
WebRTC-HTTP ingestion protocol (WHIP) | WebRTC-HTTP Ingestion Protocol (WHIP) | |||
draft-ietf-wish-whip-16 | ||||
Abstract | Abstract | |||
This document describes a simple HTTP-based protocol that will allow | This document describes a simple HTTP-based protocol that will allow | |||
WebRTC-based ingestion of content into streaming services and/or | WebRTC-based ingestion of content into streaming services and/or | |||
CDNs. | Content Delivery Networks (CDNs). | |||
This document updates RFC 8842 and RFC 8840. | This document updates RFCs 8840 and 8842. | |||
Status of This Memo | Status of This Memo | |||
This Internet-Draft is submitted in full conformance with the | This is an Internet Standards Track document. | |||
provisions of BCP 78 and BCP 79. | ||||
Internet-Drafts are working documents of the Internet Engineering | ||||
Task Force (IETF). Note that other groups may also distribute | ||||
working documents as Internet-Drafts. The list of current Internet- | ||||
Drafts is at https://datatracker.ietf.org/drafts/current/. | ||||
Internet-Drafts are draft documents valid for a maximum of six months | This document is a product of the Internet Engineering Task Force | |||
and may be updated, replaced, or obsoleted by other documents at any | (IETF). It represents the consensus of the IETF community. It has | |||
time. It is inappropriate to use Internet-Drafts as reference | received public review and has been approved for publication by the | |||
material or to cite them other than as "work in progress." | Internet Engineering Steering Group (IESG). Further information on | |||
Internet Standards is available in Section 2 of RFC 7841. | ||||
This Internet-Draft will expire on 22 February 2025. | Information about the current status of this document, any errata, | |||
and how to provide feedback on it may be obtained at | ||||
https://www.rfc-editor.org/info/rfc9725. | ||||
Copyright Notice | Copyright Notice | |||
Copyright (c) 2024 IETF Trust and the persons identified as the | Copyright (c) 2025 IETF Trust and the persons identified as the | |||
document authors. All rights reserved. | document authors. All rights reserved. | |||
This document is subject to BCP 78 and the IETF Trust's Legal | This document is subject to BCP 78 and the IETF Trust's Legal | |||
Provisions Relating to IETF Documents (https://trustee.ietf.org/ | Provisions Relating to IETF Documents | |||
license-info) in effect on the date of publication of this document. | (https://trustee.ietf.org/license-info) in effect on the date of | |||
Please review these documents carefully, as they describe your rights | publication of this document. Please review these documents | |||
and restrictions with respect to this document. Code Components | carefully, as they describe your rights and restrictions with respect | |||
extracted from this document must include Revised BSD License text as | to this document. Code Components extracted from this document must | |||
described in Section 4.e of the Trust Legal Provisions and are | include Revised BSD License text as described in Section 4.e of the | |||
provided without warranty as described in the Revised BSD License. | Trust Legal Provisions and are provided without warranty as described | |||
in the Revised BSD License. | ||||
Table of Contents | Table of Contents | |||
1. Introduction . . . . . . . . . . . . . . . . . . . . . . . . 3 | 1. Introduction | |||
2. Terminology . . . . . . . . . . . . . . . . . . . . . . . . . 4 | 2. Terminology | |||
3. Overview . . . . . . . . . . . . . . . . . . . . . . . . . . 4 | 3. Overview | |||
4. Protocol Operation . . . . . . . . . . . . . . . . . . . . . 6 | 4. Protocol Operation | |||
4.1. HTTP usage . . . . . . . . . . . . . . . . . . . . . . . 6 | 4.1. HTTP Usage | |||
4.2. Ingest session set up . . . . . . . . . . . . . . . . . . 7 | 4.2. Ingest Session Setup | |||
4.3. ICE support . . . . . . . . . . . . . . . . . . . . . . . 10 | 4.3. ICE Support | |||
4.3.1. HTTP PATCH request usage . . . . . . . . . . . . . . 10 | 4.3.1. HTTP PATCH Request Usage | |||
4.3.2. Trickle ICE . . . . . . . . . . . . . . . . . . . . . 11 | 4.3.2. Trickle ICE | |||
4.3.3. ICE Restarts . . . . . . . . . . . . . . . . . . . . 13 | 4.3.3. ICE Restarts | |||
4.4. WebRTC constraints . . . . . . . . . . . . . . . . . . . 15 | 4.4. WebRTC Constraints | |||
4.4.1. SDP Bundle . . . . . . . . . . . . . . . . . . . . . 16 | 4.4.1. SDP Bundle | |||
4.4.2. Single MediaStream . . . . . . . . . . . . . . . . . 16 | 4.4.2. Single MediaStream | |||
4.4.3. No partially successful answers . . . . . . . . . . . 16 | 4.4.3. No Partially Successful Answers | |||
4.4.4. DTLS setup role and SDP "setup" attribute . . . . . . 16 | 4.4.4. DTLS Setup Role and SDP "setup" Attribute | |||
4.4.5. Trickle ICE and ICE restarts . . . . . . . . . . . . 17 | 4.4.5. Trickle ICE and ICE Restarts | |||
4.5. Load balancing and redirections . . . . . . . . . . . . . 17 | 4.5. Load Balancing and Redirections | |||
4.6. STUN/TURN server configuration . . . . . . . . . . . . . 17 | 4.6. STUN/TURN Server Configuration | |||
4.6.1. Congestion control . . . . . . . . . . . . . . . . . 19 | 4.6.1. Congestion Control | |||
4.7. Authentication and authorization . . . . . . . . . . . . 19 | 4.7. Authentication and Authorization | |||
4.7.1. Bearer token authentication . . . . . . . . . . . . . 20 | 4.7.1. Bearer Token Authentication | |||
4.8. Simulcast and scalable video coding . . . . . . . . . . . 20 | 4.8. Simulcast and Scalable Video Coding | |||
4.9. Protocol extensions . . . . . . . . . . . . . . . . . . . 20 | 4.9. Protocol Extensions | |||
5. Security Considerations . . . . . . . . . . . . . . . . . . . 21 | 5. Security Considerations | |||
6. IANA Considerations . . . . . . . . . . . . . . . . . . . . . 23 | 6. IANA Considerations | |||
6.1. Link Relation Type: ice-server . . . . . . . . . . . . . 23 | 6.1. Link Relation Type: ice-server | |||
6.2. WebRTC-HTTP Ingestion Protocol (WHIP) registry group . . 23 | 6.2. WebRTC-HTTP Ingestion Protocol (WHIP) Registry Group | |||
6.3. Registration of WHIP URN Sub-namespace and WHIP | 6.3. Registration of WHIP URN Sub-Namespace and WHIP Registries | |||
registries . . . . . . . . . . . . . . . . . . . . . . . 23 | 6.3.1. WebRTC-HTTP Ingestion Protocol (WHIP) URNs Registry | |||
6.3.1. WebRTC-HTTP ingestion protocol (WHIP) URNs | 6.3.2. WebRTC-HTTP Ingestion Protocol (WHIP) Extension URNs | |||
registry . . . . . . . . . . . . . . . . . . . . . . 24 | Registry | |||
6.3.2. WebRTC-HTTP ingestion protocol (WHIP) extension URNs | 6.4. URN Sub-Namespace for WHIP | |||
registry . . . . . . . . . . . . . . . . . . . . . . 24 | 6.4.1. Specification Template | |||
6.4. URN Sub-namespace for WHIP . . . . . . . . . . . . . . . 25 | 6.5. Registering WHIP Protocol Extension URNs | |||
6.4.1. Specification Template . . . . . . . . . . . . . . . 25 | 6.5.1. Registration Procedure | |||
6.5. Registering WHIP Protocol Extensions URNs . . . . . . . . 27 | 6.5.2. Guidance for the Designated Expert | |||
6.5.1. Registration Procedure . . . . . . . . . . . . . . . 27 | 6.5.3. Registration Template | |||
6.5.2. Guidance for Designated Experts . . . . . . . . . . . 28 | 7. References | |||
6.5.3. WHIP Protocol Extension Registration Template . . . . 28 | 7.1. Normative References | |||
7. Acknowledgements . . . . . . . . . . . . . . . . . . . . . . 29 | 7.2. Informative References | |||
8. References . . . . . . . . . . . . . . . . . . . . . . . . . 29 | Acknowledgements | |||
8.1. Normative References . . . . . . . . . . . . . . . . . . 29 | Authors' Addresses | |||
8.2. Informative References . . . . . . . . . . . . . . . . . 32 | ||||
Authors' Addresses . . . . . . . . . . . . . . . . . . . . . . . 34 | ||||
1. Introduction | 1. Introduction | |||
The IETF RTCWEB working group standardized JSEP ([RFC9429]), a | The IETF RTCWEB Working Group standardized the JavaScript Session | |||
mechanism used to control the setup, management, and teardown of a | Establishment Protocol (JSEP) [RFC9429], a mechanism used to control | |||
multimedia session. It also describes how to negotiate media flows | the setup, management, and teardown of a multimedia session. It also | |||
using the Offer/Answer Model with the Session Description Protocol | describes how to negotiate media flows using the offer/answer model | |||
(SDP) [RFC3264] including the formats for data sent over the wire | with the Session Description Protocol (SDP) [RFC3264], including the | |||
(e.g., media types, codec parameters, and encryption). WebRTC | formats for data sent over the wire (e.g., media types, codec | |||
intentionally does not specify a signaling transport protocol at | parameters, and encryption). WebRTC intentionally does not specify a | |||
application level. | signaling transport protocol at the application level. | |||
Unfortunately, the lack of a standardized signaling mechanism in | Unfortunately, the lack of a standardized signaling mechanism in | |||
WebRTC has been an obstacle to adoption as an ingestion protocol | WebRTC has been an obstacle to its adoption as an ingestion protocol | |||
within the broadcast/streaming industry, where a streamlined | within the broadcast and streaming industry, where a streamlined | |||
production pipeline is taken for granted: plug in cables carrying raw | production pipeline is taken for granted: plug in cables carrying raw | |||
media to hardware encoders, then push the encoded media to any | media to hardware encoders, then push the encoded media to any | |||
streaming service or Content Delivery Network (CDN) ingest using an | streaming service or Content Delivery Network (CDN) ingest using an | |||
ingestion protocol. | ingestion protocol. | |||
While WebRTC can be integrated with standard signaling protocols like | While WebRTC can be integrated with standard signaling protocols like | |||
SIP [RFC3261] or XMPP [RFC6120], they are not designed to be used in | SIP [RFC3261] or Extensible Messaging and Presence Protocol (XMPP) | |||
broadcasting/streaming services, and there is also no sign of | [RFC6120], they are not designed to be used in broadcasting and | |||
adoption in that industry. RTSP [RFC7826], which is based on RTP, | streaming services, and there is also no sign of adoption in that | |||
does not support the SDP offer/answer model [RFC3264] for negotiating | industry. The Real-Time Streaming Protocol (RTSP) [RFC7826], which | |||
the characteristics of the media session. | is based on RTP, does not support the SDP offer/answer model | |||
[RFC3264] for negotiating the characteristics of the media session. | ||||
This document proposes a simple protocol based on HTTP for supporting | This document proposes a simple protocol based on HTTP for supporting | |||
WebRTC as media ingestion method which: | WebRTC as a media ingestion method that: | |||
* Is easy to implement, | * is easy to implement, | |||
* Is as easy to use as popular IP-based broadcast protocols | * is as easy to use as popular IP-based broadcast protocols, | |||
* Is fully compliant with WebRTC and RTCWEB specs | * is fully compliant with WebRTC and RTCWEB specs, | |||
* Enables ingestion on both classical media platforms and WebRTC | * enables ingestion on both classical media platforms and WebRTC | |||
end-to-end platforms, achieving the lowest possible latency. | end-to-end platforms (achieving the lowest possible latency), | |||
* Lowers the requirements on both hardware encoders and broadcasting | * lowers the requirements on both hardware encoders and broadcasting | |||
services to support WebRTC. | services to support WebRTC, and | |||
* Is usable both in web browsers and in standalone encoders. | * is usable in both web browsers and standalone encoders. | |||
2. Terminology | 2. Terminology | |||
The key words "MUST", "MUST NOT", "REQUIRED", "SHALL", "SHALL NOT", | The key words "MUST", "MUST NOT", "REQUIRED", "SHALL", "SHALL NOT", | |||
"SHOULD", "SHOULD NOT", "RECOMMENDED", "NOT RECOMMENDED", "MAY", and | "SHOULD", "SHOULD NOT", "RECOMMENDED", "NOT RECOMMENDED", "MAY", and | |||
"OPTIONAL" in this document are to be interpreted as described in | "OPTIONAL" in this document are to be interpreted as described in | |||
BCP 14 [RFC2119] [RFC8174] when, and only when, they appear in all | BCP 14 [RFC2119] [RFC8174] when, and only when, they appear in all | |||
capitals, as shown here. | capitals, as shown here. | |||
3. Overview | 3. Overview | |||
The WebRTC-HTTP Ingest Protocol (WHIP) is designed to facilitate a | The WebRTC-HTTP Ingestion Protocol (WHIP) is designed to facilitate a | |||
one-time exchange of Session Description Protocol (SDP) offers and | one-time exchange of Session Description Protocol (SDP) offers and | |||
answers using HTTP POST requests. This exchange is a fundamental | answers using HTTP POST requests. This exchange is a fundamental | |||
step in establishing an Interactive Connectivity Establishment (ICE) | step in establishing an Interactive Connectivity Establishment (ICE) | |||
and Datagram Transport Layer Security (DTLS) session between the WHIP | and Datagram Transport Layer Security (DTLS) session between the WHIP | |||
client, which represents the encoder or media producer, and the media | client, which represents the encoder or media producer, and the media | |||
server, the broadcasting ingestion endpoint. | server, which is the broadcasting ingestion endpoint. | |||
Upon successful establishment of the ICE/DTLS session, unidirectional | Upon successful establishment of the ICE/DTLS session, unidirectional | |||
media data transmission commences from the WHIP client to the media | media data transmission commences from the WHIP client to the media | |||
server. It is important to note that SDP renegotiations are not | server. It is important to note that SDP renegotiations are not | |||
supported in WHIP, meaning that no modifications to the "m=" sections | supported in WHIP. This means that no modifications to the "m=" | |||
can be made after the initial SDP offer/answer exchange via HTTP POST | sections can be made after the initial SDP offer/answer exchange via | |||
is completed and only ICE related information can be updated via HTTP | HTTP POST is completed and that only ICE-related information can be | |||
PATCH requests as defined in Section 4.3. | updated via HTTP PATCH requests as defined in Section 4.3. | |||
The following diagram illustrates the core operation of the WHIP | The following diagram illustrates the core operation of the WHIP | |||
protocol for initiating and terminating an ingest session: | protocol for initiating and terminating an ingest session: | |||
+-------------+ +---------------+ +--------------+ +---------------+ | +-------------+ +---------------+ +--------------+ +---------------+ | |||
| WHIP client | | WHIP endpoint | | Media Server | | WHIP session | | | WHIP client | | WHIP endpoint | | Media server | | WHIP session | | |||
+--+----------+ +---------+-----+ +------+-------+ +--------|------+ | +--+----------+ +---------+-----+ +------+-------+ +--------|------+ | |||
| | | | | | | | | | |||
| | | | | | | | | | |||
|HTTP POST (SDP Offer) | | | | |HTTP POST (SDP offer) | | | | |||
+------------------------>+ | | | +------------------------>+ | | | |||
|201 Created (SDP answer) | | | | |201 Created (SDP answer) | | | | |||
+<------------------------+ | | | +<------------------------+ | | | |||
| ICE REQUEST | | | | ICE REQUEST | | | |||
+--------------------------------------->+ | | +--------------------------------------->+ | | |||
| ICE RESPONSE | | | | ICE RESPONSE | | | |||
|<---------------------------------------+ | | |<---------------------------------------+ | | |||
| DTLS SETUP | | | | DTLS SETUP | | | |||
|<======================================>| | | |<======================================>| | | |||
| RTP/RTCP FLOW | | | | RTP/RTCP FLOW | | | |||
+<-------------------------------------->+ | | +<-------------------------------------->+ | | |||
| HTTP DELETE | | | HTTP DELETE | | |||
+---------------------------------------------------------->+ | +---------------------------------------------------------->+ | |||
| 200 OK | | | 200 OK | | |||
<-----------------------------------------------------------x | <-----------------------------------------------------------x | |||
Figure 1: WHIP session setup and teardown | Figure 1: WHIP Session Setup and Teardown | |||
The elements in Figure 1 are described as follows: | The elements in Figure 1 are described as follows: | |||
* WHIP client: This represents the WebRTC media encoder or producer, | WHIP client: This represents the WebRTC media encoder or producer, | |||
which functions as a client of the WHIP protocol by encoding and | which functions as a client of the WHIP protocol by encoding and | |||
delivering media to a remote media server. | delivering media to a remote media server. | |||
* WHIP endpoint: This denotes the ingest server that receives the | WHIP endpoint: This denotes the ingest server that receives the | |||
initial WHIP request. | initial WHIP request. | |||
* WHIP endpoint URL: Refers to the URL of the WHIP endpoint | WHIP endpoint URL: This refers to the URL of the WHIP endpoint | |||
responsible for creating the WHIP session. | responsible for creating the WHIP session. | |||
* Media server: This is the WebRTC media server or consumer | Media server: This is the WebRTC media server or consumer | |||
responsible for establishing the media session with the WHIP | responsible for establishing the media session with the WHIP | |||
client and receiving the media content it produces. | client and receiving the media content it produces. | |||
* WHIP session: This indicates the server handling the allocated | WHIP session: This indicates the server handling the allocated HTTP | |||
HTTP resource by the WHIP endpoint for an ongoing ingest session. | resource by the WHIP endpoint for an ongoing ingest session. | |||
* WHIP session URL: Refers to the URL of the WHIP resource allocated | WHIP session URL: This refers to the URL of the WHIP resource | |||
by the WHIP endpoint for a specific media session. The WHIP | allocated by the WHIP endpoint for a specific media session. The | |||
client can send requests to the WHIP session using this URL to | WHIP client can send requests to the WHIP session using this URL | |||
modify the session, such as ICE operations or termination. | to modify the session, such as ICE operations or termination. | |||
The Figure 1 illustrates the communication flow between a WHIP | Figure 1 illustrates the communication flow between a WHIP client, | |||
client, WHIP endpoint, media server, and WHIP session. This flow | WHIP endpoint, media server, and WHIP session. This flow outlines | |||
outlines the process of setting up and tearing down an ingestion | the process of setting up and tearing down an ingestion session using | |||
session using the WHIP protocol, involving negotiation, ICE for | the WHIP protocol, which involves negotiation, ICE for Network | |||
Network Address Translation (NAT) traversal, DTLS and Secure Real- | Address Translation (NAT) traversal, DTLS and the Secure Real-time | |||
time Transport Protocol (SRTP) for security, and RTP/RTCP for media | Transport Protocol (SRTP) for security, and RTP/RTCP for media | |||
transport: | transport: | |||
* WHIP client: Initiates the communication by sending an HTTP POST | * WHIP client: Initiates the communication by sending an HTTP POST | |||
with an SDP Offer to the WHIP endpoint. | with an SDP offer to the WHIP endpoint. | |||
* WHIP endpoint: Responds with a "201 Created" message containing an | * WHIP endpoint: Responds with a "201 Created" message containing an | |||
SDP answer. | SDP answer. | |||
* WHIP client and media server: Establish an ICE and DTLS sessions | * WHIP client and media server: Establish ICE and DTLS sessions for | |||
for NAT traversal and secure communication. | NAT traversal and secure communication. | |||
* RTP/RTCP Flow: Real-time Transport Protocol and Real-time | * RTP/RTCP flow: RTP and RTCP flows are established for media | |||
Transport Control Protocol flows are established for media | ||||
transmission from the WHIP client to the media server, secured by | transmission from the WHIP client to the media server, secured by | |||
the SRTP profile. | the SRTP profile. | |||
* WHIP client: Sends an HTTP DELETE to terminate the WHIP session. | * WHIP client: Sends an HTTP DELETE to terminate the WHIP session. | |||
* WHIP session: Responds with a "200 OK" to confirm the session | * WHIP session: Responds with a "200 OK" to confirm the session | |||
termination. | termination. | |||
4. Protocol Operation | 4. Protocol Operation | |||
4.1. HTTP usage | 4.1. HTTP Usage | |||
Following [BCP56] guidelines, WHIP clients MUST NOT match error codes | Following the guidelines in [BCP56], WHIP clients MUST NOT match | |||
returned by the WHIP endpoints and resources to a specific error | error codes returned by the WHIP endpoints and resources to a | |||
cause indicated in this specification. WHIP clients MUST be able to | specific error cause indicated in this specification. WHIP clients | |||
handle all applicable status codes gracefully falling back to the | MUST be able to handle all applicable status codes by gracefully | |||
generic n00 semantics of a given status code on unknown error codes. | falling back to the generic n00 semantics of a given status code on | |||
WHIP endpoints and resources could convey finer-grained error | unknown error codes. WHIP endpoints and resources could convey | |||
information by a problem statement json object in the response | finer-grained error information by a problem statement json object in | |||
message body of the failed request as per [RFC9457]. | the response message body of the failed request as per [RFC9457]. | |||
The WHIP endpoints and sessions are origin servers as defined in | The WHIP endpoints and sessions are origin servers as defined in | |||
Section 3.6. of [RFC9110] handling the requests and providing | Section 3.6 of [RFC9110]; they handle the requests and provide | |||
responses for the underlying HTTP resources. Those HTTP resources do | responses for the underlying HTTP resources. Those HTTP resources do | |||
not have any representation defined in this specification, so the | not have any representation defined in this specification, so the | |||
WHIP endpoints and sessions MUST return a 2XX sucessfull response | WHIP endpoints and sessions MUST return a 2xx successful response | |||
with no content when a GET request is received. | with no content when a GET request is received. | |||
4.2. Ingest session set up | 4.2. Ingest Session Setup | |||
In order to set up an ingestion session, the WHIP client MUST | In order to set up an ingestion session, the WHIP client MUST | |||
generate an SDP offer according to the JSEP rules for an initial | generate an SDP offer according to the JSEP rules for an initial | |||
offer as in Section 5.2.1 of [RFC9429] and perform an HTTP POST | offer as per Section 5.2.1 of [RFC9429] and perform an HTTP POST | |||
request as per Section 9.3.3 of [RFC9110] to the configured WHIP | request as per Section 9.3.3 of [RFC9110] to the configured WHIP | |||
endpoint URL. | endpoint URL. | |||
The HTTP POST request MUST have a content type of "application/sdp" | The HTTP POST request MUST have a content type of "application/sdp" | |||
and contain the SDP offer as the body. The WHIP endpoint MUST | and contain the SDP offer as the body. The WHIP endpoint MUST | |||
generate an SDP answer according to the JSEP rules for an initial | generate an SDP answer according to the JSEP rules for an initial | |||
answer as in Section 5.3.1 of [RFC9429] and return a "201 Created" | answer as per Section 5.3.1 of [RFC9429] and return the following: a | |||
response with a content type of "application/sdp", the SDP answer as | "201 Created" response with a content type of "application/sdp", the | |||
the body, and a Location header field pointing to the newly created | SDP answer as the body, and a Location header field pointing to the | |||
WHIP session. If the HTTP POST to the WHIP endpoint has a content | newly created WHIP session. If the HTTP POST to the WHIP endpoint | |||
type different than "application/sdp" or the SDP is malformed, the | has a content type different than "application/sdp" or the SDP is | |||
WHIP endpoint MUST reject the HTTP POST request with an appropiate | malformed, the WHIP endpoint MUST reject the HTTP POST request with | |||
4XX error response. | an appropriate 4xx error response. | |||
As the WHIP protocol only supports the ingestion use case with | As the WHIP protocol only supports the ingestion use case with | |||
unidirectional media, the WHIP client SHOULD use "sendonly" attribute | unidirectional media, the WHIP client SHOULD use the "sendonly" | |||
in the SDP offer but MAY use the "sendrecv" attribute instead, | attribute in the SDP offer but MAY use the "sendrecv" attribute | |||
"inactive" and "recvonly" attributes MUST NOT be used. The WHIP | instead; the "inactive" and "recvonly" attributes MUST NOT be used. | |||
endpoint MUST use "recvonly" attribute in the SDP answer. | The WHIP endpoint MUST use the "recvonly" attribute in the SDP | |||
answer. | ||||
Following Figure 2 is an example of an HTTP POST sent from a WHIP | Figure 2 is an example of an HTTP POST sent from a WHIP client to a | |||
client to a WHIP endpoint and the "201 Created" response from the | WHIP endpoint and the "201 Created" response from the WHIP endpoint | |||
WHIP endpoint containing the Location header pointing to the newly | containing the Location header pointing to the newly created WHIP | |||
created WHIP session: | session. | |||
POST /whip/endpoint HTTP/1.1 | POST /whip/endpoint HTTP/1.1 | |||
Host: whip.example.com | Host: whip.example.com | |||
Content-Type: application/sdp | Content-Type: application/sdp | |||
Content-Length: 1101 | Content-Length: 1101 | |||
v=0 | v=0 | |||
o=- 5228595038118931041 2 IN IP4 127.0.0.1 | o=- 5228595038118931041 2 IN IP4 127.0.0.1 | |||
s=- | s=- | |||
t=0 0 | t=0 0 | |||
a=group:BUNDLE 0 1 | a=group:BUNDLE 0 1 | |||
a=extmap-allow-mixed | a=extmap-allow-mixed | |||
a=ice-options:trickle ice2 | a=ice-options:trickle ice2 | |||
m=audio 9 UDP/TLS/RTP/SAVPF 111 | m=audio 9 UDP/TLS/RTP/SAVPF 111 | |||
c=IN IP4 0.0.0.0 | c=IN IP4 0.0.0.0 | |||
a=rtcp:9 IN IP4 0.0.0.0 | a=rtcp:9 IN IP4 0.0.0.0 | |||
a=ice-ufrag:EsAw | a=ice-ufrag:EsAw | |||
a=ice-pwd:bP+XJMM09aR8AiX1jdukzR6Y | a=ice-pwd:bP+XJMM09aR8AiX1jdukzR6Y | |||
a=fingerprint:sha-256 DA:7B:57:DC:28:CE:04:4F:31:79:85:C4:31:67:EB:27:58:29:ED:77:2A:0D:24:AE:ED:AD:30:BC:BD:F1:9C:02 | a=fingerprint:sha-256 DA:7B:57:DC:28:CE:04:4F:31:79:85:C4:31:67:EB:27:58:29:ED:77:2A:0D:24:AE:ED:AD:30:BC:BD:F1:9C:02 | |||
a=setup:actpass | a=setup:actpass | |||
a=mid:0 | a=mid:0 | |||
a=extmap:4 urn:ietf:params:rtp-hdrext:sdes:mid | a=extmap:4 urn:ietf:params:rtp-hdrext:sdes:mid | |||
a=sendonly | a=sendonly | |||
a=msid:d46fb922-d52a-4e9c-aa87-444eadc1521b ce326ecf-a081-453a-8f9f-0605d5ef4128 | a=msid:d46fb922-d52a-4e9c-aa87-444eadc1521b ce326ecf-a081-453a-8f9f-0605d5ef4128 | |||
a=rtcp-mux | a=rtcp-mux | |||
a=rtcp-mux-only | a=rtcp-mux-only | |||
a=rtpmap:111 opus/48000/2 | a=rtpmap:111 opus/48000/2 | |||
a=fmtp:111 minptime=10;useinbandfec=1 | a=fmtp:111 minptime=10;useinbandfec=1 | |||
m=video 0 UDP/TLS/RTP/SAVPF 96 97 | m=video 0 UDP/TLS/RTP/SAVPF 96 97 | |||
a=mid:1 | a=mid:1 | |||
a=bundle-only | a=bundle-only | |||
a=extmap:4 urn:ietf:params:rtp-hdrext:sdes:mid | a=extmap:4 urn:ietf:params:rtp-hdrext:sdes:mid | |||
a=extmap:10 urn:ietf:params:rtp-hdrext:sdes:rtp-stream-id | a=extmap:10 urn:ietf:params:rtp-hdrext:sdes:rtp-stream-id | |||
a=extmap:11 urn:ietf:params:rtp-hdrext:sdes:repaired-rtp-stream-id | a=extmap:11 urn:ietf:params:rtp-hdrext:sdes:repaired-rtp-stream-id | |||
a=sendonly | a=sendonly | |||
a=msid:d46fb922-d52a-4e9c-aa87-444eadc1521b 3956b460-40f4-4d05-acef-03abcdd8c6fd | a=msid:d46fb922-d52a-4e9c-aa87-444eadc1521b 3956b460-40f4-4d05-acef-03abcdd8c6fd | |||
a=rtpmap:96 VP8/90000 | a=rtpmap:96 VP8/90000 | |||
a=rtcp-fb:96 ccm fir | a=rtcp-fb:96 ccm fir | |||
a=rtcp-fb:96 nack | a=rtcp-fb:96 nack | |||
a=rtcp-fb:96 nack pli | a=rtcp-fb:96 nack pli | |||
a=rtpmap:97 rtx/90000 | a=rtpmap:97 rtx/90000 | |||
a=fmtp:97 apt=96 | a=fmtp:97 apt=96 | |||
HTTP/1.1 201 Created | HTTP/1.1 201 Created | |||
ETag: "xyzzy" | ETag: "xyzzy" | |||
Content-Type: application/sdp | Content-Type: application/sdp | |||
Content-Length: 1053 | Content-Length: 1053 | |||
Location: https://whip.example.com/session/id | Location: https://whip.example.com/session/id | |||
v=0 | v=0 | |||
o=- 1657793490019 1 IN IP4 127.0.0.1 | o=- 1657793490019 1 IN IP4 127.0.0.1 | |||
s=- | s=- | |||
t=0 0 | t=0 0 | |||
a=group:BUNDLE 0 1 | a=group:BUNDLE 0 1 | |||
a=extmap-allow-mixed | a=extmap-allow-mixed | |||
a=ice-lite | a=ice-lite | |||
a=ice-options:trickle ice2 | a=ice-options:trickle ice2 | |||
m=audio 9 UDP/TLS/RTP/SAVPF 111 | m=audio 9 UDP/TLS/RTP/SAVPF 111 | |||
c=IN IP4 0.0.0.0 | c=IN IP4 0.0.0.0 | |||
a=rtcp:9 IN IP4 0.0.0.0 | a=rtcp:9 IN IP4 0.0.0.0 | |||
a=ice-ufrag:38sdf4fdsf54 | a=ice-ufrag:38sdf4fdsf54 | |||
a=ice-pwd:2e13dde17c1cb009202f627fab90cbec358d766d049c9697 | a=ice-pwd:2e13dde17c1cb009202f627fab90cbec358d766d049c9697 | |||
a=fingerprint:sha-256 F7:EB:F3:3E:AC:D2:EA:A7:C1:EC:79:D9:B3:8A:35:DA:70:86:4F:46:D9:2D:CC:D0:BC:81:9F:67:EF:34:2E:BD | a=fingerprint:sha-256 F7:EB:F3:3E:AC:D2:EA:A7:C1:EC:79:D9:B3:8A:35:DA:70:86:4F:46:D9:2D:CC:D0:BC:81:9F:67:EF:34:2E:BD | |||
a=candidate:1 1 UDP 2130706431 198.51.100.1 39132 typ host | a=candidate:1 1 UDP 2130706431 198.51.100.1 39132 typ host | |||
a=setup:passive | a=setup:passive | |||
a=mid:0 | a=mid:0 | |||
a=extmap:4 urn:ietf:params:rtp-hdrext:sdes:mid | a=extmap:4 urn:ietf:params:rtp-hdrext:sdes:mid | |||
a=recvonly | a=recvonly | |||
a=rtcp-mux | a=rtcp-mux | |||
a=rtcp-mux-only | a=rtcp-mux-only | |||
a=rtpmap:111 opus/48000/2 | a=rtpmap:111 opus/48000/2 | |||
a=fmtp:111 minptime=10;useinbandfec=1 | a=fmtp:111 minptime=10;useinbandfec=1 | |||
m=video 0 UDP/TLS/RTP/SAVPF 96 97 | m=video 0 UDP/TLS/RTP/SAVPF 96 97 | |||
c=IN IP4 0.0.0.0 | c=IN IP4 0.0.0.0 | |||
a=mid:1 | a=mid:1 | |||
a=bundle-only | a=bundle-only | |||
a=extmap:4 urn:ietf:params:rtp-hdrext:sdes:mid | a=extmap:4 urn:ietf:params:rtp-hdrext:sdes:mid | |||
a=extmap:10 urn:ietf:params:rtp-hdrext:sdes:rtp-stream-id | a=extmap:10 urn:ietf:params:rtp-hdrext:sdes:rtp-stream-id | |||
a=extmap:11 urn:ietf:params:rtp-hdrext:sdes:repaired-rtp-stream-id | a=extmap:11 urn:ietf:params:rtp-hdrext:sdes:repaired-rtp-stream-id | |||
a=recvonly | a=recvonly | |||
a=rtpmap:96 VP8/90000 | a=rtpmap:96 VP8/90000 | |||
a=rtcp-fb:96 ccm fir | a=rtcp-fb:96 ccm fir | |||
a=rtcp-fb:96 nack | a=rtcp-fb:96 nack | |||
a=rtcp-fb:96 nack pli | a=rtcp-fb:96 nack pli | |||
a=rtpmap:97 rtx/90000 | a=rtpmap:97 rtx/90000 | |||
a=fmtp:97 apt=96 | a=fmtp:97 apt=96 | |||
Figure 2: Example of SDP offer/answer exchange done via an HTTP POST | Figure 2: Example of the SDP Offer/Answer Exchange Done via an | |||
HTTP POST | ||||
Once a session is set up, consent freshness as per [RFC7675] SHALL be | Once a session is set up, consent freshness as per [RFC7675] SHALL be | |||
used to detect non-graceful disconnection by full ICE implementations | used to detect non-graceful disconnection by full ICE implementations | |||
and DTLS teardown for session termination by either side. | and DTLS teardown for session termination by either side. | |||
To explicitly terminate a WHIP session, the WHIP client MUST perform | To explicitly terminate a WHIP session, the WHIP client MUST perform | |||
an HTTP DELETE request to the WHIP session URL returned in the | an HTTP DELETE request to the WHIP session URL returned in the | |||
Location header field of the initial HTTP POST. Upon receiving the | Location header field of the initial HTTP POST. Upon receiving the | |||
HTTP DELETE request, the WHIP session will be removed and the | HTTP DELETE request, the WHIP session will be removed and the | |||
resources freed on the media server, terminating the ICE and DTLS | resources freed on the media server, terminating the ICE and DTLS | |||
sessions. | sessions. | |||
A media server terminating a session MUST follow the procedures in | A media server terminating a session MUST follow the procedures in | |||
Section 5.2 of [RFC7675] for immediate revocation of consent. | Section 5.2 of [RFC7675] for immediate revocation of consent. | |||
The WHIP endpoints MUST support OPTIONS requests for Cross-Origin | The WHIP endpoints MUST support OPTIONS requests for Cross-Origin | |||
Resource Sharing (CORS) as defined in [FETCH]. The "200 OK" response | Resource Sharing (CORS) as defined in [FETCH]. The "200 OK" response | |||
to any OPTIONS request SHOULD include an "Accept-Post" header with a | to any OPTIONS request SHOULD include an "Accept-Post" header with a | |||
media type value of "application/sdp" as per [W3C.REC-ldp-20150226]. | media type value of "application/sdp" as per [W3C.REC-ldp-20150226]. | |||
4.3. ICE support | 4.3. ICE Support | |||
ICE [RFC8845] is a protocol addressing the complexities of NAT | ICE [RFC8845] is a protocol that addresses the complexities of NAT | |||
traversal, commonly encountered in Internet communication. NATs | traversal commonly encountered in Internet communication. NATs | |||
hinder direct communication between devices on different local | hinder direct communication between devices on different local | |||
networks, posing challenges for real-time applications. ICE | networks, posing challenges for real-time applications. ICE | |||
facilitates seamless connectivity by employing techniques to discover | facilitates seamless connectivity by employing techniques to discover | |||
and negotiate efficient communication paths. | and negotiate efficient communication paths. | |||
Trickle ICE [RFC8838] optimizes the connectivity process by | Trickle ICE [RFC8838] optimizes the connectivity process by | |||
incrementally sharing potential communication paths, reducing | incrementally sharing potential communication paths, reducing | |||
latency, and facilitating quicker establishment. | latency, and facilitating quicker establishment. | |||
ICE Restarts are crucial for maintaining connectivity in dynamic | ICE restarts are crucial for maintaining connectivity in dynamic | |||
network conditions or disruptions, allowing devices to re-establish | network conditions or disruptions, allowing devices to re-establish | |||
communication paths without complete renegotiation. This ensures | communication paths without complete renegotiation. This ensures | |||
minimal latency and reliable real-time communication. | minimal latency and reliable real-time communication. | |||
Trickle ICE and ICE restart support are RECOMMENDED for both WHIP | Trickle ICE and ICE restart support are RECOMMENDED for both WHIP | |||
sessions and clients. | sessions and clients. | |||
4.3.1. HTTP PATCH request usage | 4.3.1. HTTP PATCH Request Usage | |||
The WHIP client MAY perform trickle ICE or ICE restarts by sending an | The WHIP client MAY perform Trickle ICE or ICE restarts by sending an | |||
HTTP PATCH request as per [RFC5789] to the WHIP session URL, with a | HTTP PATCH request as per [RFC5789] to the WHIP session URL, with a | |||
body containing an SDP fragment with media type "application/trickle- | body containing an SDP fragment with media type "application/trickle- | |||
ice-sdpfrag" as specified in [RFC8840] carrying the relevant ICE | ice-sdpfrag" as specified in [RFC8840] carrying the relevant ICE | |||
information. If the HTTP PATCH to the WHIP session has a content | information. If the HTTP PATCH to the WHIP session has a content | |||
type different than "application/trickle-ice-sdpfrag" or the SDP | type different than "application/trickle-ice-sdpfrag" or the SDP | |||
fragment is malformed, the WHIP session MUST reject the HTTP PATCH | fragment is malformed, the WHIP session MUST reject the HTTP PATCH | |||
with an appropiate 4XX error response. | with an appropriate 4xx error response. | |||
If the WHIP session supports either Trickle ICE or ICE restarts, but | If the WHIP session supports either Trickle ICE or ICE restarts, but | |||
not both, it MUST return a "422 Unprocessable Content" error response | not both, it MUST return a "422 Unprocessable Content" error response | |||
for the HTTP PATCH requests that are not supported as per | for the HTTP PATCH requests that are not supported as per | |||
Section 15.5.21 of [RFC9110]. | Section 15.5.21 of [RFC9110]. | |||
The WHIP client MAY send overlapping HTTP PATCH requests to one WHIP | The WHIP client MAY send overlapping HTTP PATCH requests to one WHIP | |||
session. Consequently, as those HTTP PATCH requests may be received | session. Consequently, those HTTP PATCH requests may be received out | |||
out-of-order by the WHIP session, if WHIP session supports ICE | of order by the WHIP session. Thus, if the WHIP session supports ICE | |||
restarts, it MUST generate a unique strong entity-tag identifying the | restarts, it MUST generate a unique strong entity-tag identifying the | |||
ICE session as per Section 8.8.3 of [RFC9110], being OPTIONAL | ICE session as per Section 8.8.3 of [RFC9110], being OPTIONAL | |||
otherwise. The initial value of the entity-tag identifying the | otherwise. The initial value of the entity-tag identifying the | |||
initial ICE session MUST be returned in an ETag header field in the | initial ICE session MUST be returned in an ETag header field in the | |||
"201 Created" response to the initial POST request to the WHIP | "201 Created" response to the initial POST request to the WHIP | |||
endpoint. | endpoint. | |||
WHIP clients SHOULD NOT use entity-tag validation when matching a | WHIP clients SHOULD NOT use entity-tag validation when matching a | |||
specific ICE session is not required, such as for example when | specific ICE session is not required, for example, when initiating a | |||
initiating a DELETE request to terminate a session. WHIP sessions | DELETE request to terminate a session. WHIP sessions MUST ignore any | |||
MUST ignore any entity-tag value sent by the WHIP client when ICE | entity-tag value sent by the WHIP client when ICE session matching is | |||
session matching is not required, as in the HTTP DELETE request. | not required, as in the HTTP DELETE request. | |||
Missing or outdated ETags in the PATCH requests from WHIP clients | Missing or outdated ETags in the PATCH requests from WHIP clients | |||
will be answered by WHIP sessions as per Section 13.1.1 of [RFC9110] | will be answered by WHIP sessions as per Section 13.1.1 of [RFC9110] | |||
and Section 3 of [RFC6585], with a "428 Precondition Required" | and Section 3 of [RFC6585], with a "428 Precondition Required" | |||
response for a missing entity tag, and a "412 Precondition Failed" | response for a missing entity-tag and a "412 Precondition Failed" | |||
response for a non-matching entity tag. | response for a non-matching entity-tag. | |||
4.3.2. Trickle ICE | 4.3.2. Trickle ICE | |||
Depending on the Trickle ICE support on the WHIP client, the initial | Depending on the Trickle ICE support on the WHIP client, the initial | |||
offer by the WHIP client MAY be sent after the full ICE gathering is | offer by the WHIP client MAY be sent after the full ICE gathering is | |||
complete with the full list of ICE candidates, or it MAY only contain | complete with the full list of ICE candidates, or it MAY only contain | |||
local candidates (or even an empty list of candidates) as per | local candidates (or even an empty list of candidates) as per | |||
[RFC8845]. For the purpose of reducing setup times, when using | [RFC8845]. For the purpose of reducing setup times, when using | |||
Trickle ICE the WHIP client SHOULD send the SDP offer as soon as | Trickle ICE, the WHIP client SHOULD send the SDP offer (containing | |||
possible, containing either locally gathered ICE candidates or an | either locally gathered ICE candidates or an empty list of | |||
empty list of candidates. | candidates) as soon as possible. | |||
In order to simplify the protocol, the WHIP session cannot signal | In order to simplify the protocol, the WHIP session cannot signal | |||
additional ICE candidates to the WHIP client after the SDP answer has | additional ICE candidates to the WHIP client after the SDP answer has | |||
been sent. The WHIP endpoint SHALL gather all the ICE candidates for | been sent. The WHIP endpoint SHALL gather all the ICE candidates for | |||
the media server before responding to the client request and the SDP | the media server before responding to the client request, and the SDP | |||
answer SHALL contain the full list of ICE candidates of the media | answer SHALL contain the full list of ICE candidates of the media | |||
server. | server. | |||
As the WHIP client needs to know the WHIP session URL associated with | As the WHIP client needs to know the WHIP session URL associated with | |||
the ICE session in order to send a PATCH request containing new ICE | the ICE session in order to send a PATCH request containing new ICE | |||
candidates, it MUST wait and buffer any gathered candidates until the | candidates, it MUST wait and buffer any gathered candidates until the | |||
"201 Created" HTTP response to the initial POST request is received. | "201 Created" HTTP response to the initial POST request is received. | |||
In order to lower the HTTP traffic and processing time required the | In order to reduce the HTTP traffic and processing time required, the | |||
WHIP client SHOULD send a single aggregated HTTP PATCH request with | WHIP client SHOULD send a single aggregated HTTP PATCH request with | |||
all the buffered ICE candidates once the response is received. | all the buffered ICE candidates once the response is received. | |||
Additionally, if ICE restarts are supported by the WHIP session, the | Additionally, if ICE restarts are supported by the WHIP session, the | |||
WHIP client needs to know the entity-tag associated with the ICE | WHIP client needs to know the entity-tag associated with the ICE | |||
session in order to send a PATCH request containing new ICE | session in order to send a PATCH request containing new ICE | |||
candidates, so it MUST also wait and buffer any gathered candidates | candidates; thus, it MUST also wait and buffer any gathered | |||
until it receives the HTTP response with the new entity-tag value to | candidates until it receives the HTTP response with the new entity- | |||
the last PATCH request performing an ICE restart. | tag value to the last PATCH request performing an ICE restart. | |||
WHIP clients generating the HTTP PATCH body with the SDP fragment and | WHIP clients generating the HTTP PATCH body with the SDP fragment and | |||
its subsequent processing by WHIP sessions MUST follow to the | its subsequent processing by WHIP sessions MUST follow the guidelines | |||
guidelines defined in Section 4.4 of [RFC8840] with the following | defined in Section 4.4 of [RFC8840] with the following | |||
considerations: | considerations: | |||
* As per [RFC9429], only m-sections not marked as bundle-only can | * As per [RFC9429], only "m=" sections not marked as bundle-only can | |||
gather ICE candidates, so given that the "max-bundle" policy is | gather ICE candidates, so given that the "max-bundle" policy is | |||
being used, the SDP fragment will contain only the offerer-tagged | being used, the SDP fragment will contain only the offerer-tagged | |||
m-line of the bundle group. | "m=" line of the bundle group. | |||
* The WHIP client MAY exclude ICE candidates from the HTTP PATCH | * The WHIP client MAY exclude ICE candidates from the HTTP PATCH | |||
body if they have already been confirmed by the WHIP session with | body if they have already been confirmed by the WHIP session with | |||
a successful HTTP response to a previous HTTP PATCH request. | a successful HTTP response to a previous HTTP PATCH request. | |||
WHIP sessions and clients that support Trickle ICE MUST make use of | WHIP sessions and clients that support Trickle ICE MUST make use of | |||
entity-tags and conditional requests as explained in Section 4.3.1. | entity-tags and conditional requests as explained in Section 4.3.1. | |||
When a WHIP session receives a PATCH request that adds new ICE | When a WHIP session receives a PATCH request that adds new ICE | |||
candidates without performing an ICE restart, it MUST return a "204 | candidates without performing an ICE restart, it MUST return a "204 | |||
No Content" response without a body and MUST NOT include an ETag | No Content" response without a body and MUST NOT include an ETag | |||
header in the response. If the WHIP session does not support a | header in the response. If the WHIP session does not support a | |||
candidate transport or is not able to resolve the connection address, | candidate transport or is not able to resolve the connection address, | |||
it MUST silently discard the candidate and continue processing the | it MUST silently discard the candidate and continue processing the | |||
rest of the request normally. | rest of the request normally. | |||
PATCH /session/id HTTP/1.1 | PATCH /session/id HTTP/1.1 | |||
Host: whip.example.com | Host: whip.example.com | |||
If-Match: "xyzzy" | If-Match: "xyzzy" | |||
Content-Type: application/trickle-ice-sdpfrag | Content-Type: application/trickle-ice-sdpfrag | |||
Content-Length: 576 | Content-Length: 576 | |||
a=group:BUNDLE 0 1 | a=group:BUNDLE 0 1 | |||
m=audio 9 UDP/TLS/RTP/SAVPF 111 | m=audio 9 UDP/TLS/RTP/SAVPF 111 | |||
a=mid:0 | a=mid:0 | |||
a=ice-ufrag:EsAw | a=ice-ufrag:EsAw | |||
a=ice-pwd:P2uYro0UCOQ4zxjKXaWCBui1 | a=ice-pwd:P2uYro0UCOQ4zxjKXaWCBui1 | |||
a=candidate:1387637174 1 udp 2122260223 192.0.2.1 61764 typ host generation 0 ufrag EsAw network-id 1 | a=candidate:1387637174 1 udp 2122260223 192.0.2.1 61764 typ host generation 0 ufrag EsAw network-id 1 | |||
a=candidate:3471623853 1 udp 2122194687 198.51.100.2 61765 typ host generation 0 ufrag EsAw network-id 2 | a=candidate:3471623853 1 udp 2122194687 198.51.100.2 61765 typ host generation 0 ufrag EsAw network-id 2 | |||
a=candidate:473322822 1 tcp 1518280447 192.0.2.1 9 typ host tcptype active generation 0 ufrag EsAw network-id 1 | a=candidate:473322822 1 tcp 1518280447 192.0.2.1 9 typ host tcptype active generation 0 ufrag EsAw network-id 1 | |||
a=candidate:2154773085 1 tcp 1518214911 198.51.100.2 9 typ host tcptype active generation 0 ufrag EsAw network-id 2 | a=candidate:2154773085 1 tcp 1518214911 198.51.100.2 9 typ host tcptype active generation 0 ufrag EsAw network-id 2 | |||
a=end-of-candidates | a=end-of-candidates | |||
HTTP/1.1 204 No Content | HTTP/1.1 204 No Content | |||
Figure 3: Example of a Trickle ICE request and response | Figure 3: Example of a Trickle ICE Request and Response | |||
Figure 3 shows an example of the Trickle ICE procedure where the WHIP | Figure 3 shows an example of the Trickle ICE procedure where the WHIP | |||
client sends a PATCH request with updated ICE candidate information | client sends a PATCH request with updated ICE candidate information | |||
and receives a successful response from the WHIP session. | and receives a successful response from the WHIP session. | |||
4.3.3. ICE Restarts | 4.3.3. ICE Restarts | |||
As defined in [RFC8839], when an ICE restart occurs, a new SDP offer/ | As defined in [RFC8839], when an ICE restart occurs, a new SDP offer/ | |||
answer exchange is triggered. However, as WHIP does not support | answer exchange is triggered. However, as WHIP does not support | |||
renegotiation of non-ICE related SDP information, a WHIP client will | renegotiation of non-ICE-related SDP information, a WHIP client will | |||
not send a new offer when an ICE restart occurs. Instead, the WHIP | not send a new offer when an ICE restart occurs. Instead, the WHIP | |||
client and WHIP session will only exchange the relevant ICE | client and WHIP session will only exchange the relevant ICE | |||
information via an HTTP PATCH request as defined in Section 4.3.1 and | information via an HTTP PATCH request as defined in Section 4.3.1 and | |||
MUST assume that the previously negotiated non-ICE related SDP | MUST assume that the previously negotiated non-ICE-related SDP | |||
information still apply after the ICE restart. | information still applies after the ICE restart. | |||
When performing an ICE restart, the WHIP client MUST include the | When performing an ICE restart, the WHIP client MUST include the | |||
updated "ice-pwd" and "ice-ufrag" in the SDP fragment of the HTTP | updated "ice-pwd" and "ice-ufrag" in the SDP fragment of the HTTP | |||
PATCH request body as well as the new set of gathered ICE candidates | PATCH request body as well as the new set of gathered ICE candidates | |||
as defined in [RFC8840]. Similar what is defined in Section 4.3.2, | as defined in [RFC8840]. Similar to what is defined in | |||
as per [RFC9429] only m-sections not marked as bundle-only can gather | Section 4.3.2, as per [RFC9429], only "m=" sections not marked as | |||
ICE candidates, so given that the "max-bundle" policy is being used, | bundle-only can gather ICE candidates, so given that the "max-bundle" | |||
the SDP fragment will contain only the offerer-tagged m-line of the | policy is being used, the SDP fragment will contain only the offerer- | |||
bundle group. A WHIP client sending a PATCH request for performing | tagged "m=" line of the bundle group. A WHIP client sending a PATCH | |||
ICE restart MUST contain an "If-Match" header field with a field- | request for performing ICE restart MUST contain an "If-Match" header | |||
value "*" as per Section 13.1.1 of [RFC9110]. | field with a field-value of "*" as per Section 13.1.1 of [RFC9110]. | |||
[RFC8840] states that an agent MUST discard any received requests | [RFC8840] states that an agent MUST discard any received requests | |||
containing "ice-pwd" and "ice-ufrag" attributes that do not match | containing "ice-pwd" and "ice-ufrag" attributes that do not match | |||
those of the current ICE Negotiation Session, however, any WHIP | those of the current ICE Negotiation Session. However, any WHIP | |||
session receiving an updated "ice-pwd" and "ice-ufrag" attributes | session receiving updated "ice-pwd" and "ice-ufrag" attributes MUST | |||
MUST consider the request as performing an ICE restart instead and, | consider the request as performing an ICE restart instead and, if | |||
if supported, SHALL return a "200 OK" with an "application/trickle- | supported, SHALL return a "200 OK" with an "application/trickle-ice- | |||
ice-sdpfrag" body containing the new ICE username fragment and | sdpfrag" body containing the new ICE username fragment and password | |||
password and a new set of ICE candidates for the WHIP session. Also, | and a new set of ICE candidates for the WHIP session. Also, the "200 | |||
the "200 OK" response for a successful ICE restart MUST contain the | OK" response for a successful ICE restart MUST contain the new | |||
new entity-tag corresponding to the new ICE session in an ETag | entity-tag corresponding to the new ICE session in an ETag response | |||
response header field and MAY contain a new set of ICE candidates for | header field and MAY contain a new set of ICE candidates for the | |||
the media server. | media server. | |||
As defined in Section 4.4.1.1.1 of [RFC8839] the set of candidates | As defined in Section 4.4.1.1.1 of [RFC8839], the set of candidates | |||
after an ICE restart may include some, none, or all of the previous | after an ICE restart may include some, none, or all of the previous | |||
candidates for that data stream and may include a totally new set of | candidates for that data stream and may include a totally new set of | |||
candidates. So after performing a successful ICE restart, both the | candidates. Therefore, after performing a successful ICE restart, | |||
WHIP client and the WHIP session MUST replace the previous set of | both the WHIP client and the WHIP session MUST replace the previous | |||
remote candidates with the new set exchanged in the HTTP PATCH | set of remote candidates with the new set exchanged in the HTTP PATCH | |||
request and response, discarding any remote ICE candidate not present | request and response, discarding any remote ICE candidate not present | |||
on the new set. Both the WHIP client and the WHIP session MUST | on the new set. Both the WHIP client and the WHIP session MUST | |||
ensure that the HTTP PATCH requests and response bodies include the | ensure that the HTTP PATCH request and response bodies include the | |||
same 'ice-options,' 'ice-pacing,' and 'ice-lite' attributes as those | same "ice-options," "ice-pacing," and "ice-lite" attributes as those | |||
used in the SDP offer or answer. | used in the SDP offer or answer. | |||
If the ICE restart request cannot be satisfied by the WHIP session, | If the ICE restart request cannot be satisfied by the WHIP session, | |||
the resource MUST return an appropriate HTTP error code and MUST NOT | the resource MUST return an appropriate HTTP error code and MUST NOT | |||
terminate the session immediately and keep the existing ICE session. | terminate the session immediately and keep the existing ICE session. | |||
The WHIP client MAY retry performing a new ICE restart or terminate | The WHIP client MAY retry performing a new ICE restart or terminate | |||
the session by issuing an HTTP DELETE request instead. In any case, | the session by issuing an HTTP DELETE request instead. In any case, | |||
the session MUST be terminated if the ICE consent expires as a | the session MUST be terminated if the ICE consent expires as a | |||
consequence of the failed ICE restart as per Section 5.1 of | consequence of the failed ICE restart as per Section 5.1 of | |||
[RFC7675]. | [RFC7675]. | |||
In case of unstable network conditions, the ICE restart HTTP PATCH | In case of unstable network conditions, the ICE restart HTTP PATCH | |||
requests and responses might be received out of order. In order to | requests and responses might be received out of order. In order to | |||
mitigate this scenario, when the client performs an ICE restart, it | mitigate this scenario, when the client performs an ICE restart, it | |||
MUST discard any previous ICE username and passwords fragments and | MUST discard any previous ICE username and password fragments and | |||
ignore any further HTTP PATCH response received from a pending HTTP | ignore any further HTTP PATCH response received from a pending HTTP | |||
PATCH request. WHIP clients MUST apply only the ICE information | PATCH request. WHIP clients MUST apply only the ICE information | |||
received in the response to the last sent request. If there is a | received in the response to the last sent request. If there is a | |||
mismatch between the ICE information at the WHIP client and at the | mismatch between the ICE information at the WHIP client and at the | |||
WHIP session (because of an out-of-order request), the STUN requests | WHIP session (because of an out-of-order request), the Session | |||
will contain invalid ICE information and will be dropped by the | Traversal Utilities for NAT (STUN) requests will contain invalid ICE | |||
receiving side. If this situation is detected by the WHIP client, it | information and will be dropped by the receiving side. If this | |||
MUST send a new ICE restart request to the server. | situation is detected by the WHIP client, it MUST send a new ICE | |||
restart request to the server. | ||||
PATCH /session/id HTTP/1.1 | PATCH /session/id HTTP/1.1 | |||
Host: whip.example.com | Host: whip.example.com | |||
If-Match: "*" | If-Match: "*" | |||
Content-Type: application/trickle-ice-sdpfrag | Content-Type: application/trickle-ice-sdpfrag | |||
Content-Length: 82 | Content-Length: 82 | |||
a=ice-options:trickle ice2 | a=ice-options:trickle ice2 | |||
a=group:BUNDLE 0 1 | a=group:BUNDLE 0 1 | |||
m=audio 9 UDP/TLS/RTP/SAVPF 111 | m=audio 9 UDP/TLS/RTP/SAVPF 111 | |||
a=mid:0 | a=mid:0 | |||
a=ice-ufrag:ysXw | a=ice-ufrag:ysXw | |||
a=ice-pwd:vw5LmwG4y/e6dPP/zAP9Gp5k | a=ice-pwd:vw5LmwG4y/e6dPP/zAP9Gp5k | |||
a=candidate:1387637174 1 udp 2122260223 192.0.2.1 61764 typ host generation 0 ufrag EsAw network-id 1 | a=candidate:1387637174 1 udp 2122260223 192.0.2.1 61764 typ host generation 0 ufrag EsAw network-id 1 | |||
a=candidate:3471623853 1 udp 2122194687 198.51.100.2 61765 typ host generation 0 ufrag EsAw network-id 2 | a=candidate:3471623853 1 udp 2122194687 198.51.100.2 61765 typ host generation 0 ufrag EsAw network-id 2 | |||
a=candidate:473322822 1 tcp 1518280447 192.0.2.1 9 typ host tcptype active generation 0 ufrag EsAw network-id 1 | a=candidate:473322822 1 tcp 1518280447 192.0.2.1 9 typ host tcptype active generation 0 ufrag EsAw network-id 1 | |||
a=candidate:2154773085 1 tcp 1518214911 198.51.100.2 9 typ host tcptype active generation 0 ufrag EsAw network-id 2 | a=candidate:2154773085 1 tcp 1518214911 198.51.100.2 9 typ host tcptype active generation 0 ufrag EsAw network-id 2 | |||
HTTP/1.1 200 OK | HTTP/1.1 200 OK | |||
ETag: "abccd" | ETag: "abccd" | |||
Content-Type: application/trickle-ice-sdpfrag | Content-Type: application/trickle-ice-sdpfrag | |||
Content-Length: 252 | Content-Length: 252 | |||
a=ice-lite | a=ice-lite | |||
a=ice-options:trickle ice2 | a=ice-options:trickle ice2 | |||
a=group:BUNDLE 0 1 | a=group:BUNDLE 0 1 | |||
m=audio 9 UDP/TLS/RTP/SAVPF 111 | m=audio 9 UDP/TLS/RTP/SAVPF 111 | |||
a=mid:0 | a=mid:0 | |||
a=ice-ufrag:289b31b754eaa438 | a=ice-ufrag:289b31b754eaa438 | |||
a=ice-pwd:0b66f472495ef0ccac7bda653ab6be49ea13114472a5d10a | a=ice-pwd:0b66f472495ef0ccac7bda653ab6be49ea13114472a5d10a | |||
a=candidate:1 1 udp 2130706431 198.51.100.1 39132 typ host | a=candidate:1 1 udp 2130706431 198.51.100.1 39132 typ host | |||
a=end-of-candidates | a=end-of-candidates | |||
Figure 4: Example of an ICE restart request and response | Figure 4: Example of an ICE Restart Request and Response | |||
Figure 3 demonstrates a Trickle ICE restart procedure example. The | Figure 4 demonstrates a Trickle ICE restart procedure example. The | |||
WHIP client sends a PATCH request containing updated ICE information, | WHIP client sends a PATCH request containing updated ICE information, | |||
including a new ufrag and password, along with newly gathered ICE | including a new ufrag and password, along with newly gathered ICE | |||
candidates. In response, the WHIP session provides ICE information | candidates. In response, the WHIP session provides ICE information | |||
for the session after the ICE restart, including the updated ufrag | for the session after the ICE restart, including the updated ufrag | |||
and password, as well as the previous ICE candidate. | and password, as well as the previous ICE candidate. | |||
4.4. WebRTC constraints | 4.4. WebRTC Constraints | |||
To simplify the implementation of WHIP in both clients and media | To simplify the implementation of WHIP in both clients and media | |||
servers, WHIP introduces specific restrictions on WebRTC usage. The | servers, WHIP introduces specific restrictions on WebRTC usage. The | |||
following subsections will explain these restrictions in detail: | following subsections will explain these restrictions in detail. | |||
4.4.1. SDP Bundle | 4.4.1. SDP Bundle | |||
Both the WHIP client and the WHIP endpoint SHALL support [RFC9143] | Both the WHIP client and the WHIP endpoint SHALL support [RFC9143] | |||
and use "max-bundle" policy as defined in [RFC9429]. The WHIP client | and use the "max-bundle" policy as defined in [RFC9429]. The WHIP | |||
and the media server MUST support multiplexed media associated with | client and the media server MUST support multiplexed media associated | |||
the BUNDLE group as per Section 9 of [RFC9143]. In addition, per | with the BUNDLE group as per Section 9 of [RFC9143]. In addition, | |||
[RFC9143] the WHIP client and media server SHALL use RTP/RTCP | per [RFC9143], the WHIP client and media server SHALL use RTP/RTCP | |||
multiplexing for all bundled media. In order to reduce the network | multiplexing for all bundled media. In order to reduce the network | |||
resources required at the media server, both The WHIP client and WHIP | resources required at the media server, both the WHIP client and WHIP | |||
endpoints MUST include the "rtcp-mux-only" attribute in each bundled | endpoints MUST include the "rtcp-mux-only" attribute in each bundled | |||
"m=" sections as per Section 3 of [RFC8858]. | "m=" section as per Section 3 of [RFC8858]. | |||
4.4.2. Single MediaStream | 4.4.2. Single MediaStream | |||
WHIP only supports a single MediaStream as defined in [RFC8830] and | WHIP only supports a single MediaStream as defined in [RFC8830]; | |||
therefore all "m=" sections MUST contain a "msid" attribute with the | therefore, all "m=" sections MUST contain a "msid" attribute with the | |||
same value. The MediaStream MUST contain at least one | same value. The MediaStream MUST contain at least one | |||
MediaStreamTrack of any media kind and it MUST NOT have two or more | MediaStreamTrack of any media kind, and it MUST NOT have two or more | |||
than MediaStreamTracks for the same media (audio or video). However, | MediaStreamTracks for the same media (audio or video). However, it | |||
it would be possible for future revisions of this spec to allow more | would be possible for future revisions of this specification to allow | |||
than a single MediaStream or MediaStreamTrack of each media kind, so | more than a single MediaStream or MediaStreamTrack of each media | |||
in order to ensure forward compatibility, if the number of audio and | kind. Therefore, in order to ensure forward compatibility, if the | |||
or video MediaStreamTracks or number of MediaStreams are not | number of audio and/or video MediaStreamTracks or the number of | |||
supported by the WHIP endpoint, it MUST reject the HTTP POST request | MediaStreams are not supported by the WHIP endpoint, it MUST reject | |||
with an "422 Unprocessable Content" or "400 Bad Request" error | the HTTP POST request with a "422 Unprocessable Content" or "400 Bad | |||
response. The WHIP endpoint MAY also return a problem statement as | Request" error response. The WHIP endpoint MAY also return a problem | |||
recommended in Section 4.1 proving further error details about the | statement as recommended in Section 4.1 proving further error details | |||
failed request. | about the failed request. | |||
4.4.3. No partially successful answers | 4.4.3. No Partially Successful Answers | |||
The WHIP endpoint SHOULD NOT reject individual "m=" sections as per | The WHIP endpoint SHOULD NOT reject individual "m=" sections as per | |||
Section 5.3.1 of [RFC9429] in case there is any error processing the | Section 5.3.1 of [RFC9429] in case there is any error processing the | |||
"m=" section, but reject the HTTP POST request with an "422 | "m=" section, but reject the HTTP POST request with a "422 | |||
Unprocessable Content" or "400 Bad Request" error response to prevent | Unprocessable Content" or "400 Bad Request" error response to prevent | |||
having partially successful ingest sessions which can be misleading | having partially successful ingest sessions, which can be misleading | |||
to end users. The WHIP endpoint MAY also return a problem statement | to end users. The WHIP endpoint MAY also return a problem statement | |||
as recommended in Section 4.1 proving further error details about the | as recommended in Section 4.1 proving further error details about the | |||
failed request. | failed request. | |||
4.4.4. DTLS setup role and SDP "setup" attribute | 4.4.4. DTLS Setup Role and SDP "setup" Attribute | |||
When a WHIP client sends an SDP offer, it SHOULD insert an SDP | When a WHIP client sends an SDP offer, it SHOULD insert an SDP | |||
"setup" attribute with an "actpass" attribute value, as defined in | "setup" attribute with an "actpass" attribute value, as defined in | |||
[RFC8842]. However, if the WHIP client only implements the DTLS | [RFC8842]. However, if the WHIP client only implements the DTLS | |||
client role, it MAY use an SDP "setup" attribute with an "active" | client role, it MAY use an SDP "setup" attribute with an "active" | |||
attribute value. If the WHIP endpoint does not support an SDP offer | attribute value. If the WHIP endpoint does not support an SDP offer | |||
with an SDP "setup" attribute with an "active" attribute value, it | with an SDP "setup" attribute with an "active" attribute value, it | |||
SHOULD reject the request with an "422 Unprocessable Content" or "400 | SHOULD reject the request with a "422 Unprocessable Content" or "400 | |||
Bad Request" error response. | Bad Request" error response. | |||
NOTE: [RFC8842] defines that the offerer must insert an SDP "setup" | NOTE: [RFC8842] defines that the offerer must insert an SDP "setup" | |||
attribute with an "actpass" attribute value. However, the WHIP | attribute with an "actpass" attribute value. However, the WHIP | |||
client will always communicate with a media server that is expected | client will always communicate with a media server that is expected | |||
to support the DTLS server role, in which case the client might | to support the DTLS server role, in which case the client might | |||
choose to only implement support for the DTLS client role. | choose to only implement support for the DTLS client role. | |||
4.4.5. Trickle ICE and ICE restarts | 4.4.5. Trickle ICE and ICE Restarts | |||
The media server SHOULD support full ICE, unless it is connected to | The media server SHOULD support full ICE, unless it is connected to | |||
the Internet with an IP address that is accessible by each WHIP | the Internet with an IP address that is accessible by each WHIP | |||
client that is authorized to use it, in which case it MAY support | client that is authorized to use it, in which case it MAY support | |||
only ICE lite. The WHIP client MUST implement and use full ICE. | only ICE lite. The WHIP client MUST implement and use full ICE. | |||
Trickle ICE and ICE restarts support is OPTIONAL for both the WHIP | Trickle ICE and ICE restart support is OPTIONAL for both the WHIP | |||
clients and media servers as explained in Section 4.3. | clients and media servers as explained in Section 4.3. | |||
4.5. Load balancing and redirections | 4.5. Load Balancing and Redirections | |||
WHIP endpoints and media servers might not be colocated on the same | WHIP endpoints and media servers might not be colocated on the same | |||
server, so it is possible to load balance incoming requests to | server, so it is possible to load balance incoming requests to | |||
different media servers. | different media servers. | |||
WHIP clients SHALL support HTTP redirections as per Section 15.4 of | WHIP clients SHALL support HTTP redirections as per Section 15.4 of | |||
[RFC9110]. In order to avoid POST requests to be redirected as GET | [RFC9110]. In order to avoid POST requests being redirected as GET | |||
requests, status codes 301 and 302 MUST NOT be used and the preferred | requests, status codes 301 and 302 MUST NOT be used; the preferred | |||
method for performing load balancing is via the "307 Temporary | method for performing load balancing is via the "307 Temporary | |||
Redirect" response status code as described in Section 15.4.8 of | Redirect" response status code as described in Section 15.4.8 of | |||
[RFC9110]. Redirections are not required to be supported for the | [RFC9110]. Redirections are not required to be supported for the | |||
PATCH and DELETE requests. | PATCH and DELETE requests. | |||
In case of high load, the WHIP endpoints MAY return a "503 Service | In case of high load, the WHIP endpoints MAY return a "503 Service | |||
Unavailable" response indicating that the server is currently unable | Unavailable" response indicating that the server is currently unable | |||
to handle the request due to a temporary overload or scheduled | to handle the request due to a temporary overload or scheduled | |||
maintenance as described in Section 15.6.4 of [RFC9110], which will | maintenance as described in Section 15.6.4 of [RFC9110], which will | |||
likely be alleviated after some delay. The WHIP endpoint might send | likely be alleviated after some delay. The WHIP endpoint might send | |||
a Retry-After header field indicating the minimum time that the user | a Retry-After header field indicating the minimum time that the user | |||
agent ought to wait before making a follow-up request as described in | agent ought to wait before making a follow-up request as described in | |||
Section 10.2.3 of [RFC9110]. | Section 10.2.3 of [RFC9110]. | |||
4.6. STUN/TURN server configuration | 4.6. STUN/TURN Server Configuration | |||
The WHIP endpoint MAY return STUN/TURN server configuration URLs and | The WHIP endpoint MAY return STUN/TURN server configuration URLs and | |||
credentials usable by the client in the "201 Created" response to the | credentials usable by the client in the "201 Created" response to the | |||
HTTP POST request to the WHIP endpoint URL. | HTTP POST request to the WHIP endpoint URL. | |||
A reference to each STUN/TURN server will be returned using the | A reference to each STUN/TURN server will be returned using the | |||
"Link" header field [RFC8288] with a "rel" attribute value of "ice- | "Link" header field [RFC8288] with a "rel" attribute value of "ice- | |||
server". The Link target URI is the server URI as defined in | server". The Link target URI is the server URI as defined in | |||
[RFC7064] and [RFC7065]. The credentials are encoded in the Link | [RFC7064] and [RFC7065]. The credentials are encoded in the Link | |||
target attributes as follows: | target attributes as follows: | |||
* username: If the Link header field represents a TURN server, and | * username: If the Link header field represents a Traversal Using | |||
credential-type is "password", then this attribute specifies the | Relays around NAT (TURN) server and the "credential-type" | |||
username to use with that TURN server. | attribute has a "password" value, then this attribute specifies | |||
the username to use with that TURN server. | ||||
* credential: If the "credential-type" attribute is missing or has a | * credential: If the "credential-type" attribute is missing or has a | |||
"password" value, the credential attribute represents a long-term | "password" value, this attribute represents a long-term | |||
authentication password, as described in Section 9.2 of [RFC8489]. | authentication password, as described in Section 9.2 of [RFC8489]. | |||
* credential-type: If the Link header field represents a TURN | * credential-type: If the Link header field represents a TURN | |||
server, then this attribute specifies how the credential attribute | server, then this attribute specifies how the "credential" | |||
value should be used when that TURN server requests authorization. | attribute value should be used when that TURN server requests | |||
The default value if the attribute is not present is "password". | authorization. The default value if the attribute is not present | |||
is "password". | ||||
Link: <stun:stun.example.net>; rel="ice-server" | Link: <stun:stun.example.net>; rel="ice-server" | |||
Link: <turn:turn.example.net?transport=udp>; rel="ice-server"; | Link: <turn:turn.example.net?transport=udp>; rel="ice-server"; | |||
username="user"; credential="myPassword"; credential-type="password" | username="user"; credential="myPassword"; credential-type="password" | |||
Link: <turn:turn.example.net?transport=tcp>; rel="ice-server"; | Link: <turn:turn.example.net?transport=tcp>; rel="ice-server"; | |||
username="user"; credential="myPassword"; credential-type="password" | username="user"; credential="myPassword"; credential-type="password" | |||
Link: <turns:turn.example.net?transport=tcp>; rel="ice-server"; | Link: <turns:turn.example.net?transport=tcp>; rel="ice-server"; | |||
username="user"; credential="myPassword"; credential-type="password" | username="user"; credential="myPassword"; credential-type="password" | |||
Figure 5: Example of a STUN/TURN servers configuration | Figure 5: Example of a STUN/TURN Server's Configuration | |||
Figure 5 illustrates the Link headers included in a 201 Created | Figure 5 illustrates the Link headers included in a "201 Created" | |||
response, providing the ICE server URLs and associated credentials. | response, providing the ICE server URLs and associated credentials. | |||
NOTE: The naming of both the "rel" attribute value of "ice-server" | NOTE: The naming of both the "rel" attribute value of "ice-server" | |||
and the target attributes follows the one used on the W3C WebRTC | and the target attributes follows that used in the RTCConfiguration | |||
recommendation [W3C.REC-webrtc-20210126] RTCConfiguration dictionary | dictionary in Section 4.2.1 of the W3C WebRTC recommendation (see | |||
in section 4.2.1. "rel" attribute value of "ice-server" is not | [W3C.REC-webrtc-20210126]). The "rel" attribute value of "ice- | |||
prepended with the "urn:ietf:params:whip:" so it can be reused by | server" is not prepended with the "urn:ietf:params:whip:" so it can | |||
other specifications which may use this mechanism to configure the | be reused by other specifications, which may use this mechanism to | |||
usage of STUN/TURN servers. | configure the usage of STUN/TURN servers. | |||
NOTE: Depending on the ICE Agent implementation, the WHIP client may | NOTE: Depending on the ICE agent implementation, the WHIP client may | |||
need to call the setConfiguration method before calling the | need to call the setConfiguration method before calling the | |||
setLocalDescription method with the local SDP offer in order to avoid | setLocalDescription method with the local SDP offer in order to avoid | |||
having to perform an ICE restart for applying the updated STUN/TURN | having to perform an ICE restart for applying the updated STUN/TURN | |||
server configuration on the next ICE gathering phase. | server configuration on the next ICE gathering phase. | |||
There are some WebRTC implementations that do not support updating | There are some WebRTC implementations that do not support updating | |||
the STUN/TURN server configuration after the local offer has been | the STUN/TURN server configuration after the local offer has been | |||
created as specified in Section 4.1.18 of [RFC9429]. In order to | created as specified in Section 4.1.18 of [RFC9429]. In order to | |||
support these clients, the WHIP endpoint MAY also include the STUN/ | support these clients, the WHIP endpoint MAY also include the STUN/ | |||
TURN server configuration on the responses to OPTIONS request sent to | TURN server configuration on the responses to OPTIONS requests sent | |||
the WHIP endpoint URL before the POST request is sent. However, this | to the WHIP endpoint URL before the POST request is sent. However, | |||
method is NOT RECOMMENDED to be used by the WHIP clients and, if | this method is NOT RECOMMENDED to be used by the WHIP clients, and if | |||
supported by the underlying WHIP client's webrtc implementation, the | it is supported by the underlying WHIP client's WebRTC | |||
WHIP client SHOULD wait for the information to be returned by the | implementation, the WHIP client SHOULD wait for the information to be | |||
WHIP endpoint on the response of the HTTP POST request instead. | returned by the WHIP endpoint on the response of the HTTP POST | |||
request instead. | ||||
The generation of the TURN server credentials may require performing | The generation of the TURN server credentials may require performing | |||
a request to an external provider, which can both add latency to the | a request to an external provider, which can both add latency to the | |||
OPTIONS request processing and increase the processing required to | OPTIONS request processing and increase the processing required to | |||
handle that request. In order to prevent this, the WHIP endpoint | handle that request. In order to prevent this, the WHIP endpoint | |||
SHOULD NOT return the STUN/TURN server configuration if the OPTIONS | SHOULD NOT return the STUN/TURN server configuration if the OPTIONS | |||
request is a preflight request for CORS as defined in [FETCH], that | request is a preflight request for CORS as defined in [FETCH], that | |||
is, if The OPTIONS request does not contain an Access-Control- | is, if the OPTIONS request does not contain an Access-Control- | |||
Request-Method with "POST" value and the Access-Control-Request- | Request-Method with a "POST" value and the Access-Control-Request- | |||
Headers HTTP header does not contain the "Link" value. | Headers HTTP header does not contain the "Link" value. | |||
The WHIP clients MAY also support configuring the STUN/TURN server | The WHIP clients MAY also support configuring the STUN/TURN server | |||
URIs with long term credentials provided by either the broadcasting | URIs with long-term credentials provided by either the broadcasting | |||
service or an external TURN provider, overriding the values provided | service or an external TURN provider, overriding the values provided | |||
by the WHIP endpoint. | by the WHIP endpoint. | |||
4.6.1. Congestion control | 4.6.1. Congestion Control | |||
[RFC8836] defines the congestion control requirements for interactive | [RFC8836] defines the congestion control requirements for interactive | |||
Real-Time media to be used in WebRTC. These requirements are based | real-time media to be used in WebRTC. These requirements are based | |||
on the assumption of the need to provide the data continuously, | on the assumption that the data needs to be provided continuously | |||
within a very limited time window (no more delay than hundreds of | within a very limited time window (a delay of no more than hundreds | |||
milliseconds end-to-end). If the latency target is higher, some of | of milliseconds end-to-end). If the latency target is higher, some | |||
the requirements present in RFC8836 could be relaxed to allow more | of the requirements present in [RFC8836] could be relaxed to allow | |||
flexible implementations. | more flexible implementations. | |||
4.7. Authentication and authorization | 4.7. Authentication and Authorization | |||
All WHIP endpoints, sessions and clients MUST support HTTP | All WHIP endpoints, sessions, and clients MUST support HTTP | |||
Authentication as per Section 11 of [RFC9110] and in order to ensure | authentication as per Section 11 of [RFC9110]. Additionally, in | |||
interoperability, bearer token authentication as defined in the next | order to ensure interoperability, bearer token authentication as | |||
section MUST be supported by all WHIP entities. However, this does | defined in the next section MUST be supported by all WHIP entities. | |||
not preclude the support of additional HTTP authentication schemes as | However, this does not preclude the support of additional HTTP | |||
defined in Section 11.6 of [RFC9110]. | authentication schemes as defined in Section 11.6 of [RFC9110]. | |||
4.7.1. Bearer token authentication | 4.7.1. Bearer Token Authentication | |||
WHIP endpoints and sessions MAY require the HTTP request to be | WHIP endpoints and sessions MAY require the HTTP request to be | |||
authenticated using an HTTP Authorization header field with a Bearer | authenticated using an HTTP Authorization header field with a bearer | |||
token as specified in Section 2.1 of [RFC6750]. WHIP clients MUST | token as specified in Section 2.1 of [RFC6750]. WHIP clients MUST | |||
implement this authentication and authorization mechanism and send | implement this authentication and authorization mechanism and send | |||
the HTTP Authorization header field in all HTTP requests sent to | the HTTP Authorization header field in all HTTP requests sent to | |||
either the WHIP endpoint or session except the preflight OPTIONS | either the WHIP endpoint or session (except the preflight OPTIONS | |||
requests for CORS. | requests for CORS). | |||
The nature, syntax, and semantics of the bearer token, as well as how | The nature, syntax, and semantics of the bearer token, as well as how | |||
to distribute it to the client, is outside the scope of this | to distribute it to the client, are outside the scope of this | |||
document. Some examples of the kind of tokens that could be used | document. Examples of tokens that could be used include, but are not | |||
are, but are not limited to, JWT tokens as per [RFC6750] and | limited to, JSON Web Tokens (JWTs) as per [RFC6750] and [RFC8725] and | |||
[RFC8725] or a shared secret stored on a database. The tokens are | a shared secret stored on a database. The tokens are typically made | |||
typically made available to the end user alongside the WHIP endpoint | available to the end user alongside the WHIP endpoint URL and | |||
URL and configured on the WHIP clients (similar to the way RTMP URLs | configured on the WHIP clients (similar to the way Real Time | |||
and Stream Keys are distributed). | Messaging Protocol (RTMP) URLs and Stream Keys are distributed). | |||
WHIP endpoints and sessions could perform the authentication and | WHIP endpoints and sessions could perform the authentication and | |||
authorization by encoding an authentication token within the URLs for | authorization by encoding an authentication token within the URLs for | |||
the WHIP endpoints or sessions instead. In case the WHIP client is | the WHIP endpoints or sessions instead. In case the WHIP client is | |||
not configured to use a bearer token, the HTTP Authorization header | not configured to use a bearer token, the HTTP Authorization header | |||
field MUST NOT be sent in any request. | field MUST NOT be sent in any request. | |||
4.8. Simulcast and scalable video coding | 4.8. Simulcast and Scalable Video Coding | |||
Simulcast as per [RFC8853] MAY be supported by both the media servers | Simulcast as per [RFC8853] MAY be supported by both the media servers | |||
and WHIP clients through negotiation in the SDP offer/answer. | and WHIP clients through negotiation in the SDP offer/answer. | |||
If the client supports simulcast and wants to enable it for | If the client supports simulcast and wants to enable it for | |||
ingesting, it MUST negotiate the support in the SDP offer according | ingesting, it MUST negotiate the support in the SDP offer according | |||
to the procedures in Section 5.3 of [RFC8853]. A server accepting a | to the procedures in Section 5.3 of [RFC8853]. A server accepting a | |||
simulcast offer MUST create an answer according to the procedures in | simulcast offer MUST create an answer according to the procedures in | |||
Section 5.3.2 of [RFC8853]. | Section 5.3.2 of [RFC8853]. | |||
It is possible for both media servers and WHIP clients to support | It is possible for both media servers and WHIP clients to support | |||
Scalable Video Coding (SVC). However, as there is no universal | Scalable Video Coding (SVC). However, as there is no universal | |||
negotiation mechanism in SDP for SVC, the encoder must consider the | negotiation mechanism in SDP for SVC, the encoder must consider the | |||
negotiated codec(s), intended usage, and SVC support in available | negotiated codec(s), intended usage, and SVC support in available | |||
decoders when configuring SVC. | decoders when configuring SVC. | |||
4.9. Protocol extensions | 4.9. Protocol Extensions | |||
In order to support future extensions to be defined for the WHIP | In order to support future extensions to be defined for the WHIP | |||
protocol, a common procedure for registering and announcing the new | protocol, a common procedure for registering and announcing the new | |||
extensions is defined. | extensions is defined. | |||
Protocol extensions supported by the WHIP sessions MUST be advertised | Protocol extensions supported by the WHIP sessions MUST be advertised | |||
to the WHIP client in the "201 Created" response to the initial HTTP | to the WHIP client in the "201 Created" response to the initial HTTP | |||
POST request sent to the WHIP endpoint. The WHIP endpoint MUST | POST request sent to the WHIP endpoint. The WHIP endpoint MUST | |||
return one "Link" header field for each extension that it supports, | return one "Link" header field for each extension that it supports, | |||
with the extension "rel" attribute value containing the extension URN | with the extension "rel" attribute value containing the extension URN | |||
and the URL for the HTTP resource that will be available for | and the URL for the HTTP resource that will be available for | |||
receiving requests related to that extension. | receiving requests related to that extension. | |||
Protocol extensions are optional for both WHIP clients and servers. | Protocol extensions are optional for both WHIP clients and servers. | |||
WHIP clients MUST ignore any Link attribute with an unknown "rel" | WHIP clients MUST ignore any Link attribute with an unknown "rel" | |||
attribute value and WHIP sessions MUST NOT require the usage of any | attribute value, and WHIP sessions MUST NOT require the usage of any | |||
extension. | extension. | |||
Each protocol extension MUST register a unique "rel" attribute value | Each protocol extension MUST register a unique "rel" attribute value | |||
at IANA starting with the prefix: "urn:ietf:params:whip:ext" as | that starts with the prefix "urn:ietf:params:whip:ext" (as defined in | |||
defined in Section 6.4. | Section 6.4) in the "WebRTC-HTTP Ingestion Protocol (WHIP) Extension | |||
URNs" registry (Section 6.3.2). | ||||
For example, considering a potential extension of server-to-client | For example, consider a potential extension of server-to-client | |||
communication using server-sent events as specified in | communication using server-sent events as specified in Section 9.2 of | |||
https://html.spec.whatwg.org/multipage/server-sent- | [HTML]. The URL for connecting to the server-sent event resource for | |||
events.html#server-sent-events, the URL for connecting to the server- | the ingested stream could be returned in the initial HTTP "201 | |||
sent event resource for the ingested stream could be returned in the | Created" response with a "Link" header field and a "rel" attribute of | |||
initial HTTP "201 Created" response with a "Link" header field and a | "urn:ietf:params:whip:ext:example:server-sent-events" (this document | |||
"rel" attribute of "urn:ietf:params:whip:ext:example:server-sent- | does not specify such an extension and uses it only as an example). | |||
events" (this document does not specify such an extension, and uses | ||||
it only as an example). | ||||
In this theoretical case, the "201 Created" response to the HTTP POST | In this theoretical case, the "201 Created" response to the HTTP POST | |||
request would look like: | request would look like: | |||
HTTP/1.1 201 Created | HTTP/1.1 201 Created | |||
Content-Type: application/sdp | Content-Type: application/sdp | |||
Location: https://whip.example.com/session/id | Location: https://whip.example.com/session/id | |||
Link: <https://whip.example.com/session/id/sse>; | Link: <https://whip.example.com/session/id/sse>; | |||
rel="urn:ietf:params:whip:ext:example:server-sent-events" | rel="urn:ietf:params:whip:ext:example:server-sent-events" | |||
Figure 6: Example of a WHIP protocol extension | Figure 6: Example of a WHIP Protocol Extension | |||
Figure 6 shows an example of a WHIP protocol extension supported by | Figure 6 shows an example of a WHIP protocol extension supported by | |||
the WHIP session, as indicated in the Link header of the 201 Created | the WHIP session, as indicated in the Link header of the "201 | |||
response. | Created" response. | |||
5. Security Considerations | 5. Security Considerations | |||
This document specifies a new protocol on top of HTTP and WebRTC, | This document specifies a new protocol on top of HTTP and WebRTC; | |||
thus, security protocols and considerations from related | thus, security protocols and considerations from related | |||
specifications apply to the WHIP specification. These include: | specifications apply to the WHIP specification. These include: | |||
* WebRTC security considerations: [RFC8826]. HTTPS SHALL be used in | * WebRTC security considerations: See [RFC8826]. HTTPS SHALL be | |||
order to preserve the WebRTC security model. | used in order to preserve the WebRTC security model. | |||
* Transport Layer Security (TLS): [RFC8446] and [RFC9147]. | * Transport Layer Security (TLS): See [RFC8446] and [RFC9147]. | |||
* HTTP security: Section 11 of [RFC9112] and Section 17 of | * HTTP security: See Section 11 of [RFC9112] and Section 17 of | |||
[RFC9110]. | [RFC9110]. | |||
* URI security: Section 7 of [RFC3986]. | * URI security: See Section 7 of [RFC3986]. | |||
On top of that, the WHIP protocol exposes a thin new attack surface | On top of that, the WHIP protocol exposes a thin new attack surface | |||
specific of the REST API methods used within it: | specific to the REST API methods used within it: | |||
* HTTP POST flooding and resource exhaustion: It would be possible | * HTTP POST flooding and resource exhaustion: It would be possible | |||
for an attacker in possession of authentication credentials valid | for an attacker in possession of authentication credentials valid | |||
for ingesting a WHIP stream to make multiple HTTP POST to the WHIP | for ingesting a WHIP stream to make multiple HTTP POST requests to | |||
endpoint. This will force the WHIP endpoint to process the | the WHIP endpoint. This will force the WHIP endpoint to process | |||
incoming SDP and allocate resources for being able to set up the | the incoming SDP and allocate resources for being able to set up | |||
DTLS/ICE connection. While the malicious client does not need to | the DTLS/ICE connection. While the malicious client does not need | |||
initiate the DTLS/ICE connection at all, the WHIP session will | to initiate the DTLS/ICE connection at all, the WHIP session will | |||
have to wait for the DTLS/ICE connection timeout in order to | have to wait for the DTLS/ICE connection timeout in order to | |||
release the associated resources. If the connection rate is high | release the associated resources. If the connection rate is high | |||
enough, this could lead to resource exhaustion on the servers | enough, this could lead to resource exhaustion on the servers | |||
handling the requests and it will not be able to process | handling the requests, and it will not be able to process | |||
legitimate incoming ingests. In order to prevent this scenario, | legitimate incoming ingests. In order to prevent this scenario, | |||
WHIP endpoints SHOULD implement a rate limit and avalanche control | WHIP endpoints SHOULD implement a rate limit and avalanche control | |||
mechanism for incoming initial HTTP POST requests. | mechanism for incoming initial HTTP POST requests. | |||
* Insecure direct object references (IDOR) on the WHIP session | * Insecure Direct Object References (IDORs) on the WHIP session | |||
locations: If the URLs returned by the WHIP endpoint for the WHIP | locations: If the URLs returned by the WHIP endpoint for the WHIP | |||
sessions location are easy to guess, it would be possible for an | sessions location are easy to guess, it would be possible for an | |||
attacker to send multiple HTTP DELETE requests and terminate all | attacker to send multiple HTTP DELETE requests and terminate all | |||
the WHIP sessions currently running. In order to prevent this | the WHIP sessions currently running. In order to prevent this | |||
scenario, WHIP endpoints SHOULD generate URLs with enough | scenario, WHIP endpoints SHOULD generate URLs with enough | |||
randomness, using a cryptographically secure pseudorandom number | randomness, using a cryptographically secure pseudorandom number | |||
generator following the best practices in Randomness Requirements | generator following the best practices in "Randomness Requirements | |||
for Security [RFC4086], and implement a rate limit and avalanche | for Security" [RFC4086], and implement a rate limit and avalanche | |||
control mechanism for HTTP DELETE requests. The security | control mechanism for HTTP DELETE requests. The security | |||
considerations for Universally Unique IDentifier (UUID) [RFC9562], | considerations for Universally Unique IDentifiers (UUIDs) in | |||
Section 8 are applicable for generating the WHIP sessions location | Section 8 of [RFC9562] are applicable for generating the WHIP | |||
URL. | sessions location URL. | |||
* HTTP PATCH flooding: Similar to the HTTP POST flooding, a | * HTTP PATCH flooding: Similar to the HTTP POST flooding, a | |||
malicious client could also create a resource exhaustion by | malicious client could also create resource exhaustion by sending | |||
sending multiple HTTP PATCH request to the WHIP session, although | multiple HTTP PATCH requests to the WHIP session, although the | |||
the WHIP sessions can limit the impact by not allocating new ICE | WHIP sessions can limit the impact by not allocating new ICE | |||
candidates and reusing the existing ICE candidates when doing ICE | candidates and reusing the existing ICE candidates when doing ICE | |||
restarts. In order to prevent this scenario, WHIP endpoints | restarts. In order to prevent this scenario, WHIP endpoints | |||
SHOULD implement a rate limit and avalanche control mechanism for | SHOULD implement a rate limit and avalanche control mechanism for | |||
incoming HTTP PATCH requests. | incoming HTTP PATCH requests. | |||
6. IANA Considerations | 6. IANA Considerations | |||
This specification adds a new link relation type and a registry for | This specification adds a new link relation type and a registry for | |||
URN sub-namespaces for WHIP protocol extensions. | URN sub-namespaces for WHIP protocol extensions. | |||
6.1. Link Relation Type: ice-server | 6.1. Link Relation Type: ice-server | |||
The link relation type below has been registered by IANA per | The link relation type below has been registered by IANA in the "Link | |||
Section 4.2 of [RFC8288]. | Relation Types" registry per Section 4.2 of [RFC8288]: | |||
Relation Name: ice-server | ||||
Description: Conveys the STUN and TURN servers that can be used by an | ||||
ICE Agent to establish a connection with a peer. | ||||
Reference: TBD | Relation Name: ice-server | |||
6.2. WebRTC-HTTP Ingestion Protocol (WHIP) registry group | Description: Conveys the STUN and TURN servers that can be used by | |||
an ICE agent to establish a connection with a peer. | ||||
IANA is asked to create a new registry group called "WebRTC-HTTP | Reference: RFC 9725 | |||
Ingestion Protocol (WHIP)". This group includes the "WebRTC-HTTP | ||||
ingestion protocol (WHIP) URNs" and "WebRTC-HTTP ingestion protocol | ||||
(WHIP) extension URNs" registries described below. | ||||
6.3. Registration of WHIP URN Sub-namespace and WHIP registries | 6.2. WebRTC-HTTP Ingestion Protocol (WHIP) Registry Group | |||
IANA is asked to add an entry to the "IETF URN Sub-namespace for | IANA has created a new registry group called "WebRTC-HTTP Ingestion | |||
Registered Protocol Parameter Identifiers" registry and create a sub- | Protocol (WHIP)". This group includes the "WebRTC-HTTP Ingestion | |||
namespace for the Registered Parameter Identifier as per [RFC3553]: | Protocol (WHIP) URNs" and "WebRTC-HTTP Ingestion Protocol (WHIP) | |||
"urn:ietf:params:whip". | Extension URNs" registries described in Sections 6.3.1 and 6.3.2. | |||
To manage this sub-namespace, IANA is asked to create the "WebRTC- | 6.3. Registration of WHIP URN Sub-Namespace and WHIP Registries | |||
HTTP ingestion protocol (WHIP) URNs" and "WebRTC-HTTP ingestion | ||||
protocol (WHIP) extension URNs". | ||||
6.3.1. WebRTC-HTTP ingestion protocol (WHIP) URNs registry | IANA has added an entry in the "IETF URN Sub-namespace for Registered | |||
Protocol Parameter Identifiers" registry [RFC3553] for | ||||
"urn:ietf:params:whip" as follows: | ||||
The "WebRTC-HTTP ingestion protocol (WHIP) URNs" registry is used to | Registered Parameter Identifier: whip | |||
manage entries within the "urn:ietf:params:whip" namespace. The | ||||
registry descriptions is as follows: | ||||
* Registry group: WebRTC-HTTP ingestion protocol (WHIP) | Reference: RFC 9725 | |||
* Registry name: WebRTC-HTTP ingestion protocol (WHIP) URNs | IANA Registry Reference: <https://www.iana.org/assignments/whip> | |||
* Specification: this document (RFC TBD) | To manage this sub-namespace, IANA has created the "WebRTC-HTTP | |||
Ingestion Protocol (WHIP) URNs" and "WebRTC-HTTP Ingestion Protocol | ||||
(WHIP) Extension URNs" registries described below. | ||||
* Registration procedure: Specification Required | 6.3.1. WebRTC-HTTP Ingestion Protocol (WHIP) URNs Registry | |||
* Field names: URI, description, change controller, reference and | The "WebRTC-HTTP Ingestion Protocol (WHIP) URNs" registry is used to | |||
IANA registry reference | manage entries within the "urn:ietf:params:whip" namespace. The | |||
registration procedure is "Specification Required" [RFC8126]. The | ||||
registry contains the following fields: URI, Description, Reference, | ||||
IANA Registry Reference, and Change Controller. This document is | ||||
listed as the reference. | ||||
The registry contains a single initial value: | The registry contains a single initial entry: | |||
* URI: urn:ietf:params:whip:ext | URI: urn:ietf:params:whip:ext | |||
* Description: WebRTC-HTTP ingestion protocol (WHIP) extension URNs | Description: WebRTC-HTTP ingestion protocol (WHIP) extension URNs | |||
* Change Controller: IETF | Reference: Section 6.3.2 of RFC 9725 | |||
* Reference: this document (RFC TBD) Section Section 6.3.2 | IANA Registry Reference: See "WebRTC-HTTP Ingestion Protocol (WHIP) | |||
Extension URNs" on <https://www.iana.org/assignments/whip> | ||||
* IANA registry reference: WebRTC-HTTP ingestion protocol (WHIP) | Change Controller: IETF | |||
extension URNs registry. | ||||
6.3.2. WebRTC-HTTP ingestion protocol (WHIP) extension URNs registry | 6.3.2. WebRTC-HTTP Ingestion Protocol (WHIP) Extension URNs Registry | |||
The "WebRTC-HTTP ingestion protocol (WHIP) Extension URNs" is used to | The "WebRTC-HTTP Ingestion Protocol (WHIP) Extension URNs" is used to | |||
manage entries within the "urn:ietf:params:whip:ext" namespace. The | manage entries within the "urn:ietf:params:whip:ext" namespace. The | |||
registry descriptions is as follows: | registration procedure is "Specification Required" [RFC8126]. The | |||
registry contains the following fields: URI, Description, Reference, | ||||
* Registry group: WebRTC-HTTP ingestion protocol (WHIP) | IANA Registry Reference, and Change Controller. This document is | |||
listed as the reference. | ||||
* Registry name: WebRTC-HTTP ingestion protocol (WHIP) Extension | ||||
URNs | ||||
* Specification: this document (RFC TBD) | ||||
* Registration procedure: Specification Required | ||||
* Field names: URI, description, change controller, reference and | ||||
IANA registry reference | ||||
6.4. URN Sub-namespace for WHIP | 6.4. URN Sub-Namespace for WHIP | |||
WHIP endpoint utilizes URNs to identify the supported WHIP protocol | A WHIP endpoint utilizes URNs to identify the supported WHIP protocol | |||
extensions on the "rel" attribute of the Link header as defined in | extensions on the "rel" attribute of the Link header as defined in | |||
Section 4.9. | Section 4.9. | |||
This section creates and registers an IETF URN Sub-namespace for use | This section creates and registers an IETF URN sub-namespace for use | |||
in the WHIP specifications and future extensions. | in the WHIP specifications and future extensions. | |||
6.4.1. Specification Template | 6.4.1. Specification Template | |||
Namespace ID: | Namespace ID: | |||
whip | ||||
* The Namespace ID "whip" has been assigned. | ||||
Registration Information: | Registration Information: | |||
Version: 1 | ||||
* Version: 1 | Date: TBD | |||
* Date: TBD | ||||
Declared registrant of the namespace: | Declared registrant of the namespace: | |||
Registering organization: IETF | ||||
* Registering organization: The Internet Engineering Task Force. | Designated contact: A designated expert (DE) will monitor the | |||
public mailing list <wish@ietf.org>. | ||||
* Designated contact: A designated expert will monitor the WHIP | ||||
public mailing list, "wish@ietf.org". | ||||
Declaration of Syntactic Structure: | Declaration of Syntactic Structure: | |||
The Namespace Specific String (NSS) of all URNs that use the | ||||
* The Namespace Specific String (NSS) of all URNs that use the | ||||
"whip" Namespace ID shall have the following structure: | "whip" Namespace ID shall have the following structure: | |||
urn:ietf:params:whip:{type}:{name}:{other}. | urn:ietf:params:whip:{type}:{name}:{other}. | |||
* The keywords have the following meaning: | The keywords have the following meanings: | |||
- type: The entity type. This specification only defines the | type: The entity type. This specification only defines the "ext" | |||
"ext" type. | type. | |||
- name: A required ASCII string that conforms to the URN syntax | name: A required ASCII string that conforms to the URN syntax | |||
requirements (see [RFC8141]) and defines a major namespace of a | requirements (see [RFC8141]) and defines a major namespace of a | |||
WHIP protocol extension. The value MAY also be an industry | WHIP protocol extension. The value MAY also be an industry | |||
name or organization name. | name or organization name. | |||
- other: Any ASCII string that conforms to the URN syntax | other: Any ASCII string that conforms to the URN syntax | |||
requirements (see [RFC8141]) and defines the sub-namespace | requirements (see [RFC8141]) and defines the sub-namespace | |||
(which MAY be further broken down in namespaces delimited by | (which MAY be further broken down in namespaces delimited by | |||
colons) as needed to uniquely identify an WHIP protocol | colons) as needed to uniquely identify a WHIP protocol | |||
extension. | extension. | |||
Relevant Ancillary Documentation: | Relevant Ancillary Documentation: | |||
None | ||||
* None | ||||
Identifier Uniqueness Considerations: | Identifier Uniqueness Considerations: | |||
The designated contact shall be responsible for reviewing and | ||||
* The designated contact shall be responsible for reviewing and | ||||
enforcing uniqueness. | enforcing uniqueness. | |||
Identifier Persistence Considerations: | Identifier Persistence Considerations: | |||
* Once a name has been allocated, it MUST NOT be reallocated for | ||||
a different purpose. | ||||
* Once a name has been allocated, it MUST NOT be reallocated for a | * The rules provided for assignments of values within a sub- | |||
different purpose. | namespace MUST be constructed so that the meanings of values | |||
cannot change. | ||||
* The rules provided for assignments of values within a sub- | ||||
namespace MUST be constructed so that the meanings of values | ||||
cannot change. | ||||
* This registration mechanism is not appropriate for naming values | * This registration mechanism is not appropriate for naming | |||
whose meanings may change over time. | values whose meanings may change over time. | |||
Process of Identifier Assignment: | Process of Identifier Assignment: | |||
The namespace with type "ext" (e.g., "urn:ietf:params:whip:ext") | ||||
* Namespace with type "ext" (e.g., "urn:ietf:params:whip:ext") is | is reserved for IETF-approved WHIP specifications. | |||
reserved for IETF-approved WHIP specifications. | ||||
Process of Identifier Resolution: | Process of Identifier Resolution: | |||
None specified | ||||
* None specified. | ||||
Rules for Lexical Equivalence: | Rules for Lexical Equivalence: | |||
No special considerations; the rules for lexical equivalence | ||||
* No special considerations; the rules for lexical equivalence | ||||
specified in [RFC8141] apply. | specified in [RFC8141] apply. | |||
Conformance with URN Syntax: | Conformance with URN Syntax: | |||
No special considerations | ||||
* No special considerations. | ||||
Validation Mechanism: | Validation Mechanism: | |||
None specified | ||||
* None specified. | ||||
Scope: | Scope: | |||
Global | ||||
* Global. | 6.5. Registering WHIP Protocol Extension URNs | |||
6.5. Registering WHIP Protocol Extensions URNs | ||||
This section defines the process for registering new WHIP protocol | This section defines the process for registering new WHIP protocol | |||
extensions URNs with IANA in the "WebRTC-HTTP ingestion protocol | extension URNs with IANA in the "WebRTC-HTTP Ingestion Protocol | |||
(WHIP) extension URNs" registry (see Section 6.4). | (WHIP) Extension URNs" registry (see Section 6.3.2). | |||
A WHIP Protocol Extension URNs is used as a value in the "rel" | A WHIP Protocol Extension URN is used as a value in the "rel" | |||
attribute of the Link header as defined in Section 4.9 for the | attribute of the Link header as defined in Section 4.9 for the | |||
purpose of signaling the WHIP protocol extensions supported by the | purpose of signaling the WHIP protocol extensions supported by the | |||
WHIP endpoints. | WHIP endpoint. | |||
WHIP Protocol Extensions URNs have an "ext" type as defined in | WHIP Protocol Extension URNs have an "ext" type as defined in | |||
Section 6.4. | Section 6.4. | |||
6.5.1. Registration Procedure | 6.5.1. Registration Procedure | |||
The IETF has created a mailing list, "wish@ietf.org", which can be | The IETF has created a mailing list, <wish@ietf.org>, which can be | |||
used for public discussion of WHIP protocol extensions proposals | used for public discussion of proposals regarding WHIP protocol | |||
prior to registration. Use of the mailing list is strongly | extensions prior to registration. Use of the mailing list is | |||
encouraged. The IESG has appointed a designated expert as per | strongly encouraged. A designated expert (DE) [RFC8126], appointed | |||
[RFC8126] who will monitor the wish@ietf.org mailing list and review | by the IESG, will monitor the <wish@ietf.org> mailing list and review | |||
registrations. | registrations. | |||
Registration of new "ext" type URNs (in the namespace | Registration of new "ext" type URNs (in the namespace | |||
"urn:ietf:params:whip:ext") belonging to a WHIP Protocol Extension | "urn:ietf:params:whip:ext") belonging to a WHIP Protocol Extension | |||
MUST be documented in a permanent and readily available public | MUST be documented in a permanent and readily available public | |||
specification, in sufficient detail so that interoperability between | specification, in sufficient detail so that interoperability between | |||
independent implementations is possible and reviewed by the | independent implementations is possible, and reviewed by the DE as | |||
designated expert as per Section 4.6 of [RFC8126]. An Standards | per Section 4.6 of [RFC8126]. A Standards Track RFC is REQUIRED for | |||
Track RFC is REQUIRED for the registration of new value data types | the registration of new value data types that modify existing | |||
that modify existing properties. An Standards Track RFC is also | properties. A Standards Track RFC is also REQUIRED for registration | |||
REQUIRED for registration of WHIP Protocol Extensions URNs that | of WHIP Protocol Extension URNs that modify WHIP Protocol Extensions | |||
modify WHIP Protocol Extensions previously documented in an existing | previously documented in an existing RFC. | |||
RFC. | ||||
The registration procedure begins when a completed registration | The registration procedure begins when a completed registration | |||
template, defined in the sections below, is sent to iana@iana.org. | template, defined in Section 6.5.3, is sent to <iana@iana.org>. | |||
Decisions made by the designated expert can be appealed to an | Decisions made by the DE can be appealed to an Applications and Real- | |||
Applications and Real Time (ART) Area Director, then to the IESG. | Time (ART) Area Director, then to the IESG. The normal appeals | |||
The normal appeals procedure described in [BCP9] is to be followed. | procedure described in [BCP9] is to be followed. | |||
Once the registration procedure concludes successfully, IANA creates | Once the registration procedure concludes successfully, IANA creates | |||
or modifies the corresponding record in the WHIP Protocol Extension | or modifies the corresponding record in the "WebRTC-HTTP ingestion | |||
registry. | protocol (WHIP) Extension URNs" registry. | |||
An RFC specifying one or more new WHIP Protocol Extension URNs MUST | An RFC specifying one or more new WHIP Protocol Extension URNs MUST | |||
include the completed registration templates, which MAY be expanded | include the completed registration template(s), which MAY be expanded | |||
with additional information. These completed templates are intended | with additional information. These completed template(s) are | |||
to go in the body of the document, not in the IANA Considerations | intended to go in the body of the document, not in the IANA | |||
section. The RFC MUST include the syntax and semantics of any | Considerations section. The RFC MUST include the syntax and | |||
extension-specific attributes that may be provided in a Link header | semantics of any extension-specific attributes that may be provided | |||
field advertising the extension. | in a Link header field advertising the extension. | |||
6.5.2. Guidance for Designated Experts | 6.5.2. Guidance for the Designated Expert | |||
The Designated Expert (DE) is expected to ascertain the existence of | The DE is expected to do the following: | |||
suitable documentation (a specification) as described in [RFC8126] | ||||
and to verify that the document is permanently and publicly | ||||
available. | ||||
The DE is also expected to check the clarity of purpose and use of | * Ascertain the existence of suitable documentation (a | |||
the requested registration. | specification) as described in [RFC8126] and verify that the | |||
document is permanently and publicly available. Specifications | ||||
should be documented in an Internet-Draft. | ||||
Additionally, the DE must verify that any request for one of these | * Check the clarity of purpose and use of the requested | |||
registrations has been made available for review and comment by | registration. | |||
posting the request to the WebRTC Ingest Signaling over HTTPS (wish) | ||||
Working Group mailing list. | ||||
Specifications should be documented in an Internet-Draft. Lastly, | * Verify that any request for one of these registrations has been | |||
the DE must ensure that any other request for a code point does not | made available for review and comments by posting the request to | |||
conflict with work that is active in or already published by the | the <wish@ietf.org> mailing list. | |||
IETF. | ||||
6.5.3. WHIP Protocol Extension Registration Template | * Ensure that any other request for a code point does not conflict | |||
with work that is active or already published by the IETF. | ||||
A WHIP Protocol Extension URNs is defined by completing the following | 6.5.3. Registration Template | |||
A WHIP Protocol Extension URN is defined by completing the following | ||||
template: | template: | |||
* URN: A unique URN for the WHIP Protocol Extension (e.g., | URN: A unique URN for the WHIP Protocol Extension (e.g., | |||
"urn:ietf:params:whip:ext:example:server-sent-events"). | "urn:ietf:params:whip:ext:example:server-sent-events") | |||
* Reference: A formal reference to the publicly available | Reference: A formal reference to the publicly available | |||
specification | specification | |||
* Name: A descriptive name of the WHIP Protocol Extension (e.g., | Name: A descriptive name of the WHIP Protocol Extension (e.g., | |||
"Sender Side events"). | "Sender Side events") | |||
* Description: A brief description of the function of the extension, | Description: A brief description of the function of the extension | |||
in a short paragraph or two | (short paragraph or two) | |||
* Contact information: Contact information for the organization or | Contact information: Contact information for the organization or | |||
person making the registration | person making the registration | |||
7. Acknowledgements | 7. References | |||
The authors wish to thank Lorenzo Miniero, Juliusz Chroboczek, Adam | ||||
Roach, Nils Ohlmeier, Christer Holmberg, Cameron Elliott, Gustavo | ||||
Garcia, Jonas Birme, Sandro Gauci, Christer Holmberg and everyone | ||||
else in the WebRTC community that have provided comments, feedback, | ||||
text and improvement proposals on the document and contributed early | ||||
implementations of the spec. | ||||
8. References | ||||
8.1. Normative References | 7.1. Normative References | |||
[FETCH] WHATWG, "Fetch - Living Standard", n.d., | [FETCH] WHATWG, "Fetch", WHATWG Living Standard, | |||
<https://fetch.spec.whatwg.org>. | <https://fetch.spec.whatwg.org>. Commit snapshot: | |||
<https://fetch.spec.whatwg.org/commit-snapshots/ | ||||
edfa8d100cf1ecfde385f65c172e0e8d018fcd98/>. | ||||
[RFC2119] Bradner, S., "Key words for use in RFCs to Indicate | [RFC2119] Bradner, S., "Key words for use in RFCs to Indicate | |||
Requirement Levels", BCP 14, RFC 2119, | Requirement Levels", BCP 14, RFC 2119, | |||
DOI 10.17487/RFC2119, March 1997, | DOI 10.17487/RFC2119, March 1997, | |||
<https://www.rfc-editor.org/rfc/rfc2119>. | <https://www.rfc-editor.org/info/rfc2119>. | |||
[RFC3264] Rosenberg, J. and H. Schulzrinne, "An Offer/Answer Model | [RFC3264] Rosenberg, J. and H. Schulzrinne, "An Offer/Answer Model | |||
with Session Description Protocol (SDP)", RFC 3264, | with Session Description Protocol (SDP)", RFC 3264, | |||
DOI 10.17487/RFC3264, June 2002, | DOI 10.17487/RFC3264, June 2002, | |||
<https://www.rfc-editor.org/rfc/rfc3264>. | <https://www.rfc-editor.org/info/rfc3264>. | |||
[RFC3553] Mealling, M., Masinter, L., Hardie, T., and G. Klyne, "An | [RFC3553] Mealling, M., Masinter, L., Hardie, T., and G. Klyne, "An | |||
IETF URN Sub-namespace for Registered Protocol | IETF URN Sub-namespace for Registered Protocol | |||
Parameters", BCP 73, RFC 3553, DOI 10.17487/RFC3553, June | Parameters", BCP 73, RFC 3553, DOI 10.17487/RFC3553, June | |||
2003, <https://www.rfc-editor.org/rfc/rfc3553>. | 2003, <https://www.rfc-editor.org/info/rfc3553>. | |||
[RFC3986] Berners-Lee, T., Fielding, R., and L. Masinter, "Uniform | [RFC3986] Berners-Lee, T., Fielding, R., and L. Masinter, "Uniform | |||
Resource Identifier (URI): Generic Syntax", STD 66, | Resource Identifier (URI): Generic Syntax", STD 66, | |||
RFC 3986, DOI 10.17487/RFC3986, January 2005, | RFC 3986, DOI 10.17487/RFC3986, January 2005, | |||
<https://www.rfc-editor.org/rfc/rfc3986>. | <https://www.rfc-editor.org/info/rfc3986>. | |||
[RFC4086] Eastlake 3rd, D., Schiller, J., and S. Crocker, | [RFC4086] Eastlake 3rd, D., Schiller, J., and S. Crocker, | |||
"Randomness Requirements for Security", BCP 106, RFC 4086, | "Randomness Requirements for Security", BCP 106, RFC 4086, | |||
DOI 10.17487/RFC4086, June 2005, | DOI 10.17487/RFC4086, June 2005, | |||
<https://www.rfc-editor.org/rfc/rfc4086>. | <https://www.rfc-editor.org/info/rfc4086>. | |||
[RFC5789] Dusseault, L. and J. Snell, "PATCH Method for HTTP", | [RFC5789] Dusseault, L. and J. Snell, "PATCH Method for HTTP", | |||
RFC 5789, DOI 10.17487/RFC5789, March 2010, | RFC 5789, DOI 10.17487/RFC5789, March 2010, | |||
<https://www.rfc-editor.org/rfc/rfc5789>. | <https://www.rfc-editor.org/info/rfc5789>. | |||
[RFC6585] Nottingham, M. and R. Fielding, "Additional HTTP Status | [RFC6585] Nottingham, M. and R. Fielding, "Additional HTTP Status | |||
Codes", RFC 6585, DOI 10.17487/RFC6585, April 2012, | Codes", RFC 6585, DOI 10.17487/RFC6585, April 2012, | |||
<https://www.rfc-editor.org/rfc/rfc6585>. | <https://www.rfc-editor.org/info/rfc6585>. | |||
[RFC6750] Jones, M. and D. Hardt, "The OAuth 2.0 Authorization | [RFC6750] Jones, M. and D. Hardt, "The OAuth 2.0 Authorization | |||
Framework: Bearer Token Usage", RFC 6750, | Framework: Bearer Token Usage", RFC 6750, | |||
DOI 10.17487/RFC6750, October 2012, | DOI 10.17487/RFC6750, October 2012, | |||
<https://www.rfc-editor.org/rfc/rfc6750>. | <https://www.rfc-editor.org/info/rfc6750>. | |||
[RFC7064] Nandakumar, S., Salgueiro, G., Jones, P., and M. Petit- | [RFC7064] Nandakumar, S., Salgueiro, G., Jones, P., and M. Petit- | |||
Huguenin, "URI Scheme for the Session Traversal Utilities | Huguenin, "URI Scheme for the Session Traversal Utilities | |||
for NAT (STUN) Protocol", RFC 7064, DOI 10.17487/RFC7064, | for NAT (STUN) Protocol", RFC 7064, DOI 10.17487/RFC7064, | |||
November 2013, <https://www.rfc-editor.org/rfc/rfc7064>. | November 2013, <https://www.rfc-editor.org/info/rfc7064>. | |||
[RFC7065] Petit-Huguenin, M., Nandakumar, S., Salgueiro, G., and P. | [RFC7065] Petit-Huguenin, M., Nandakumar, S., Salgueiro, G., and P. | |||
Jones, "Traversal Using Relays around NAT (TURN) Uniform | Jones, "Traversal Using Relays around NAT (TURN) Uniform | |||
Resource Identifiers", RFC 7065, DOI 10.17487/RFC7065, | Resource Identifiers", RFC 7065, DOI 10.17487/RFC7065, | |||
November 2013, <https://www.rfc-editor.org/rfc/rfc7065>. | November 2013, <https://www.rfc-editor.org/info/rfc7065>. | |||
[RFC7675] Perumal, M., Wing, D., Ravindranath, R., Reddy, T., and M. | [RFC7675] Perumal, M., Wing, D., Ravindranath, R., Reddy, T., and M. | |||
Thomson, "Session Traversal Utilities for NAT (STUN) Usage | Thomson, "Session Traversal Utilities for NAT (STUN) Usage | |||
for Consent Freshness", RFC 7675, DOI 10.17487/RFC7675, | for Consent Freshness", RFC 7675, DOI 10.17487/RFC7675, | |||
October 2015, <https://www.rfc-editor.org/rfc/rfc7675>. | October 2015, <https://www.rfc-editor.org/info/rfc7675>. | |||
[RFC8174] Leiba, B., "Ambiguity of Uppercase vs Lowercase in RFC | [RFC8174] Leiba, B., "Ambiguity of Uppercase vs Lowercase in RFC | |||
2119 Key Words", BCP 14, RFC 8174, DOI 10.17487/RFC8174, | 2119 Key Words", BCP 14, RFC 8174, DOI 10.17487/RFC8174, | |||
May 2017, <https://www.rfc-editor.org/rfc/rfc8174>. | May 2017, <https://www.rfc-editor.org/info/rfc8174>. | |||
[RFC8288] Nottingham, M., "Web Linking", RFC 8288, | [RFC8288] Nottingham, M., "Web Linking", RFC 8288, | |||
DOI 10.17487/RFC8288, October 2017, | DOI 10.17487/RFC8288, October 2017, | |||
<https://www.rfc-editor.org/rfc/rfc8288>. | <https://www.rfc-editor.org/info/rfc8288>. | |||
[RFC8446] Rescorla, E., "The Transport Layer Security (TLS) Protocol | [RFC8446] Rescorla, E., "The Transport Layer Security (TLS) Protocol | |||
Version 1.3", RFC 8446, DOI 10.17487/RFC8446, August 2018, | Version 1.3", RFC 8446, DOI 10.17487/RFC8446, August 2018, | |||
<https://www.rfc-editor.org/rfc/rfc8446>. | <https://www.rfc-editor.org/info/rfc8446>. | |||
[RFC8489] Petit-Huguenin, M., Salgueiro, G., Rosenberg, J., Wing, | [RFC8489] Petit-Huguenin, M., Salgueiro, G., Rosenberg, J., Wing, | |||
D., Mahy, R., and P. Matthews, "Session Traversal | D., Mahy, R., and P. Matthews, "Session Traversal | |||
Utilities for NAT (STUN)", RFC 8489, DOI 10.17487/RFC8489, | Utilities for NAT (STUN)", RFC 8489, DOI 10.17487/RFC8489, | |||
February 2020, <https://www.rfc-editor.org/rfc/rfc8489>. | February 2020, <https://www.rfc-editor.org/info/rfc8489>. | |||
[RFC8725] Sheffer, Y., Hardt, D., and M. Jones, "JSON Web Token Best | [RFC8725] Sheffer, Y., Hardt, D., and M. Jones, "JSON Web Token Best | |||
Current Practices", BCP 225, RFC 8725, | Current Practices", BCP 225, RFC 8725, | |||
DOI 10.17487/RFC8725, February 2020, | DOI 10.17487/RFC8725, February 2020, | |||
<https://www.rfc-editor.org/rfc/rfc8725>. | <https://www.rfc-editor.org/info/rfc8725>. | |||
[RFC8826] Rescorla, E., "Security Considerations for WebRTC", | [RFC8826] Rescorla, E., "Security Considerations for WebRTC", | |||
RFC 8826, DOI 10.17487/RFC8826, January 2021, | RFC 8826, DOI 10.17487/RFC8826, January 2021, | |||
<https://www.rfc-editor.org/rfc/rfc8826>. | <https://www.rfc-editor.org/info/rfc8826>. | |||
[RFC8830] Alvestrand, H., "WebRTC MediaStream Identification in the | [RFC8830] Alvestrand, H., "WebRTC MediaStream Identification in the | |||
Session Description Protocol", RFC 8830, | Session Description Protocol", RFC 8830, | |||
DOI 10.17487/RFC8830, January 2021, | DOI 10.17487/RFC8830, January 2021, | |||
<https://www.rfc-editor.org/rfc/rfc8830>. | <https://www.rfc-editor.org/info/rfc8830>. | |||
[RFC8838] Ivov, E., Uberti, J., and P. Saint-Andre, "Trickle ICE: | [RFC8838] Ivov, E., Uberti, J., and P. Saint-Andre, "Trickle ICE: | |||
Incremental Provisioning of Candidates for the Interactive | Incremental Provisioning of Candidates for the Interactive | |||
Connectivity Establishment (ICE) Protocol", RFC 8838, | Connectivity Establishment (ICE) Protocol", RFC 8838, | |||
DOI 10.17487/RFC8838, January 2021, | DOI 10.17487/RFC8838, January 2021, | |||
<https://www.rfc-editor.org/rfc/rfc8838>. | <https://www.rfc-editor.org/info/rfc8838>. | |||
[RFC8839] Petit-Huguenin, M., Nandakumar, S., Holmberg, C., Keränen, | [RFC8839] Petit-Huguenin, M., Nandakumar, S., Holmberg, C., Keränen, | |||
A., and R. Shpount, "Session Description Protocol (SDP) | A., and R. Shpount, "Session Description Protocol (SDP) | |||
Offer/Answer Procedures for Interactive Connectivity | Offer/Answer Procedures for Interactive Connectivity | |||
Establishment (ICE)", RFC 8839, DOI 10.17487/RFC8839, | Establishment (ICE)", RFC 8839, DOI 10.17487/RFC8839, | |||
January 2021, <https://www.rfc-editor.org/rfc/rfc8839>. | January 2021, <https://www.rfc-editor.org/info/rfc8839>. | |||
[RFC8840] Ivov, E., Stach, T., Marocco, E., and C. Holmberg, "A | [RFC8840] Ivov, E., Stach, T., Marocco, E., and C. Holmberg, "A | |||
Session Initiation Protocol (SIP) Usage for Incremental | Session Initiation Protocol (SIP) Usage for Incremental | |||
Provisioning of Candidates for the Interactive | Provisioning of Candidates for the Interactive | |||
Connectivity Establishment (Trickle ICE)", RFC 8840, | Connectivity Establishment (Trickle ICE)", RFC 8840, | |||
DOI 10.17487/RFC8840, January 2021, | DOI 10.17487/RFC8840, January 2021, | |||
<https://www.rfc-editor.org/rfc/rfc8840>. | <https://www.rfc-editor.org/info/rfc8840>. | |||
[RFC8842] Holmberg, C. and R. Shpount, "Session Description Protocol | [RFC8842] Holmberg, C. and R. Shpount, "Session Description Protocol | |||
(SDP) Offer/Answer Considerations for Datagram Transport | (SDP) Offer/Answer Considerations for Datagram Transport | |||
Layer Security (DTLS) and Transport Layer Security (TLS)", | Layer Security (DTLS) and Transport Layer Security (TLS)", | |||
RFC 8842, DOI 10.17487/RFC8842, January 2021, | RFC 8842, DOI 10.17487/RFC8842, January 2021, | |||
<https://www.rfc-editor.org/rfc/rfc8842>. | <https://www.rfc-editor.org/info/rfc8842>. | |||
[RFC8845] Duckworth, M., Ed., Pepperell, A., and S. Wenger, | [RFC8845] Duckworth, M., Ed., Pepperell, A., and S. Wenger, | |||
"Framework for Telepresence Multi-Streams", RFC 8845, | "Framework for Telepresence Multi-Streams", RFC 8845, | |||
DOI 10.17487/RFC8845, January 2021, | DOI 10.17487/RFC8845, January 2021, | |||
<https://www.rfc-editor.org/rfc/rfc8845>. | <https://www.rfc-editor.org/info/rfc8845>. | |||
[RFC8853] Burman, B., Westerlund, M., Nandakumar, S., and M. Zanaty, | [RFC8853] Burman, B., Westerlund, M., Nandakumar, S., and M. Zanaty, | |||
"Using Simulcast in Session Description Protocol (SDP) and | "Using Simulcast in Session Description Protocol (SDP) and | |||
RTP Sessions", RFC 8853, DOI 10.17487/RFC8853, January | RTP Sessions", RFC 8853, DOI 10.17487/RFC8853, January | |||
2021, <https://www.rfc-editor.org/rfc/rfc8853>. | 2021, <https://www.rfc-editor.org/info/rfc8853>. | |||
[RFC8858] Holmberg, C., "Indicating Exclusive Support of RTP and RTP | [RFC8858] Holmberg, C., "Indicating Exclusive Support of RTP and RTP | |||
Control Protocol (RTCP) Multiplexing Using the Session | Control Protocol (RTCP) Multiplexing Using the Session | |||
Description Protocol (SDP)", RFC 8858, | Description Protocol (SDP)", RFC 8858, | |||
DOI 10.17487/RFC8858, January 2021, | DOI 10.17487/RFC8858, January 2021, | |||
<https://www.rfc-editor.org/rfc/rfc8858>. | <https://www.rfc-editor.org/info/rfc8858>. | |||
[RFC9110] Fielding, R., Ed., Nottingham, M., Ed., and J. Reschke, | [RFC9110] Fielding, R., Ed., Nottingham, M., Ed., and J. Reschke, | |||
Ed., "HTTP Semantics", STD 97, RFC 9110, | Ed., "HTTP Semantics", STD 97, RFC 9110, | |||
DOI 10.17487/RFC9110, June 2022, | DOI 10.17487/RFC9110, June 2022, | |||
<https://www.rfc-editor.org/rfc/rfc9110>. | <https://www.rfc-editor.org/info/rfc9110>. | |||
[RFC9112] Fielding, R., Ed., Nottingham, M., Ed., and J. Reschke, | [RFC9112] Fielding, R., Ed., Nottingham, M., Ed., and J. Reschke, | |||
Ed., "HTTP/1.1", STD 99, RFC 9112, DOI 10.17487/RFC9112, | Ed., "HTTP/1.1", STD 99, RFC 9112, DOI 10.17487/RFC9112, | |||
June 2022, <https://www.rfc-editor.org/rfc/rfc9112>. | June 2022, <https://www.rfc-editor.org/info/rfc9112>. | |||
[RFC9143] Holmberg, C., Alvestrand, H., and C. Jennings, | [RFC9143] Holmberg, C., Alvestrand, H., and C. Jennings, | |||
"Negotiating Media Multiplexing Using the Session | "Negotiating Media Multiplexing Using the Session | |||
Description Protocol (SDP)", RFC 9143, | Description Protocol (SDP)", RFC 9143, | |||
DOI 10.17487/RFC9143, February 2022, | DOI 10.17487/RFC9143, February 2022, | |||
<https://www.rfc-editor.org/rfc/rfc9143>. | <https://www.rfc-editor.org/info/rfc9143>. | |||
[RFC9147] Rescorla, E., Tschofenig, H., and N. Modadugu, "The | [RFC9147] Rescorla, E., Tschofenig, H., and N. Modadugu, "The | |||
Datagram Transport Layer Security (DTLS) Protocol Version | Datagram Transport Layer Security (DTLS) Protocol Version | |||
1.3", RFC 9147, DOI 10.17487/RFC9147, April 2022, | 1.3", RFC 9147, DOI 10.17487/RFC9147, April 2022, | |||
<https://www.rfc-editor.org/rfc/rfc9147>. | <https://www.rfc-editor.org/info/rfc9147>. | |||
[RFC9429] Uberti, J., Jennings, C., and E. Rescorla, Ed., | [RFC9429] Uberti, J., Jennings, C., and E. Rescorla, Ed., | |||
"JavaScript Session Establishment Protocol (JSEP)", | "JavaScript Session Establishment Protocol (JSEP)", | |||
RFC 9429, DOI 10.17487/RFC9429, April 2024, | RFC 9429, DOI 10.17487/RFC9429, April 2024, | |||
<https://www.rfc-editor.org/rfc/rfc9429>. | <https://www.rfc-editor.org/info/rfc9429>. | |||
[RFC9562] Davis, K., Peabody, B., and P. Leach, "Universally Unique | [RFC9562] Davis, K., Peabody, B., and P. Leach, "Universally Unique | |||
IDentifiers (UUIDs)", RFC 9562, DOI 10.17487/RFC9562, May | IDentifiers (UUIDs)", RFC 9562, DOI 10.17487/RFC9562, May | |||
2024, <https://www.rfc-editor.org/rfc/rfc9562>. | 2024, <https://www.rfc-editor.org/info/rfc9562>. | |||
[W3C.REC-ldp-20150226] | [W3C.REC-ldp-20150226] | |||
Malhotra, A., Ed., Arwe, J., Ed., and S. Speicher, Ed., | Arwe, J., Ed., Speicher, S., Ed., and A. Malhotra, Ed., | |||
"Linked Data Platform 1.0", W3C REC REC-ldp-20150226, W3C | "Linked Data Platform 1.0", W3C Recommendation, 26 | |||
REC-ldp-20150226, 26 February 2015, | February 2015, | |||
<https://www.w3.org/TR/2015/REC-ldp-20150226/>. | <https://www.w3.org/TR/2015/REC-ldp-20150226/>. Latest | |||
version available at: <https://www.w3.org/TR/ldp/>. | ||||
8.2. Informative References | 7.2. Informative References | |||
[BCP56] Best Current Practice 56, | [BCP56] Best Current Practice 56, | |||
<https://www.rfc-editor.org/info/bcp56>. | <https://www.rfc-editor.org/info/bcp56>. | |||
At the time of writing, this BCP comprises the following: | At the time of writing, this BCP comprises the following: | |||
Nottingham, M., "Building Protocols with HTTP", BCP 56, | Nottingham, M., "Building Protocols with HTTP", BCP 56, | |||
RFC 9205, DOI 10.17487/RFC9205, June 2022, | RFC 9205, DOI 10.17487/RFC9205, June 2022, | |||
<https://www.rfc-editor.org/info/rfc9205>. | <https://www.rfc-editor.org/info/rfc9205>. | |||
[BCP9] Best Current Practice 9, | [BCP9] Best Current Practice 9, | |||
skipping to change at page 33, line 42 ¶ | skipping to change at line 1459 ¶ | |||
Halpern, J., Ed. and E. Rescorla, Ed., "IETF Stream | Halpern, J., Ed. and E. Rescorla, Ed., "IETF Stream | |||
Documents Require IETF Rough Consensus", BCP 9, RFC 8789, | Documents Require IETF Rough Consensus", BCP 9, RFC 8789, | |||
DOI 10.17487/RFC8789, June 2020, | DOI 10.17487/RFC8789, June 2020, | |||
<https://www.rfc-editor.org/info/rfc8789>. | <https://www.rfc-editor.org/info/rfc8789>. | |||
Rosen, B., "Responsibility Change for the RFC Series", | Rosen, B., "Responsibility Change for the RFC Series", | |||
BCP 9, RFC 9282, DOI 10.17487/RFC9282, June 2022, | BCP 9, RFC 9282, DOI 10.17487/RFC9282, June 2022, | |||
<https://www.rfc-editor.org/info/rfc9282>. | <https://www.rfc-editor.org/info/rfc9282>. | |||
[HTML] WHATWG, "HTML", WHATWG Living Standard, | ||||
<https://html.spec.whatwg.org/>. Commit snapshot: | ||||
<https://html.spec.whatwg.org/commit- | ||||
snapshots/09db56ba9343c597340b2c7715f43ff9b10826f6/>. | ||||
[RFC3261] Rosenberg, J., Schulzrinne, H., Camarillo, G., Johnston, | [RFC3261] Rosenberg, J., Schulzrinne, H., Camarillo, G., Johnston, | |||
A., Peterson, J., Sparks, R., Handley, M., and E. | A., Peterson, J., Sparks, R., Handley, M., and E. | |||
Schooler, "SIP: Session Initiation Protocol", RFC 3261, | Schooler, "SIP: Session Initiation Protocol", RFC 3261, | |||
DOI 10.17487/RFC3261, June 2002, | DOI 10.17487/RFC3261, June 2002, | |||
<https://www.rfc-editor.org/rfc/rfc3261>. | <https://www.rfc-editor.org/info/rfc3261>. | |||
[RFC6120] Saint-Andre, P., "Extensible Messaging and Presence | [RFC6120] Saint-Andre, P., "Extensible Messaging and Presence | |||
Protocol (XMPP): Core", RFC 6120, DOI 10.17487/RFC6120, | Protocol (XMPP): Core", RFC 6120, DOI 10.17487/RFC6120, | |||
March 2011, <https://www.rfc-editor.org/rfc/rfc6120>. | March 2011, <https://www.rfc-editor.org/info/rfc6120>. | |||
[RFC7826] Schulzrinne, H., Rao, A., Lanphier, R., Westerlund, M., | [RFC7826] Schulzrinne, H., Rao, A., Lanphier, R., Westerlund, M., | |||
and M. Stiemerling, Ed., "Real-Time Streaming Protocol | and M. Stiemerling, Ed., "Real-Time Streaming Protocol | |||
Version 2.0", RFC 7826, DOI 10.17487/RFC7826, December | Version 2.0", RFC 7826, DOI 10.17487/RFC7826, December | |||
2016, <https://www.rfc-editor.org/rfc/rfc7826>. | 2016, <https://www.rfc-editor.org/info/rfc7826>. | |||
[RFC8126] Cotton, M., Leiba, B., and T. Narten, "Guidelines for | [RFC8126] Cotton, M., Leiba, B., and T. Narten, "Guidelines for | |||
Writing an IANA Considerations Section in RFCs", BCP 26, | Writing an IANA Considerations Section in RFCs", BCP 26, | |||
RFC 8126, DOI 10.17487/RFC8126, June 2017, | RFC 8126, DOI 10.17487/RFC8126, June 2017, | |||
<https://www.rfc-editor.org/rfc/rfc8126>. | <https://www.rfc-editor.org/info/rfc8126>. | |||
[RFC8141] Saint-Andre, P. and J. Klensin, "Uniform Resource Names | [RFC8141] Saint-Andre, P. and J. Klensin, "Uniform Resource Names | |||
(URNs)", RFC 8141, DOI 10.17487/RFC8141, April 2017, | (URNs)", RFC 8141, DOI 10.17487/RFC8141, April 2017, | |||
<https://www.rfc-editor.org/rfc/rfc8141>. | <https://www.rfc-editor.org/info/rfc8141>. | |||
[RFC8836] Jesup, R. and Z. Sarker, Ed., "Congestion Control | [RFC8836] Jesup, R. and Z. Sarker, Ed., "Congestion Control | |||
Requirements for Interactive Real-Time Media", RFC 8836, | Requirements for Interactive Real-Time Media", RFC 8836, | |||
DOI 10.17487/RFC8836, January 2021, | DOI 10.17487/RFC8836, January 2021, | |||
<https://www.rfc-editor.org/rfc/rfc8836>. | <https://www.rfc-editor.org/info/rfc8836>. | |||
[RFC9457] Nottingham, M., Wilde, E., and S. Dalal, "Problem Details | [RFC9457] Nottingham, M., Wilde, E., and S. Dalal, "Problem Details | |||
for HTTP APIs", RFC 9457, DOI 10.17487/RFC9457, July 2023, | for HTTP APIs", RFC 9457, DOI 10.17487/RFC9457, July 2023, | |||
<https://www.rfc-editor.org/rfc/rfc9457>. | <https://www.rfc-editor.org/info/rfc9457>. | |||
[W3C.REC-webrtc-20210126] | [W3C.REC-webrtc-20210126] | |||
Jennings, C., Ed., Boström, H., Ed., and J. Bruaroey, Ed., | Jennings, C., Ed., Boström, H., Ed., and J. Bruaroey, Ed., | |||
"WebRTC 1.0: Real-Time Communication Between Browsers", | "WebRTC 1.0: Real-Time Communication Between Browsers", | |||
W3C REC REC-webrtc-20210126, W3C REC-webrtc-20210126, 26 | W3C Recommendation, 26 January 2021, | |||
January 2021, | <https://www.w3.org/TR/2021/REC-webrtc-20210126/>. Latest | |||
<https://www.w3.org/TR/2021/REC-webrtc-20210126/>. | version available at: <https://www.w3.org/TR/webrtc/>. | |||
Acknowledgements | ||||
The authors wish to thank Lorenzo Miniero, Juliusz Chroboczek, Adam | ||||
Roach, Nils Ohlmeier, Christer Holmberg, Cameron Elliott, Gustavo | ||||
Garcia, Jonas Birme, Sandro Gauci, Christer Holmberg, and everyone | ||||
else in the WebRTC community that have provided comments, feedback, | ||||
text, and improvement proposals on the document and contributed early | ||||
implementations of the spec. | ||||
Authors' Addresses | Authors' Addresses | |||
Sergio Garcia Murillo | Sergio Garcia Murillo | |||
Millicast | Millicast | |||
Email: sergio.garcia.murillo@cosmosoftware.io | Email: sergio.garcia.murillo@cosmosoftware.io | |||
Alexandre Gouaillard | Alexandre Gouaillard | |||
CoSMo Software | CoSMo Software | |||
Email: alex.gouaillard@cosmosoftware.io | Email: alex.gouaillard@cosmosoftware.io | |||
End of changes. 255 change blocks. | ||||
683 lines changed or deleted | 664 lines changed or added | |||
This html diff was produced by rfcdiff 1.48. |