| rfc8831xml2.original.xml | rfc8831.xml | |||
|---|---|---|---|---|
| <?xml version='1.0'?> | <?xml version='1.0' encoding='utf-8'?> | |||
| <?rfc symrefs='yes'?> | <!DOCTYPE rfc SYSTEM "rfc2629-xhtml.ent"> | |||
| <!DOCTYPE rfc SYSTEM 'rfc2629.dtd'> | ||||
| <?rfc toc='yes' ?> | ||||
| <?rfc compact='yes' ?> | ||||
| <?rfc subcompact='no' ?> | ||||
| <?rfc sortrefs='no' ?> | ||||
| <?rfc strict='yes' ?> | ||||
| <rfc category='std' | ||||
| ipr='trust200902' | ||||
| docName='draft-ietf-rtcweb-data-channel-13.txt'> | ||||
| <front> | ||||
| <title>WebRTC Data Channels</title> | ||||
| <author initials='R.' surname='Jesup' fullname='Randell Jesup'> | ||||
| <organization>Mozilla</organization> | ||||
| <address> | ||||
| <postal> | ||||
| <street></street> | ||||
| <code></code> | ||||
| <city></city> | ||||
| <country>US</country> | ||||
| </postal> | ||||
| <email>randell-ietf@jesup.org</email> | ||||
| </address> | ||||
| </author> | ||||
| <author initials='S.' surname='Loreto' fullname='Salvatore Loreto'> | ||||
| <organization>Ericsson</organization> | ||||
| <address> | ||||
| <postal> | ||||
| <street>Hirsalantie 11</street> | ||||
| <code>02420</code> | ||||
| <city>Jorvas</city> | ||||
| <country>FI</country> | ||||
| </postal> | ||||
| <email>salvatore.loreto@ericsson.com</email> | ||||
| </address> | ||||
| </author> | ||||
| <author initials='M.' surname='Tuexen' fullname='Michael Tuexen'> | ||||
| <organization abbrev='Muenster Univ. of Appl. Sciences'> | ||||
| Muenster University of Applied Sciences</organization> | ||||
| <address> | ||||
| <postal> | ||||
| <street>Stegerwaldstrasse 39</street> | ||||
| <code>48565</code> | ||||
| <city> Steinfurt</city> | ||||
| <country>DE</country> | ||||
| </postal> | ||||
| <email>tuexen@fh-muenster.de</email> | ||||
| </address> | ||||
| </author> | ||||
| <date /> | <rfc xmlns:xi="http://www.w3.org/2001/XInclude" number="8831" | |||
| <area>RAI</area> | docName="draft-ietf-rtcweb-data-channel-13" category="std" | |||
| ipr="trust200902" submissionType="IETF" consensus="yes" obsoletes="" | ||||
| updates="" xml:lang="en" symRefs="true" tocInclude="true" | ||||
| sortRefs="true" version="3"> | ||||
| <!-- xml2rfc v2v3 conversion 2.44.0 --> | ||||
| <front> | ||||
| <title>WebRTC Data Channels</title> | ||||
| <seriesInfo name="RFC" value="8831"/> | ||||
| <author initials="R." surname="Jesup" fullname="Randell Jesup"> | ||||
| <organization>Mozilla</organization> | ||||
| <address> | ||||
| <postal> | ||||
| <street/> | ||||
| <code/> | ||||
| <city/> | ||||
| <country>United States of America</country> | ||||
| </postal> | ||||
| <email>randell-ietf@jesup.org</email> | ||||
| </address> | ||||
| </author> | ||||
| <author initials="S." surname="Loreto" fullname="Salvatore Loreto"> | ||||
| <organization>Ericsson</organization> | ||||
| <address> | ||||
| <postal> | ||||
| <street>Hirsalantie 11</street> | ||||
| <code>02420</code> | ||||
| <city>Jorvas</city> | ||||
| <country>Finland</country> | ||||
| </postal> | ||||
| <email>salvatore.loreto@ericsson.com</email> | ||||
| </address> | ||||
| </author> | ||||
| <author initials="M." surname="Tüxen" fullname="Michael Tüxen"> | ||||
| <organization abbrev="Münster Univ. of Appl. Sciences"> | ||||
| Münster University of Applied Sciences</organization> | ||||
| <address> | ||||
| <postal> | ||||
| <street>Stegerwaldstrasse 39</street> | ||||
| <code>48565</code> | ||||
| <city> Steinfurt</city> | ||||
| <country>Germany</country> | ||||
| </postal> | ||||
| <email>tuexen@fh-muenster.de</email> | ||||
| </address> | ||||
| </author> | ||||
| <date month="October" year="2020"/> | ||||
| <area>RAI</area> | ||||
| <abstract> | <abstract> | |||
| <t>The WebRTC framework specifies protocol support for direct interactive | <t>The WebRTC framework specifies protocol support for direct, interactive | |||
| rich communication using audio, video, and data between two peers' web-browsers. | , | |||
| rich communication using audio, video, and data between two peers' web browsers. | ||||
| This document specifies the non-media data transport aspects of the WebRTC | This document specifies the non-media data transport aspects of the WebRTC | |||
| framework. It provides an architectural overview of how the Stream Control | framework. It provides an architectural overview of how the Stream Control | |||
| Transmission Protocol (SCTP) is used in the WebRTC context as a generic | Transmission Protocol (SCTP) is used in the WebRTC context as a generic | |||
| transport service allowing WEB-browsers to exchange generic data from peer to | transport service that allows web browsers to exchange generic data from peer to | |||
| peer.</t> | peer.</t> | |||
| </abstract> | </abstract> | |||
| </front> | </front> | |||
| <middle> | ||||
| <middle> | <section numbered="true" toc="default"> | |||
| <section title='Introduction'> | <name>Introduction</name> | |||
| <t>In the WebRTC framework, communication between the parties consists of media | <t>In the WebRTC framework, communication between the parties consists of | |||
| (for example audio and video) and non-media data. | media | |||
| Media is sent using SRTP, and is not specified further here. | (for example, audio and video) and non-media data. | |||
| Non-media data is handled by using SCTP <xref target='RFC4960'/> encapsulated | Media is sent using the Secure Real-time Transport Protocol (SRTP) | |||
| in DTLS. DTLS 1.0 is defined in <xref target='RFC4347'/> and the present | and is not specified further here. | |||
| latest version, DTLS 1.2, is defined in <xref target='RFC6347'/>.</t> | Non-media data is handled by using the Stream Control Transmission Protocol (SCT | |||
| P) <xref target="RFC4960" format="default"/> encapsulated | ||||
| <figure title='Basic stack diagram' | in DTLS. DTLS 1.0 is defined in <xref target="RFC4347" format="default"/>, and t | |||
| anchor='fig-stack'> | he present | |||
| <artwork align='center'> | latest version, DTLS 1.2, is defined in <xref target="RFC6347" format="default"/ | |||
| >.</t> | ||||
| <figure anchor="fig-stack"> | ||||
| <name>Basic Stack Diagram</name> | ||||
| <artwork align="center" name="" type="" alt=""><![CDATA[ | ||||
| +----------+ | +----------+ | |||
| | SCTP | | | SCTP | | |||
| +----------+ | +----------+ | |||
| | DTLS | | | DTLS | | |||
| +----------+ | +----------+ | |||
| | ICE/UDP | | | ICE/UDP | | |||
| +----------+ | +----------+ | |||
| </artwork> | ]]></artwork> | |||
| </figure> | </figure> | |||
| <t>The encapsulation of SCTP over DTLS | <t>The encapsulation of SCTP over DTLS | |||
| (see <xref target='I-D.ietf-tsvwg-sctp-dtls-encaps'/>) over ICE/UDP | (see <xref target="RFC8261" format="default"/>) over ICE/UDP | |||
| (see <xref target='RFC5245'/>) provides a NAT traversal | (see <xref target="RFC8445" format="default"/>) provides a NAT traversal | |||
| solution together with confidentiality, source authentication, and | solution together with confidentiality, source authentication, and | |||
| integrity protected transfers. | integrity-protected transfers. | |||
| This data transport service operates in parallel to the SRTP media transports, | This data transport service operates in parallel to the SRTP media transports, | |||
| and all of them can eventually share a single UDP port number.</t> | and all of them can eventually share a single UDP port number.</t> | |||
| <t>SCTP as specified in <xref target='RFC4960'/> with the partial reliability | <t>SCTP, as specified in <xref target="RFC4960" format="default"/> with the part | |||
| extension defined in <xref target='RFC3758'/> and the additional policies | ial reliability | |||
| defined in <xref target='I-D.ietf-tsvwg-sctp-prpolicies'/> | extension (PR-SCTP) defined in <xref target="RFC3758" format="default"/> and the | |||
| additional policies | ||||
| defined in <xref target="RFC7496" format="default"/>, | ||||
| provides multiple streams natively with reliable, and the relevant | provides multiple streams natively with reliable, and the relevant | |||
| partially-reliable delivery modes for user messages. | partially reliable, delivery modes for user messages. | |||
| Using the reconfiguration extension defined in <xref target='RFC6525'/> | Using the reconfiguration extension defined in <xref target="RFC6525" format="de | |||
| allows to increase the number of streams during the lifetime of an SCTP | fault"/> | |||
| association and to reset individual SCTP streams. | allows an increase in the number of streams during the lifetime of an SCTP | |||
| Using <xref target='I-D.ietf-tsvwg-sctp-ndata'/> allows to interleave | association and allows individual SCTP streams to be reset. | |||
| large messages to avoid the monopolization and adds the support of | Using <xref target="RFC8260" format="default"/> allows the interleave of large m | |||
| prioritizing of SCTP streams.</t> | essages to | |||
| <t>The remainder of this document is organized as follows: | avoid monopolization and adds support for | |||
| <xref target='sec-use-cases'/> and <xref target='sec-req'/> provide use cases | prioritizing SCTP streams.</t> | |||
| and requirements for both unreliable and reliable peer to peer data channels; | <t>The remainder of this document is organized as follows: | |||
| <xref target='sec-p-a-2'/> discusses SCTP over DTLS over UDP; | Sections <xref target="sec-use-cases" format="counter"/> and <xref target="sec-r | |||
| <xref target='sec-sctp-usage'/> provides the specification of how SCTP should be | eq" format="counter"/> provide use cases | |||
| and requirements for both unreliable and reliable peer-to-peer data channels; | ||||
| <xref target="sec-p-a-2" format="default"/> discusses SCTP over DTLS over UDP; a | ||||
| nd | ||||
| <xref target="sec-sctp-usage" format="default"/> specifies how SCTP should be | ||||
| used by the WebRTC protocol framework for transporting non-media data | used by the WebRTC protocol framework for transporting non-media data | |||
| between WEB-browsers.</t> | between web browsers.</t> | |||
| </section> | </section> | |||
| <section numbered="true" toc="default"> | ||||
| <section title='Conventions'> | <name>Conventions</name> | |||
| <t>The key words "MUST", "MUST NOT", "REQUIRED", "SHALL", "SHALL NOT", | <t>The key words "<bcp14>MUST</bcp14>", "<bcp14>MUST NOT</bcp14>", | |||
| "SHOULD", "SHOULD NOT", "RECOMMENDED", "MAY", and "OPTIONAL" | "<bcp14>REQUIRED</bcp14>", "<bcp14>SHALL</bcp14>", | |||
| in this document are to be interpreted as described in | "<bcp14>SHALL NOT</bcp14>", "<bcp14>SHOULD</bcp14>", | |||
| <xref target='RFC2119'/>.</t> | "<bcp14>SHOULD NOT</bcp14>", | |||
| </section> | "<bcp14>RECOMMENDED</bcp14>", "<bcp14>NOT RECOMMENDED</bcp14>", | |||
| "<bcp14>MAY</bcp14>", and "<bcp14>OPTIONAL</bcp14>" in this document | ||||
| <section title='Use Cases' | are to be interpreted as described in BCP 14 | |||
| anchor='sec-use-cases'> | <xref target="RFC2119"/> <xref target="RFC8174"/> when, and only | |||
| <t>This section defines use cases specific to data channels. | when, they appear in all capitals, as shown here.</t> | |||
| </section> | ||||
| <section anchor="sec-use-cases" numbered="true" toc="default"> | ||||
| <name>Use Cases</name> | ||||
| <t>This section defines use cases specific to data channels. | ||||
| Please note that this section is informational only.</t> | Please note that this section is informational only.</t> | |||
| <section anchor="sec-use-cases-unreliable" numbered="true" toc="default"> | ||||
| <section title='Use Cases for Unreliable Data Channels' | <name>Use Cases for Unreliable Data Channels</name> | |||
| anchor='sec-use-cases-unreliable'> | <ol group="UseCases" spacing="normal" type="U-C %d:" indent="8"> | |||
| <t><list style='format U-C %d:' counter='UseCases'> | <li>A real-time game where position and object state information are | |||
| <t>A real-time game where position and object state information is | ||||
| sent via one or more unreliable data channels. | sent via one or more unreliable data channels. | |||
| Note that at any time there may be no SRTP media channels, or all SRTP media | Note that at any time, there may not be any SRTP media channels or all SRTP medi | |||
| channels may be inactive, and that there may also be reliable data channels | a | |||
| in use.</t> | channels may be inactive, and there may also be reliable data channels | |||
| <t>Providing non-critical information to a user about the reason for a state | in use.</li> | |||
| update in a video chat or conference, such as mute state.</t> | <li>Providing non-critical information to a user about the reason for | |||
| </list></t> | a state | |||
| </section> | update in a video chat or conference, such as mute state.</li> | |||
| </ol> | ||||
| <section title='Use Cases for Reliable Data Channels' | </section> | |||
| anchor='sec-use-cases-reliable'> | <section anchor="sec-use-cases-reliable" numbered="true" toc="default"> | |||
| <t><list style='format U-C %d:' counter='UseCases'> | <name>Use Cases for Reliable Data Channels</name> | |||
| <t> A real-time game where critical state information needs to be | <ol group="UseCases" spacing="normal" type="U-C %d:" indent="8"> | |||
| <li> A real-time game where critical state information needs to be | ||||
| transferred, such as control information. | transferred, such as control information. | |||
| Such a game may have no SRTP media channels, or they may be inactive at any | Such a game may have no SRTP media channels, or they may be inactive at any | |||
| given time, or may only be added due to in-game actions.</t> | given time or may only be added due to in-game actions.</li> | |||
| <t>Non-realtime file transfers between people chatting. | <li>Non-real-time file transfers between people chatting. | |||
| Note that this may involve a large number of files to transfer sequentially | Note that this may involve a large number of files to transfer sequentially | |||
| or in parallel, such as when sharing a folder of images or a directory of files. | or in parallel, such as when sharing a folder of images or a directory of files. | |||
| </t> | </li> | |||
| <t>Realtime text chat during an audio and/or video call with an individual | <li>Real-time text chat during an audio and/or video call with an indi | |||
| or with multiple people in a conference.</t> | vidual | |||
| <t>Renegotiation of the configuration of the PeerConnection.</t> | or with multiple people in a conference.</li> | |||
| <t>Proxy browsing, where a browser uses data channels of a PeerConnection | <li>Renegotiation of the configuration of the PeerConnection.</li> | |||
| to send and receive HTTP/HTTPS requests and data, for example to avoid local | <li>Proxy browsing, where a browser uses data channels of a PeerConnec | |||
| Internet filtering or monitoring.</t> | tion | |||
| </list></t> | to send and receive HTTP/HTTPS requests and data, for example, to avoid local | |||
| </section> | Internet filtering or monitoring.</li> | |||
| </section> | </ol> | |||
| </section> | ||||
| <section title='Requirements' | </section> | |||
| anchor='sec-req'> | <section anchor="sec-req" numbered="true" toc="default"> | |||
| <t>This section lists the requirements for P2P data channels between | <name>Requirements</name> | |||
| <t>This section lists the requirements for Peer-to-Peer (P2P) data channel | ||||
| s between | ||||
| two browsers. | two browsers. | |||
| Please note that this section is informational only.</t> | Please note that this section is informational only.</t> | |||
| <t><list style='format Req. %d:'> | <ol spacing="normal" type="Req. %d:" indent="10"> | |||
| <t>Multiple simultaneous data channels must be supported. | <li>Multiple simultaneous data channels must be supported. | |||
| Note that there may be 0 or more SRTP media streams in parallel with the data | Note that there may be zero or more SRTP media streams in parallel with the data | |||
| channels in the same PeerConnection, and the number and state (active/inactive) | channels in the same PeerConnection, and the number and state (active/inactive) | |||
| of these SRTP media streams may change at any time.</t> | of these SRTP media streams may change at any time.</li> | |||
| <t>Both reliable and unreliable data channels must be supported.</t> | <li>Both reliable and unreliable data channels must be supported.</li> | |||
| <t>Data channels of a PeerConnection must be congestion controlled; | <li>Data channels of a PeerConnection must be congestion controlled | |||
| either individually, as a class, or in conjunction with the SRTP media streams | either individually, as a class, or in conjunction with the SRTP media streams | |||
| of the PeerConnection, to ensure that data channels don't cause congestion | of the PeerConnection. This ensures that data channels don't cause congestion | |||
| problems for these SRTP media streams, and that the WebRTC PeerConnection does | problems for these SRTP media streams, and that the WebRTC PeerConnection does | |||
| not cause excessive problems when run in parallel with TCP connections.</t> | not cause excessive problems when run in parallel with TCP connections.</li> | |||
| <t>The application should be able to provide guidance as to the | <li>The application should be able to provide guidance as to the | |||
| relative priority of each data channel relative to each other, | relative priority of each data channel relative to each other | |||
| and relative to the SRTP media streams. | and relative to the SRTP media streams. | |||
| This will interact with the congestion control algorithms.</t> | This will interact with the congestion control algorithms.</li> | |||
| <t>Data channels must be secured; allowing for confidentiality, | <li>Data channels must be secured, which allows for confidentiality, | |||
| integrity and source authentication. | integrity, and source authentication. | |||
| See <xref target='I-D.ietf-rtcweb-security'/> and | See <xref target="RFC8826" format="default"/> and | |||
| <xref target='I-D.ietf-rtcweb-security-arch'/> for detailed info.</t> | <xref target="RFC8827" format="default"/> for detailed information.</li> | |||
| <!--<t>Consent and NAT traversal mechanism: These are handled by the | <!--<t>Consent and NAT traversal mechanism: These are handled by the | |||
| PeerConnection's ICE <xref target='RFC5245'/> connectivity checks and | PeerConnection's ICE <xref target='RFC5245'/> connectivity checks and | |||
| optional TURN servers.</t>--> | optional TURN servers.</t>--> | |||
| <t>Data channels must provide message fragmentation support such that | <li>Data channels must provide message fragmentation support such that | |||
| IP-layer fragmentation can be avoided no matter how large a message the | IP-layer fragmentation can be avoided no matter how large a message the | |||
| JavaScript application passes to be sent. It also must ensure that large | JavaScript application passes to be sent. It also must ensure that large | |||
| data channel transfers don't unduly delay traffic on other data | data channel transfers don't unduly delay traffic on other data | |||
| channels.</t> | channels.</li> | |||
| <t>The data channel transport protocol must not encode local IP addresses | <li>The data channel transport protocol must not encode local IP address | |||
| inside its protocol fields; doing so reveals potentially private information, | es | |||
| and leads to failure if the address is depended upon.</t> | inside its protocol fields; doing so reveals potentially private information | |||
| <t>The data channel transport protocol should support unbounded-length "messages | and leads to failure if the address is depended upon.</li> | |||
| " | <li>The data channel transport protocol should support unbounded-length | |||
| (i.e., a virtual socket stream) at the application layer, for such things as | "messages" | |||
| image-file-transfer; Implementations might enforce a reasonable message size | (i.e., a virtual socket stream) at the application layer for such things as | |||
| limit.</t> | image-file-transfer; implementations might enforce a reasonable message size | |||
| <t>The data channel transport protocol should avoid IP fragmentation. It | limit.</li> | |||
| must support PMTU (Path MTU) discovery and must not rely on ICMP or ICMPv6 | <li>The data channel transport protocol should avoid IP fragmentation. I | |||
| being generated or being passed back, especially for PMTU discovery.</t> | t | |||
| <t>It must be possible to implement the protocol stack in the user | must support Path MTU (PMTU) discovery and must not rely on ICMP or ICMPv6 | |||
| application space.</t> | being generated or being passed back, especially for PMTU discovery.</li> | |||
| </list></t> | <li>It must be possible to implement the protocol stack in the user appl | |||
| </section> | ication space.</li> | |||
| </ol> | ||||
| <section title='SCTP over DTLS over UDP Considerations' | </section> | |||
| anchor='sec-p-a-2'> | <section anchor="sec-p-a-2" numbered="true" toc="default"> | |||
| <t>The important features of SCTP in the WebRTC context are: | <name>SCTP over DTLS over UDP Considerations</name> | |||
| <list style='symbols'> | <t>The important features of SCTP in the WebRTC context are the following: | |||
| <t>Usage of a TCP-friendly congestion control.</t> | </t> | |||
| <t>The congestion control is modifiable for integration with the | <ul spacing="normal"> | |||
| SRTP media stream congestion control.</t> | <li>Usage of TCP-friendly congestion control.</li> | |||
| <t>Support of multiple unidirectional streams, each providing its own | <li>modifiable congestion control for integration with the | |||
| notion of ordered message delivery.</t> | SRTP media stream congestion control.</li> | |||
| <t>Support of ordered and out-of-order message delivery.</t> | <li>Support of multiple unidirectional streams, each providing its own | |||
| <t>Supporting arbitrary large user messages by providing fragmentation | notion of ordered message delivery.</li> | |||
| and reassembly.</t> | <li>Support of ordered and out-of-order message delivery.</li> | |||
| <t>Support of PMTU-discovery.</t> | <li>Support of arbitrarily large user messages by providing fragmentation | |||
| <t>Support of reliable or partially reliable message transport.</t> | and reassembly.</li> | |||
| </list></t> | <li>Support of PMTU discovery.</li> | |||
| <t>The WebRTC Data Channel mechanism does not support SCTP multihoming. | <li>Support of reliable or partially reliable message transport.</li> | |||
| </ul> | ||||
| <t>The WebRTC data channel mechanism does not support SCTP multihoming. | ||||
| The SCTP layer will simply act as if it were running on a single-homed host, | The SCTP layer will simply act as if it were running on a single-homed host, | |||
| since that is the abstraction that the DTLS layer (a connection oriented, | since that is the abstraction that the DTLS layer (a connection-oriented, | |||
| unreliable datagram service) exposes.</t> | unreliable datagram service) exposes.</t> | |||
| <t>The encapsulation of SCTP over DTLS defined in | <t>The encapsulation of SCTP over DTLS defined in | |||
| <xref target='I-D.ietf-tsvwg-sctp-dtls-encaps'/> provides confidentiality, | <xref target="RFC8261" format="default"/> provides confidentiality, | |||
| source authenticated, and integrity protected transfers. | source authentication, and integrity-protected transfers. | |||
| Using DTLS over UDP in combination with ICE enables middlebox traversal | Using DTLS over UDP in combination with Interactive Connectivity Establishment | |||
| in IPv4 and IPv6 based networks. | (ICE) <xref target="RFC8445"/> enables middlebox traversal | |||
| SCTP as specified in <xref target='RFC4960'/> MUST be used in | in IPv4- and IPv6-based networks. | |||
| combination with the extension defined in <xref target='RFC3758'/> and | SCTP as specified in <xref target="RFC4960" format="default"/> <bcp14>MUST</bcp1 | |||
| 4> be used in | ||||
| combination with the extension defined in <xref target="RFC3758" format="default | ||||
| "/> and | ||||
| provides the following features for transporting non-media data between | provides the following features for transporting non-media data between | |||
| browsers: | browsers: | |||
| <list style='symbols'> | </t> | |||
| <t>Support of multiple unidirectional streams.</t> | <ul spacing="normal"> | |||
| <t>Ordered and unordered delivery of user messages.</t> | <li>Support of multiple unidirectional streams.</li> | |||
| <t>Reliable and partial-reliable transport of user messages.</t> | <li>Ordered and unordered delivery of user messages.</li> | |||
| </list></t> | <li>Reliable and partially reliable transport of user messages.</li> | |||
| <t>Each SCTP user message contains a Payload Protocol Identifier (PPID) | </ul> | |||
| <t>Each SCTP user message contains a Payload Protocol Identifier (PPID) | ||||
| that is passed to SCTP by its upper layer on the sending side and | that is passed to SCTP by its upper layer on the sending side and | |||
| provided to its upper layer on the receiving side. | provided to its upper layer on the receiving side. | |||
| The PPID can be used to multiplex/demultiplex multiple upper layers over | The PPID can be used to multiplex/demultiplex multiple upper layers over | |||
| a single SCTP association. | a single SCTP association. | |||
| In the WebRTC context, the PPID is used to distinguish between | In the WebRTC context, the PPID is used to distinguish between | |||
| UTF-8 encoded user data, | UTF-8 encoded user data, | |||
| binary encoded userdata and | binary-encoded user data, and | |||
| the Data Channel Establishment Protocol defined in | the Data Channel Establishment Protocol (DCEP) defined in | |||
| <xref target='I-D.ietf-rtcweb-data-protocol'/>. | <xref target="RFC8832" format="default"/>. | |||
| Please note that the PPID is not accessible via the Javascript API.</t> | Please note that the PPID is not accessible via the Javascript API.</t> | |||
| <!-- | <!-- | |||
| <t>Moreover SCTP provides the possibility to transport different "protocols" | <t>Moreover SCTP provides the possibility to transport different "protocols" | |||
| over multiple streams and associations using the PPID | over multiple streams and associations using the PPID | |||
| (Payload Protocol Identifier). | (Payload Protocol Identifier). | |||
| An application can set a different PPID with each send call. | An application can set a different PPID with each send call. | |||
| This allows the receiving application to look at this information | This allows the receiving application to look at this information | |||
| (as well as the stream id/seq) on receiving to know what type of protocol | (as well as the stream id/seq) on receiving to know what type of protocol | |||
| the data payload has.</t> | the data payload has.</t> | |||
| --> | --> | |||
| <t>The encapsulation of SCTP over DTLS, together with the SCTP features listed | <t>The encapsulation of SCTP over DTLS, together with the SCTP features listed | |||
| above satisfies all the requirements listed in <xref target='sec-req'/>.</t> | above, satisfies all the requirements listed in <xref target="sec-req" format="d | |||
| <!-- | efault"/>.</t> | |||
| <!-- | ||||
| <t>There are SCTP implementations for most Operating Systems in wide use:</t> | <t>There are SCTP implementations for most Operating Systems in wide use:</t> | |||
| <t> | <t> | |||
| <list style='empty'> | <list style='empty'> | |||
| <t>Linux (mainline kernel 2.6.36)</t> | <t>Linux (mainline kernel 2.6.36)</t> | |||
| <t>FreeBSD (release kernel 8.2)</t> | <t>FreeBSD (release kernel 8.2)</t> | |||
| <t>Mac OS X</t> | <t>Mac OS X</t> | |||
| <t>Windows (SctpDrv4)</t> | <t>Windows (SctpDrv4)</t> | |||
| <t>Solaris (OpenSolaris 2009.06)</t> | <t>Solaris (OpenSolaris 2009.06)</t> | |||
| <t>and a user-land SCTP implementation (based on the FreeBSD implementation).</t > | <t>and a user-land SCTP implementation (based on the FreeBSD implementation).</t > | |||
| </list> | </list> | |||
| skipping to change at line 296 ¶ | skipping to change at line 292 ¶ | |||
| they run on mobile and desktop operating systems, | they run on mobile and desktop operating systems, | |||
| and they are highly portable to new operating systems. | and they are highly portable to new operating systems. | |||
| This is achieved by having a fairly narrow portability layer to minimize | This is achieved by having a fairly narrow portability layer to minimize | |||
| what needs to be supported on old operating systems and ported to new ones. | what needs to be supported on old operating systems and ported to new ones. | |||
| This creates a need to implement as much functionality as possible | This creates a need to implement as much functionality as possible | |||
| inside the application instead of relying on the operating system.</t> | inside the application instead of relying on the operating system.</t> | |||
| <t>As a user-land implementation of SCTP is available, this meets | <t>As a user-land implementation of SCTP is available, this meets | |||
| requirement 12.</t> | requirement 12.</t> | |||
| </section> | </section> | |||
| --> | --> | |||
| <t>The layering of protocols for WebRTC is shown in the following | <t>The layering of protocols for WebRTC is shown in <xref target="fig-sctp-layer | |||
| <xref target='fig-sctp-layering'/>.</t> | ing" format="default"/>.</t> | |||
| <figure title='WebRTC protocol layers' | <figure anchor="fig-sctp-layering"> | |||
| anchor='fig-sctp-layering'> | <name>WebRTC Protocol Layers</name> | |||
| <artwork align='center'> | <artwork align="center" name="" type="" alt=""><![CDATA[ | |||
| +------+------+------+ | +------+------+------+ | |||
| | DCEP | UTF-8|Binary| | | DCEP | UTF-8|Binary| | |||
| | | data | data | | | | Data | Data | | |||
| +------+------+------+ | +------+------+------+ | |||
| | SCTP | | | SCTP | | |||
| +----------------------------------+ | +----------------------------------+ | |||
| | STUN | SRTP | DTLS | | | STUN | SRTP | DTLS | | |||
| +----------------------------------+ | +----------------------------------+ | |||
| | ICE | | | ICE | | |||
| +----------------------------------+ | +----------------------------------+ | |||
| | UDP1 | UDP2 | UDP3 | ... | | | UDP1 | UDP2 | UDP3 | ... | | |||
| +----------------------------------+ | +----------------------------------+ | |||
| </artwork> | ]]></artwork> | |||
| </figure> | </figure> | |||
| <t>This stack (especially in contrast to DTLS over SCTP <xref target='RFC6083'/> | <t>This stack (especially in contrast to DTLS over SCTP <xref target="RFC6 | |||
| in combination with SCTP over UDP <xref target='RFC6951'/>) | 083" format="default"/> and | |||
| has been chosen because it | in combination with SCTP over UDP <xref target="RFC6951" format="default"/>) | |||
| <list style='symbols'> | has been chosen for the following reasons: | |||
| <t>supports the transmission of arbitrary large user messages.</t> | </t> | |||
| <t>shares the DTLS connection with the SRTP media channels of the PeerConnection | <ul spacing="normal"> | |||
| .</t> | <li>supports the transmission of arbitrarily large user messages;</li> | |||
| <t>provides privacy for the SCTP control information.</t> | <li>shares the DTLS connection with the SRTP media channels of the | |||
| </list></t> | PeerConnection; and</li> | |||
| <t>Considering the protocol stack of <xref target='fig-sctp-layering'/> the | <li>provides privacy for the SCTP control information.</li> | |||
| usage of DTLS 1.0 over UDP is specified in <xref target='RFC4347'/> and | </ul> | |||
| the usage of DTLS 1.2 over UDP in specified in <xref target='RFC6347'/>, | <t>In the protocol stack of <xref target="fig-sctp-layering" format="defau | |||
| lt"/>, the | ||||
| usage of DTLS 1.0 over UDP is specified in <xref target="RFC4347" format="defaul | ||||
| t"/> and | ||||
| the usage of DTLS 1.2 over UDP in specified in <xref target="RFC6347" format="de | ||||
| fault"/>, | ||||
| while the usage of SCTP on top of DTLS is specified in | while the usage of SCTP on top of DTLS is specified in | |||
| <xref target='I-D.ietf-tsvwg-sctp-dtls-encaps'/>. | <xref target="RFC8261" format="default"/>. | |||
| Please note that the demultiplexing STUN vs. SRTP vs. DTLS is done | Please note that the demultiplexing Session Traversal Utilities for NAT (STUN) | |||
| as described in Section 5.1.2 of <xref target='RFC5764'/> and SCTP | <xref target="RFC5389"/> vs. SRTP vs. DTLS is done | |||
| as described in <xref target="RFC5764" sectionFormat="of" section="5.1.2"/>, and | ||||
| SCTP | ||||
| is the only payload of DTLS.</t> | is the only payload of DTLS.</t> | |||
| <t>Since DTLS is typically implemented in user application space, the SCTP | <t>Since DTLS is typically implemented in user application space, the SCTP | |||
| stack also needs to be a user application space stack.</t> | stack also needs to be a user application space stack.</t> | |||
| <t>The ICE/UDP layer can handle IP address changes during a session without | <t>The ICE/UDP layer can handle IP address changes during a session withou t | |||
| needing interaction with the DTLS and SCTP layers. | needing interaction with the DTLS and SCTP layers. | |||
| However, SCTP SHOULD be notified when an address changes has happened. | However, SCTP <bcp14>SHOULD</bcp14> be notified when an address change has happe | |||
| In this case SCTP SHOULD retest the Path MTU and reset the congestion | ned. | |||
| In this case, SCTP <bcp14>SHOULD</bcp14> retest the Path MTU and reset the conge | ||||
| stion | ||||
| state to the initial state. | state to the initial state. | |||
| In case of a window based congestion control like the one specified in | In the case of window-based congestion control like the one specified in | |||
| <xref target='RFC4960'/>, this means setting the congestion window and | <xref target="RFC4960" format="default"/>, this means setting the congestion win | |||
| slow start threshold to its initial values.</t> | dow and | |||
| <t>Incoming ICMP or ICMPv6 messages can't be processed by | slow-start threshold to its initial values.</t> | |||
| <t>Incoming ICMP or ICMPv6 messages can't be processed by | ||||
| the SCTP layer, since there is no way to identify the corresponding | the SCTP layer, since there is no way to identify the corresponding | |||
| association. Therefore SCTP MUST support performing Path MTU discovery | association. Therefore, SCTP <bcp14>MUST</bcp14> support performing Path MTU dis | |||
| without relying on ICMP or ICMPv6 as specified in <xref target='RFC4821'/> | covery | |||
| using probing messages specified in <xref target='RFC4820'/>. | without relying on ICMP or ICMPv6 as specified in <xref target="RFC4821" format= | |||
| The initial Path MTU at the IP layer SHOULD NOT exceed 1200 bytes for IPv4 | "default"/> | |||
| and 1280 for IPv6.</t> | by using probing messages specified in <xref target="RFC4820" format="default"/> | |||
| <t>In general, the lower layer interface of an SCTP implementation should be | . | |||
| adapted to address the differences between IPv4 and IPv6 (being connection-less) | The initial Path MTU at the IP layer <bcp14>SHOULD NOT</bcp14> exceed 1200 bytes | |||
| or DTLS (being connection-oriented).</t> | for IPv4 | |||
| <t>When the protocol stack of <xref target='fig-sctp-layering'/> is used, DTLS | and 1280 bytes for IPv6.</t> | |||
| protects the complete SCTP packet, so it provides confidentiality, integrity and | <t>In general, the lower-layer interface of an SCTP implementation should | |||
| be | ||||
| adapted to address the differences between IPv4 and IPv6 (being connectionless) | ||||
| or DTLS (being connection oriented).</t> | ||||
| <t>When the protocol stack of <xref target="fig-sctp-layering" format="def | ||||
| ault"/> is used, DTLS | ||||
| protects the complete SCTP packet, so it provides confidentiality, integrity, an | ||||
| d | ||||
| source authentication of the complete SCTP packet.</t> | source authentication of the complete SCTP packet.</t> | |||
| <t>SCTP provides congestion control on a per-association base. This means | <t>SCTP provides congestion control on a per-association basis. This means | |||
| that all SCTP streams within a single SCTP association share the same | that all SCTP streams within a single SCTP association share the same | |||
| congestion window. Traffic not being sent over SCTP is not covered by | congestion window. Traffic not being sent over SCTP is not covered by | |||
| the SCTP congestion control. | SCTP congestion control. | |||
| Using a congestion control different from than the standard one might improve | Using a congestion control different from the standard one might improve | |||
| the impact on the parallel SRTP media streams.</t> | the impact on the parallel SRTP media streams.</t> | |||
| <t>SCTP uses the same port number concept as TCP and UDP do. | <t>SCTP uses the same port number concept as TCP and UDP. | |||
| Therefore an SCTP association uses two port numbers, one at each SCTP | Therefore, an SCTP association uses two port numbers, one at each SCTP | |||
| end-point.</t> | endpoint.</t> | |||
| </section> | </section> | |||
| <section anchor="sec-sctp-usage" numbered="true" toc="default"> | ||||
| <section title='The Usage of SCTP for Data Channels' | <name>The Usage of SCTP for Data Channels</name> | |||
| anchor='sec-sctp-usage'> | <section numbered="true" toc="default"> | |||
| <name>SCTP Protocol Considerations</name> | ||||
| <section title='SCTP Protocol Considerations'> | <t>The DTLS encapsulation of SCTP packets as described in | |||
| <t>The DTLS encapsulation of SCTP packets as described in | <xref target="RFC8261" format="default"/> <bcp14>MUST</bcp14> be used.</t> | |||
| <xref target='I-D.ietf-tsvwg-sctp-dtls-encaps'/> MUST be used.</t> | <t>This SCTP stack and its upper layer <bcp14>MUST</bcp14> support the u | |||
| <t>This SCTP stack and its upper layer MUST support the usage of multiple | sage of multiple | |||
| SCTP streams. | SCTP streams. | |||
| A user message can be sent ordered or unordered and with partial or full | A user message can be sent ordered or unordered and with partial or full | |||
| reliability.</t> | reliability.</t> | |||
| <t>The following SCTP protocol extensions are required: | <t>The following SCTP protocol extensions are required: | |||
| <list style='symbols'> | </t> | |||
| <t>The stream reconfiguration extension defined in <xref target='RFC6525'/> | <ul spacing="normal"> | |||
| MUST be supported. It is used for closing channels.</t> | <li>The stream reconfiguration extension defined in <xref target="RFC6 | |||
| <t>The dynamic address reconfiguration extension defined in | 525" format="default"/> | |||
| <xref target='RFC5061'/> MUST be used to signal the support of the | <bcp14>MUST</bcp14> be supported. It is used for closing channels.</li> | |||
| stream reset extension defined in <xref target='RFC6525'/>. | <li>The dynamic address reconfiguration extension defined in | |||
| Other features of <xref target='RFC5061'/> are OPTIONAL.</t> | <xref target="RFC5061" format="default"/> <bcp14>MUST</bcp14> be used to sign | |||
| <t>The partial reliability extension defined in <xref target='RFC3758'/> MUST | al the support of the | |||
| stream reset extension defined in <xref target="RFC6525" format="default"/>. | ||||
| Other features of <xref target="RFC5061" format="default"/> are <bcp14>OPTION | ||||
| AL</bcp14>.</li> | ||||
| <li>The partial reliability extension defined in <xref target="RFC3758 | ||||
| " format="default"/> <bcp14>MUST</bcp14> | ||||
| be supported. In addition to the timed reliability PR-SCTP policy defined | be supported. In addition to the timed reliability PR-SCTP policy defined | |||
| in <xref target='RFC3758'/>, the limited retransmission policy defined in | in <xref target="RFC3758" format="default"/>, the limited retransmission poli | |||
| <xref target='I-D.ietf-tsvwg-sctp-prpolicies'/> MUST be supported. | cy defined in | |||
| Limiting the number of retransmissions to zero combined with unordered | <xref target="RFC7496" format="default"/> <bcp14>MUST</bcp14> be supported. | |||
| delivery provides a UDP-like service where each user message is sent | Limiting the number of retransmissions to zero, combined with unordered | |||
| exactly once and delivered in the order received.</t> | delivery, provides a UDP-like service where each user message is sent | |||
| </list></t> | exactly once and delivered in the order received.</li> | |||
| <t>The support for message interleaving as defined in | </ul> | |||
| <xref target='I-D.ietf-tsvwg-sctp-ndata'/> SHOULD be used.</t> | <t>The support for message interleaving as defined in | |||
| </section> | <xref target="RFC8260" format="default"/> <bcp14>SHOULD</bcp14> be used.</t> | |||
| </section> | ||||
| <section title='SCTP Association Management' | <section anchor="sec-sctp-management" numbered="true" toc="default"> | |||
| anchor='sec-sctp-management'> | <name>SCTP Association Management</name> | |||
| <t>In the WebRTC context, the SCTP association will be set up when the | <t>In the WebRTC context, the SCTP association will be set up when the | |||
| two endpoints of the WebRTC PeerConnection agree on opening it, as negotiated | two endpoints of the WebRTC PeerConnection agree on opening it, as negotiated | |||
| by JSEP (typically an exchange of SDP) <xref target='I-D.ietf-rtcweb-jsep'/>. | by the JavaScript Session Establishment Protocol (JSEP), which is typically an | |||
| It will use the DTLS connection selected via ICE; typically this will be | exchange of the Session Description Protocol (SDP) <xref target="RFC8829" format | |||
| ="default"/>. | ||||
| It will use the DTLS connection selected via ICE, and typically this will be | ||||
| shared via BUNDLE or equivalent with DTLS connections used to key the | shared via BUNDLE or equivalent with DTLS connections used to key the | |||
| SRTP media streams.</t> | SRTP media streams.</t> | |||
| <!-- FIXME: Bundle Issue. --> | <!-- FIXME: Bundle Issue. --> | |||
| <t>The number of streams negotiated during SCTP association setup SHOULD | <t>The number of streams negotiated during SCTP association setup <bcp14>SHOULD< | |||
| /bcp14> | ||||
| be 65535, which is the maximum number of streams that can be negotiated during | be 65535, which is the maximum number of streams that can be negotiated during | |||
| the association setup.</t> | the association setup.</t> | |||
| <t>SCTP supports two ways of terminating an SCTP association. | ||||
| <t>SCTP supports two ways of terminating an SCTP association. | The first method is a graceful one, where a procedure that ensures no messages | |||
| A graceful one, using a procedure which ensures that no messages are lost | are lost during the shutdown of the association is used. | |||
| during the shutdown of the association. | ||||
| The second method is a non-graceful one, where one side can just abort the | The second method is a non-graceful one, where one side can just abort the | |||
| association.</t> | association.</t> | |||
| <t>Each SCTP end-point supervises continuously the reachability of its peer by | <t>Each SCTP endpoint continuously supervises the reachability of its pe er by | |||
| monitoring the number of retransmissions of user messages and test messages. | monitoring the number of retransmissions of user messages and test messages. | |||
| In case of excessive retransmissions, the association is terminated in a | In case of excessive retransmissions, the association is terminated in a | |||
| non-graceful way.</t> | non-graceful way.</t> | |||
| <t>If an SCTP association is closed in a graceful way, all of its data channels | <t>If an SCTP association is closed in a graceful way, all of its data c hannels | |||
| are closed. | are closed. | |||
| In case of a non-graceful teardown, all data channels are also closed, | In case of a non-graceful teardown, all data channels are also closed, | |||
| but an error indication SHOULD be provided if possible.</t> | but an error indication <bcp14>SHOULD</bcp14> be provided if possible.</t> | |||
| </section> | </section> | |||
| <section numbered="true" toc="default"> | ||||
| <section title='SCTP Streams'> | <name>SCTP Streams</name> | |||
| <t>SCTP defines a stream as a unidirectional logical channel existing within | <t>SCTP defines a stream as a unidirectional logical channel existing wi | |||
| thin | ||||
| an SCTP association to another SCTP endpoint. The streams are used to | an SCTP association to another SCTP endpoint. The streams are used to | |||
| provide the notion of in-sequence delivery and for multiplexing. | provide the notion of in-sequence delivery and for multiplexing. | |||
| Each user message is sent on a particular stream, either ordered or unordered. | Each user message is sent on a particular stream, either ordered or unordered. | |||
| Ordering is preserved only for ordered messages sent on the same stream.</t> | Ordering is preserved only for ordered messages sent on the same stream.</t> | |||
| </section> | </section> | |||
| <section numbered="true" toc="default"> | ||||
| <section title='Data Channel Definition'> | <name>Data Channel Definition</name> | |||
| <t>Data channels are defined such that their accompanying application-level API | <t>Data channels are defined such that their accompanying application-le | |||
| vel API | ||||
| can closely mirror the API for WebSockets, which implies bidirectional streams | can closely mirror the API for WebSockets, which implies bidirectional streams | |||
| of data and a textual field called 'label' used to identify the meaning of the | of data and a textual field called 'label' used to identify the meaning of the | |||
| data channel.</t> | data channel.</t> | |||
| <t>The realization of a data channel is a pair of one incoming stream and | <t>The realization of a data channel is a pair of one incoming stream an d | |||
| one outgoing SCTP stream having the same SCTP stream identifier. | one outgoing SCTP stream having the same SCTP stream identifier. | |||
| How these SCTP stream identifiers are selected is protocol and implementation | How these SCTP stream identifiers are selected is protocol and implementation | |||
| dependent. This allows a bidirectional communication.</t> | dependent. This allows a bidirectional communication.</t> | |||
| <t>Additionally, each data channel has the following properties in each | <t>Additionally, each data channel has the following properties in each | |||
| direction: | direction: | |||
| <list style='symbols'> | </t> | |||
| <t>reliable or unreliable message transmission. | <ul spacing="normal"> | |||
| <li>reliable or unreliable message transmission: | ||||
| In case of unreliable transmissions, the same level of unreliability is used. | In case of unreliable transmissions, the same level of unreliability is used. | |||
| Please note that in SCTP this is a property of an SCTP user message and not | Note that, in SCTP, this is a property of an SCTP user message and not | |||
| of an SCTP stream.</t> | of an SCTP stream.</li> | |||
| <t>in-order or out-of-order message delivery for message sent. | <li>in-order or out-of-order message delivery for message sent: | |||
| Please note that in SCTP this is a property of an SCTP user message and not | Note that, in SCTP, this is a property of an SCTP user message and not | |||
| of an SCTP stream.</t> | of an SCTP stream.</li> | |||
| <t>A priority, which is a 2 byte unsigned integer. | <li>a priority, which is a 2-byte unsigned integer: | |||
| These priorities MUST be interpreted as weighted-fair-queuing scheduling | These priorities <bcp14>MUST</bcp14> be interpreted as weighted-fair-queuing sch | |||
| eduling | ||||
| priorities per the definition of the corresponding stream scheduler | priorities per the definition of the corresponding stream scheduler | |||
| supporting interleaving in <xref target='I-D.ietf-tsvwg-sctp-ndata'/>. | supporting interleaving in <xref target="RFC8260" format="default"/>. | |||
| For use in WebRTC, the values used SHOULD be one of 128 ("below normal"), | For use in WebRTC, the values used <bcp14>SHOULD</bcp14> be one of 128 ("below n | |||
| 256 ("normal"), 512 ("high") or 1024 ("extra high").</t> | ormal"), | |||
| <t>an optional label.</t> | 256 ("normal"), 512 ("high"), or 1024 ("extra high").</li> | |||
| <t>an optional protocol.</t> | <li>an optional label.</li> | |||
| </list></t> | <li>an optional protocol.</li> | |||
| <t>Please note that for a data channel being negotiated with the protocol | </ul> | |||
| specified in <xref target='I-D.ietf-rtcweb-data-protocol'/> all of the above | <t>Note that for a data channel being negotiated with the protocol | |||
| specified in <xref target="RFC8832" format="default"/>, all of the above | ||||
| properties are the same in both directions.</t> | properties are the same in both directions.</t> | |||
| </section> | </section> | |||
| <section numbered="true" toc="default"> | ||||
| <section title='Opening a Data Channel'> | <name>Opening a Data Channel</name> | |||
| <t>Data channels can be opened by using negotiation within the SCTP association, | <t>Data channels can be opened by using negotiation within the SCTP asso | |||
| called in-band negotiation, or out-of-band negotiation. | ciation | |||
| Out-of-band negotiation is defined as any method which results in an agreement | (called in-band negotiation) or out-of-band negotiation. | |||
| Out-of-band negotiation is defined as any method that results in an agreement | ||||
| as to the parameters of a channel and the creation thereof. | as to the parameters of a channel and the creation thereof. | |||
| The details are out of scope of this document. Applications using data | The details are out of scope of this document. Applications using data | |||
| channels need to use the negotiation methods consistently on both end-points.</t | channels need to use the negotiation methods consistently on both endpoints.</t> | |||
| > | <t>A simple protocol for in-band negotiation is specified in | |||
| <t>A simple protocol for in-band negotiation is specified in | <xref target="RFC8832" format="default"/>.</t> | |||
| <xref target='I-D.ietf-rtcweb-data-protocol'/>.</t> | <t>When one side wants to open a channel using out-of-band negotiation, | |||
| <t>When one side wants to open a channel using out-of-band negotiation, it | it | |||
| picks a stream. | picks a stream. | |||
| Unless otherwise defined or negotiated, the streams are picked based on | Unless otherwise defined or negotiated, the streams are picked based on | |||
| the DTLS role (the client picks even stream identifiers, | the DTLS role (the client picks even stream identifiers, and | |||
| the server odd stream identifiers). | the server picks odd stream identifiers). | |||
| However, the application is responsible for avoiding collisions with | However, the application is responsible for avoiding collisions with | |||
| existing streams. | existing streams. | |||
| If it attempts to re-use a stream which is part of an existing data channel, | If it attempts to reuse a stream that is part of an existing data channel, | |||
| the addition MUST fail. | the addition <bcp14>MUST</bcp14> fail. | |||
| In addition to choosing a stream, the application SHOULD also determine | In addition to choosing a stream, the application <bcp14>SHOULD</bcp14> also det | |||
| the options to use for sending messages. | ermine | |||
| The application MUST ensure in an application-specific manner that | the options to be used for sending messages. | |||
| The application <bcp14>MUST</bcp14> ensure in an application-specific manner tha | ||||
| t | ||||
| the application at the peer will also know the selected stream to | the application at the peer will also know the selected stream to | |||
| be used, and the options for sending data from that side.</t> | be used, as well as the options for sending data from that side.</t> | |||
| </section> | </section> | |||
| <section numbered="true" toc="default"> | ||||
| <section title='Transferring User Data on a Data Channel'> | <name>Transferring User Data on a Data Channel</name> | |||
| <t>All data sent on a data channel in both directions MUST be sent over the | <t>All data sent on a data channel in both directions <bcp14>MUST</bcp14 | |||
| > be sent over the | ||||
| underlying stream using the reliability defined when the data channel was | underlying stream using the reliability defined when the data channel was | |||
| opened unless the options are changed, or per-message options are specified | opened, unless the options are changed or per-message options are specified | |||
| by a higher level.</t> | by a higher level.</t> | |||
| <t>The message-orientation of SCTP is used to preserve the message boundaries | <t>The message orientation of SCTP is used to preserve the message bound | |||
| of user messages. Therefore, senders MUST NOT put more than one application | aries | |||
| of user messages. Therefore, senders <bcp14>MUST NOT</bcp14> put more than one a | ||||
| pplication | ||||
| message into an SCTP user message. Unless the deprecated PPID-based | message into an SCTP user message. Unless the deprecated PPID-based | |||
| fragmentation and reassembly is used, the sender MUST include exactly one | fragmentation and reassembly is used, the sender <bcp14>MUST</bcp14> include exa ctly one | |||
| application message in each SCTP user message.</t> | application message in each SCTP user message.</t> | |||
| <t>The SCTP Payload Protocol Identifiers (PPIDs) are used to signal the | <t>The SCTP Payload Protocol Identifiers (PPIDs) are used to signal the | |||
| interpretation of the "Payload data". The following PPIDs MUST be used | interpretation of the "payload data". The following PPIDs <bcp14>MUST</bcp14> be | |||
| (see <xref target='sec-IANA'/>): | used | |||
| <list style="hanging"> | (see <xref target="sec-IANA" format="default"/>): | |||
| <t hangText='WebRTC String:'> | </t> | |||
| to identify a non-empty JavaScript string encoded in UTF-8.</t> | <dl newline="false" spacing="normal"> | |||
| <t hangText='WebRTC String Empty:'> | <dt>WebRTC String:</dt> | |||
| to identify an empty JavaScript string encoded in UTF-8.</t> | <dd> | |||
| <t hangText='WebRTC Binary:'> | to identify a non-empty JavaScript string encoded in UTF-8.</dd> | |||
| to identify a non-empty JavaScript binary data | <dt>WebRTC String Empty:</dt> | |||
| (ArrayBuffer, ArrayBufferView or Blob).</t> | <dd> | |||
| <t hangText='WebRTC Binary Empty:'> | to identify an empty JavaScript string encoded in UTF-8.</dd> | |||
| to identify an empty JavaScript binary data | <dt>WebRTC Binary:</dt> | |||
| (ArrayBuffer, ArrayBufferView or Blob).</t> | <dd> | |||
| </list></t> | to identify non-empty JavaScript binary data | |||
| <t>SCTP does not support the sending of empty user messages. Therefore, if an | (ArrayBuffer, ArrayBufferView, or Blob).</dd> | |||
| <dt>WebRTC Binary Empty:</dt> | ||||
| <dd> | ||||
| to identify empty JavaScript binary data | ||||
| (ArrayBuffer, ArrayBufferView, or Blob).</dd> | ||||
| </dl> | ||||
| <t>SCTP does not support the sending of empty user messages. Therefore, | ||||
| if an | ||||
| empty message has to be sent, the appropriate PPID (WebRTC String Empty or | empty message has to be sent, the appropriate PPID (WebRTC String Empty or | |||
| WebRTC Binary Empty) is used and the SCTP user message of one zero byte is | WebRTC Binary Empty) is used, and the SCTP user message of one zero byte is | |||
| sent. When receiving an SCTP user message with one of these PPIDs, the receiver | sent. When receiving an SCTP user message with one of these PPIDs, the receiver | |||
| MUST ignore the SCTP user message and process it as an empty message.</t> | <bcp14>MUST</bcp14> ignore the SCTP user message and process it as an empty mess | |||
| <t>The usage of the PPIDs "WebRTC String Partial" and "WebRTC Binary Partial" | age.</t> | |||
| <t>The usage of the PPIDs "WebRTC String Partial" and "WebRTC Binary Par | ||||
| tial" | ||||
| is deprecated. They were used for a PPID-based fragmentation and reassembly | is deprecated. They were used for a PPID-based fragmentation and reassembly | |||
| of user messages belonging to reliable and ordered data channels.</t> | of user messages belonging to reliable and ordered data channels.</t> | |||
| <t>If a message with an unsupported PPID is received or some error condition | <t>If a message with an unsupported PPID is received or some error condi tion | |||
| related to the received message is detected by the receiver | related to the received message is detected by the receiver | |||
| (for example, illegal ordering), the receiver SHOULD close the corresponding | (for example, illegal ordering), the receiver <bcp14>SHOULD</bcp14> close the co rresponding | |||
| data channel. This implies in particular that extensions using additional | data channel. This implies in particular that extensions using additional | |||
| PPIDs can't be used without prior negotiation.</t> | PPIDs can't be used without prior negotiation.</t> | |||
| <t>The SCTP base protocol specified in <xref target='RFC4960'/> does not | <t>The SCTP base protocol specified in <xref target="RFC4960" format="de | |||
| support the interleaving of user messages. Therefore sending a large user | fault"/> does not | |||
| support the interleaving of user messages. Therefore, sending a large user | ||||
| message can monopolize the SCTP association. | message can monopolize the SCTP association. | |||
| To overcome this limitation, <xref target='I-D.ietf-tsvwg-sctp-ndata'/> | To overcome this limitation, <xref target="RFC8260" format="default"/> | |||
| defines an extension to support message interleaving, which SHOULD be used. | defines an extension to support message interleaving, which <bcp14>SHOULD</bcp14 | |||
| > be used. | ||||
| As long as message interleaving is not supported, the sender | As long as message interleaving is not supported, the sender | |||
| SHOULD limit the maximum message size to 16 KB to avoid monopolization.</t> | <bcp14>SHOULD</bcp14> limit the maximum message size to 16 KB to avoid monopoliz | |||
| <t>It is recommended that the message size be kept within certain size bounds | ation.</t> | |||
| as applications will not be able to support arbitrarily-large single | <t>It is recommended that the message size be kept within certain size b | |||
| messages. This limit has to be negotiated, for example by using | ounds, | |||
| <xref target='I-D.ietf-mmusic-sctp-sdp'/>.</t> | as applications will not be able to support arbitrarily large single | |||
| <t>The sender SHOULD disable the Nagle algorithm (see <xref target='RFC1122'/>) | messages. This limit has to be negotiated, for example, by using | |||
| <xref target="RFC8841" format="default"/>.</t> | ||||
| <t>The sender <bcp14>SHOULD</bcp14> disable the Nagle algorithm (see <xr | ||||
| ef target="RFC1122" format="default"/>) | ||||
| to minimize the latency.</t> | to minimize the latency.</t> | |||
| </section> | </section> | |||
| <section numbered="true" toc="default"> | ||||
| <section title='Closing a Data Channel'> | <name>Closing a Data Channel</name> | |||
| <t>Closing of a data channel MUST be signaled by resetting the corresponding | <t>Closing of a data channel <bcp14>MUST</bcp14> be signaled by resettin | |||
| outgoing streams <xref target='RFC6525'/>. This means that if one side | g the corresponding | |||
| outgoing streams <xref target="RFC6525" format="default"/>. This means that if o | ||||
| ne side | ||||
| decides to close the data channel, it resets the corresponding outgoing stream. | decides to close the data channel, it resets the corresponding outgoing stream. | |||
| When the peer sees that an incoming stream was reset, it also resets its | When the peer sees that an incoming stream was reset, it also resets its | |||
| corresponding outgoing stream. Once this is completed, the data channel is close d. | corresponding outgoing stream. Once this is completed, the data channel is close d. | |||
| Resetting a stream sets the Stream Sequence Numbers (SSNs) of the stream back to | Resetting a stream sets the Stream Sequence Numbers (SSNs) of the stream back to | |||
| 'zero' with a corresponding notification to the application layer | 'zero' with a corresponding notification to the application layer | |||
| that the reset has been performed. Streams are available for reuse after a reset | that the reset has been performed. Streams are available for reuse after a reset | |||
| has been performed.</t> | has been performed.</t> | |||
| <t><xref target='RFC6525'/> also guarantees that all the messages are delivered | <t><xref target="RFC6525" format="default"/> also guarantees that all th e messages are delivered | |||
| (or abandoned) before the stream is reset.</t> | (or abandoned) before the stream is reset.</t> | |||
| </section> | </section> | |||
| </section> | </section> | |||
| <section anchor="sec-security" numbered="true" toc="default"> | ||||
| <section title='Security Considerations' | <name>Security Considerations</name> | |||
| anchor='sec-security'> | <t>This document does not add any additional considerations to the ones gi | |||
| <t>This document does not add any additional considerations to the ones given in | ven in | |||
| <xref target='I-D.ietf-rtcweb-security'/> and | <xref target="RFC8826" format="default"/> and | |||
| <xref target='I-D.ietf-rtcweb-security-arch'/>.</t> | <xref target="RFC8827" format="default"/>.</t> | |||
| <t>It should be noted that a receiver must be prepared that the sender tries | <t>It should be noted that a receiver must be prepared for a sender that t | |||
| to send arbitrary large messages.</t> | ries | |||
| </section> | to send arbitrarily large messages.</t> | |||
| </section> | ||||
| <section title='IANA Considerations' | <section anchor="sec-IANA" numbered="true" toc="default"> | |||
| anchor='sec-IANA'> | <name>IANA Considerations</name> | |||
| <t>[NOTE to RFC-Editor: | <t>This document uses six already registered SCTP Payload Protocol | |||
| <list> | ||||
| <t>"RFCXXXX" is to be replaced by the RFC number you assign this document.</t> | ||||
| </list> | ||||
| ]</t> | ||||
| <t>This document uses six already registered SCTP Payload Protocol | ||||
| Identifiers (PPIDs): | Identifiers (PPIDs): | |||
| "DOMString Last", | "DOMString Last", | |||
| "Binary Data Partial", | "Binary Data Partial", | |||
| "Binary Data Last", | "Binary Data Last", | |||
| "DOMString Partial", | "DOMString Partial", | |||
| "WebRTC String Empty", and | "WebRTC String Empty", and | |||
| "WebRTC Binary Empty". | "WebRTC Binary Empty". | |||
| <xref target='RFC4960'/> creates the registry "SCTP Payload Protocol Identifiers " | <xref target="RFC4960" format="default"/> creates the "SCTP Payload Protocol Ide ntifiers" registry | |||
| from which these identifiers were assigned. | from which these identifiers were assigned. | |||
| IANA is requested to update the reference of these six assignments to point | IANA has updated the reference of these six assignments to point | |||
| to this document and change the names of the first four PPIDs. | to this document and changed the names of the first four PPIDs. | |||
| The corresponding dates should be kept.</t> | The corresponding dates remain unchanged.</t> | |||
| <t>Therefore these six assignments should be updated to read:</t> | <t>The six assignments have been updated to read:</t> | |||
| <texttable> | <table align="center"> | |||
| <ttcol align='left'>Value</ttcol> | <thead> | |||
| <ttcol align='left'>SCTP PPID</ttcol> | <tr> | |||
| <ttcol align='left'>Reference</ttcol> | <th align="left">Value</th> | |||
| <ttcol align='left'>Date</ttcol> | <th align="left">SCTP PPID</th> | |||
| <c>WebRTC String</c> <c>51</c> <c>[RFCXXXX]</c> <c>2013-09- | <th align="left">Reference</th> | |||
| 20</c> | <th align="left">Date</th> | |||
| <c>WebRTC Binary Partial (Deprecated)</c> <c>52</c> <c>[RFCXXXX]</c> <c>2013-09- | </tr> | |||
| 20</c> | </thead> | |||
| <c>WebRTC Binary</c> <c>53</c> <c>[RFCXXXX]</c> <c>2013-09- | <tbody> | |||
| 20</c> | <tr> | |||
| <c>WebRTC String Partial (Deprecated)</c> <c>54</c> <c>[RFCXXXX]</c> <c>2013-09- | <td align="left">WebRTC String</td> | |||
| 20</c> | <td align="left">51</td> | |||
| <c>WebRTC String Empty</c> <c>56</c> <c>[RFCXXXX]</c> <c>2014-08- | <td align="left">RFC 8831</td> | |||
| 22</c> | <td align="left">2013-09-20</td> | |||
| <c>WebRTC Binary Empty</c> <c>57</c> <c>[RFCXXXX]</c> <c>2014-08- | </tr> | |||
| 22</c> | <tr> | |||
| </texttable> | <td align="left">WebRTC Binary Partial (deprecated)</td> | |||
| </section> | <td align="left">52</td> | |||
| <td align="left">RFC 8831</td> | ||||
| <td align="left">2013-09-20</td> | ||||
| </tr> | ||||
| <tr> | ||||
| <td align="left">WebRTC Binary</td> | ||||
| <td align="left">53</td> | ||||
| <td align="left">RFC 8831</td> | ||||
| <td align="left">2013-09-20</td> | ||||
| </tr> | ||||
| <tr> | ||||
| <td align="left">WebRTC String Partial (deprecated)</td> | ||||
| <td align="left">54</td> | ||||
| <td align="left">RFC 8831</td> | ||||
| <td align="left">2013-09-20</td> | ||||
| </tr> | ||||
| <tr> | ||||
| <td align="left">WebRTC String Empty</td> | ||||
| <td align="left">56</td> | ||||
| <td align="left">RFC 8831</td> | ||||
| <td align="left">2014-08-22</td> | ||||
| </tr> | ||||
| <tr> | ||||
| <td align="left">WebRTC Binary Empty</td> | ||||
| <td align="left">57</td> | ||||
| <td align="left">RFC 8831</td> | ||||
| <td align="left">2014-08-22</td> | ||||
| </tr> | ||||
| </tbody> | ||||
| </table> | ||||
| </section> | ||||
| </middle> | ||||
| <back> | ||||
| <references> | ||||
| <name>References</name> | ||||
| <references> | ||||
| <name>Normative References</name> | ||||
| <xi:include href="https://xml2rfc.ietf.org/public/rfc/bibxml/reference.R | ||||
| FC.2119.xml"/> | ||||
| <xi:include href="https://xml2rfc.ietf.org/public/rfc/bibxml/reference.R | ||||
| FC.3758.xml"/> | ||||
| <xi:include href="https://xml2rfc.ietf.org/public/rfc/bibxml/reference.R | ||||
| FC.4347.xml"/> | ||||
| <xi:include href="https://xml2rfc.ietf.org/public/rfc/bibxml/reference.R | ||||
| FC.4820.xml"/> | ||||
| <xi:include href="https://xml2rfc.ietf.org/public/rfc/bibxml/reference.R | ||||
| FC.4821.xml"/> | ||||
| <xi:include href="https://xml2rfc.ietf.org/public/rfc/bibxml/reference.R | ||||
| FC.4960.xml"/> | ||||
| <xi:include href="https://xml2rfc.ietf.org/public/rfc/bibxml/reference.R | ||||
| FC.5061.xml"/> | ||||
| <xi:include href="https://xml2rfc.ietf.org/public/rfc/bibxml/reference.RFC.8445. | ||||
| xml"/> | ||||
| <xi:include href="https://xml2rfc.ietf.org/public/rfc/bibxml/reference.R | ||||
| FC.6347.xml"/> | ||||
| <xi:include href="https://xml2rfc.ietf.org/public/rfc/bibxml/reference.R | ||||
| FC.6525.xml"/> | ||||
| <xi:include href="https://xml2rfc.ietf.org/public/rfc/bibxml/reference.R | ||||
| FC.8174.xml"/> | ||||
| <xi:include href="https://xml2rfc.ietf.org/public/rfc/bibxml/reference.R | ||||
| FC.8260.xml"/> | ||||
| <!--draft-ietf-rtcweb-data-protocol: 8832 --> | ||||
| <reference anchor="RFC8832" target="https://www.rfc-editor.org/info/rfc8832"> | ||||
| <front> | ||||
| <title>WebRTC Data Channel Establishment Protocol</title> | ||||
| <author initials='R.' surname='Jesup' fullname='Randell Jesup'> | ||||
| <organization/> | ||||
| </author> | ||||
| <author initials='S.' surname='Loreto' fullname='Salvatore Loreto'> | ||||
| <organization/> | ||||
| </author> | ||||
| <author initials='M' surname='Tüxen' fullname='Michael Tüxen'> | ||||
| <organization/> | ||||
| </author> | ||||
| <date month='October' year='2020'/> | ||||
| </front> | ||||
| <seriesInfo name="RFC" value="8832"/> | ||||
| <seriesInfo name="DOI" value="10.17487/RFC8832"/> | ||||
| </reference> | ||||
| <section title='Acknowledgments'> | <xi:include href="https://xml2rfc.ietf.org/public/rfc/bibxml/reference.R | |||
| <t>Many thanks for comments, ideas, and text from | FC.8261.xml"/> | |||
| Harald Alvestrand, | ||||
| Richard Barnes, | ||||
| Adam Bergkvist, | ||||
| Alissa Cooper, | ||||
| Benoit Claise, | ||||
| Spencer Dawkins, | ||||
| Gunnar Hellstrom, | ||||
| Christer Holmberg, | ||||
| Cullen Jennings, | ||||
| Paul Kyzivat, | ||||
| Eric Rescorla, | ||||
| Adam Roach, | ||||
| Irene Ruengeler, | ||||
| Randall Stewart, | ||||
| Martin Stiemerling, | ||||
| Justin Uberti, | ||||
| and Magnus Westerlund.</t> | ||||
| </section> | ||||
| </middle> | ||||
| <back> | <!--draft-ietf-rtcweb-security: RFC 8826 --> | |||
| <references title='Normative References'> | <reference anchor="RFC8826" target="https://www.rfc-editor.org/info/rfc8826"> | |||
| <?rfc include='reference.RFC.2119' ?> | <front> | |||
| <?rfc include='reference.RFC.3758'?> | <title>Security Considerations for WebRTC</title> | |||
| <?rfc include='reference.RFC.4347'?> | <author initials='E.' surname='Rescorla' fullname='Eric Rescorla'> | |||
| <?rfc include='reference.RFC.4820'?> | <organization/> | |||
| <?rfc include='reference.RFC.4821'?> | </author> | |||
| <?rfc include='reference.RFC.4960'?> | <date month='October' year='2020'/> | |||
| <?rfc include='reference.RFC.5061'?> | </front> | |||
| <?rfc include='reference.RFC.5245'?> | <seriesInfo name="RFC" value="8826"/> | |||
| <?rfc include='reference.RFC.6347'?> | <seriesInfo name="DOI" value="10.17487/RFC8826"/> | |||
| <?rfc include='reference.RFC.6525'?> | </reference> | |||
| <?rfc include='reference.I-D.ietf-tsvwg-sctp-ndata'?> | ||||
| <?rfc include='reference.I-D.ietf-rtcweb-data-protocol'?> | <!--draft-ietf-rtcweb-security-arch: 8827 --> | |||
| <?rfc include='reference.I-D.ietf-tsvwg-sctp-dtls-encaps'?> | <reference anchor="RFC8827" target="https://www.rfc-editor.org/info/rfc8827"> | |||
| <?rfc include='reference.I-D.ietf-rtcweb-security'?> | <front> | |||
| <?rfc include='reference.I-D.ietf-rtcweb-security-arch'?> | <title>WebRTC Security Architecture</title> | |||
| <?rfc include='reference.I-D.ietf-rtcweb-jsep'?> | <author initials='E.' surname='Rescorla' fullname='Eric Rescorla'> | |||
| <?rfc include='reference.I-D.ietf-tsvwg-sctp-prpolicies'?> | <organization/> | |||
| <?rfc include='reference.I-D.ietf-mmusic-sctp-sdp'?> | </author> | |||
| </references> | <date month='October' year='2020'/> | |||
| <references title='Informative References'> | </front> | |||
| <?rfc include='reference.RFC.1122'?> | <seriesInfo name="RFC" value="8827"/> | |||
| <?rfc include='reference.RFC.5764'?> | <seriesInfo name="DOI" value="10.17487/RFC8827"/> | |||
| <?rfc include='reference.RFC.6083'?> | </reference> | |||
| <?rfc include='reference.RFC.6951'?> | ||||
| </references> | <!--draft-ietf-rtcweb-jsep: 8829 --> | |||
| </back> | <reference anchor="RFC8829" target="https://www.rfc-editor.org/info/rfc8829"> | |||
| <front> | ||||
| <title>JavaScript Session Establishment Protocol (JSEP)</title> | ||||
| <author initials='J.' surname='Uberti' fullname='Justin Uberti'> | ||||
| <organization/> | ||||
| </author> | ||||
| <author initials="C." surname="Jennings" fullname="Cullen Jennings"> | ||||
| <organization/> | ||||
| </author> | ||||
| <author initials="E." surname="Rescorla" fullname="Eric Rescorla" | ||||
| role="editor"> | ||||
| <organization/> | ||||
| </author> | ||||
| <date month='October' year='2020'/> | ||||
| </front> | ||||
| <seriesInfo name="RFC" value="8829"/> | ||||
| <seriesInfo name="DOI" value="10.17487/RFC8829"/> | ||||
| </reference> | ||||
| <xi:include href="https://xml2rfc.ietf.org/public/rfc/bibxml/reference.R | ||||
| FC.7496.xml"/> | ||||
| <!-- draft-ietf-mmusic-sctp-sdp: 8841 --> | ||||
| <reference anchor="RFC8841" target="https://www.rfc-editor.org/info/rfc8841"> | ||||
| <front> | ||||
| <title>Session Description Protocol (SDP) Offer/Answer Procedures for | ||||
| Stream Control Transmission Protocol (SCTP) over Datagram Transport Layer | ||||
| Security (DTLS) Transport</title> | ||||
| <author initials="C." surname="Holmberg" fullname="Christer Holmberg"> | ||||
| <organization /> | ||||
| </author> | ||||
| <author initials="R." surname="Shpount" fullname="Roman Shpount"> | ||||
| <organization /> | ||||
| </author> | ||||
| <author initials="S." surname="Loreto" fullname="Salvatore Loreto"> | ||||
| <organization /> | ||||
| </author> | ||||
| <author initials="G." surname="Camarillo" fullname="Gonzalo Camarillo"> | ||||
| <organization /> | ||||
| </author> | ||||
| <date month="October" year="2020" /> | ||||
| </front> | ||||
| <seriesInfo name="RFC" value="8841" /> | ||||
| <seriesInfo name="DOI" value="10.17487/RFC8841"/> | ||||
| </reference> | ||||
| </references> | ||||
| <references> | ||||
| <name>Informative References</name> | ||||
| <xi:include href="https://xml2rfc.ietf.org/public/rfc/bibxml/reference.R | ||||
| FC.1122.xml"/> | ||||
| <xi:include href="https://xml2rfc.ietf.org/public/rfc/bibxml/reference.RFC.5389. | ||||
| xml"/> | ||||
| <xi:include href="https://xml2rfc.ietf.org/public/rfc/bibxml/reference.R | ||||
| FC.5764.xml"/> | ||||
| <xi:include href="https://xml2rfc.ietf.org/public/rfc/bibxml/reference.R | ||||
| FC.6083.xml"/> | ||||
| <xi:include href="https://xml2rfc.ietf.org/public/rfc/bibxml/reference.R | ||||
| FC.6951.xml"/> | ||||
| </references> | ||||
| </references> | ||||
| <section numbered="false" toc="default"> | ||||
| <name>Acknowledgements</name> | ||||
| <t>Many thanks for comments, ideas, and text from <contact | ||||
| fullname="Harald Alvestrand"/>, <contact fullname="Richard Barnes"/>, | ||||
| <contact fullname="Adam Bergkvist"/>, <contact fullname="Alissa Cooper"/>, | ||||
| <contact fullname="Benoit Claise"/>, <contact fullname="Spencer | ||||
| Dawkins"/>, <contact fullname="Gunnar Hellström"/>, <contact | ||||
| fullname="Christer Holmberg"/>, <contact fullname="Cullen Jennings"/>, | ||||
| <contact fullname="Paul Kyzivat"/>, <contact fullname="Eric Rescorla"/>, | ||||
| <contact fullname="Adam Roach"/>, <contact fullname="Irene Rüngeler"/>, | ||||
| <contact fullname="Randall Stewart"/>, <contact fullname="Martin | ||||
| Stiemerling"/>, <contact fullname="Justin Uberti"/>, and <contact | ||||
| fullname="Magnus Westerlund"/>.</t> | ||||
| </section> | ||||
| </back> | ||||
| </rfc> | </rfc> | |||
| End of changes. 77 change blocks. | ||||
| 486 lines changed or deleted | 691 lines changed or added | |||
This html diff was produced by rfcdiff 1.48. The latest version is available from http://tools.ietf.org/tools/rfcdiff/ | ||||