rfc9725v1.txt | rfc9725.txt | |||
---|---|---|---|---|
Internet Engineering Task Force (IETF) S. Murillo | Internet Engineering Task Force (IETF) S. Garcia Murillo | |||
Request for Comments: 9725 Millicast | Request for Comments: 9725 Millicast | |||
Updates: 8840, 8842 A. Gouaillard | Updates: 8840, 8842 A. Gouaillard | |||
Category: Standards Track CoSMo Software | Category: Standards Track CoSMo Software | |||
ISSN: 2070-1721 January 2025 | ISSN: 2070-1721 February 2025 | |||
WebRTC-HTTP Ingestion Protocol (WHIP) | WebRTC-HTTP Ingestion Protocol (WHIP) | |||
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 | |||
Content Delivery Networks (CDNs). | Content Delivery Networks (CDNs). | |||
This document updates RFCs 8840 and 8842. | This document updates RFCs 8840 and 8842. | |||
skipping to change at line 75 ¶ | skipping to change at line 75 ¶ | |||
4.5. Load Balancing and Redirections | 4.5. Load Balancing and Redirections | |||
4.6. STUN/TURN Server Configuration | 4.6. STUN/TURN Server Configuration | |||
4.6.1. Congestion Control | 4.6.1. Congestion Control | |||
4.7. Authentication and Authorization | 4.7. Authentication and Authorization | |||
4.7.1. Bearer Token Authentication | 4.7.1. Bearer Token Authentication | |||
4.8. Simulcast and Scalable Video Coding | 4.8. Simulcast and Scalable Video Coding | |||
4.9. Protocol Extensions | 4.9. Protocol Extensions | |||
5. Security Considerations | 5. Security Considerations | |||
6. IANA Considerations | 6. IANA Considerations | |||
6.1. Link Relation Type: ice-server | 6.1. Link Relation Type: ice-server | |||
6.2. WebRTC-HTTP Ingestion Protocol (WHIP) Registry Group | 6.2. URN Sub-namespace for WHIP (urn:ietf:params:whip) | |||
6.3. Registration of WHIP URN Sub-Namespace and WHIP Registries | 6.3. WebRTC-HTTP Ingestion Protocol (WHIP) URNs Registry | |||
6.3.1. WebRTC-HTTP Ingestion Protocol (WHIP) URNs Registry | 6.4. WebRTC-HTTP Ingestion Protocol (WHIP) Extension URNs | |||
6.3.2. WebRTC-HTTP Ingestion Protocol (WHIP) Extension URNs | Registry | |||
Registry | 6.5. Registering WHIP URNs and WHIP Extension URNs | |||
6.4. URN Sub-Namespace for WHIP | ||||
6.4.1. Specification Template | ||||
6.5. Registering WHIP Protocol Extension URNs | ||||
6.5.1. Registration Procedure | 6.5.1. Registration Procedure | |||
6.5.2. Guidance for the Designated Expert | 6.5.2. Guidance for the Designated Expert | |||
6.5.3. Registration Template | 6.5.3. Registration Template | |||
7. References | 7. References | |||
7.1. Normative References | 7.1. Normative References | |||
7.2. Informative References | 7.2. Informative References | |||
Acknowledgements | Acknowledgements | |||
Authors' Addresses | Authors' Addresses | |||
1. Introduction | 1. Introduction | |||
skipping to change at line 106 ¶ | skipping to change at line 103 ¶ | |||
the setup, management, and teardown of a multimedia session. It also | the setup, management, and teardown of a multimedia session. It also | |||
describes how to negotiate media flows using the offer/answer model | describes how to negotiate media flows using the offer/answer model | |||
with the Session Description Protocol (SDP) [RFC3264], including the | with the Session Description Protocol (SDP) [RFC3264], including the | |||
formats for data sent over the wire (e.g., media types, codec | formats for data sent over the wire (e.g., media types, codec | |||
parameters, and encryption). WebRTC intentionally does not specify a | parameters, and encryption). WebRTC intentionally does not specify a | |||
signaling transport protocol at the 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 its adoption as an ingestion protocol | WebRTC has been an obstacle to its adoption as an ingestion protocol | |||
within the broadcast and 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. For example, cables | |||
media to hardware encoders, then push the encoded media to any | carrying raw media to hardware encoders are plugged in and then the | |||
streaming service or Content Delivery Network (CDN) ingest using an | encoded media is pushed to any streaming service or Content Delivery | |||
ingestion protocol. | Network (CDN) using an 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 Extensible Messaging and Presence Protocol (XMPP) | SIP [RFC3261] or Extensible Messaging and Presence Protocol (XMPP) | |||
[RFC6120], they are not designed to be used in broadcasting and | [RFC6120], they are not designed to be used in broadcasting and | |||
streaming services, and there is also no sign of adoption in that | streaming services, and there is also no sign of adoption in that | |||
industry. The Real-Time Streaming Protocol (RTSP) [RFC7826], which | industry. The Real-Time Streaming Protocol (RTSP) [RFC7826], which | |||
is based on RTP, does not support the SDP offer/answer model | is based on RTP, does not support the SDP offer/answer model | |||
[RFC3264] for negotiating the characteristics of the media session. | [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 | |||
skipping to change at line 162 ¶ | skipping to change at line 159 ¶ | |||
server, which is 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. This means that no modifications to the "m=" | supported in WHIP. This means that no modifications to the "m=" | |||
sections can be made after the initial SDP offer/answer exchange via | sections can be made after the initial SDP offer/answer exchange via | |||
HTTP POST is completed and that only ICE-related information can be | HTTP POST is completed and that only ICE-related information can be | |||
updated via HTTP 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 WHIP for | |||
protocol for initiating and terminating an ingest session: | 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) | | | | |||
+<------------------------+ | | | +<------------------------+ | | | |||
skipping to change at line 192 ¶ | skipping to change at line 189 ¶ | |||
| 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 WHIP by encoding and delivering | |||
delivering media to a remote media server. | 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: This 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 HTTP | WHIP session: This indicates the server handling the allocated HTTP | |||
resource by the WHIP endpoint for an ongoing ingest session. | resource by the WHIP endpoint for an ongoing ingest session. | |||
WHIP session URL: This refers to the URL of the WHIP resource | WHIP session URL: This refers to the URL of the WHIP resource | |||
allocated by the WHIP endpoint for a specific media session. The | allocated by the WHIP endpoint for a specific media session. The | |||
WHIP client can send requests to the WHIP session using this URL | WHIP client can send requests to the WHIP session using this URL | |||
to modify the session, such as ICE operations or termination. | to modify the session, such as ICE operations or session | |||
termination. | ||||
Figure 1 illustrates the communication flow between a WHIP client, | Figure 1 illustrates the communication flow between a WHIP client, | |||
WHIP endpoint, media server, and WHIP session. This flow outlines | WHIP endpoint, media server, and WHIP session. This flow outlines | |||
the process of setting up and tearing down an ingestion session using | the process of setting up and tearing down an ingest session using | |||
the WHIP protocol, which involves negotiation, ICE for Network | WHIP, which involves negotiation, ICE for Network Address Translation | |||
Address Translation (NAT) traversal, DTLS and the Secure Real-time | (NAT) traversal, DTLS and the Secure Real-time Transport Protocol | |||
Transport Protocol (SRTP) for security, and RTP/RTCP for media | (SRTP) for security, and RTP/RTCP for media transport: | |||
transport: | ||||
* WHIP client: Initiates the communication by sending an HTTP POST | * The WHIP client initiates the communication by sending an HTTP | |||
with an SDP offer to the WHIP endpoint. | POST with an SDP offer to the WHIP endpoint. | |||
* WHIP endpoint: Responds with a "201 Created" message containing an | * The WHIP endpoint responds with a "201 Created" message containing | |||
SDP answer. | an SDP answer. | |||
* WHIP client and media server: Establish ICE and DTLS sessions for | * The WHIP client and media server establish ICE and DTLS sessions | |||
NAT traversal and secure communication. | for NAT traversal and secure communication. | |||
* RTP/RTCP flow: RTP and RTCP flows are established for media | * RTP and RTCP flows are established for media transmission from the | |||
transmission from the WHIP client to the media server, secured by | 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. | * The WHIP client sends an HTTP DELETE to terminate the WHIP | |||
session. | ||||
* WHIP session: Responds with a "200 OK" to confirm the session | * The 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 the guidelines in [BCP56], WHIP clients MUST NOT match | Following the guidelines in [BCP56], WHIP clients MUST NOT match | |||
error codes returned by the WHIP endpoints and resources to a | error codes returned by the WHIP endpoints and resources to a | |||
specific error cause indicated in this specification. WHIP clients | specific error cause indicated in this specification. WHIP clients | |||
MUST be able to handle all applicable status codes by gracefully | MUST be able to handle all applicable status codes by gracefully | |||
falling back to the generic n00 semantics of a given status code on | falling back to the generic n00 semantics of a given status code on | |||
unknown error codes. WHIP endpoints and resources could convey | unknown error codes. WHIP endpoints and resources could convey | |||
finer-grained error information by a problem statement json object in | finer-grained error information by a problem details json object in | |||
the response 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]; they handle the requests and provide | 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 successful 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 Setup | 4.2. Ingest Session Setup | |||
In order to set up an ingestion session, the WHIP client MUST | In order to set up an ingest session, the WHIP client MUST generate | |||
generate an SDP offer according to the JSEP rules for an initial | an SDP offer according to the JSEP rules for an initial offer as per | |||
offer as per Section 5.2.1 of [RFC9429] and perform an HTTP POST | Section 5.2.1 of [RFC9429] and send an HTTP POST request as per | |||
request as per Section 9.3.3 of [RFC9110] to the configured WHIP | 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 per Section 5.3.1 of [RFC9429] and return the following: a | answer as per Section 5.3.1 of [RFC9429] and return the following: a | |||
"201 Created" response with a content type of "application/sdp", the | "201 Created" response with a content type of "application/sdp", the | |||
SDP answer as the body, and a Location header field pointing to the | SDP answer as the body, and a Location header field pointing to the | |||
newly created WHIP session. If the HTTP POST to the WHIP endpoint | newly created WHIP session. If the HTTP POST to the WHIP endpoint | |||
has a content type different than "application/sdp" or the SDP is | has a content type different than "application/sdp" or the SDP is | |||
malformed, the WHIP endpoint MUST reject the HTTP POST request with | malformed, the WHIP endpoint MUST reject the HTTP POST request with | |||
an appropriate 4xx error response. | an appropriate 4xx error response. | |||
As the WHIP protocol only supports the ingestion use case with | As WHIP only supports the ingestion use case with unidirectional | |||
unidirectional media, the WHIP client SHOULD use the "sendonly" | media, the WHIP client SHOULD use the "sendonly" attribute in the SDP | |||
attribute in the SDP offer but MAY use the "sendrecv" attribute | offer but MAY use the "sendrecv" attribute instead; the "inactive" | |||
instead; the "inactive" and "recvonly" attributes MUST NOT be used. | and "recvonly" attributes MUST NOT be used. The WHIP endpoint MUST | |||
The WHIP endpoint MUST use the "recvonly" attribute in the SDP | use the "recvonly" attribute in the SDP answer. | |||
answer. | ||||
Figure 2 is an example of an HTTP POST sent from a WHIP client to a | Figure 2 is an example of an HTTP POST sent from a WHIP client to a | |||
WHIP endpoint and the "201 Created" response from the WHIP endpoint | WHIP endpoint and the "201 Created" response from the WHIP endpoint | |||
containing the Location header pointing to the newly created WHIP | containing the Location header pointing to the newly 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 | |||
skipping to change at line 307 ¶ | skipping to change at line 302 ¶ | |||
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 | |||
skipping to change at line 351 ¶ | skipping to change at line 349 ¶ | |||
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 | |||
skipping to change at line 383 ¶ | skipping to change at line 382 ¶ | |||
a=rtpmap:97 rtx/90000 | a=rtpmap:97 rtx/90000 | |||
a=fmtp:97 apt=96 | a=fmtp:97 apt=96 | |||
Figure 2: Example of the SDP Offer/Answer Exchange Done via an | Figure 2: Example of the SDP Offer/Answer Exchange Done via an | |||
HTTP POST | 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 send an | |||
an HTTP DELETE request to the WHIP session URL returned in the | HTTP DELETE request to the WHIP session URL returned in the Location | |||
Location header field of the initial HTTP POST. Upon receiving the | header field of the initial HTTP POST. Upon receiving the HTTP | |||
HTTP DELETE request, the WHIP session will be removed and the | DELETE request, the WHIP session will be removed and the resources | |||
resources freed on the media server, terminating the ICE and DTLS | 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 that addresses the complexities of NAT | ICE [RFC8445] 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. | |||
skipping to change at line 422 ¶ | skipping to change at line 420 ¶ | |||
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. This | |||
body containing an SDP fragment with media type "application/trickle- | HTTP PATCH request MUST contain a body with an SDP fragment with | |||
ice-sdpfrag" as specified in [RFC8840] carrying the relevant ICE | media type "application/trickle-ice-sdpfrag" as specified in | |||
information. If the HTTP PATCH to the WHIP session has a content | [RFC8840], which carries the relevant ICE information. If the HTTP | |||
type different than "application/trickle-ice-sdpfrag" or the SDP | PATCH request sent to the WHIP session URL has a content type | |||
fragment is malformed, the WHIP session MUST reject the HTTP PATCH | different than "application/trickle-ice-sdpfrag" or the SDP fragment | |||
with an appropriate 4xx error response. | is malformed, the WHIP session MUST reject the HTTP PATCH 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, those HTTP PATCH requests may be received out | session. Consequently, those HTTP PATCH requests may be received out | |||
of order by the WHIP session. Thus, if the 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 | |||
skipping to change at line 463 ¶ | skipping to change at line 462 ¶ | |||
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 | [RFC8445]. For the purpose of reducing setup times, when using | |||
Trickle ICE, the WHIP client SHOULD send the SDP offer (containing | Trickle ICE, the WHIP client SHOULD send the SDP offer (containing | |||
either locally gathered ICE candidates or an empty list of | either locally gathered ICE candidates or an empty list of | |||
candidates) as soon as possible. | 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. | |||
skipping to change at line 514 ¶ | skipping to change at line 513 ¶ | |||
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. | |||
Figure 3 shows an example of the Trickle ICE procedure where the WHIP | ||||
client sends a PATCH request with updated ICE candidate information | ||||
and receives a successful response from the WHIP session. | ||||
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 | |||
a=candidate:3471623853 1 udp 2122194687 198.51.100.2 61765 typ host generation 0 ufrag EsAw network-id 2 | 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:3471623853 1 udp 2122194687 198.51.100.2 61765 typ host | |||
a=candidate:2154773085 1 tcp 1518214911 198.51.100.2 9 typ host tcptype active generation 0 ufrag EsAw network-id 2 | 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: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 | ||||
client sends a PATCH request with updated ICE candidate information | ||||
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 applies 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 to what is defined in | as defined in [RFC8840]. Similar to what is defined in | |||
Section 4.3.2, as per [RFC9429], only "m=" sections not marked as | Section 4.3.2, as per [RFC9429], only "m=" sections not marked as | |||
bundle-only can gather ICE candidates, so given that the "max-bundle" | bundle-only can gather ICE candidates, so given that the "max-bundle" | |||
policy is being used, the SDP fragment will contain only the offerer- | policy is being used, the SDP fragment will contain only the offerer- | |||
tagged "m=" line of the bundle group. A WHIP client sending a PATCH | tagged "m=" line of the bundle group. A WHIP client sending a PATCH | |||
request for performing ICE restart MUST contain an "If-Match" header | request for performing ICE restart MUST contain an If-Match header | |||
field with a field-value of "*" 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 updated "ice-pwd" and "ice-ufrag" attributes MUST | session receiving updated "ice-pwd" and "ice-ufrag" attributes MUST | |||
consider the request as performing an ICE restart instead and, if | consider the request as performing an ICE restart instead and, if | |||
supported, SHALL return a "200 OK" with an "application/trickle-ice- | supported, SHALL return a "200 OK" with an "application/trickle-ice- | |||
sdpfrag" body containing the new ICE username fragment and password | sdpfrag" body containing the new ICE username fragment and password | |||
and a new set of ICE candidates for the WHIP session. Also, the "200 | and a new set of ICE candidates for the WHIP session. Also, the "200 | |||
skipping to change at line 609 ¶ | skipping to change at line 612 ¶ | |||
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 Session | WHIP session (because of an out-of-order request), the Session | |||
Traversal Utilities for NAT (STUN) requests will contain invalid ICE | Traversal Utilities for NAT (STUN) requests will contain invalid ICE | |||
information and will be dropped by the receiving side. If this | information and will be dropped by the receiving side. If this | |||
situation is detected by the WHIP client, it MUST send a new ICE | situation is detected by the WHIP client, it MUST send a new ICE | |||
restart request to the server. | restart request to the server. | |||
Figure 4 demonstrates a Trickle ICE restart procedure example. The | ||||
WHIP client sends a PATCH request containing updated ICE information, | ||||
including a new username fragment and password, along with newly | ||||
gathered ICE candidates. In response, the WHIP session provides ICE | ||||
information for the session after the ICE restart, including the | ||||
updated username fragment and password, as well as the previous ICE | ||||
candidate. | ||||
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 | |||
a=candidate:3471623853 1 udp 2122194687 198.51.100.2 61765 typ host generation 0 ufrag EsAw network-id 2 | 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:3471623853 1 udp 2122194687 198.51.100.2 61765 typ host | |||
a=candidate:2154773085 1 tcp 1518214911 198.51.100.2 9 typ host tcptype active generation 0 ufrag EsAw network-id 2 | 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: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 4 demonstrates a Trickle ICE restart procedure example. The | ||||
WHIP client sends a PATCH request containing updated ICE information, | ||||
including a new ufrag and password, along with newly gathered ICE | ||||
candidates. In response, the WHIP session provides ICE information | ||||
for the session after the ICE restart, including the updated ufrag | ||||
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 the "max-bundle" policy as defined in [RFC9429]. The WHIP | and use the "max-bundle" policy as defined in [RFC9429]. The WHIP | |||
skipping to change at line 682 ¶ | skipping to change at line 690 ¶ | |||
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 | |||
MediaStreamTracks for the same media (audio or video). However, it | MediaStreamTracks for the same media (audio or video). However, it | |||
would be possible for future revisions of this specification to allow | would be possible for future revisions of this specification to allow | |||
more than a single MediaStream or MediaStreamTrack of each media | more than a single MediaStream or MediaStreamTrack of each media | |||
kind. Therefore, in order to ensure forward compatibility, if the | kind. Therefore, in order to ensure forward compatibility, if the | |||
number of audio and/or video MediaStreamTracks or the number of | number of audio and/or video MediaStreamTracks or the number of | |||
MediaStreams are not supported by the WHIP endpoint, it MUST reject | MediaStreams are not supported by the WHIP endpoint, it MUST reject | |||
the HTTP POST request with a "422 Unprocessable Content" or "400 Bad | the HTTP POST request with a "422 Unprocessable Content" or "400 Bad | |||
Request" error response. The WHIP endpoint MAY also return a problem | Request" error response. The WHIP endpoint MAY also return a problem | |||
statement as recommended in Section 4.1 proving further error details | statement that provides further error details about the failed | |||
about the failed request. | request, as recommended in Section 4.1. | |||
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 a "422 | "m=" section; instead, it SHOULD reject the HTTP POST request with a | |||
Unprocessable Content" or "400 Bad Request" error response to prevent | "422 Unprocessable Content" or "400 Bad Request" error response to | |||
having partially successful ingest sessions, which can be misleading | prevent having partially successful ingest sessions, which can be | |||
to end users. The WHIP endpoint MAY also return a problem statement | misleading to end users. The WHIP endpoint MAY also return a problem | |||
as 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.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 a "422 Unprocessable Content" or "400 | SHOULD reject the request with a "422 Unprocessable Content" or "400 | |||
skipping to change at line 731 ¶ | skipping to change at line 739 ¶ | |||
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 being redirected as GET | [RFC9110]. In order to avoid POST requests being redirected as GET | |||
requests, status codes 301 and 302 MUST NOT be used; the preferred | requests, status codes "301 Moved Permanently" and "302 Found" MUST | |||
method for performing load balancing is via the "307 Temporary | NOT be used; the preferred method for performing load balancing is | |||
Redirect" response status code as described in Section 15.4.8 of | via the "307 Temporary Redirect" response status code as described in | |||
[RFC9110]. Redirections are not required to be supported for the | Section 15.4.8 of [RFC9110]. Redirections are not required to be | |||
PATCH and DELETE requests. | supported for the 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 | |||
"Link" header field [RFC8288] with a "rel" attribute value of "ice- | header field [RFC8288] with a "rel" attribute value of "ice-server". | |||
server". The Link target URI is the server URI as defined in | The Link target URI is the server URI as defined in [RFC7064] and | |||
[RFC7064] and [RFC7065]. The credentials are encoded in the Link | [RFC7065]. The credentials are encoded in the Link target attributes | |||
target attributes as follows: | as follows: | |||
* username: If the Link header field represents a Traversal Using | * username: If the Link header field represents a Traversal Using | |||
Relays around NAT (TURN) server and the "credential-type" | Relays around NAT (TURN) server and the "credential-type" | |||
attribute has a "password" value, then this attribute specifies | attribute has a "password" value, then this attribute specifies | |||
the username to use with that TURN server. | 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, this 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" | server, then this attribute specifies how the "credential" | |||
attribute value should be used when that TURN server requests | attribute value should be used when that TURN server requests | |||
authorization. The default value if the attribute is not present | authorization. The default value if the attribute is not present | |||
is "password". | is "password". | |||
Figure 5 illustrates the Link headers included in a "201 Created" | ||||
response, providing the ICE server URLs and associated credentials. | ||||
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 Server's Configuration | Figure 5: Example of a STUN/TURN Server's Configuration | |||
Figure 5 illustrates the Link headers included in a "201 Created" | ||||
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 that used in the RTCConfiguration | and the target attributes follows that used in the RTCConfiguration | |||
dictionary in Section 4.2.1 of the W3C WebRTC recommendation (see | dictionary in Section 4.2.1 of the W3C WebRTC recommendation (see | |||
[W3C.REC-webrtc-20210126]). The "rel" attribute value of "ice- | [W3C.REC-webrtc-20210126]). The "rel" attribute value of "ice- | |||
server" is not prepended with the "urn:ietf:params:whip:" so it can | server" is not prepended with the "urn:ietf:params:whip:" so it can | |||
be reused by other specifications, which may use this mechanism to | be reused by other specifications, which may use this mechanism to | |||
configure the 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 requests sent | TURN server configuration in the responses to OPTIONS requests sent | |||
to the WHIP endpoint URL before the POST request is sent. However, | to the WHIP endpoint URL before the POST request is sent. However, | |||
this 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 | |||
it is supported by the underlying WHIP client's WebRTC | it is supported by the underlying WHIP client's WebRTC | |||
implementation, the WHIP client SHOULD wait for the information to be | implementation, the WHIP client SHOULD wait for the information to be | |||
returned by the WHIP endpoint on the response of the HTTP POST | returned by the WHIP endpoint in the response of the HTTP POST | |||
request instead. | request instead. | |||
The generation of the TURN server credentials may require performing | The generation of the TURN server credentials may require sending a | |||
a request to an external provider, which can both add latency to the | 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 a "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 | |||
skipping to change at line 859 ¶ | skipping to change at line 870 ¶ | |||
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, are outside the scope of this | to distribute it to the client, are outside the scope of this | |||
document. Examples of tokens that could be used include, but are not | document. Examples of tokens that could be used include, but are not | |||
limited to, JSON Web Tokens (JWTs) as per [RFC6750] and [RFC8725] and | limited to, JSON Web Tokens (JWTs) as per [RFC8725] and a shared | |||
a shared secret stored on a database. The tokens are typically made | secret stored on a database. The tokens are typically made available | |||
available to the end user alongside the WHIP endpoint URL and | to the end user alongside the WHIP endpoint URL and configured on the | |||
configured on the WHIP clients (similar to the way Real Time | WHIP clients (similar to the way Real Time Messaging Protocol (RTMP) | |||
Messaging Protocol (RTMP) URLs and Stream Keys are distributed). | 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 | |||
skipping to change at line 890 ¶ | skipping to change at line 901 ¶ | |||
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 WHIP, a | |||
protocol, a common procedure for registering and announcing the new | common procedure for registering and announcing the new extensions is | |||
extensions is defined. | 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 target attribute with an unknown | |||
attribute value, and WHIP sessions MUST NOT require the usage of any | "rel" attribute value, and WHIP sessions MUST NOT require the usage | |||
extension. | of any extension. | |||
Each protocol extension MUST register a unique "rel" attribute value | Each protocol extension MUST register a unique "rel" attribute value | |||
that starts with the prefix "urn:ietf:params:whip:ext" (as defined in | that starts with the prefix "urn:ietf:params:whip:ext" in the | |||
Section 6.4) in the "WebRTC-HTTP Ingestion Protocol (WHIP) Extension | "WebRTC-HTTP Ingestion Protocol (WHIP) Extension URNs" registry | |||
URNs" registry (Section 6.3.2). | (Section 6.4). | |||
For example, consider 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 Section 9.2 of | communication using server-sent events as specified in Section 9.2 of | |||
[HTML]. The URL for connecting to the server-sent event resource for | [HTML]. The URL for connecting to the server-sent event resource for | |||
the ingested stream could be returned in the initial HTTP "201 | the ingested stream could be returned in the initial HTTP "201 | |||
Created" response with a "Link" header field and a "rel" attribute of | Created" response with a Link header field and a "rel" attribute of | |||
"urn:ietf:params:whip:ext:example:server-sent-events" (this document | "urn:ietf:params:whip:ext:example:server-sent-events" (this document | |||
does not specify such an extension and uses it only as an example). | 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: | |||
Figure 6 shows the "201 Created" response to the HTTP POST request in | ||||
this theoretical case (i.e., the WHIP extension supported by the WHIP | ||||
session, as indicated in the Link header of the "201 Created" | ||||
response). | ||||
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 Extension | |||
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" 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: See [RFC8826]. HTTPS SHALL be | * WebRTC security considerations: See [RFC8826]. HTTPS SHALL be | |||
used in order to preserve the WebRTC security model. | used in order to preserve the WebRTC security model. | |||
* Transport Layer Security (TLS): See [RFC8446] and [RFC9147]. | * Transport Layer Security (TLS): See [RFC8446] and [RFC9147]. | |||
* HTTP security: See Section 11 of [RFC9112] and Section 17 of | * HTTP security: See Section 11 of [RFC9112] and Section 17 of | |||
[RFC9110]. | [RFC9110]. | |||
* URI security: See 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, WHIP exposes a thin new attack surface specific to | |||
specific to the REST API methods used within it: | 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 requests to | for ingesting a WHIP stream to make multiple HTTP POST requests to | |||
the WHIP endpoint. This will force the WHIP endpoint to process | the WHIP endpoint. This will force the WHIP endpoint to process | |||
the incoming SDP and allocate resources for being able to set up | the incoming SDP and allocate resources for being able to set up | |||
the DTLS/ICE connection. While the malicious client does not need | the DTLS/ICE connection. While the malicious client does not need | |||
to 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 they 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 (IDORs) on the WHIP session | * Insecure Direct Object References (IDORs) for WHIP session URLs: | |||
locations: If the URLs returned by the WHIP endpoint for the WHIP | If the URLs returned by the WHIP endpoint for the location of WHIP | |||
sessions location are easy to guess, it would be possible for an | sessions are easy to guess, it would be possible for an attacker | |||
attacker to send multiple HTTP DELETE requests and terminate all | to send multiple HTTP DELETE requests and terminate all the WHIP | |||
the WHIP sessions currently running. In order to prevent this | sessions currently running. In order to prevent this scenario, | |||
scenario, WHIP endpoints SHOULD generate URLs with enough | WHIP endpoints SHOULD generate URLs with enough randomness, using | |||
randomness, using a cryptographically secure pseudorandom number | a cryptographically secure pseudorandom number generator following | |||
generator following the best practices in "Randomness Requirements | the best practices in "Randomness Requirements for Security" | |||
for Security" [RFC4086], and implement a rate limit and avalanche | [RFC4086], and implement a rate limit and avalanche control | |||
control mechanism for HTTP DELETE requests. The security | mechanism for HTTP DELETE requests. The security considerations | |||
considerations for Universally Unique IDentifiers (UUIDs) in | for Universally Unique IDentifiers (UUIDs) in Section 8 of | |||
Section 8 of [RFC9562] are applicable for generating the WHIP | [RFC9562] are applicable for generating the WHIP session URLs. | |||
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 resource exhaustion by sending | malicious client could also create resource exhaustion by sending | |||
multiple HTTP PATCH requests to the WHIP session, although the | multiple HTTP PATCH requests to the WHIP session, although 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 | Per this specification, IANA has added a new link relation type and a | |||
URN sub-namespaces for WHIP protocol extensions. | new URN sub-namespace for WHIP. IANA has also created registries to | |||
manage entries within the "urn:ietf:params:whip" and | ||||
"urn:ietf:params:whip:ext" namespaces. | ||||
6.1. Link Relation Type: ice-server | 6.1. Link Relation Type: ice-server | |||
The link relation type below has been registered by IANA in the "Link | The link relation type below has been registered by IANA in the "Link | |||
Relation Types" registry per Section 4.2 of [RFC8288]: | Relation Types" registry per Section 4.2 of [RFC8288]: | |||
Relation Name: ice-server | Relation Name: ice-server | |||
Description: Conveys the STUN and TURN servers that can be used by | Description: Conveys the STUN and TURN servers that can be used by | |||
an ICE agent to establish a connection with a peer. | an ICE agent to establish a connection with a peer. | |||
Reference: RFC 9725 | Reference: RFC 9725 | |||
6.2. WebRTC-HTTP Ingestion Protocol (WHIP) Registry Group | 6.2. URN Sub-namespace for WHIP (urn:ietf:params:whip) | |||
IANA has created a new registry group called "WebRTC-HTTP Ingestion | IANA has added a new entry in the “IETF URN Sub-namespace for | |||
Protocol (WHIP)". This group includes the "WebRTC-HTTP Ingestion | Registered Protocol Parameter Identifiers” registry, following the | |||
Protocol (WHIP) URNs" and "WebRTC-HTTP Ingestion Protocol (WHIP) | template in [RFC3553]: | |||
Extension URNs" registries described in Sections 6.3.1 and 6.3.2. | ||||
6.3. Registration of WHIP URN Sub-Namespace and WHIP Registries | Registry name: whip | |||
IANA has added an entry in the "IETF URN Sub-namespace for Registered | Specification: RFC 9725 | |||
Protocol Parameter Identifiers" registry [RFC3553] for | ||||
"urn:ietf:params:whip" as follows: | ||||
Registered Parameter Identifier: whip | Repository: <https://www.iana.org/assignments/whip> | |||
Reference: RFC 9725 | Index value: TBD | |||
IANA Registry Reference: <https://www.iana.org/assignments/whip> | To manage this sub-namespace, IANA has created two registries within | |||
a new registry group called "WebRTC-HTTP Ingestion Protocol (WHIP)": | ||||
To manage this sub-namespace, IANA has created the "WebRTC-HTTP | * "WebRTC-HTTP Ingestion Protocol (WHIP) URNs" registry | |||
Ingestion Protocol (WHIP) URNs" and "WebRTC-HTTP Ingestion Protocol | (Section 6.3) | |||
(WHIP) Extension URNs" registries described below. | ||||
6.3.1. WebRTC-HTTP Ingestion Protocol (WHIP) URNs Registry | * "WebRTC-HTTP Ingestion Protocol (WHIP) Extension URNs" registry | |||
(Section 6.4) | ||||
6.3. WebRTC-HTTP Ingestion Protocol (WHIP) URNs Registry | ||||
The "WebRTC-HTTP Ingestion Protocol (WHIP) URNs" registry is used to | The "WebRTC-HTTP Ingestion Protocol (WHIP) URNs" registry is used to | |||
manage entries within the "urn:ietf:params:whip" namespace. The | manage entries within the "urn:ietf:params:whip" namespace. The | |||
registration procedure is "Specification Required" [RFC8126]. The | registration procedure is "Specification Required" [RFC8126]. The | |||
registry contains the following fields: URI, Description, Reference, | registry contains the following fields: URI, Description, Reference, | |||
IANA Registry Reference, and Change Controller. This document is | IANA Registry Reference, and Change Controller. This document is | |||
listed as the reference. | listed as the reference. | |||
The registry contains a single initial entry: | 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 | |||
Reference: Section 6.3.2 of RFC 9725 | Reference: Section 6.4 of RFC 9725 | |||
IANA Registry Reference: See "WebRTC-HTTP Ingestion Protocol (WHIP) | IANA Registry Reference: See "WebRTC-HTTP Ingestion Protocol (WHIP) | |||
Extension URNs" on <https://www.iana.org/assignments/whip> | Extension URNs" on <https://www.iana.org/assignments/whip> | |||
Change Controller: IETF | Change Controller: IETF | |||
6.3.2. WebRTC-HTTP Ingestion Protocol (WHIP) Extension URNs Registry | 6.4. WebRTC-HTTP Ingestion Protocol (WHIP) Extension URNs Registry | |||
The "WebRTC-HTTP Ingestion Protocol (WHIP) Extension URNs" is used to | ||||
manage entries within the "urn:ietf:params:whip:ext" 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. | ||||
6.4. URN Sub-Namespace for WHIP | ||||
A WHIP endpoint utilizes URNs to identify the supported WHIP protocol | ||||
extensions on the "rel" attribute of the Link header as defined in | ||||
Section 4.9. | ||||
This section creates and registers an IETF URN sub-namespace for use | ||||
in the WHIP specifications and future extensions. | ||||
6.4.1. Specification Template | ||||
Namespace ID: | ||||
whip | ||||
Registration Information: | ||||
Version: 1 | ||||
Date: TBD | ||||
Declared registrant of the namespace: | ||||
Registering organization: IETF | ||||
Designated contact: A designated expert (DE) will monitor the | ||||
public mailing list <wish@ietf.org>. | ||||
Declaration of Syntactic Structure: | ||||
The Namespace Specific String (NSS) of all URNs that use the | ||||
"whip" Namespace ID shall have the following structure: | ||||
urn:ietf:params:whip:{type}:{name}:{other}. | ||||
The keywords have the following meanings: | ||||
type: The entity type. This specification only defines the "ext" | ||||
type. | ||||
name: A required ASCII string that conforms to the URN syntax | ||||
requirements (see [RFC8141]) and defines a major namespace of a | ||||
WHIP protocol extension. The value MAY also be an industry | ||||
name or organization name. | ||||
other: Any ASCII string that conforms to the URN syntax | ||||
requirements (see [RFC8141]) and defines the sub-namespace | ||||
(which MAY be further broken down in namespaces delimited by | ||||
colons) as needed to uniquely identify a WHIP protocol | ||||
extension. | ||||
Relevant Ancillary Documentation: | ||||
None | ||||
Identifier Uniqueness Considerations: | ||||
The designated contact shall be responsible for reviewing and | ||||
enforcing uniqueness. | ||||
Identifier Persistence Considerations: | ||||
* Once a name has been allocated, it MUST NOT be reallocated for | ||||
a different purpose. | ||||
* 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 whose meanings may change over time. | ||||
Process of Identifier Assignment: | ||||
The namespace with type "ext" (e.g., "urn:ietf:params:whip:ext") | ||||
is reserved for IETF-approved WHIP specifications. | ||||
Process of Identifier Resolution: | ||||
None specified | ||||
Rules for Lexical Equivalence: | ||||
No special considerations; the rules for lexical equivalence | ||||
specified in [RFC8141] apply. | ||||
Conformance with URN Syntax: | ||||
No special considerations | ||||
Validation Mechanism: | ||||
None specified | ||||
Scope: | ||||
Global | ||||
6.5. Registering WHIP Protocol Extension URNs | The "WebRTC-HTTP Ingestion Protocol (WHIP) Extension URNs" registry | |||
is used to manage entries within the "urn:ietf:params:whip:ext" | ||||
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. | ||||
This section defines the process for registering new WHIP protocol | A WHIP extension URN is used as a value in the "rel" attribute of the | |||
extension URNs with IANA in the "WebRTC-HTTP Ingestion Protocol | Link header as defined in Section 4.9 for the purpose of signaling | |||
(WHIP) Extension URNs" registry (see Section 6.3.2). | the WHIP extensions supported by the WHIP endpoint. WHIP extension | |||
URNs have an "ext" type. | ||||
A WHIP Protocol Extension URN is used as a value in the "rel" | 6.5. Registering WHIP URNs and WHIP Extension URNs | |||
attribute of the Link header as defined in Section 4.9 for the | ||||
purpose of signaling the WHIP protocol extensions supported by the | ||||
WHIP endpoint. | ||||
WHIP Protocol Extension URNs have an "ext" type as defined in | This section defines the process for registering new URNs in the | |||
Section 6.4. | "WebRTC-HTTP Ingestion Protocol (WHIP) URNs" registry (Section 6.3) | |||
and the "WebRTC-HTTP Ingestion Protocol (WHIP) Extension URNs" | ||||
registry (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 proposals regarding WHIP protocol | used for public discussion of proposals regarding WHIP extensions | |||
extensions prior to registration. Use of the mailing list is | prior to registration. Use of the mailing list is strongly | |||
strongly encouraged. A designated expert (DE) [RFC8126], appointed | encouraged. A designated expert (DE) [RFC8126], appointed by the | |||
by the IESG, will monitor the <wish@ietf.org> mailing list and review | 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 extension MUST be | |||
MUST be documented in a permanent and readily available public | documented in a permanent and readily available public specification, | |||
specification, in sufficient detail so that interoperability between | in sufficient detail so that interoperability between independent | |||
independent implementations is possible, and reviewed by the DE as | implementations is possible, and reviewed by the DE as per | |||
per Section 4.6 of [RFC8126]. A Standards Track RFC is REQUIRED for | Section 4.6 of [RFC8126]. A Standards Track RFC is REQUIRED for the | |||
the registration of new value data types that modify existing | registration of new value data types that modify existing properties. | |||
properties. A Standards Track RFC is also REQUIRED for registration | A Standards Track RFC is also REQUIRED for registration of WHIP | |||
of WHIP Protocol Extension URNs that modify WHIP Protocol Extensions | extension URNs that modify WHIP extensions previously documented in | |||
previously documented in an existing RFC. | an existing RFC. | |||
The registration procedure begins when a completed registration | The registration procedure begins when a completed registration | |||
template, defined in Section 6.5.3, is sent to <iana@iana.org>. | template, defined in Section 6.5.3, is sent to <iana@iana.org>. | |||
Decisions made by the DE can be appealed to an Applications and Real- | Decisions made by the DE can be appealed to an Applications and Real- | |||
Time (ART) Area Director, then to the IESG. The normal appeals | Time (ART) Area Director, then to the IESG. The normal appeals | |||
procedure described in [BCP9] is to be followed. | procedure described in RFC 2026 [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 "WebRTC-HTTP ingestion | or modifies the corresponding record in the "WebRTC-HTTP Ingestion | |||
protocol (WHIP) Extension URNs" 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 extension URNs MUST include | |||
include the completed registration template(s), which MAY be expanded | the completed registration template(s), which MAY be expanded with | |||
with additional information. These completed template(s) are | additional information. These completed template(s) are intended to | |||
intended to go in the body of the document, not in the IANA | go in the body of the document, not in the IANA Considerations | |||
Considerations section. The RFC MUST include the syntax and | section. The RFC MUST include the syntax and semantics of any | |||
semantics of any extension-specific attributes that may be provided | extension-specific attributes that may be provided in a Link header | |||
in a Link header field advertising the extension. | field advertising the extension. | |||
6.5.2. Guidance for the Designated Expert | 6.5.2. Guidance for the Designated Expert | |||
The DE is expected to do the following: | The DE is expected to do the following: | |||
* Ascertain the existence of suitable documentation (a | * Ascertain the existence of suitable documentation (a | |||
specification) as described in [RFC8126] and verify that the | specification) as described in [RFC8126] and verify that the | |||
document is permanently and publicly available. Specifications | document is permanently and publicly available. Specifications | |||
should be documented in an Internet-Draft. | should be documented in an Internet-Draft. | |||
skipping to change at line 1220 ¶ | skipping to change at line 1147 ¶ | |||
* Verify that any request for one of these registrations has been | * Verify that any request for one of these registrations has been | |||
made available for review and comments by posting the request to | made available for review and comments by posting the request to | |||
the <wish@ietf.org> mailing list. | the <wish@ietf.org> mailing list. | |||
* Ensure that any other request for a code point does not conflict | * Ensure that any other request for a code point does not conflict | |||
with work that is active or already published by the IETF. | with work that is active or already published by the IETF. | |||
6.5.3. Registration Template | 6.5.3. Registration Template | |||
A WHIP Protocol Extension URN is defined by completing the following | A WHIP 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 extension (e.g., | |||
"urn:ietf:params:whip:ext:example:server-sent-events") | "urn:ietf:params:whip:ext:example:server-sent-events") | |||
Description: A descriptive name of the WHIP extension (e.g., "Sender | ||||
Side 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., | IANA Registry Reference: TBD | |||
"Sender Side events") | ||||
Description: A brief description of the function of the extension | ||||
(short paragraph or two) | ||||
Contact information: Contact information for the organization or | Change Controller: TBD | |||
person making the registration | ||||
7. References | 7. References | |||
7.1. Normative References | 7.1. Normative References | |||
[FETCH] WHATWG, "Fetch", WHATWG Living Standard, | [FETCH] WHATWG, "Fetch", WHATWG Living Standard, | |||
<https://fetch.spec.whatwg.org>. Commit snapshot: | <https://fetch.spec.whatwg.org>. Commit snapshot: | |||
<https://fetch.spec.whatwg.org/commit-snapshots/ | <https://fetch.spec.whatwg.org/commit-snapshots/ | |||
edfa8d100cf1ecfde385f65c172e0e8d018fcd98/>. | edfa8d100cf1ecfde385f65c172e0e8d018fcd98/>. | |||
skipping to change at line 1308 ¶ | skipping to change at line 1232 ¶ | |||
October 2015, <https://www.rfc-editor.org/info/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/info/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/info/rfc8288>. | <https://www.rfc-editor.org/info/rfc8288>. | |||
[RFC8445] Keranen, A., Holmberg, C., and J. Rosenberg, "Interactive | ||||
Connectivity Establishment (ICE): A Protocol for Network | ||||
Address Translator (NAT) Traversal", RFC 8445, | ||||
DOI 10.17487/RFC8445, July 2018, | ||||
<https://www.rfc-editor.org/info/rfc8445>. | ||||
[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/info/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/info/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 | |||
skipping to change at line 1356 ¶ | skipping to change at line 1286 ¶ | |||
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/info/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/info/rfc8842>. | <https://www.rfc-editor.org/info/rfc8842>. | |||
[RFC8845] Duckworth, M., Ed., Pepperell, A., and S. Wenger, | ||||
"Framework for Telepresence Multi-Streams", RFC 8845, | ||||
DOI 10.17487/RFC8845, January 2021, | ||||
<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/info/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/info/rfc8858>. | <https://www.rfc-editor.org/info/rfc8858>. | |||
skipping to change at line 1484 ¶ | skipping to change at line 1409 ¶ | |||
[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/info/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/info/rfc8126>. | <https://www.rfc-editor.org/info/rfc8126>. | |||
[RFC8141] Saint-Andre, P. and J. Klensin, "Uniform Resource Names | ||||
(URNs)", RFC 8141, DOI 10.17487/RFC8141, April 2017, | ||||
<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/info/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/info/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., Castelli, F., Ed., Boström, H., Ed., | |||
"WebRTC 1.0: Real-Time Communication Between Browsers", | and J. Bruaroey, Ed., "WebRTC 1.0: Real-Time Communication | |||
W3C Recommendation, 26 January 2021, | Between Browsers", W3C Recommendation, 8 October 2024, | |||
<https://www.w3.org/TR/2021/REC-webrtc-20210126/>. Latest | <https://www.w3.org/TR/2024/REC-webrtc-20241008/>. Latest | |||
version available at: <https://www.w3.org/TR/webrtc/>. | version available at: <https://www.w3.org/TR/webrtc/>. | |||
Acknowledgements | Acknowledgements | |||
The authors wish to thank Lorenzo Miniero, Juliusz Chroboczek, Adam | The authors wish to thank Lorenzo Miniero, Juliusz Chroboczek, Adam | |||
Roach, Nils Ohlmeier, Christer Holmberg, Cameron Elliott, Gustavo | Roach, Nils Ohlmeier, Christer Holmberg, Cameron Elliott, Gustavo | |||
Garcia, Jonas Birme, Sandro Gauci, Christer Holmberg, and everyone | Garcia, Jonas Birme, Sandro Gauci, Christer Holmberg, and everyone | |||
else in the WebRTC community that have provided comments, feedback, | else in the WebRTC community that have provided comments, feedback, | |||
text, and improvement proposals on the document and contributed early | text, and improvement proposals on the document and contributed early | |||
implementations of the spec. | implementations of the spec. | |||
End of changes. 88 change blocks. | ||||
322 lines changed or deleted | 243 lines changed or added | |||
This html diff was produced by rfcdiff 1.48. |