rfc8656xml2.original.xml | rfc8656.xml | |||
---|---|---|---|---|
<?xml version="1.0" encoding="US-ASCII"?> | <?xml version='1.0' encoding='utf-8'?> | |||
<!DOCTYPE rfc SYSTEM "rfc2629.dtd"> | <!DOCTYPE rfc SYSTEM "rfc2629-xhtml.ent"> | |||
<?rfc toc="yes"?> | ||||
<?rfc compact='yes'?> | <rfc number="8656" docName="draft-ietf-tram-turnbis-29" | |||
<?rfc subcompact='no'?> | xmlns:xi="http://www.w3.org/2001/XInclude" submissionType="IETF" | |||
<?rfc symrefs="yes"?> | category="std" consensus="true" ipr="trust200902" obsoletes="5766, 6156" | |||
<rfc category="std" docName="draft-ietf-tram-turnbis-29" ipr="trust200902" | updates="" tocInclude="true" symRefs="true" sortRefs="true" xml:lang="en" | |||
obsoletes="5766, 6156"> | version="3"> | |||
<front> | <front> | |||
<title abbrev="TURN">Traversal Using Relays around NAT (TURN): Relay | <title abbrev="TURN">Traversal Using Relays around NAT (TURN): Relay | |||
Extensions to Session Traversal Utilities for NAT (STUN)</title> | Extensions to Session Traversal Utilities for NAT (STUN)</title> | |||
<author fullname="Tirumaleswar Reddy" initials="T." role="editor" | <seriesInfo name="RFC" value="8656"/> | |||
surname="Reddy"> | ||||
<organization abbrev="McAfee">McAfee, Inc.</organization> | ||||
<author fullname="Tirumaleswar Reddy" initials="T." role="editor" surname="R | ||||
eddy"> | ||||
<organization abbrev="McAfee">McAfee, Inc.</organization> | ||||
<address> | <address> | |||
<postal> | <postal> | |||
<street>Embassy Golf Link Business Park</street> | <street>Embassy Golf Link Business Park</street> | |||
<city>Bangalore</city> | <city>Bangalore</city> | |||
<region>Karnataka</region> | <region>Karnataka</region> | |||
<code>560071</code> | <code>560071</code> | |||
<country>India</country> | <country>India</country> | |||
</postal> | </postal> | |||
<email>kondtir@gmail.com</email> | <email>kondtir@gmail.com</email> | |||
</address> | </address> | |||
</author> | </author> | |||
<author fullname="Alan Johnston" initials="A." role="editor" surname="Johnst | ||||
<author fullname="Alan Johnston" initials="A." role="editor" | on"> | |||
surname="Johnston"> | ||||
<organization>Villanova University</organization> | <organization>Villanova University</organization> | |||
<address> | <address> | |||
<postal> | <postal> | |||
<street></street> | <street/> | |||
<city>Villanova</city> | <city>Villanova</city> | |||
<region>PA</region> | <region>PA</region> | |||
<code/> | ||||
<code></code> | <country>United States of America</country> | |||
<country>USA</country> | ||||
</postal> | </postal> | |||
<email>alan.b.johnston@gmail.com</email> | <email>alan.b.johnston@gmail.com</email> | |||
</address> | </address> | |||
</author> | </author> | |||
<author fullname="Philip Matthews" initials="P." surname="Matthews"> | <author fullname="Philip Matthews" initials="P." surname="Matthews"> | |||
<organization>Alcatel-Lucent</organization> | <organization>Alcatel-Lucent</organization> | |||
<address> | <address> | |||
<postal> | <postal> | |||
<street>600 March Road</street> | <street>600 March Road</street> | |||
<city>Ottawa</city> | <city>Ottawa</city> | |||
<region>Ontario</region> | <region>Ontario</region> | |||
<code/> | ||||
<code></code> | ||||
<country>Canada</country> | <country>Canada</country> | |||
</postal> | </postal> | |||
<email>philip_matthews@magma.ca</email> | <email>philip_matthews@magma.ca</email> | |||
</address> | </address> | |||
</author> | </author> | |||
<author fullname="Jonathan Rosenberg" initials="J." surname="Rosenberg"> | <author fullname="Jonathan Rosenberg" initials="J." surname="Rosenberg"> | |||
<organization>jdrosen.net</organization> | <organization>jdrosen.net</organization> | |||
<address> | <address> | |||
<postal> | <postal> | |||
<street></street> | <street/> | |||
<city>Edison</city> | <city>Edison</city> | |||
<region>NJ</region> | <region>NJ</region> | |||
<country>United States of America</country> | ||||
<country>USA</country> | ||||
</postal> | </postal> | |||
<email>jdrosen@jdrosen.net</email> | <email>jdrosen@jdrosen.net</email> | |||
<uri>http://www.jdrosen.net</uri> | <uri>http://www.jdrosen.net</uri> | |||
</address> | </address> | |||
</author> | </author> | |||
<date month="February" year="2020"/> | ||||
<date day="27" month="July" year="2019" /> | ||||
<area>Transport</area> | <area>Transport</area> | |||
<workgroup>TRAM WG</workgroup> | <workgroup>TRAM WG</workgroup> | |||
<keyword>NAT</keyword> | <keyword>NAT</keyword> | |||
<keyword>TURN</keyword> | <keyword>TURN</keyword> | |||
<keyword>STUN</keyword> | <keyword>STUN</keyword> | |||
<keyword>ICE</keyword> | ||||
<keyword>ICEf</keyword> | ||||
<abstract> | <abstract> | |||
<t>If a host is located behind a NAT, then in certain situations it can | <t>If a host is located behind a NAT, it can be impossible for that host | |||
be impossible for that host to communicate directly with other hosts | to communicate directly with other hosts (peers) in certain | |||
(peers). In these situations, it is necessary for the host to use the | situations. In these situations, it is necessary for the host to use the | |||
services of an intermediate node that acts as a communication relay. | services of an intermediate node that acts as a communication relay. | |||
This specification defines a protocol, called TURN (Traversal Using | This specification defines a protocol, called "Traversal Using Relays | |||
Relays around NAT), that allows the host to control the operation of the | around NAT" (TURN), that allows the host to control the operation of the | |||
relay and to exchange packets with its peers using the relay. TURN | relay and to exchange packets with its peers using the relay. TURN | |||
differs from other relay control protocols in that it allows a client to | differs from other relay control protocols in that it allows a client to | |||
communicate with multiple peers using a single relay address.</t> | communicate with multiple peers using a single relay address.</t> | |||
<t>The TURN protocol was designed to be used as part of the Interactive | ||||
<t>The TURN protocol was designed to be used as part of the ICE | Connectivity Establishment (ICE) approach to NAT traversal, | |||
(Interactive Connectivity Establishment) approach to NAT traversal, | though it can also be used without ICE.</t> | |||
though it also can be used without ICE.</t> | <t>This document obsoletes RFCs 5766 and 6156.</t> | |||
<t>This document obsoletes RFC 5766 and RFC 6156.</t> | ||||
</abstract> | </abstract> | |||
</front> | </front> | |||
<middle> | <middle> | |||
<section title="Introduction"> | <section numbered="true" toc="default"> | |||
<name>Introduction</name> | ||||
<t>A host behind a NAT may wish to exchange packets with other hosts, | <t>A host behind a NAT may wish to exchange packets with other hosts, | |||
some of which may also be behind NATs. To do this, the hosts involved | some of which may also be behind NATs. To do this, the hosts involved | |||
can use "hole punching" techniques (see <xref target="RFC5128"></xref>) | can use "hole punching" techniques (see <xref target="RFC5128" format="def | |||
in an attempt discover a direct communication path; that is, a | ault"/>) | |||
in an attempt to discover a direct communication path; that is, a | ||||
communication path that goes from one host to another through | communication path that goes from one host to another through | |||
intervening NATs and routers, but does not traverse any relays.</t> | intervening NATs and routers but does not traverse any relays.</t> | |||
<t>As described in <xref target="RFC5128" format="default"/> and <xref | ||||
<t>As described in <xref target="RFC5128"></xref> and <xref | target="RFC4787" format="default"/>, hole punching techniques will fail | |||
target="RFC4787"></xref>, hole punching techniques will fail if both | if both hosts are behind NATs that are not well behaved. For example, if | |||
hosts are behind NATs that are not well behaved. For example, if both | both hosts are behind NATs that have a mapping behavior of | |||
hosts are behind NATs that have a mapping behavior of "address-dependent | "address-dependent mapping" or "address- and port-dependent mapping" | |||
mapping" or "address- and port- dependent mapping" (Section 4.1 in <xref | (see <xref target="RFC4787" sectionFormat="of" section="4.1"/>), then | |||
target="RFC4787"></xref>), then hole punching techniques generally | hole punching techniques generally fail.</t> | |||
fail.</t> | ||||
<t>When a direct communication path cannot be found, it is necessary to | <t>When a direct communication path cannot be found, it is necessary to | |||
use the services of an intermediate host that acts as a relay for the | use the services of an intermediate host that acts as a relay for the | |||
packets. This relay typically sits in the public Internet and relays | packets. This relay typically sits in the public Internet and relays | |||
packets between two hosts that both sit behind NATs.</t> | packets between two hosts that both sit behind NATs.</t> | |||
<t>In many enterprise networks, direct UDP transmissions are not | <t>In many enterprise networks, direct UDP transmissions are not | |||
permitted between clients on the internal networks and external IP | permitted between clients on the internal networks and external IP | |||
addresses. To permit media sessions in such a situation to use UDP and | addresses. To permit media sessions in such a situation to use UDP and | |||
avoid forcing them through TCP, an Enterprise Firewall can be configured | avoid forcing them through TCP, an Enterprise Firewall can be configured | |||
to allow UDP traffic relayed through an Enterprise relay server. WebRTC | to allow UDP traffic relayed through an Enterprise relay server. WebRTC | |||
requires support for this scenario (Section 2.3.5.1 in <xref | requires support for this scenario (see <xref target="RFC7478" | |||
target="RFC7478"></xref>). Some users of SIP or WebRTC want IP location | sectionFormat="of" section="2.3.5.1"/>). Some users of SIP or WebRTC | |||
privacy from the remote peer. In this scenario, the client can select a | want IP location privacy from the remote peer. In this scenario, the | |||
relay server offering IP location privacy and only convey the relayed | client can select a relay server offering IP location privacy and only | |||
candidates to the peer for ICE connectivity checks (see Section 4.2.4 in | convey the relayed candidates to the peer for ICE connectivity checks | |||
<xref target="I-D.ietf-rtcweb-security"></xref>).</t> | (see <xref target="I-D.ietf-rtcweb-security" | |||
sectionFormat="of" section="4.2.4"></xref>).</t> | ||||
<t>This specification defines a protocol, called "TURN", that allows a | ||||
host behind a NAT (called the "TURN client") to request that another host | ||||
(called the "TURN server") act as a relay. | ||||
<t>This specification defines a protocol, called TURN, that allows a | The client can arrange for the server to relay packets to and from | |||
host behind a NAT (called the TURN client) to request that another host | certain other hosts (called "peers"), and the client can control aspects | |||
(called the TURN server) act as a relay. The client can arrange for the | of how the relaying is done. The client does this by obtaining an IP | |||
server to relay packets to and from certain other hosts (called peers) | address and port on the server, called the "relayed transport | |||
and can control aspects of how the relaying is done. The client does | address". When a peer sends a packet to the relayed transport address, | |||
this by obtaining an IP address and port on the server, called the | the server relays the transport protocol data from the packet to the | |||
relayed transport address. When a peer sends a packet to the relayed | client. The data encapsulated within a message header that allows the | |||
transport address, the server relays the transport protocol data from | client to know the peer from which the transport protocol data was | |||
the packet to the client. The data encapsulated within a message header | relayed by the server. | |||
that allows the client to know the peer from which the transport | ||||
protocol data was relayed by the server. If the server receives an ICMP | ||||
error packet, the server also relays certain layer 3/4 header fields | ||||
from the ICMP header to the client. When the client sends a message to | ||||
the server, the server identifies the remote peer from the message | ||||
header and relays the message data to the intended peer.</t> | ||||
If the server receives an ICMP error packet, the server also relays | ||||
certain Layer 3 and 4 header fields from the ICMP header to the | ||||
client. When the client sends a message to the server, the server | ||||
identifies the remote peer from the message header and relays the | ||||
message data to the intended peer.</t> | ||||
<t>A client using TURN must have some way to communicate the relayed | <t>A client using TURN must have some way to communicate the relayed | |||
transport address to its peers, and to learn each peer's IP address and | transport address to its peers and to learn each peer's IP address and | |||
port (more precisely, each peer's server-reflexive transport address, | port (more precisely, each peer's server-reflexive transport address; | |||
see <xref target="sec-overview"></xref>). How this is done is out of the | see <xref target="sec-overview" format="default"/>). How this is done is o | |||
ut of the | ||||
scope of the TURN protocol. One way this might be done is for the client | scope of the TURN protocol. One way this might be done is for the client | |||
and peers to exchange email messages. Another way is for the client and | and peers to exchange email messages. Another way is for the client and | |||
its peers to use a special-purpose "introduction" or "rendezvous" | its peers to use a special-purpose "introduction" or "rendezvous" | |||
protocol (see <xref target="RFC5128"></xref> for more details).</t> | protocol (see <xref target="RFC5128" format="default"/> for more details). | |||
</t> | ||||
<t>If TURN is used with ICE <xref target="RFC8445"></xref>, then the | <t>If TURN is used with ICE <xref target="RFC8445" format="default"/>, | |||
relayed transport address and the IP addresses and ports of the peers | then the relayed transport address and the IP addresses and ports of the | |||
are included in the ICE candidate information that the rendezvous | peers are included in the ICE candidate information that the rendezvous | |||
protocol must carry. For example, if TURN and ICE are used as part of a | protocol must carry. For example, if TURN and ICE are used as part of a | |||
multimedia solution using SIP <xref target="RFC3261"></xref>, then SIP | multimedia solution using SIP <xref target="RFC3261" format="default"/>, | |||
serves the role of the rendezvous protocol, carrying the ICE candidate | then SIP serves the role of the rendezvous protocol, carrying the ICE | |||
information inside the body of SIP messages <xref | candidate information inside the body of SIP messages <xref | |||
target="I-D.ietf-mmusic-ice-sip-sdp"></xref>. If TURN and ICE are used | target="I-D.ietf-mmusic-ice-sip-sdp" format="default"/>. If TURN and ICE a | |||
with some other rendezvous protocol, then ICE provides guidance on the | re used with some | |||
services the rendezvous protocol must perform.</t> | other rendezvous protocol, then ICE provides guidance on the services | |||
the rendezvous protocol must perform.</t> | ||||
<t>Though the use of a TURN server to enable communication between two | <t>Though the use of a TURN server to enable communication between two | |||
hosts behind NATs is very likely to work, it comes at a high cost to the | hosts behind NATs is very likely to work, it comes at a high cost to the | |||
provider of the TURN server, since the server typically needs a | provider of the TURN server since the server typically needs a | |||
high-bandwidth connection to the Internet. As a consequence, it is best | high-bandwidth connection to the Internet. As a consequence, it is best | |||
to use a TURN server only when a direct communication path cannot be | to use a TURN server only when a direct communication path cannot be | |||
found. When the client and a peer use ICE to determine the communication | found. When the client and a peer use ICE to determine the communication | |||
path, ICE will use hole punching techniques to search for a direct path | path, ICE will use hole punching techniques to search for a direct path | |||
first and only use a TURN server when a direct path cannot be found.</t> | first and only use a TURN server when a direct path cannot be found.</t> | |||
<t>TURN was originally invented to support multimedia sessions signaled | <t>TURN was originally invented to support multimedia sessions signaled | |||
using SIP. Since SIP supports forking, TURN supports multiple peers per | using SIP. Since SIP supports forking, TURN supports multiple peers per | |||
relayed transport address; a feature not supported by other approaches | relayed transport address; a feature not supported by other approaches | |||
(e.g., SOCKS <xref target="RFC1928"></xref>). However, care has been | (e.g., SOCKS <xref target="RFC1928" format="default"/>). However, care has been | |||
taken to make sure that TURN is suitable for other types of | taken to make sure that TURN is suitable for other types of | |||
applications.</t> | applications.</t> | |||
<t>TURN was designed as one piece in the larger ICE approach to NAT | <t>TURN was designed as one piece in the larger ICE approach to NAT | |||
traversal. Implementors of TURN are urged to investigate ICE and | traversal. Implementors of TURN are urged to investigate ICE and | |||
seriously consider using it for their application. However, it is | seriously consider using it for their application. However, it is | |||
possible to use TURN without ICE.</t> | possible to use TURN without ICE.</t> | |||
<t>TURN is an extension to the Session Traversal Utilities for NAT | ||||
<t>TURN is an extension to the STUN (Session Traversal Utilities for | (STUN) protocol <xref target="RFC8489" format="default"/>. Most, though | |||
NAT) protocol <xref target="I-D.ietf-tram-stunbis"></xref>. Most, though | ||||
not all, TURN messages are STUN-formatted messages. A reader of this | not all, TURN messages are STUN-formatted messages. A reader of this | |||
document should be familiar with STUN.</t> | document should be familiar with STUN.</t> | |||
<t>The TURN specification was originally published as <xref target="RFC576 | ||||
<t>The TURN specification was originally published as <xref | 6" format="default"/>, which was updated by <xref target="RFC6156" format="defau | |||
target="RFC5766"></xref>, which was updated by <xref | lt"/> to add IPv6 support. This document supersedes | |||
target="RFC6156"></xref> to add IPv6 support. This document supersedes | and obsoletes both <xref target="RFC5766" format="default"/> and <xref tar | |||
and obsoletes both <xref target="RFC5766"></xref> and <xref | get="RFC6156" format="default"/>.</t> | |||
target="RFC6156"></xref>.</t> | ||||
</section> | </section> | |||
<section numbered="true" toc="default"> | ||||
<name>Terminology</name> | ||||
<section title="Terminology"> | <t> | |||
<t>The key words "MUST", "MUST NOT", "REQUIRED", "SHALL", "SHALL NOT", | The key words "<bcp14>MUST</bcp14>", "<bcp14>MUST NOT</bcp14>", "<bcp14>REQU | |||
"SHOULD", "SHOULD NOT", "RECOMMENDED", "NOT RECOMMENDED", "MAY", and | IRED</bcp14>", "<bcp14>SHALL</bcp14>", "<bcp14>SHALL | |||
"OPTIONAL" in this document are to be interpreted as described in BCP 14 | NOT</bcp14>", "<bcp14>SHOULD</bcp14>", "<bcp14>SHOULD NOT</bcp14>", "<bcp14> | |||
<xref target="RFC2119"></xref><xref target="RFC8174"></xref> when, and | RECOMMENDED</bcp14>", "<bcp14>NOT RECOMMENDED</bcp14>", | |||
only when, they appear in all capitals, as shown here.</t> | "<bcp14>MAY</bcp14>", and "<bcp14>OPTIONAL</bcp14>" in this document are to | |||
be interpreted as | ||||
<t>Readers are expected to be familiar with <xref | described in BCP 14 <xref target="RFC2119"/> <xref target="RFC8174"/> | |||
target="I-D.ietf-tram-stunbis"></xref> and the terms defined there.</t> | when, and only when, they appear in all capitals, as shown here. | |||
</t> | ||||
<t>Readers are expected to be familiar with <xref target="RFC8489" format= "default"/> and the terms defined there.</t> | ||||
<t>The following terms are used in this document:</t> | <t>The following terms are used in this document:</t> | |||
<dl newline="true" spacing="normal"> | ||||
<t><list style="hanging"> | <dt>TURN:</dt> | |||
<t hangText="TURN:">The protocol spoken between a TURN client and a | <dd>The protocol spoken between a TURN client and a | |||
TURN server. It is an extension to the STUN protocol <xref | TURN server. It is an extension to the STUN protocol <xref target="RFC | |||
target="I-D.ietf-tram-stunbis"></xref>. The protocol allows a client | 8489" format="default"/>. The protocol allows a client | |||
to allocate and use a relayed transport address.</t> | to allocate and use a relayed transport address.</dd> | |||
<dt>TURN client:</dt> | ||||
<t hangText="TURN client:">A STUN client that implements this | <dd>A STUN client that implements this | |||
specification.</t> | specification.</dd> | |||
<dt>TURN server:</dt> | ||||
<t hangText="TURN server:">A STUN server that implements this | <dd>A STUN server that implements this | |||
specification. It relays data between a TURN client and its | specification. It relays data between a TURN client and its | |||
peer(s).</t> | peer(s).</dd> | |||
<dt>Peer:</dt> | ||||
<t hangText="Peer:">A host with which the TURN client wishes to | <dd>A host with which the TURN client wishes to | |||
communicate. The TURN server relays traffic between the TURN client | communicate. The TURN server relays traffic between the TURN client | |||
and its peer(s). The peer does not interact with the TURN server | and its peer(s). The peer does not interact with the TURN server | |||
using the protocol defined in this document; rather, the peer | using the protocol defined in this document; rather, the peer | |||
receives data sent by the TURN server and the peer sends data | receives data sent by the TURN server, and the peer sends data | |||
towards the TURN server.</t> | towards the TURN server.</dd> | |||
<dt>Transport Address:</dt> | ||||
<t hangText="Transport Address:">The combination of an IP address | <dd>The combination of an IP address | |||
and a port.</t> | and a port.</dd> | |||
<dt>Host Transport Address:</dt> | ||||
<t hangText="Host Transport Address:">A transport address on a | <dd>A transport address on a | |||
client or a peer.</t> | client or a peer.</dd> | |||
<dt>Server-Reflexive Transport Address:</dt> | ||||
<t hangText="Server-Reflexive Transport Address:">A transport | <dd>A transport | |||
address on the "external side" of a NAT. This address is allocated | address on the "external side" of a NAT. This address is allocated | |||
by the NAT to correspond to a specific host transport address.</t> | by the NAT to correspond to a specific host transport address.</dd> | |||
<dt>Relayed Transport Address:</dt> | ||||
<t hangText="Relayed Transport Address:">A transport address on the | <dd>A transport address on the | |||
TURN server that is used for relaying packets between the client and | TURN server that is used for relaying packets between the client and | |||
a peer. A peer sends to this address on the TURN server, and the | a peer. A peer sends to this address on the TURN server, and the | |||
packet is then relayed to the client.</t> | packet is then relayed to the client.</dd> | |||
<dt>TURN Server Transport Address:</dt> | ||||
<t hangText="TURN Server Transport Address:">A transport address on | <dd>A transport address on | |||
the TURN server that is used for sending TURN messages to the | the TURN server that is used for sending TURN messages to the | |||
server. This is the transport address that the client uses to | server. This is the transport address that the client uses to | |||
communicate with the server.</t> | communicate with the server.</dd> | |||
<dt>Peer Transport Address:</dt> | ||||
<t hangText="Peer Transport Address:">The transport address of the | <dd>The transport address of the | |||
peer as seen by the server. When the peer is behind a NAT, this is | peer as seen by the server. When the peer is behind a NAT, this is | |||
the peer's server-reflexive transport address.</t> | the peer's server-reflexive transport address.</dd> | |||
<dt>Allocation:</dt> | ||||
<t hangText="Allocation:">The relayed transport address granted to a | <dd>The relayed transport address granted to a | |||
client through an Allocate request, along with related state, such | client through an Allocate request, along with related state, such | |||
as permissions and expiration timers.</t> | as permissions and expiration timers.</dd> | |||
<dt>5-tuple:</dt> | ||||
<t hangText="5-tuple:">The combination (client IP address and port, | ||||
server IP address and port, and transport protocol (currently one of | ||||
UDP, TCP, DTLS/UDP or TLS/TCP) used to communicate between the | ||||
client and the server. The 5-tuple uniquely identifies this | ||||
communication stream. The 5-tuple also uniquely identifies the | ||||
Allocation on the server.</t> | ||||
<t hangText="Transport Protocol:">The protocol above IP that carries | <dd>The combination (client IP address and port, server IP address and | |||
TURN Requests, Responses, and Indications as well as providing | port, and transport protocol (currently one of UDP, TCP, DTLS/UDP, or | |||
identifiable flows using a 5-tuple. In this specification, UDP and | TLS/TCP)) used to communicate between the client and the server. The | |||
TCP are defined as transport protocols, as well as their combination | 5-tuple uniquely identifies this communication stream. The 5-tuple | |||
with a security layer using DTLS and TLS respectively.</t> | also uniquely identifies the Allocation on the server.</dd> | |||
<dt>Transport Protocol:</dt> | ||||
<t hangText="Channel:">A channel number and associated peer | <dd>The protocol above IP that carries TURN Requests, Responses, and | |||
Indications as well as providing identifiable flows using a | ||||
5-tuple. In this specification, UDP and TCP are defined as transport | ||||
protocols; this document also describes the use of UDP and TCP in | ||||
combination with a security layer using DTLS and TLS, | ||||
respectively.</dd> | ||||
<dt>Channel:</dt> | ||||
<dd>A channel number and associated peer | ||||
transport address. Once a channel number is bound to a peer's | transport address. Once a channel number is bound to a peer's | |||
transport address, the client and server can use the more | transport address, the client and server can use the more | |||
bandwidth-efficient ChannelData message to exchange data.</t> | bandwidth-efficient ChannelData message to exchange data.</dd> | |||
<dt>Permission:</dt> | ||||
<t hangText="Permission:">The IP address and transport protocol (but | <dd>The IP address and transport protocol (but | |||
not the port) of a peer that is permitted to send traffic to the | not the port) of a peer that is permitted to send traffic to the | |||
TURN server and have that traffic relayed to the TURN client. The | TURN server and have that traffic relayed to the TURN client. The | |||
TURN server will only forward traffic to its client from peers that | TURN server will only forward traffic to its client from peers that | |||
match an existing permission.</t> | match an existing permission.</dd> | |||
<dt>Realm:</dt> | ||||
<t hangText="Realm:">A string used to describe the server or a | <dd>A string used to describe the server or a | |||
context within the server. The realm tells the client which username | context within the server. The realm tells the client which username | |||
and password combination to use to authenticate requests.</t> | and password combination to use to authenticate requests.</dd> | |||
<dt>Nonce:</dt> | ||||
<t hangText="Nonce:">A string chosen at random by the server and | <dd>A string chosen at random by the server and | |||
included in the server response. To prevent replay attacks, the | included in the server response. To prevent replay attacks, the | |||
server should change the nonce regularly.</t> | server should change the nonce regularly.</dd> | |||
<dt>(D)TLS:</dt> | ||||
<t hangText="(D)TLS:">This term is used for statements that apply to | <dd>This term is used for statements that apply to | |||
both Transport Layer Security <xref target="RFC8446"></xref> and | both Transport Layer Security <xref target="RFC8446" format="default"/ | |||
Datagram Transport Layer Security <xref | > and | |||
target="RFC6347"></xref>.</t> | Datagram Transport Layer Security <xref target="RFC6347" format="defau | |||
</list></t> | lt"/>.</dd> | |||
</dl> | ||||
</section> | </section> | |||
<section anchor="sec-overview" title="Overview of Operation"> | <section anchor="sec-overview" numbered="true" toc="default"> | |||
<name>Overview of Operation</name> | ||||
<t>This section gives an overview of the operation of TURN. It is | <t>This section gives an overview of the operation of TURN. It is | |||
non-normative.</t> | non-normative.</t> | |||
<t>In a typical configuration, a TURN client is connected to a private | ||||
<t>In a typical configuration, a TURN client is connected to a <xref | network <xref target="RFC1918" format="default"/> and, through one or more | |||
target="RFC1918">private network</xref> and through one or more NATs to | NATs, to the public Internet. On the public Internet is a TURN | |||
the public Internet. On the public Internet is a TURN server. Elsewhere | server. Elsewhere in the Internet are one or more peers with which the | |||
in the Internet are one or more peers with which the TURN client wishes | TURN client wishes to communicate. These peers may or may not be behind | |||
to communicate. These peers may or may not be behind one or more NATs. | one or more NATs. The client uses the server as a relay to send packets | |||
The client uses the server as a relay to send packets to these peers and | to these peers and to receive packets from these peers.</t> | |||
to receive packets from these peers.</t> | ||||
<figure anchor="fig-turn-model"> | <figure anchor="fig-turn-model"> | |||
<artwork><![CDATA[ Peer A | <artwork name="" type="" align="left" alt=""><![CDATA[ | |||
Server-Reflexive +---------+ | Peer A | |||
Transport Address | | | Server-Reflexive +---------+ | |||
192.0.2.150:32102 | | | Transport Address | | | |||
| /| | | 192.0.2.150:32102 | | | |||
TURN | / ^| Peer A | | | /| | | |||
Client's Server | / || | | TURN | / ^| Peer A | | |||
Host Transport Transport | // || | | Client's Server | / || | | |||
Address Address | // |+---------+ | Host Transport Transport | // || | | |||
198.51.100.2:49721 192.0.2.15:3478 |+-+ // Peer A | Address Address | // |+---------+ | |||
| | ||N| / Host Transport | 198.51.100.2:49721 192.0.2.15:3478 |+-+ // Peer A | |||
| +-+ | ||A|/ Address | | | ||N| / Host Transport | |||
| | | | v|T| 203.0.113.2:49582 | | +-+ | ||A|/ Address | |||
| | | | /+-+ | | | | | v|T| 203.0.113.2:49582 | |||
+---------+| | | |+---------+ / +---------+ | | | | | /+-+ | |||
| || |N| || | // | | | +---------+| | | |+---------+ / +---------+ | |||
| TURN |v | | v| TURN |/ | | | | || |N| || | // | | | |||
| Client |----|A|----------| Server |------------------| Peer B | | | TURN |v | | v| TURN |/ | | | |||
| | | |^ | |^ ^| | | | Client |----|A|-------| Server |------------------| Peer B | | |||
| | |T|| | || || | | | | | |^ | |^ ^| | | |||
+---------+ | || +---------+| |+---------+ | | | |T|| | || || | | |||
| || | | | +---------+ | || +---------+| |+---------+ | |||
| || | | | | || | | | |||
+-+| | | | | || | | | |||
| | | | +-+| | | | |||
| | | | | | | | |||
Client's | Peer B | | | | | |||
Server-Reflexive Relayed Transport | Client's | Peer B | |||
Transport Address Transport Address Address | Server-Reflexive Relayed Transport | |||
192.0.2.1:7000 192.0.2.15:50000 192.0.2.210:49191 | Transport Address Transport Address Address | |||
]]></artwork> | 192.0.2.1:7000 192.0.2.15:50000 192.0.2.210:49191]]></artwork> | |||
</figure> | </figure> | |||
<t></t> | <t><xref target="fig-turn-model" format="default"/> shows a typical deploy | |||
ment. In | ||||
<t><xref target="fig-turn-model"></xref> shows a typical deployment. In | ||||
this figure, the TURN client and the TURN server are separated by a NAT, | this figure, the TURN client and the TURN server are separated by a NAT, | |||
with the client on the private side and the server on the public side of | with the client on the private side and the server on the public side of | |||
the NAT. This NAT is assumed to be a “bad” NAT; for example, | the NAT. This NAT is assumed to be a "bad" NAT; for example, | |||
it might have a mapping property of "address-and-port-dependent mapping" | it might have a mapping property of "address-and-port-dependent mapping" | |||
(see <xref target="RFC4787"></xref>).</t> | (see <xref target="RFC4787" format="default"/>).</t> | |||
<t>The client talks to the server from a (IP address, port) combination | <t>The client talks to the server from a (IP address, port) combination | |||
called the client's HOST TRANSPORT ADDRESS. (The combination of an IP | called the client's "host transport address". (The combination of an IP | |||
address and port is called a TRANSPORT ADDRESS.)</t> | address and port is called a "transport address".)</t> | |||
<t>The client sends TURN messages from its host transport address to a | <t>The client sends TURN messages from its host transport address to a | |||
transport address on the TURN server that is known as the TURN SERVER | transport address on the TURN server that is known as the "TURN server | |||
TRANSPORT ADDRESS. The client learns the TURN server transport address | transport address". The client learns the TURN server transport address | |||
through some unspecified means (e.g., configuration), and this address | through some unspecified means (e.g., configuration), and this address | |||
is typically used by many clients simultaneously.</t> | is typically used by many clients simultaneously.</t> | |||
<t>Since the client is behind a NAT, the server sees packets from the | <t>Since the client is behind a NAT, the server sees packets from the | |||
client as coming from a transport address on the NAT itself. This | client as coming from a transport address on the NAT itself. This | |||
address is known as the client’s SERVER-REFLEXIVE transport | address is known as the client's "server-reflexive transport | |||
address; packets sent by the server to the client’s | address"; packets sent by the server to the client's | |||
server-reflexive transport address will be forwarded by the NAT to the | server-reflexive transport address will be forwarded by the NAT to the | |||
client’s host transport address.</t> | client's host transport address.</t> | |||
<t>The client uses TURN commands to create and manipulate an ALLOCATION | <t>The client uses TURN commands to create and manipulate an ALLOCATION | |||
on the server. An allocation is a data structure on the server. This | on the server. An allocation is a data structure on the server. This | |||
data structure contains, amongst other things, the RELAYED TRANSPORT | data structure contains, amongst other things, the relayed transport | |||
ADDRESS for the allocation. The relayed transport address is the | address for the allocation. The relayed transport address is the | |||
transport address on the server that peers can use to have the server | transport address on the server that peers can use to have the server | |||
relay data to the client. An allocation is uniquely identified by its | relay data to the client. An allocation is uniquely identified by its | |||
relayed transport address.</t> | relayed transport address.</t> | |||
<t>Once an allocation is created, the client can send application data | <t>Once an allocation is created, the client can send application data | |||
to the server along with an indication of to which peer the data is to | to the server along with an indication of to which peer the data is to | |||
be sent, and the server will relay this data to the intended peer. The | be sent, and the server will relay this data to the intended peer. The | |||
client sends the application data to the server inside a TURN message; | client sends the application data to the server inside a TURN message; | |||
at the server, the data is extracted from the TURN message and sent to | at the server, the data is extracted from the TURN message and sent to | |||
the peer in a UDP datagram. In the reverse direction, a peer can send | the peer in a UDP datagram. In the reverse direction, a peer can send | |||
application data in a UDP datagram to the relayed transport address for | application data in a UDP datagram to the relayed transport address for | |||
the allocation; the server will then encapsulate this data inside a TURN | the allocation; the server will then encapsulate this data inside a TURN | |||
message and send it to the client along with an indication of which peer | message and send it to the client along with an indication of which peer | |||
sent the data. Since the TURN message always contains an indication of | sent the data. Since the TURN message always contains an indication of | |||
skipping to change at line 422 ¶ | skipping to change at line 372 ¶ | |||
be sent, and the server will relay this data to the intended peer. The | be sent, and the server will relay this data to the intended peer. The | |||
client sends the application data to the server inside a TURN message; | client sends the application data to the server inside a TURN message; | |||
at the server, the data is extracted from the TURN message and sent to | at the server, the data is extracted from the TURN message and sent to | |||
the peer in a UDP datagram. In the reverse direction, a peer can send | the peer in a UDP datagram. In the reverse direction, a peer can send | |||
application data in a UDP datagram to the relayed transport address for | application data in a UDP datagram to the relayed transport address for | |||
the allocation; the server will then encapsulate this data inside a TURN | the allocation; the server will then encapsulate this data inside a TURN | |||
message and send it to the client along with an indication of which peer | message and send it to the client along with an indication of which peer | |||
sent the data. Since the TURN message always contains an indication of | sent the data. Since the TURN message always contains an indication of | |||
which peer the client is communicating with, the client can use a single | which peer the client is communicating with, the client can use a single | |||
allocation to communicate with multiple peers.</t> | allocation to communicate with multiple peers.</t> | |||
<t>When the peer is behind a NAT, the client must identify the peer | ||||
<t>When the peer is behind a NAT, then the client must identify the peer | ||||
using its server-reflexive transport address rather than its host | using its server-reflexive transport address rather than its host | |||
transport address. For example, to send application data to Peer A in | transport address. For example, to send application data to Peer A in | |||
the example above, the client must specify 192.0.2.150:32102 (Peer A's | the example above, the client must specify 192.0.2.150:32102 (Peer A's | |||
server-reflexive transport address) rather than 203.0.113.2:49582 (Peer | server-reflexive transport address) rather than 203.0.113.2:49582 (Peer | |||
A's host transport address).</t> | A's host transport address).</t> | |||
<t>Each allocation on the server belongs to a single client and has | <t>Each allocation on the server belongs to a single client and has | |||
either one or two relayed transport addresses that are used only by that | either one or two relayed transport addresses that are used only by that | |||
allocation. Thus, when a packet arrives at a relayed transport address | allocation. Thus, when a packet arrives at a relayed transport address | |||
on the server, the server knows for which client the data is | on the server, the server knows for which client the data is | |||
intended.</t> | intended.</t> | |||
<t>The client may have multiple allocations on a server at the same | <t>The client may have multiple allocations on a server at the same | |||
time.</t> | time.</t> | |||
<section anchor="sec-transports" numbered="true" toc="default"> | ||||
<section anchor="sec-transports" title="Transports"> | <name>Transports</name> | |||
<t>TURN, as defined in this specification, always uses UDP between the | <t>TURN, as defined in this specification, always uses UDP between the | |||
server and the peer. However, this specification allows the use of any | server and the peer. However, this specification allows the use of any | |||
one of UDP, TCP, Transport Layer Security (TLS) over TCP or Datagram | one of UDP, TCP, Transport Layer Security (TLS) over TCP, or Datagram | |||
Transport Layer Security (DTLS) over UDP to carry the TURN messages | Transport Layer Security (DTLS) over UDP to carry the TURN messages | |||
between the client and the server.</t> | between the client and the server.</t> | |||
<table align="center"> | ||||
<texttable> | <thead> | |||
<ttcol align="center">TURN client to TURN server</ttcol> | <tr> | |||
<th align="center">TURN client to TURN server</th> | ||||
<ttcol align="center">TURN server to peer</ttcol> | <th align="center">TURN server to peer</th> | |||
</tr> | ||||
<c>UDP</c> | </thead> | |||
<tbody> | ||||
<c>UDP</c> | <tr> | |||
<td align="center">UDP</td> | ||||
<c>TCP</c> | <td align="center">UDP</td> | |||
</tr> | ||||
<c>UDP</c> | <tr> | |||
<td align="center">TCP</td> | ||||
<c>TLS-over-TCP</c> | <td align="center">UDP</td> | |||
</tr> | ||||
<c>UDP</c> | <tr> | |||
<td align="center">TLS-over-TCP</td> | ||||
<c>DTLS-over-UDP</c> | <td align="center">UDP</td> | |||
</tr> | ||||
<c>UDP</c> | <tr> | |||
</texttable> | <td align="center">DTLS-over-UDP</td> | |||
<td align="center">UDP</td> | ||||
</tr> | ||||
</tbody> | ||||
</table> | ||||
<t>If TCP or TLS-over-TCP is used between the client and the server, | <t>If TCP or TLS-over-TCP is used between the client and the server, | |||
then the server will convert between these transports and UDP | then the server will convert between these transports and UDP | |||
transport when relaying data to/from the peer.</t> | transport when relaying data to/from the peer.</t> | |||
<t>Since this version of TURN only supports UDP between the server and | <t>Since this version of TURN only supports UDP between the server and | |||
the peer, it is expected that most clients will prefer to use UDP | the peer, it is expected that most clients will prefer to use UDP | |||
between the client and the server as well. That being the case, some | between the client and the server as well. That being the case, some | |||
readers may wonder: Why also support TCP and TLS-over-TCP?</t> | readers may wonder: Why also support TCP and TLS-over-TCP?</t> | |||
<t>TURN supports TCP transport between the client and the server | <t>TURN supports TCP transport between the client and the server | |||
because some firewalls are configured to block UDP entirely. These | because some firewalls are configured to block UDP entirely. These | |||
firewalls block UDP but not TCP, in part because TCP has properties | firewalls block UDP but not TCP, in part because TCP has properties | |||
that make the intention of the nodes being protected by the firewall | that make the intention of the nodes being protected by the firewall | |||
more obvious to the firewall. For example, TCP has a three-way | more obvious to the firewall. For example, TCP has a three-way | |||
handshake that makes in clearer that the protected node really wishes | handshake that makes it clearer that the protected node really wishes | |||
to have that particular connection established, while for UDP the best | to have that particular connection established, while for UDP, the best | |||
the firewall can do is guess which flows are desired by using | the firewall can do is guess which flows are desired by using | |||
filtering rules. Also, TCP has explicit connection teardown; while for | filtering rules. Also, TCP has explicit connection teardown; while for | |||
UDP, the firewall has to use timers to guess when the flow is | UDP, the firewall has to use timers to guess when the flow is | |||
finished.</t> | finished.</t> | |||
<t>TURN supports TLS-over-TCP transport and DTLS-over-UDP transport | <t>TURN supports TLS-over-TCP transport and DTLS-over-UDP transport | |||
between the client and the server because (D)TLS provides additional | between the client and the server because (D)TLS provides additional | |||
security properties not provided by TURN's default digest | security properties not provided by TURN's default digest | |||
authentication; properties that some clients may wish to take | authentication, properties that some clients may wish to take | |||
advantage of. In particular, (D)TLS provides a way for the client to | advantage of. In particular, (D)TLS provides a way for the client to | |||
ascertain that it is talking to the correct server, and provides for | ascertain that it is talking to the correct server and provides for | |||
confidentiality of TURN control messages. If (D)TLS transport is used | confidentiality of TURN control messages. | |||
between the TURN client and the TURN server, the cipher suites, server | ||||
certificate validation and authentication of TURN server are discussed | ||||
in Section 6.2.3 of <xref | ||||
target="I-D.ietf-tram-stunbis"> </xref>. The guidance given | ||||
in <xref target="RFC7525"></xref> MUST be followed to avoid attacks on | ||||
(D)TLS. TURN does not require (D)TLS because the overhead of using | ||||
(D)TLS is higher than that of digest authentication; for example, | ||||
using (D)TLS likely means that most application data will be doubly | ||||
encrypted (once by (D)TLS and once to ensure it is still encrypted in | ||||
the UDP datagram).</t> | ||||
<t>There is an extension to TURN for TCP transport between the server | If (D)TLS transport is used between the TURN client and the TURN server, refer | |||
and the peers <xref target="RFC6062"></xref>. For this reason, | to <xref target="RFC8489" sectionFormat="of" section="6.2.3"/> for more | |||
allocations that use UDP between the server and the peers are known as | information about cipher suites, server certificate validation, and | |||
UDP allocations, while allocations that use TCP between the server and | authentication of TURN servers. | |||
the peers are known as TCP allocations. This specification describes | ||||
only UDP allocations.</t> | ||||
The guidance given in <xref target="RFC7525" format="default"/> | ||||
<bcp14>MUST</bcp14> be followed to avoid attacks on (D)TLS. TURN does not | ||||
require (D)TLS because the overhead of using (D)TLS is higher than that of | ||||
digest authentication; for example, using (D)TLS likely means that most | ||||
application data will be doubly encrypted (once by (D)TLS and once to ensure | ||||
it is still encrypted in the UDP datagram).</t> | ||||
<t>There is an extension to TURN for TCP transport between the server | ||||
and the peers <xref target="RFC6062" format="default"/>. For this | ||||
reason, allocations that use UDP between the server and the peers are | ||||
known as "UDP allocations", while allocations that use TCP between the | ||||
server and the peers are known as "TCP allocations". This specification | ||||
describes only UDP allocations.</t> | ||||
<t>In some applications for TURN, the client may send and receive | <t>In some applications for TURN, the client may send and receive | |||
packets other than TURN packets on the host transport address it uses | packets other than TURN packets on the host transport address it uses | |||
to communicate with the server. This can happen, for example, when | to communicate with the server. This can happen, for example, when | |||
using TURN with ICE. In these cases, the client can distinguish TURN | using TURN with ICE. In these cases, the client can distinguish TURN | |||
packets from other packets by examining the source address of the | packets from other packets by examining the source address of the | |||
arriving packet: those arriving from the TURN server will be TURN | arriving packet; those arriving from the TURN server will be TURN | |||
packets. The algorithm of demultiplexing packets received from | packets. The algorithm of demultiplexing packets received from | |||
multiple protocols on the host transport address is discussed in <xref | multiple protocols on the host transport address is discussed in <xref t | |||
target="RFC7983"></xref>.</t> | arget="RFC7983" format="default"/>.</t> | |||
</section> | </section> | |||
<section numbered="true" toc="default"> | ||||
<section title="Allocations"> | <name>Allocations</name> | |||
<t>To create an allocation on the server, the client uses an Allocate | <t>To create an allocation on the server, the client uses an Allocate | |||
transaction. The client sends an Allocate request to the server, and | transaction. The client sends an Allocate request to the server, and | |||
the server replies with an Allocate success response containing the | the server replies with an Allocate success response containing the | |||
allocated relayed transport address. The client can include attributes | allocated relayed transport address. The client can include attributes | |||
in the Allocate request that describe the type of allocation it | in the Allocate request that describe the type of allocation it | |||
desires (e.g., the lifetime of the allocation). Since relaying data | desires (e.g., the lifetime of the allocation). Since relaying data | |||
has security implications, the server requires that the client | has security implications, the server requires that the client | |||
authenticate itself, typically using STUN’s long-term credential | authenticate itself, typically using STUN's long-term credential | |||
mechanism or the STUN Extension for Third-Party Authorization <xref | mechanism or the STUN Extension for Third-Party Authorization <xref targ | |||
target="RFC7635"></xref>, to show that it is authorized to use the | et="RFC7635" format="default"/>, to show that it is authorized to use the | |||
server.</t> | server.</t> | |||
<t>Once a relayed transport address is allocated, a client must keep | <t>Once a relayed transport address is allocated, a client must keep | |||
the allocation alive. To do this, the client periodically sends a | the allocation alive. To do this, the client periodically sends a | |||
Refresh request to the server. TURN deliberately uses a different | Refresh request to the server. TURN deliberately uses a different | |||
method (Refresh rather than Allocate) for refreshes to ensure that the | method (Refresh rather than Allocate) for refreshes to ensure that the | |||
client is informed if the allocation vanishes for some reason.</t> | client is informed if the allocation vanishes for some reason.</t> | |||
<t>The frequency of the Refresh transaction is determined by the | <t>The frequency of the Refresh transaction is determined by the | |||
lifetime of the allocation. The default lifetime of an allocation is | lifetime of the allocation. The default lifetime of an allocation is | |||
10 minutes -- this value was chosen to be long enough so that | 10 minutes; this value was chosen to be long enough so that | |||
refreshing is not typically a burden on the client, while expiring | refreshing is not typically a burden on the client while expiring | |||
allocations where the client has unexpectedly quit in a timely manner. | allocations where the client has unexpectedly quit in a timely manner. | |||
However, the client can request a longer lifetime in the Allocate | However, the client can request a longer lifetime in the Allocate | |||
request and may modify its request in a Refresh request, and the | request and may modify its request in a Refresh request, and the | |||
server always indicates the actual lifetime in the response. The | server always indicates the actual lifetime in the response. The | |||
client must issue a new Refresh transaction within "lifetime" seconds | client must issue a new Refresh transaction within "lifetime" seconds | |||
of the previous Allocate or Refresh transaction. Once a client no | of the previous Allocate or Refresh transaction. Once a client no | |||
longer wishes to use an allocation, it should delete the allocation | longer wishes to use an allocation, it should delete the allocation | |||
using a Refresh request with a requested lifetime of 0.</t> | using a Refresh request with a requested lifetime of zero.</t> | |||
<t>Both the server and client keep track of a value known as the | <t>Both the server and client keep track of a value known as the | |||
5-TUPLE. At the client, the 5-tuple consists of the client's host | "5-tuple". At the client, the 5-tuple consists of the client's host | |||
transport address, the server transport address, and the transport | transport address, the server transport address, and the transport | |||
protocol used by the client to communicate with the server. At the | protocol used by the client to communicate with the server. At the | |||
server, the 5-tuple value is the same except that the client's host | server, the 5-tuple value is the same except that the client's host | |||
transport address is replaced by the client's server-reflexive | transport address is replaced by the client's server-reflexive | |||
address, since that is the client's address as seen by the server.</t> | address since that is the client's address as seen by the server.</t> | |||
<t>Both the client and the server remember the 5-tuple used in the | <t>Both the client and the server remember the 5-tuple used in the | |||
Allocate request. Subsequent messages between the client and the | Allocate request. Subsequent messages between the client and the | |||
server use the same 5-tuple. In this way, the client and server know | server use the same 5-tuple. In this way, the client and server know | |||
which allocation is being referred to. If the client wishes to | which allocation is being referred to. If the client wishes to | |||
allocate a second relayed transport address, it must create a second | allocate a second relayed transport address, it must create a second | |||
allocation using a different 5-tuple (e.g., by using a different | allocation using a different 5-tuple (e.g., by using a different | |||
client host address or port).</t> | client host address or port).</t> | |||
<aside> | ||||
<t><list> | <t>NOTE: While the terminology used in this document refers to | |||
<t>NOTE: While the terminology used in this document refers to | ||||
5-tuples, the TURN server can store whatever identifier it likes | 5-tuples, the TURN server can store whatever identifier it likes | |||
that yields identical results. Specifically, an implementation may | that yields identical results. Specifically, an implementation may | |||
use a file-descriptor in place of a 5-tuple to represent a TCP | use a file descriptor in place of a 5-tuple to represent a TCP | |||
connection.</t> | connection.</t> | |||
</list></t> | </aside> | |||
<figure anchor="fig-allocate"> | <figure anchor="fig-allocate"> | |||
<artwork><![CDATA[TURN TURN | <artwork name="" type="" align="left" alt=""><![CDATA[ | |||
Peer Peer | TURN TURN Peer Peer | |||
client server A B | client server A B | |||
|-- Allocate request --------------->| | | | |-- Allocate request --------------->| | | | |||
| (invalid or missing credentials) | | | | | (invalid or missing credentials) | | | | |||
| | | | | | | | | | |||
|<--------------- Allocate failure --| | | | |<--------------- Allocate failure --| | | | |||
| (401 Unauthenticated) | | | | | (401 Unauthenticated) | | | | |||
| | | | | | | | | | |||
|-- Allocate request --------------->| | | | |-- Allocate request --------------->| | | | |||
| (valid credentials) | | | | | (valid credentials) | | | | |||
| | | | | | | | | | |||
|<---------- Allocate success resp --| | | | |<---------- Allocate success resp --| | | | |||
| (192.0.2.15:50000) | | | | | (192.0.2.15:50000) | | | | |||
// // // // | // // // // | |||
| | | | | | | | | | |||
|-- Refresh request ---------------->| | | | |-- Refresh request ---------------->| | | | |||
| | | | | | | | | | |||
|<----------- Refresh success resp --| | | | |<----------- Refresh success resp --| | | | |||
| | | | | | | | | | |||
]]></artwork> | ]]></artwork> | |||
<postamble></postamble> | ||||
</figure> | </figure> | |||
<t>In <xref target="fig-allocate"></xref>, the client sends an | <t>In <xref target="fig-allocate" format="default"/>, the client sends a n | |||
Allocate request to the server with invalid or missing credentials. | Allocate request to the server with invalid or missing credentials. | |||
Since the server requires that all requests be authenticated using | Since the server requires that all requests be authenticated using | |||
STUN's long-term credential mechanism, the server rejects the request | STUN's long-term credential mechanism, the server rejects the request | |||
with a 401 (Unauthorized) error code. The client then tries again, | with a 401 (Unauthorized) error code. The client then tries again, | |||
this time including credentials. This time, the server accepts the | this time including credentials. This time, the server accepts the | |||
Allocate request and returns an Allocate success response containing | Allocate request and returns an Allocate success response containing | |||
(amongst other things) the relayed transport address assigned to the | (amongst other things) the relayed transport address assigned to the | |||
allocation. Sometime later, the client decides to refresh the | allocation. Sometime later, the client decides to refresh the | |||
allocation and thus sends a Refresh request to the server. The refresh | allocation; thus, it sends a Refresh request to the server. The refresh | |||
is accepted and the server replies with a Refresh success | is accepted and the server replies with a Refresh success | |||
response.</t> | response.</t> | |||
</section> | </section> | |||
<section anchor="sec-permission-overview" title="Permissions"> | <section anchor="sec-permission-overview" numbered="true" toc="default"> | |||
<name>Permissions</name> | ||||
<t>To ease concerns amongst enterprise IT administrators that TURN | <t>To ease concerns amongst enterprise IT administrators that TURN | |||
could be used to bypass corporate firewall security, TURN includes the | could be used to bypass corporate firewall security, TURN includes the | |||
notion of permissions. TURN permissions mimic the address-restricted | notion of permissions. TURN permissions mimic the address-restricted | |||
filtering mechanism of NATs that comply with <xref | filtering mechanism of NATs that comply with <xref target="RFC4787" form | |||
target="RFC4787"></xref>.</t> | at="default"/>.</t> | |||
<t>An allocation can have zero or more permissions. Each permission | <t>An allocation can have zero or more permissions. Each permission | |||
consists of an IP address and a lifetime. When the server receives a | consists of an IP address and a lifetime. When the server receives a | |||
UDP datagram on the allocation's relayed transport address, it first | UDP datagram on the allocation's relayed transport address, it first | |||
checks the list of permissions. If the source IP address of the | checks the list of permissions. If the source IP address of the | |||
datagram matches a permission, the application data is relayed to the | datagram matches a permission, the application data is relayed to the | |||
client, otherwise the UDP datagram is silently discarded.</t> | client; otherwise, the UDP datagram is silently discarded.</t> | |||
<t>A permission expires after 5 minutes if it is not refreshed, and | <t>A permission expires after 5 minutes if it is not refreshed, and | |||
there is no way to explicitly delete a permission. This behavior was | there is no way to explicitly delete a permission. This behavior was | |||
selected to match the behavior of a NAT that complies with <xref | selected to match the behavior of a NAT that complies with <xref target= | |||
target="RFC4787"></xref>.</t> | "RFC4787" format="default"/>.</t> | |||
<t>The client can install or refresh a permission using either a | <t>The client can install or refresh a permission using either a | |||
CreatePermission request or a ChannelBind request. Using the | CreatePermission request or a ChannelBind request. Using the | |||
CreatePermission request, multiple permissions can be installed or | CreatePermission request, multiple permissions can be installed or | |||
refreshed with a single request -- this is important for applications | refreshed with a single request; this is important for applications | |||
that use ICE. For security reasons, permissions can only be installed | that use ICE. For security reasons, permissions can only be installed | |||
or refreshed by transactions that can be authenticated; thus, Send | or refreshed by transactions that can be authenticated; thus, Send | |||
indications and ChannelData messages (which are used to send data to | indications and ChannelData messages (which are used to send data to | |||
peers) do not install or refresh any permissions.</t> | peers) do not install or refresh any permissions.</t> | |||
<t>Note that permissions are within the context of an allocation, so | <t>Note that permissions are within the context of an allocation, so | |||
adding or expiring a permission in one allocation does not affect | adding or expiring a permission in one allocation does not affect | |||
other allocations.</t> | other allocations.</t> | |||
</section> | </section> | |||
<section numbered="true" toc="default"> | ||||
<section title="Send Mechanism"> | <name>Send Mechanism</name> | |||
<t>There are two mechanisms for the client and peers to exchange | <t>There are two mechanisms for the client and peers to exchange | |||
application data using the TURN server. The first mechanism uses the | application data using the TURN server. The first mechanism uses the | |||
Send and Data methods, the second mechanism uses channels. Common to | Send and Data methods, the second mechanism uses channels. Common to | |||
both mechanisms is the ability of the client to communicate with | both mechanisms is the ability of the client to communicate with | |||
multiple peers using a single allocated relayed transport address; | multiple peers using a single allocated relayed transport address; | |||
thus, both mechanisms include a means for the client to indicate to | thus, both mechanisms include a means for the client to indicate to | |||
the server which peer should receive the data, and for the server to | the server which peer should receive the data and for the server to | |||
indicate to the client which peer sent the data.</t> | indicate to the client which peer sent the data.</t> | |||
<t>The Send mechanism uses Send and Data indications. Send indications | <t>The Send mechanism uses Send and Data indications. Send indications | |||
are used to send application data from the client to the server, while | are used to send application data from the client to the server, while | |||
Data indications are used to send application data from the server to | Data indications are used to send application data from the server to | |||
the client.</t> | the client.</t> | |||
<t>When using the Send mechanism, the client sends a Send indication | <t>When using the Send mechanism, the client sends a Send indication | |||
to the TURN server containing (a) an XOR-PEER-ADDRESS attribute | to the TURN server containing (a) an XOR-PEER-ADDRESS attribute | |||
specifying the (server-reflexive) transport address of the peer and | specifying the (server-reflexive) transport address of the peer and | |||
(b) a DATA attribute holding the application data. When the TURN | (b) a DATA attribute holding the application data. When the TURN | |||
server receives the Send indication, it extracts the application data | server receives the Send indication, it extracts the application data | |||
from the DATA attribute and sends it in a UDP datagram to the peer, | from the DATA attribute and sends it in a UDP datagram to the peer, | |||
using the allocated relay address as the source address. Note that | using the allocated relay address as the source address. Note that | |||
there is no need to specify the relayed transport address, since it is | there is no need to specify the relayed transport address since it is | |||
implied by the 5-tuple used for the Send indication.</t> | implied by the 5-tuple used for the Send indication.</t> | |||
<t>In the reverse direction, UDP datagrams arriving at the relayed | <t>In the reverse direction, UDP datagrams arriving at the relayed | |||
transport address on the TURN server are converted into Data | transport address on the TURN server are converted into Data | |||
indications and sent to the client, with the server-reflexive | indications and sent to the client, with the server-reflexive | |||
transport address of the peer included in an XOR-PEER-ADDRESS | transport address of the peer included in an XOR-PEER-ADDRESS | |||
attribute and the data itself in a DATA attribute. Since the relayed | attribute and the data itself in a DATA attribute. Since the relayed | |||
transport address uniquely identified the allocation, the server knows | transport address uniquely identified the allocation, the server knows | |||
which client should receive the data.</t> | which client should receive the data.</t> | |||
<t>Some ICMP (Internet Control Message Protocol) packets arriving at | <t>Some ICMP (Internet Control Message Protocol) packets arriving at | |||
the relayed transport address on the TURN server may be converted into | the relayed transport address on the TURN server may be converted into | |||
Data indications and sent to the client, with the transport address of | Data indications and sent to the client, with the transport address of | |||
the peer included in an XOR-PEER-ADDRESS attribute and the ICMP type | the peer included in an XOR-PEER-ADDRESS attribute and the ICMP type | |||
and code in a ICMP attribute. ICMP attribute forwarding always uses | and code in an ICMP attribute. ICMP attribute forwarding always uses | |||
Data indications containing the XOR-PEER-ADDRESS and ICMP attributes, | Data indications containing the XOR-PEER-ADDRESS and ICMP attributes, | |||
even when using the channel mechanism to forward UDP data.</t> | even when using the channel mechanism to forward UDP data.</t> | |||
<t>Send and Data indications cannot be authenticated since the | ||||
<t>Send and Data indications cannot be authenticated, since the | ||||
long-term credential mechanism of STUN does not support authenticating | long-term credential mechanism of STUN does not support authenticating | |||
indications. This is not as big an issue as it might first appear, | indications. This is not as big an issue as it might first appear | |||
since the client-to-server leg is only half of the total path to the | since the client-to-server leg is only half of the total path to the | |||
peer. Applications that want end-to-end security should encrypt the | peer. Applications that want end-to-end security should encrypt the | |||
data sent between the client and a peer.</t> | data sent between the client and a peer.</t> | |||
<t>Because Send indications are not authenticated, it is possible for | <t>Because Send indications are not authenticated, it is possible for | |||
an attacker to send bogus Send indications to the server, which will | an attacker to send bogus Send indications to the server, which will | |||
then relay these to a peer. To partly mitigate this attack, TURN | then relay these to a peer. To partly mitigate this attack, TURN | |||
requires that the client install a permission towards a peer before | requires that the client install a permission towards a peer before | |||
sending data to it using a Send indication. The technique to fully | sending data to it using a Send indication. The technique to fully | |||
mitigate the attack is discussed in <xref | mitigate the attack is discussed in <xref target="fate-data" format="def | |||
target="fate-data"></xref>.</t> | ault"/>.</t> | |||
<figure anchor="fig-send-data"> | <figure anchor="fig-send-data"> | |||
<artwork><![CDATA[TURN TURN | <artwork name="" type="" align="left" alt=""><![CDATA[ | |||
Peer Peer | TURN TURN Peer Peer | |||
client server A B | client server A B | |||
| | | | | | | | | | |||
|-- CreatePermission req (Peer A) -->| | | | |-- CreatePermission req (Peer A) ->| | | | |||
|<-- CreatePermission success resp --| | | | |<- CreatePermission success resp --| | | | |||
| | | | | | | | | | |||
|--- Send ind (Peer A)-------------->| | | | |--- Send ind (Peer A)------------->| | | | |||
| |=== data ===>| | | | |=== data ===>| | | |||
| | | | | | | | | | |||
| |<== data ====| | | | |<== data ====| | | |||
|<-------------- Data ind (Peer A) --| | | | |<------------- Data ind (Peer A) --| | | | |||
| | | | | | | | | | |||
| | | | | | | | | | |||
|--- Send ind (Peer B)-------------->| | | | |--- Send ind (Peer B)------------->| | | | |||
| | dropped | | | | | dropped | | | |||
| | | | | | | | | | |||
| |<== data ==================| | | |<== data ==================| | |||
| dropped | | | | | dropped | | | | |||
| | | | | | | | | | |||
]]></artwork> | ]]></artwork></figure> | |||
<t>In <xref target="fig-send-data" format="default"/>, the client has al | ||||
<postamble></postamble> | ready | |||
</figure> | ||||
<t>In <xref target="fig-send-data"></xref>, the client has already | ||||
created an allocation and now wishes to send data to its peers. The | created an allocation and now wishes to send data to its peers. The | |||
client first creates a permission by sending the server a | client first creates a permission by sending the server a | |||
CreatePermission request specifying Peer A's (server-reflexive) IP | CreatePermission request specifying Peer A's (server-reflexive) IP | |||
address in the XOR-PEER-ADDRESS attribute; if this was not done, the | address in the XOR-PEER-ADDRESS attribute; if this was not done, the | |||
server would not relay data between the client and the server. The | server would not relay data between the client and the server. The | |||
client then sends data to Peer A using a Send indication; at the | client then sends data to Peer A using a Send indication; at the | |||
server, the application data is extracted and forwarded in a UDP | server, the application data is extracted and forwarded in a UDP | |||
datagram to Peer A, using the relayed transport address as the source | datagram to Peer A, using the relayed transport address as the source | |||
transport address. When a UDP datagram from Peer A is received at the | transport address. When a UDP datagram from Peer A is received at the | |||
relayed transport address, the contents are placed into a Data | relayed transport address, the contents are placed into a Data | |||
indication and forwarded to the client. Later, the client attempts to | indication and forwarded to the client. Later, the client attempts to | |||
exchange data with Peer B; however, no permission has been installed | exchange data with Peer B; however, no permission has been installed | |||
for Peer B, so the Send indication from the client and the UDP | for Peer B, so the Send indication from the client and the UDP | |||
datagram from the peer are both dropped by the server.</t> | datagram from the peer are both dropped by the server.</t> | |||
</section> | </section> | |||
<section title="Channels"> | <section numbered="true" toc="default"> | |||
<t>For some applications (e.g., Voice over IP), the 36 bytes of | <name>Channels</name> | |||
<t>For some applications (e.g., Voice over IP (VoIP)), the 36 bytes of | ||||
overhead that a Send indication or Data indication adds to the | overhead that a Send indication or Data indication adds to the | |||
application data can substantially increase the bandwidth required | application data can substantially increase the bandwidth required | |||
between the client and the server. To remedy this, TURN offers a | between the client and the server. To remedy this, TURN offers a | |||
second way for the client and server to associate data with a specific | second way for the client and server to associate data with a specific | |||
peer.</t> | peer.</t> | |||
<t>This second way uses an alternate packet format known as the | <t>This second way uses an alternate packet format known as the | |||
ChannelData message. The ChannelData message does not use the STUN | "ChannelData message". The ChannelData message does not use the STUN | |||
header used by other TURN messages, but instead has a 4-byte header | header used by other TURN messages, but instead has a 4-byte header | |||
that includes a number known as a channel number. Each channel number | that includes a number known as a "channel number". Each channel number | |||
in use is bound to a specific peer and thus serves as a shorthand for | in use is bound to a specific peer; thus, it serves as a shorthand for | |||
the peer's host transport address.</t> | the peer's host transport address.</t> | |||
<t>To bind a channel to a peer, the client sends a ChannelBind request | <t>To bind a channel to a peer, the client sends a ChannelBind request | |||
to the server, and includes an unbound channel number and the | to the server and includes an unbound channel number and the | |||
transport address of the peer. Once the channel is bound, the client | transport address of the peer. Once the channel is bound, the client | |||
can use a ChannelData message to send the server data destined for the | can use a ChannelData message to send the server data destined for the | |||
peer. Similarly, the server can relay data from that peer towards the | peer. Similarly, the server can relay data from that peer towards the | |||
client using a ChannelData message.</t> | client using a ChannelData message.</t> | |||
<t>Channel bindings last for 10 minutes unless refreshed; this | ||||
<t>Channel bindings last for 10 minutes unless refreshed -- this | ||||
lifetime was chosen to be longer than the permission lifetime. Channel | lifetime was chosen to be longer than the permission lifetime. Channel | |||
bindings are refreshed by sending another ChannelBind request | bindings are refreshed by sending another ChannelBind request | |||
rebinding the channel to the peer. Like permissions (but unlike | rebinding the channel to the peer. Like permissions (but unlike | |||
allocations), there is no way to explicitly delete a channel binding; | allocations), there is no way to explicitly delete a channel binding; | |||
the client must simply wait for it to time out.</t> | the client must simply wait for it to time out.</t> | |||
<figure anchor="fig-channels"> | <figure anchor="fig-channels"> | |||
<artwork><![CDATA[TURN TURN | <artwork name="" type="" align="left" alt=""><![CDATA[ | |||
Peer Peer | TURN TURN Peer Peer | |||
client server A B | client server A B | |||
| | | | | | | | | | |||
|-- ChannelBind req ---------------->| | | | |-- ChannelBind req --------------->| | | | |||
| (Peer A to 0x4001) | | | | | (Peer A to 0x4001) | | | | |||
| | | | | | | | | | |||
|<---------- ChannelBind succ resp --| | | | |<---------- ChannelBind succ resp -| | | | |||
| | | | | | | | | | |||
|-- (0x4001) data ------------------>| | | | |-- (0x4001) data ----------------->| | | | |||
| |=== data ===>| | | | |=== data ===>| | | |||
| | | | | | | | | | |||
| |<== data ====| | | | |<== data ====| | | |||
|<------------------ (0x4001) data --| | | | |<------------------ (0x4001) data -| | | | |||
| | | | | | | | | | |||
|--- Send ind (Peer A)-------------->| | | | |--- Send ind (Peer A)------------->| | | | |||
| |=== data ===>| | | | |=== data ===>| | | |||
| | | | | | | | | | |||
| |<== data ====| | | | |<== data ====| | | |||
|<------------------ (0x4001) data --| | | | |<------------------ (0x4001) data -| | | | |||
| | | | | | | | | | |||
]]></artwork> | ]]></artwork> | |||
</figure> | </figure> | |||
<t><xref target="fig-channels" format="default"/> shows the channel mech | ||||
<t><xref target="fig-channels"></xref> shows the channel mechanism in | anism in | |||
use. The client has already created an allocation and now wishes to | use. The client has already created an allocation and now wishes to | |||
bind a channel to Peer A. To do this, the client sends a ChannelBind | bind a channel to Peer A. To do this, the client sends a ChannelBind | |||
request to the server, specifying the transport address of Peer A and | request to the server, specifying the transport address of Peer A and | |||
a channel number (0x4001). After that, the client can send application | a channel number (0x4001). After that, the client can send application | |||
data encapsulated inside ChannelData messages to Peer A: this is shown | data encapsulated inside ChannelData messages to Peer A: this is shown | |||
as "(0x4001) data" where 0x4001 is the channel number. When the | as "(0x4001) data" where 0x4001 is the channel number. When the | |||
ChannelData message arrives at the server, the server transfers the | ChannelData message arrives at the server, the server transfers the | |||
data to a UDP datagram and sends it to Peer A (which is the peer bound | data to a UDP datagram and sends it to Peer A (which is the peer bound | |||
to channel number 0x4001).</t> | to channel number 0x4001).</t> | |||
<t>In the reverse direction, when Peer A sends a UDP datagram to the | <t>In the reverse direction, when Peer A sends a UDP datagram to the | |||
relayed transport address, this UDP datagram arrives at the server on | relayed transport address, this UDP datagram arrives at the server on | |||
the relayed transport address assigned to the allocation. Since the | the relayed transport address assigned to the allocation. Since the | |||
UDP datagram was received from Peer A, which has a channel number | UDP datagram was received from Peer A, which has a channel number | |||
assigned to it, the server encapsulates the data into a ChannelData | assigned to it, the server encapsulates the data into a ChannelData | |||
message when sending the data to the client.</t> | message when sending the data to the client.</t> | |||
<t>Once a channel has been bound, the client is free to intermix | <t>Once a channel has been bound, the client is free to intermix | |||
ChannelData messages and Send indications. In the figure, the client | ChannelData messages and Send indications. In the figure, the client | |||
later decides to use a Send indication rather than a ChannelData | later decides to use a Send indication rather than a ChannelData | |||
message to send additional data to Peer A. The client might decide to | message to send additional data to Peer A. The client might decide to | |||
do this, for example, so it can use the DONT-FRAGMENT attribute (see | do this, for example, so it can use the DONT-FRAGMENT attribute (see | |||
the next section). However, once a channel is bound, the server will | the next section). However, once a channel is bound, the server will | |||
always use a ChannelData message, as shown in the call flow.</t> | always use a ChannelData message, as shown in the call flow.</t> | |||
<t>Note that ChannelData messages can only be used for peers to which | <t>Note that ChannelData messages can only be used for peers to which | |||
the client has bound a channel. In the example above, Peer A has been | the client has bound a channel. In the example above, Peer A has been | |||
bound to a channel, but Peer B has not, so application data to and | bound to a channel, but Peer B has not, so application data to and | |||
from Peer B would use the Send mechanism.</t> | from Peer B would use the Send mechanism.</t> | |||
</section> | </section> | |||
<section anchor="unpriv" numbered="true" toc="default"> | ||||
<section anchor="unpriv" title="Unprivileged TURN Servers"> | <name>Unprivileged TURN Servers</name> | |||
<t>This version of TURN is designed so that the server can be | <t>This version of TURN is designed so that the server can be | |||
implemented as an application that runs in user space under commonly | implemented as an application that runs in user space under commonly | |||
available operating systems without requiring special privileges. This | available operating systems without requiring special privileges. This | |||
design decision was made to make it easy to deploy a TURN server: for | design decision was made to make it easy to deploy a TURN server: for | |||
example, to allow a TURN server to be integrated into a peer-to-peer | example, to allow a TURN server to be integrated into a peer-to-peer | |||
application so that one peer can offer NAT traversal services to | application so that one peer can offer NAT traversal services to | |||
another peer and to use (D)TLS to secure the TURN connection.</t> | another peer and to use (D)TLS to secure the TURN connection.</t> | |||
<t>This design decision has the following implications for data | <t>This design decision has the following implications for data | |||
relayed by a TURN server:<list style="symbols"> | relayed by a TURN server:</t> | |||
<t>The value of the Diffserv field may not be preserved across the | <ul spacing="normal"> | |||
server;</t> | <li>The value of the Diffserv field may not be preserved across the | |||
server;</li> | ||||
<t>The Time to Live (TTL) field may be reset, rather than | <li>The Time to Live (TTL) field may be reset, rather than | |||
decremented, across the server;</t> | decremented, across the server;</li> | |||
<li>The Explicit Congestion Notification (ECN) field may be reset | ||||
<t>The Explicit Congestion Notification (ECN) field may be reset | by the server;</li> | |||
by the server;</t> | <li>There is no end-to-end fragmentation since the packet is | |||
reassembled at the server.</li> | ||||
<t>There is no end-to-end fragmentation, since the packet is | </ul> | |||
re-assembled at the server.</t> | <t>Future work may specify alternate TURN semantics that address | |||
</list>Future work may specify alternate TURN semantics that address | ||||
these limitations.</t> | these limitations.</t> | |||
</section> | </section> | |||
<section title="Avoiding IP Fragmentation"> | <section numbered="true" toc="default"> | |||
<t>For reasons described in <xref target="Frag-Harmful"></xref>, | <name>Avoiding IP Fragmentation</name> | |||
applications, especially those sending large volumes of data, should | <t>For reasons described in <xref target="FRAG-HARMFUL" | |||
avoid having their packets fragmented. <xref | format="default"/>, applications, especially those sending large | |||
target="I-D.ietf-intarea-frag-fragile"></xref> discusses issues | volumes of data, should avoid having their packets fragmented. <xref | |||
associated with IP fragmentation and proposes alternatives to IP | target="I-D.ietf-intarea-frag-fragile" format="default"/> discusses issu | |||
fragmentation. Applications using TCP can more or less ignore this | es associated | |||
with IP fragmentation and proposes alternatives to IP | ||||
fragmentation. | ||||
Applications using TCP can, more or less, ignore this | ||||
issue because fragmentation avoidance is now a standard part of TCP, | issue because fragmentation avoidance is now a standard part of TCP, | |||
but applications using UDP (and thus any application using this | but applications using UDP (and, thus, any application using this | |||
version of TURN) need to avoid IP fragmentation by sending | version of TURN) need to avoid IP fragmentation by sending | |||
sufficiently small messages or use UDP fragmentation <xref | sufficiently small messages or by using UDP fragmentation <xref | |||
target="I-D.ietf-tsvwg-udp-options"></xref>. Note that the UDP | target="I-D.ietf-tsvwg-udp-options" format="default"/>. Note that the UD | |||
P | ||||
fragmentation option needs to be supported by both endpoints, and at | fragmentation option needs to be supported by both endpoints, and at | |||
the time of writing of this document, UDP fragmentation support is | the time of writing of this document, UDP fragmentation support is | |||
under discussion and is not deployed.</t> | under discussion and is not deployed.</t> | |||
<t>The application running on the client and the peer can take one of | <t>The application running on the client and the peer can take one of | |||
two approaches to avoid IP fragmentation until UDP fragmentation | two approaches to avoid IP fragmentation until UDP fragmentation | |||
support is available. The first uses messages that are limited to a | support is available. The first uses messages that are limited to a | |||
predetermined fixed maximum and the second relies on network feedback | predetermined fixed maximum, and the second relies on network feedback | |||
to adapt that maximum.</t> | to adapt that maximum.</t> | |||
<t>The first approach is to avoid sending large amounts of application | <t>The first approach is to avoid sending large amounts of application | |||
data in the TURN messages/UDP datagrams exchanged between the client | data in the TURN messages/UDP datagrams exchanged between the client | |||
and the peer. This is the approach taken by most VoIP (Voice-over-IP) | and the peer. This is the approach taken by most VoIP | |||
applications. In this approach, the application MUST assume a PMTU of | applications. In this approach, the application <bcp14>MUST</bcp14> | |||
1280 bytes, as IPv6 requires that every link in the Internet have an | assume a Path MTU (PMTU) of 1280 bytes because IPv6 requires that every | |||
MTU of 1280 octets or greater as specified in <xref | link in the Internet has an MTU of 1280 octets or greater as | |||
target="RFC8200"></xref>. If IPv4 support on legacy or otherwise | specified in <xref target="RFC8200" format="default"/>. If IPv4 | |||
unusual networks is a consideration, the application MAY assume an | support on legacy or otherwise unusual networks is a consideration, | |||
effective MTU of 576 bytes for IPv4 datagrams, as every IPv4 host must | the application <bcp14>MAY</bcp14> assume an effective MTU of 576 | |||
be capable of receiving a packet whose length is equal to 576 bytes as | bytes for IPv4 datagrams, as every IPv4 host must be capable of | |||
discussed in <xref target="RFC0791"></xref> and <xref | receiving a packet with a length equal to 576 bytes as discussed in | |||
target="RFC1122"></xref>.</t> | <xref target="RFC0791" format="default"/> and <xref target="RFC1122" | |||
format="default"/>.</t> | ||||
<t>The exact amount of application data that can be included while | <t>The exact amount of application data that can be included while | |||
avoiding fragmentation depends on the details of the TURN session | avoiding fragmentation depends on the details of the TURN session | |||
between the client and the server: whether UDP, TCP, or (D)TLS | between the client and the server: whether UDP, TCP, or (D)TLS | |||
transport is used, whether ChannelData messages or Send/Data | transport is used; whether ChannelData messages or Send/Data | |||
indications are used, and whether any additional attributes (such as | indications are used; and whether any additional attributes (such as | |||
the DONT-FRAGMENT attribute) are included. Another factor, which is | the DONT-FRAGMENT attribute) are included. Another factor, which is | |||
hard to determine, is whether the MTU is reduced somewhere along the | hard to determine, is whether the MTU is reduced somewhere along the | |||
path for other reasons, such as the use of IP-in-IP tunneling.</t> | path for other reasons, such as the use of IP-in-IP tunneling.</t> | |||
<t>As a guideline, sending a maximum of 500 bytes of application data | <t>As a guideline, sending a maximum of 500 bytes of application data | |||
in a single TURN message (by the client on the client-to-server leg) | in a single TURN message (by the client on the client-to-server leg) | |||
or a UDP datagram (by the peer on the peer-to-server leg) will | or a UDP datagram (by the peer on the peer-to-server leg) will | |||
generally avoid IP fragmentation. To further reduce the chance of | generally avoid IP fragmentation. To further reduce the chance of | |||
fragmentation, it is recommended that the client use ChannelData | fragmentation, it is recommended that the client use ChannelData | |||
messages when transferring significant volumes of data, since the | messages when transferring significant volumes of data since the | |||
overhead of the ChannelData message is less than Send and Data | overhead of the ChannelData message is less than Send and Data | |||
indications.</t> | indications.</t> | |||
<t>The second approach the client and peer can take to avoid | <t>The second approach the client and peer can take to avoid | |||
fragmentation is to use a path MTU discovery algorithm to determine | fragmentation is to use a path MTU discovery algorithm to determine | |||
the maximum amount of application data that can be sent without | the maximum amount of application data that can be sent without | |||
fragmentation. The classic path MTU discovery algorithm defined in | fragmentation. The classic path MTU discovery algorithm defined in | |||
<xref target="RFC1191"></xref> may not be able to discover the MTU of | <xref target="RFC1191" format="default"/> may not be able to discover th e MTU of | |||
the transmission path between the client and the peer since:</t> | the transmission path between the client and the peer since:</t> | |||
<ul empty="false" spacing="normal"> | ||||
<t><list> | <li>A probe packet with a Don't Fragment (DF) bit in the IPv4 header s | |||
<t>- a probe packet with DF bit in the IPv4 header set to test a | et to test a | |||
path for a larger MTU can be dropped by routers, or</t> | path for a larger MTU can be dropped by routers, or</li> | |||
<li>ICMP error messages can be dropped by middleboxes.</li> | ||||
<t>- ICMP error messages can be dropped by middle boxes.</t> | </ul> | |||
</list></t> | ||||
<t>As a result, the client and server need to use a path MTU discovery | <t>As a result, the client and server need to use a path MTU discovery | |||
algorithm that does not require ICMP messages. The Packetized Path MTU | algorithm that does not require ICMP messages. The Packetized Path MTU | |||
Discovery algorithm defined in <xref target="RFC4821"></xref> is one | Discovery algorithm defined in <xref target="RFC4821" format="default"/> | |||
such algorithm.</t> | is one | |||
such algorithm, and a set of algorithms is defined in <xref target="I-D. | ||||
<t><xref target="I-D.ietf-tram-stun-pmtud"></xref> is an | ietf-tsvwg-datagram-plpmtud" format="default"/>. </t> | |||
implementation of <xref target="RFC4821"></xref> that uses STUN to | <t><xref target="I-D.ietf-tram-stun-pmtud" format="default"/> is an | |||
discover the path MTU, and so might be a suitable approach to be used | implementation of <xref target="RFC4821" format="default"/> that uses ST | |||
UN to | ||||
discover the path MTU; so it might be a suitable approach to be used | ||||
in conjunction with a TURN server that supports the DONT-FRAGMENT | in conjunction with a TURN server that supports the DONT-FRAGMENT | |||
attribute. When the client includes the DONT-FRAGMENT attribute in a | attribute. When the client includes the DONT-FRAGMENT attribute in a | |||
Send indication, this tells the server to set the DF bit in the | Send indication, this tells the server to set the DF bit in the | |||
resulting UDP datagram that it sends to the peer. Since some servers | resulting UDP datagram that it sends to the peer. Since some servers | |||
may be unable to set the DF bit, the client should also include this | may be unable to set the DF bit, the client should also include this | |||
attribute in the Allocate request -- any server that does not support | attribute in the Allocate request; any server that does not support | |||
the DONT-FRAGMENT attribute will indicate this by rejecting the | the DONT-FRAGMENT attribute will indicate this by rejecting the | |||
Allocate request. If the TURN server carrying out packet translation | Allocate request. If the TURN server carrying out packet translation | |||
from IPv4-to-IPv6 is unable to access the state of Don't Fragment (DF) | from IPv4-to-IPv6 is unable to access the state of the Don't Fragment (D | |||
bit in the IPv4 header, it MUST reject the Allocate request with | F) | |||
DONT-FRAGMENT attribute.</t> | bit in the IPv4 header, it <bcp14>MUST</bcp14> reject the Allocate reque | |||
st with | ||||
the DONT-FRAGMENT attribute.</t> | ||||
</section> | </section> | |||
<section numbered="true" toc="default"> | ||||
<section title="RTP Support"> | <name>RTP Support</name> | |||
<t>One of the envisioned uses of TURN is as a relay for clients and | <t>One of the envisioned uses of TURN is as a relay for clients and | |||
peers wishing to exchange real-time data (e.g., voice or video) using | peers wishing to exchange real-time data (e.g., voice or video) using | |||
RTP. To facilitate the use of TURN for this purpose, TURN includes | RTP. To facilitate the use of TURN for this purpose, TURN includes | |||
some special support for older versions of RTP.</t> | some special support for older versions of RTP.</t> | |||
<t>Old versions of RTP <xref target="RFC3550" format="default"/> require | ||||
<t>Old versions of RTP <xref target="RFC3550"></xref> required that | d that | |||
the RTP stream be on an even port number and the associated RTP | the RTP stream be on an even port number and the associated RTP | |||
Control Protocol (RTCP) stream, if present, be on the next highest | Control Protocol (RTCP) stream, if present, be on the next highest | |||
port. To allow clients to work with peers that still require this, | port. To allow clients to work with peers that still require this, | |||
TURN allows the client to request that the server allocate a relayed | TURN allows the client to request that the server allocate a relayed | |||
transport address with an even port number, and to optionally request | transport address with an even port number and optionally request | |||
the server reserve the next-highest port number for a subsequent | the server reserve the next-highest port number for a subsequent | |||
allocation.</t> | allocation.</t> | |||
</section> | </section> | |||
<section numbered="true" toc="default"> | ||||
<section title="Happy Eyeballs for TURN"> | <name>Happy Eyeballs for TURN</name> | |||
<t>If an IPv4 path to reach a TURN server is found, but the TURN | <t>If an IPv4 path to reach a TURN server is found, but the TURN | |||
server's IPv6 path is not working, a dual-stack TURN client can | server's IPv6 path is not working, a dual-stack TURN client can | |||
experience a significant connection delay compared to an IPv4-only | experience a significant connection delay compared to an IPv4-only | |||
TURN client. To overcome these connection setup problems, the TURN | TURN client. To overcome these connection setup problems, the TURN | |||
client needs to query both A and AAAA records for the TURN server | client needs to query both A and AAAA records for the TURN server | |||
specified using a domain name and try connecting to the TURN server | specified using a domain name and try connecting to the TURN server | |||
using both IPv6 and IPv4 addresses in a fashion similar to the Happy | using both IPv6 and IPv4 addresses in a fashion similar to the Happy | |||
Eyeballs mechanism defined in <xref target="RFC8305"></xref>. The TURN | Eyeballs mechanism defined in <xref target="RFC8305" format="default"/>. The TURN | |||
client performs the following steps based on the transport protocol | client performs the following steps based on the transport protocol | |||
being used to connect to the TURN server.</t> | being used to connect to the TURN server.</t> | |||
<ul spacing="normal"> | ||||
<li>For TCP or TLS-over-TCP, the results of the Happy Eyeballs | ||||
procedure <xref target="RFC8305" format="default"/> are used by the | ||||
TURN | ||||
client for sending its TURN messages to the server.</li> | ||||
<li>For clear text UDP, send TURN Allocate requests to both IP | ||||
address families as discussed in <xref target="RFC8305" format="defa | ||||
ult"/> | ||||
without authentication information. | ||||
<t><list style="symbols"> | If the TURN server requires | |||
<t>For TCP or TLS-over-TCP, the results of the Happy Eyeballs | authentication, it will send back a 401 unauthenticated response; | |||
procedure <xref target="RFC8305"></xref> are used by the TURN | the TURN client will use the first UDP connection on which a 401 | |||
client for sending its TURN messages to the server.</t> | ||||
<t>For clear text UDP, send TURN Allocate requests to both IP | ||||
address families as discussed in <xref target="RFC8305"></xref>, | ||||
without authentication information. If the TURN server requires | ||||
authentication, it will send back a 401 unauthenticated response | ||||
and the TURN client uses the first UDP connection on which a 401 | ||||
error response is received. If a 401 error response is received | error response is received. If a 401 error response is received | |||
from both IP address families then the TURN client can silently | from both IP address families, then the TURN client can silently | |||
abandon the UDP connection on the IP address family with lower | abandon the UDP connection on the IP address family with lower | |||
precedence. If the TURN server does not require authentication (as | precedence. If the TURN server does not require authentication (as | |||
described in Section 9 of <xref target="RFC8155"></xref>), it is | described in <xref target="RFC8155" | |||
sectionFormat="of" section="9"/>), it is | ||||
possible for both Allocate requests to succeed. In this case, the | possible for both Allocate requests to succeed. In this case, the | |||
TURN client sends a Refresh with LIFETIME value of 0 on the | TURN client sends a Refresh with a LIFETIME value of zero on the | |||
allocation using the IP address family with lower precedence to | allocation using the IP address family with lower precedence to | |||
delete the allocation.</t> | delete the allocation.</li> | |||
<li>For DTLS over UDP, initiate a DTLS handshake to both IP address | ||||
<t>For DTLS over UDP, initiate DTLS handshake to both IP address | families as discussed in <xref target="RFC8305" format="default"/>, | |||
families as discussed in <xref target="RFC8305"></xref> and use | and use the first DTLS session that is established. If the DTLS | |||
the first DTLS session that is established. If the DTLS session is | session is established on both IP address families, then the client | |||
established on both IP address families then the client sends DTLS | sends a DTLS close_notify alert to terminate the DTLS session using | |||
close_notify alert to terminate the DTLS session using the IP | the IP address family with lower precedence. If the TURN over DTLS | |||
address family with lower precedence. If TURN over DTLS server has | server has been configured to require a cookie exchange (<xref | |||
been configured to require a cookie exchange (Section 4.2 in <xref | target="RFC6347" sectionFormat="of" section="4.2"/>) and | |||
target="RFC6347"></xref>) and HelloVerifyRequest is received from | a HelloVerifyRequest is received from the TURN servers on both IP | |||
the TURN servers on both IP address families then the client can | address families, then the client can silently abandon the | |||
silently abandon the connection on the IP address family with | connection on the IP address family with lower precedence.</li> | |||
lower precedence.</t> | </ul> | |||
</list></t> | ||||
</section> | </section> | |||
</section> | </section> | |||
<section title="Discovery of TURN server"> | <section numbered="true" toc="default"> | |||
<name>Discovery of TURN Server</name> | ||||
<t>Methods of TURN server discovery, including using anycast, are | <t>Methods of TURN server discovery, including using anycast, are | |||
described in <xref target="RFC8155"></xref>. If a host with multiple | described in <xref target="RFC8155" format="default"/>. If a host with | |||
interfaces discovers a TURN server in each interface, the mechanism | multiple interfaces discovers a TURN server in each interface, the | |||
described in <xref target="RFC7982"></xref> can be used by the TURN | mechanism described in <xref target="RFC7982" format="default"/> can be | |||
client to influence the TURN server selection. The syntax of the "turn" | used by the TURN client to influence the TURN server selection. The | |||
and "turns" URIs are defined in Section 3.1 of <xref | syntax of the "turn" and "turns" URIs are defined in <xref | |||
target="RFC7065"></xref>. DTLS as a transport protocol for TURN is | target="RFC7065" sectionFormat="of" section="3.1"/>. DTLS as a transport | |||
defined in <xref target="RFC7350"></xref>.</t> | protocol for TURN is defined in <xref target="RFC7350" | |||
format="default"/>.</t> | ||||
<section title="TURN URI Scheme Semantics"> | <section numbered="true" toc="default"> | |||
<name>TURN URI Scheme Semantics</name> | ||||
<t>The "turn" and "turns" URI schemes are used to designate a TURN | <t>The "turn" and "turns" URI schemes are used to designate a TURN | |||
server (also known as a relay) on Internet hosts accessible using the | server (also known as a "relay") on Internet hosts accessible using the | |||
TURN protocol. The TURN protocol supports sending messages over UDP, | TURN protocol. The TURN protocol supports sending messages over UDP, | |||
TCP, TLS-over-TCP or DTLS-over-UDP. The "turns" URI scheme MUST be | TCP, TLS-over-TCP, or DTLS-over-UDP. The "turns" URI scheme <bcp14>MUST< /bcp14> be | |||
used when TURN is run over TLS-over-TCP or in DTLS-over-UDP, and the | used when TURN is run over TLS-over-TCP or in DTLS-over-UDP, and the | |||
"turn" scheme MUST be used otherwise. The required <host> part | "turn" scheme <bcp14>MUST</bcp14> be used otherwise. The required <ho st> part | |||
of the "turn" URI denotes the TURN server host. The <port> part, | of the "turn" URI denotes the TURN server host. The <port> part, | |||
if present, denotes the port on which the TURN server is awaiting | if present, denotes the port on which the TURN server is awaiting | |||
connection requests. If it is absent, the default port is 3478 for | connection requests. If it is absent, the default port is 3478 for | |||
both UDP and TCP. The default port for TURN over TLS and TURN over | both UDP and TCP. The default port for TURN over TLS and TURN over | |||
DTLS is 5349.</t> | DTLS is 5349.</t> | |||
</section> | </section> | |||
</section> | </section> | |||
<!-- Overview --> | <section anchor="sec-general-behavior" numbered="true" toc="default"> | |||
<name>General Behavior</name> | ||||
<section anchor="sec-general-behavior" title="General Behavior"> | ||||
<t>This section contains general TURN processing rules that apply to all | <t>This section contains general TURN processing rules that apply to all | |||
TURN messages.</t> | TURN messages.</t> | |||
<t>TURN is an extension to STUN. All TURN messages, with the exception | <t>TURN is an extension to STUN. All TURN messages, with the exception | |||
of the ChannelData message, are STUN-formatted messages. All the base | of the ChannelData message, are STUN-formatted messages. All the base | |||
processing rules described in <xref | processing rules described in <xref target="RFC8489" format="default"/> ap | |||
target="I-D.ietf-tram-stunbis"></xref> apply to STUN-formatted messages. | ply to STUN-formatted messages. | |||
This means that all the message-forming and message-processing | This means that all the message-forming and message-processing | |||
descriptions in this document are implicitly prefixed with the rules of | descriptions in this document are implicitly prefixed with the rules of | |||
<xref target="I-D.ietf-tram-stunbis"></xref>.</t> | <xref target="RFC8489" format="default"/>.</t> | |||
<t><xref target="RFC8489" format="default"/> specifies an | ||||
<t><xref target="I-D.ietf-tram-stunbis"></xref> specifies an | authentication mechanism called the "long-term credential mechanism". TURN | |||
authentication mechanism called the long-term credential mechanism. TURN | servers and clients <bcp14>MUST</bcp14> implement this mechanism, and the | |||
servers and clients MUST implement this mechanism, and the | authentication options are discussed in <xref target="sec-rcv-allocate" fo | |||
authentication options are discussed in <xref | rmat="default"/>.</t> | |||
target="sec-rcv-allocate"></xref>.</t> | ||||
<t>Note that the long-term credential mechanism applies only to requests | <t>Note that the long-term credential mechanism applies only to requests | |||
and cannot be used to authenticate indications; thus, indications in | and cannot be used to authenticate indications; thus, indications in | |||
TURN are never authenticated. If the server requires requests to be | TURN are never authenticated. If the server requires requests to be | |||
authenticated, then the server's administrator MUST choose a realm value | authenticated, then the server's administrator <bcp14>MUST</bcp14> choose a realm value | |||
that will uniquely identify the username and password combination that | that will uniquely identify the username and password combination that | |||
the client must use, even if the client uses multiple servers under | the client must use, even if the client uses multiple servers under | |||
different administrations. The server's administrator MAY choose to | different administrations. The server's administrator <bcp14>MAY</bcp14> c | |||
allocate a unique username to each client, or MAY choose to allocate the | hoose to | |||
allocate a unique username to each client, or it <bcp14>MAY</bcp14> choose | ||||
to allocate the | ||||
same username to more than one client (for example, to all clients from | same username to more than one client (for example, to all clients from | |||
the same department or company). For each Allocate request, the server | the same department or company). For each Allocate request, the server | |||
SHOULD generate a new random nonce when the allocation is first | <bcp14>SHOULD</bcp14> generate a new random nonce when the allocation is f | |||
attempted following the randomness recommendations in <xref | irst | |||
target="RFC4086"></xref> and SHOULD expire the nonce at least once every | attempted following the randomness recommendations in <xref target="RFC408 | |||
6" format="default"/> and <bcp14>SHOULD</bcp14> expire the nonce at least once e | ||||
very | ||||
hour during the lifetime of the allocation. The server uses the | hour during the lifetime of the allocation. The server uses the | |||
mechanism described in section 9.2 of <xref | mechanism described in <xref target="RFC8489" | |||
target="I-D.ietf-tram-stunbis"></xref> to indicate that it supports | sectionFormat="of" section="9.2"/> to indicate that it supports | |||
<xref target="I-D.ietf-tram-stunbis"></xref>.</t> | <xref target="RFC8489" format="default"/>.</t> | |||
<t>All requests after the initial Allocate must use the same username as | <t>All requests after the initial Allocate must use the same username as | |||
that used to create the allocation, to prevent attackers from hijacking | that used to create the allocation to prevent attackers from hijacking | |||
the client's allocation. Specifically, if the server requires the use of | the client's allocation.</t> | |||
the long-term credential mechanism, and if a non-Allocate request passes | <t>Specifically, if: | |||
authentication under this mechanism, and if the 5-tuple identifies an | </t> | |||
existing allocation, but the request does not use the same username as | <ul> | |||
used to create the allocation, then the request MUST be rejected with a | <li>the server requires the use of the long-term credential mechanism, and; | |||
441 (Wrong Credentials) error.</t> | </li> | |||
<li>a non-Allocate request passes authentication under this mechanism, and; | ||||
</li> | ||||
<li>the 5-tuple identifies an existing allocation, but; | ||||
</li> | ||||
<li>the request does not use the same username as used to create the allocation, | ||||
</li> | ||||
</ul> | ||||
<t> then the request <bcp14>MUST</bcp14> be rejected with a 441 (Wrong | ||||
Credentials) error.</t> | ||||
<t>When a TURN message arrives at the server from the client, the server | <t>When a TURN message arrives at the server from the client, the server | |||
uses the 5-tuple in the message to identify the associated allocation. | uses the 5-tuple in the message to identify the associated allocation. | |||
For all TURN messages (including ChannelData) EXCEPT an Allocate | For all TURN messages (including ChannelData) EXCEPT an Allocate | |||
request, if the 5-tuple does not identify an existing allocation, then | request, if the 5-tuple does not identify an existing allocation, then | |||
the message MUST either be rejected with a 437 Allocation Mismatch error | the message <bcp14>MUST</bcp14> either be rejected with a 437 Allocation M | |||
(if it is a request) or silently ignored (if it is an indication or a | ismatch error | |||
(if it is a request) or be silently ignored (if it is an indication or a | ||||
ChannelData message). A client receiving a 437 error response to a | ChannelData message). A client receiving a 437 error response to a | |||
request other than Allocate MUST assume the allocation no longer | request other than Allocate <bcp14>MUST</bcp14> assume the allocation no l onger | |||
exists.</t> | exists.</t> | |||
<t><xref target="RFC8489" format="default"/> defines a number of | ||||
<t><xref target="I-D.ietf-tram-stunbis"></xref> defines a number of | ||||
attributes, including the SOFTWARE and FINGERPRINT attributes. The | attributes, including the SOFTWARE and FINGERPRINT attributes. The | |||
client SHOULD include the SOFTWARE attribute in all Allocate and Refresh | client <bcp14>SHOULD</bcp14> include the SOFTWARE attribute in all Allocat | |||
requests and MAY include it in any other requests or indications. The | e and Refresh | |||
server SHOULD include the SOFTWARE attribute in all Allocate and Refresh | requests and <bcp14>MAY</bcp14> include it in any other requests or indica | |||
responses (either success or failure) and MAY include it in other | tions. The | |||
responses or indications. The client and the server MAY include the | server <bcp14>SHOULD</bcp14> include the SOFTWARE attribute in all Allocat | |||
e and Refresh | ||||
responses (either success or failure) and <bcp14>MAY</bcp14> include it in | ||||
other | ||||
responses or indications. The client and the server <bcp14>MAY</bcp14> inc | ||||
lude the | ||||
FINGERPRINT attribute in any STUN-formatted messages defined in this | FINGERPRINT attribute in any STUN-formatted messages defined in this | |||
document.</t> | document.</t> | |||
<t>TURN does not use the backwards-compatibility mechanism described in | <t>TURN does not use the backwards-compatibility mechanism described in | |||
<xref target="I-D.ietf-tram-stunbis"></xref>.</t> | <xref target="RFC8489" format="default"/>.</t> | |||
<t>TURN, as defined in this specification, supports both IPv4 and IPv6. | <t>TURN, as defined in this specification, supports both IPv4 and IPv6. | |||
IPv6 support in TURN includes IPv4-to-IPv6, IPv6-to-IPv6, and | IPv6 support in TURN includes IPv4-to-IPv6, IPv6-to-IPv6, and | |||
IPv6-to-IPv4 relaying. When only a single address type is desired, the | IPv6-to-IPv4 relaying. When only a single address type is desired, the | |||
REQUESTED-ADDRESS-FAMILY attribute is used to explicitly request the | REQUESTED-ADDRESS-FAMILY attribute is used to explicitly request the | |||
address type the TURN server will allocate (e.g., an IPv4-only node may | address type the TURN server will allocate (e.g., an IPv4-only node may | |||
request the TURN server to allocate an IPv6 address). If both IPv4 and | request the TURN server to allocate an IPv6 address). If both IPv4 and | |||
IPv6 are desired, the single ADDITIONAL-ADDRESS-FAMILY attribute | IPv6 are desired, the single ADDITIONAL-ADDRESS-FAMILY attribute | |||
indicates a request to the server to allocate one IPv4 and one IPv6 | indicates a request to the server to allocate one IPv4 and one IPv6 | |||
relay address in a single Allocate request. This saves local ports on | relay address in a single Allocate request. This saves local ports on | |||
the client and reduces the number of messages sent between the client | the client and reduces the number of messages sent between the client | |||
skipping to change at line 1119 ¶ | skipping to change at line 1029 ¶ | |||
IPv6 support in TURN includes IPv4-to-IPv6, IPv6-to-IPv6, and | IPv6 support in TURN includes IPv4-to-IPv6, IPv6-to-IPv6, and | |||
IPv6-to-IPv4 relaying. When only a single address type is desired, the | IPv6-to-IPv4 relaying. When only a single address type is desired, the | |||
REQUESTED-ADDRESS-FAMILY attribute is used to explicitly request the | REQUESTED-ADDRESS-FAMILY attribute is used to explicitly request the | |||
address type the TURN server will allocate (e.g., an IPv4-only node may | address type the TURN server will allocate (e.g., an IPv4-only node may | |||
request the TURN server to allocate an IPv6 address). If both IPv4 and | request the TURN server to allocate an IPv6 address). If both IPv4 and | |||
IPv6 are desired, the single ADDITIONAL-ADDRESS-FAMILY attribute | IPv6 are desired, the single ADDITIONAL-ADDRESS-FAMILY attribute | |||
indicates a request to the server to allocate one IPv4 and one IPv6 | indicates a request to the server to allocate one IPv4 and one IPv6 | |||
relay address in a single Allocate request. This saves local ports on | relay address in a single Allocate request. This saves local ports on | |||
the client and reduces the number of messages sent between the client | the client and reduces the number of messages sent between the client | |||
and the TURN server.</t> | and the TURN server.</t> | |||
<t>By default, TURN runs on the same ports as STUN: 3478 for TURN over | <t>By default, TURN runs on the same ports as STUN: 3478 for TURN over | |||
UDP and TCP, and 5349 for TURN over (D)TLS. However, TURN has its own | UDP and TCP, and 5349 for TURN over (D)TLS. However, TURN has its own | |||
set of Service Record (SRV) names: "turn" for UDP and TCP, and "turns" | set of Service Record (SRV) names: "turn" for UDP and TCP, and "turns" | |||
for (D)TLS. Either the DNS resolution procedures or the ALTERNATE-SERVER | for (D)TLS. Either the DNS resolution procedures or the ALTERNATE-SERVER | |||
procedures, both described in <xref | procedures, both described in <xref target="sec-create-allocation" format= | |||
target="sec-create-allocation"></xref>, can be used to run TURN on a | "default"/>, can be used to run TURN on a | |||
different port.</t> | different port.</t> | |||
<t>To ensure interoperability, a TURN server <bcp14>MUST</bcp14> support t | ||||
<t>To ensure interoperability, a TURN server MUST support the use of UDP | he use of UDP | |||
transport between the client and the server, and SHOULD support the use | transport between the client and the server, and it <bcp14>SHOULD</bcp14> | |||
of TCP, TLS-over-TCP and DTLS-over-UDP transports.</t> | support the use | |||
of TCP, TLS-over-TCP, and DTLS-over-UDP transports.</t> | ||||
<t>When UDP or DTLS-over-UDP transport is used between the client and | <t>When UDP or DTLS-over-UDP transport is used between the client and | |||
the server, the client will retransmit a request if it does not receive | the server, the client will retransmit a request if it does not receive | |||
a response within a certain timeout period. Because of this, the server | a response within a certain timeout period. Because of this, the server | |||
may receive two (or more) requests with the same 5-tuple and same | may receive two (or more) requests with the same 5-tuple and same | |||
transaction id. STUN requires that the server recognize this case and | transaction id. STUN requires that the server recognize this case and | |||
treat the request as idempotent (see <xref | treat the request as idempotent (see <xref target="RFC8489" format="defaul | |||
target="I-D.ietf-tram-stunbis"></xref>). Some implementations may choose | t"/>). Some implementations may choose | |||
to meet this requirement by remembering all received requests and the | to meet this requirement by remembering all received requests and the | |||
corresponding responses for 40 seconds (Section 6.3.1 in <xref | corresponding responses for 40 seconds (<xref | |||
target="I-D.ietf-tram-stunbis"></xref>). Other implementations may | target="RFC8489" sectionFormat="of" section="6.3.1"/>). Other implementati | |||
ons may | ||||
choose to reprocess the request and arrange that such reprocessing | choose to reprocess the request and arrange that such reprocessing | |||
returns essentially the same response. To aid implementors who choose | returns essentially the same response. To aid implementors who choose | |||
the latter approach (the so-called "stateless stack approach"), this | the latter approach (the so-called "stateless stack approach"), this | |||
specification includes some implementation notes on how this might be | specification includes some implementation notes on how this might be | |||
done. Implementations are free to choose either approach or choose some | done. Implementations are free to choose either approach or some | |||
other approach that gives the same results.</t> | other approach that gives the same results.</t> | |||
<t>To mitigate either intentional or unintentional denial-of-service | <t>To mitigate either intentional or unintentional denial-of-service | |||
attacks against the server by clients with valid usernames and | attacks against the server by clients with valid usernames and | |||
passwords, it is RECOMMENDED that the server impose limits on both the | passwords, it is <bcp14>RECOMMENDED</bcp14> that the server impose limits on both the | |||
number of allocations active at one time for a given username and on the | number of allocations active at one time for a given username and on the | |||
amount of bandwidth those allocations can use. The server should reject | amount of bandwidth those allocations can use. The server should reject | |||
new allocations that would exceed the limit on the allowed number of | new allocations that would exceed the limit on the allowed number of | |||
allocations active at one time with a 486 (Allocation Quota Exceeded) | allocations active at one time with a 486 (Allocation Quota Exceeded) | |||
(see <xref target="sec-rcv-allocate"></xref>), and since UDP does not | (see <xref target="sec-rcv-allocate" format="default"/>), and since UDP do es not | |||
include a congestion control mechanism, it should discard application | include a congestion control mechanism, it should discard application | |||
data traffic that exceeds the bandwidth quota.</t> | data traffic that exceeds the bandwidth quota.</t> | |||
</section> | </section> | |||
<section anchor="sec-allocations" numbered="true" toc="default"> | ||||
<section anchor="sec-allocations" title="Allocations"> | <name>Allocations</name> | |||
<t>All TURN operations revolve around allocations, and all TURN messages | <t>All TURN operations revolve around allocations, and all TURN messages | |||
are associated with either a single or dual allocation. An allocation | are associated with either a single or dual allocation. An allocation | |||
conceptually consists of the following state data:<list style="symbols"> | conceptually consists of the following state data:</t> | |||
<t>the relayed transport address or addresses;</t> | <ul spacing="normal"> | |||
<li>the relayed transport address or addresses;</li> | ||||
<t>the 5-tuple: (client's IP address, client's port, server IP | <li>the 5-tuple: (client's IP address, client's port, server IP | |||
address, server port, transport protocol);</t> | address, server port, and transport protocol);</li> | |||
<li>the authentication information;</li> | ||||
<t>the authentication information;</t> | <li>the time-to-expiry for each relayed transport address;</li> | |||
<li>a list of permissions for each relayed transport address;</li> | ||||
<t>the time-to-expiry for each relayed transport address;</t> | <li>a list of channel-to-peer bindings for each relayed transport | |||
address.</li> | ||||
<t>a list of permissions for each relayed transport address;</t> | </ul> | |||
<t>The relayed transport address is the transport address | ||||
<t>a list of channel to peer bindings for each relayed transport | ||||
address.</t> | ||||
</list>The relayed transport address is the transport address | ||||
allocated by the server for communicating with peers, while the 5-tuple | allocated by the server for communicating with peers, while the 5-tuple | |||
describes the communication path between the client and the server. On | describes the communication path between the client and the server. On | |||
the client, the 5-tuple uses the client's host transport address; on the | the client, the 5-tuple uses the client's host transport address; on the | |||
server, the 5-tuple uses the client's server-reflexive transport | server, the 5-tuple uses the client's server-reflexive transport | |||
address. The relayed transport address MUST be unique across all | address. The relayed transport address <bcp14>MUST</bcp14> be unique acros s all | |||
allocations so it can be used to uniquely identify the allocation, and | allocations so it can be used to uniquely identify the allocation, and | |||
an allocation in this context can be either a single or dual | an allocation in this context can be either a single or dual | |||
allocation.</t> | allocation.</t> | |||
<t>The authentication information (e.g., username, password, realm, and | <t>The authentication information (e.g., username, password, realm, and | |||
nonce) is used to both verify subsequent requests and to compute the | nonce) is used to both verify subsequent requests and to compute the | |||
message integrity of responses. The username, realm, and nonce values | message integrity of responses. The username, realm, and nonce values | |||
are initially those used in the authenticated Allocate request that | are initially those used in the authenticated Allocate request that | |||
creates the allocation, though the server can change the nonce value | creates the allocation, though the server can change the nonce value | |||
during the lifetime of the allocation using a 438 (Stale Nonce) reply. | during the lifetime of the allocation using a 438 (Stale Nonce) reply. | |||
For security reasons, the server MUST NOT store the password explicitly | For security reasons, the server <bcp14>MUST NOT</bcp14> store the | |||
and MUST store the key value, which is a cryptographic hash over the | password explicitly and <bcp14>MUST</bcp14> store the key value, which | |||
username, realm, and password (see Section 16.1.3 in <xref | is a cryptographic hash over the username, realm, and password (see | |||
target="I-D.ietf-tram-stunbis"></xref>).</t> | <xref target="RFC8489" sectionFormat="of" section="16.1.3"/>).</t> | |||
<t>Note that if the response contains a PASSWORD-ALGORITHMS attribute | <t>Note that if the response contains a PASSWORD-ALGORITHMS attribute | |||
and this attribute contains both MD5 and SHA-256 algorithms, and the | and this attribute contains both MD5 and SHA-256 algorithms, and the | |||
client also supports both the algorithms, the request MUST contain a | client also supports both the algorithms, the request <bcp14>MUST</bcp14> contain a | |||
PASSWORD-ALGORITHM attribute with the SHA-256 algorithm.</t> | PASSWORD-ALGORITHM attribute with the SHA-256 algorithm.</t> | |||
<t>The time-to-expiry is the time in seconds left until the allocation | <t>The time-to-expiry is the time in seconds left until the allocation | |||
expires. Each Allocate or Refresh transaction sets this timer, which | expires. Each Allocate or Refresh transaction sets this timer, which | |||
then ticks down towards 0. By default, each Allocate or Refresh | then ticks down towards zero. By default, each Allocate or Refresh | |||
transaction resets this timer to the default lifetime value of 600 | transaction resets this timer to the default lifetime value of 600 | |||
seconds (10 minutes), but the client can request a different value in | seconds (10 minutes), but the client can request a different value in | |||
the Allocate and Refresh request. Allocations can only be refreshed | the Allocate and Refresh request. Allocations can only be refreshed | |||
using the Refresh request; sending data to a peer does not refresh an | using the Refresh request; sending data to a peer does not refresh an | |||
allocation. When an allocation expires, the state data associated with | allocation. When an allocation expires, the state data associated with | |||
the allocation can be freed.</t> | the allocation can be freed.</t> | |||
<t>The list of permissions is described in <xref target="sec-permissions" | ||||
<t>The list of permissions is described in <xref | format="default"/> and the list of channels is described | |||
target="sec-permissions"></xref> and the list of channels is described | in <xref target="sec-channels" format="default"/>.</t> | |||
in <xref target="sec-channels"></xref>.</t> | ||||
</section> | </section> | |||
<section anchor="sec-create-allocation" numbered="true" toc="default"> | ||||
<section anchor="sec-create-allocation" title="Creating an Allocation"> | <name>Creating an Allocation</name> | |||
<t>An allocation on the server is created using an Allocate | <t>An allocation on the server is created using an Allocate | |||
transaction.</t> | transaction.</t> | |||
<section anchor="sec-send-allocate" numbered="true" toc="default"> | ||||
<section anchor="sec-send-allocate" title="Sending an Allocate Request"> | <name>Sending an Allocate Request</name> | |||
<t>The client forms an Allocate request as follows.</t> | <t>The client forms an Allocate request as follows.</t> | |||
<t>The client first picks a host transport address. It is <bcp14>RECOMME | ||||
<t>The client first picks a host transport address. It is RECOMMENDED | NDED</bcp14> | |||
that the client picks a currently unused transport address, typically | that the client pick a currently unused transport address, typically | |||
by allowing the underlying OS to pick a currently unused port.</t> | by allowing the underlying OS to pick a currently unused port.</t> | |||
<t>The client then picks a transport protocol that the client supports | <t>The client then picks a transport protocol that the client supports | |||
to use between the client and the server based on the transport | to use between the client and the server based on the transport | |||
protocols supported by the server. Since this specification only | protocols supported by the server. Since this specification only | |||
allows UDP between the server and the peers, it is RECOMMENDED that | allows UDP between the server and the peers, it is <bcp14>RECOMMENDED</b cp14> that | |||
the client pick UDP unless it has a reason to use a different | the client pick UDP unless it has a reason to use a different | |||
transport. One reason to pick a different transport would be that the | transport. One reason to pick a different transport would be that the | |||
client believes, either through configuration or discovery or by | client believes, either through configuration or discovery or by | |||
experiment, that it is unable to contact any TURN server using UDP. | experiment, that it is unable to contact any TURN server using UDP. | |||
See <xref target="sec-transports"></xref> for more discussion.</t> | See <xref target="sec-transports" format="default"/> for more discussion | |||
.</t> | ||||
<t>The client also picks a server transport address, which SHOULD be | <t>The client also picks a server transport address, which <bcp14>SHOULD | |||
</bcp14> be | ||||
done as follows. The client uses one or more procedures described in | done as follows. The client uses one or more procedures described in | |||
<xref target="RFC8155"></xref> to discover a TURN server and uses the | <xref target="RFC8155" format="default"/> to discover a TURN server and | |||
TURN server resolution mechanism defined in <xref | uses the | |||
target="RFC5928"></xref> and <xref target="RFC7350"></xref> to get a | TURN server resolution mechanism defined in <xref target="RFC5928" forma | |||
t="default"/> and <xref target="RFC7350" format="default"/> to get a | ||||
list of server transport addresses that can be tried to create a TURN | list of server transport addresses that can be tried to create a TURN | |||
allocation.</t> | allocation.</t> | |||
<t>The client <bcp14>MUST</bcp14> include a REQUESTED-TRANSPORT attribut | ||||
e in the | ||||
request. | ||||
<t>The client MUST include a REQUESTED-TRANSPORT attribute in the | This attribute specifies the transport protocol between the | |||
request. This attribute specifies the transport protocol between the | server and the peers (note that this is *not* the transport protocol | |||
server and the peers (note that this is NOT the transport protocol | ||||
that appears in the 5-tuple). In this specification, the | that appears in the 5-tuple). In this specification, the | |||
REQUESTED-TRANSPORT type is always UDP. This attribute is included to | REQUESTED-TRANSPORT type is always UDP. This attribute is included to | |||
allow future extensions to specify other protocols.</t> | allow future extensions to specify other protocols.</t> | |||
<t>If the client wishes to obtain a relayed transport address of a | <t>If the client wishes to obtain a relayed transport address of a | |||
specific address type then it includes a REQUESTED-ADDRESS-FAMILY | specific address type, then it includes a REQUESTED-ADDRESS-FAMILY | |||
attribute in the request. This attribute indicates the specific | attribute in the request. This attribute indicates the specific | |||
address type the client wishes the TURN server to allocate. Clients | address type the client wishes the TURN server to allocate. Clients | |||
MUST NOT include more than one REQUESTED-ADDRESS-FAMILY attribute in | <bcp14>MUST NOT</bcp14> include more than one REQUESTED-ADDRESS-FAMILY a | |||
an Allocate request. Clients MUST NOT include a | ttribute in | |||
an Allocate request. Clients <bcp14>MUST NOT</bcp14> include a | ||||
REQUESTED-ADDRESS-FAMILY attribute in an Allocate request that | REQUESTED-ADDRESS-FAMILY attribute in an Allocate request that | |||
contains a RESERVATION-TOKEN attribute, for the reason that the server | contains a RESERVATION-TOKEN attribute, for the reason that the server | |||
uses the previously reserved transport address corresponding to the | uses the previously reserved transport address corresponding to the | |||
included token and the client cannot obtain a relayed transport | included token and the client cannot obtain a relayed transport | |||
address of a specific address type.</t> | address of a specific address type.</t> | |||
<t>If the client wishes to obtain one IPv6 and one IPv4 relayed | <t>If the client wishes to obtain one IPv6 and one IPv4 relayed | |||
transport address then it includes an ADDITIONAL-ADDRESS-FAMILY | transport address, then it includes an ADDITIONAL-ADDRESS-FAMILY | |||
attribute in the request. This attribute specifies that the server | attribute in the request. This attribute specifies that the server | |||
must allocate both address types. The attribute value in the | must allocate both address types. The attribute value in the | |||
ADDITIONAL-ADDRESS-FAMILY MUST be set to 0x02 (IPv6 address family). | ADDITIONAL-ADDRESS-FAMILY <bcp14>MUST</bcp14> be set to 0x02 (IPv6 addre | |||
Clients MUST NOT include REQUESTED-ADDRESS-FAMILY and | ss family). | |||
ADDITIONAL-ADDRESS-FAMILY attributes in the same request. Clients MUST | Clients <bcp14>MUST NOT</bcp14> include REQUESTED-ADDRESS-FAMILY and | |||
NOT include ADDITIONAL-ADDRESS-FAMILY attribute in a Allocate request | ADDITIONAL-ADDRESS-FAMILY attributes in the same request. Clients <bcp14 | |||
that contains a RESERVATION-TOKEN attribute. Clients MUST NOT include | >MUST | |||
ADDITIONAL-ADDRESS-FAMILY attribute in a Allocate request that | NOT</bcp14> include the ADDITIONAL-ADDRESS-FAMILY attribute in an Alloca | |||
contains an EVEN-PORT attribute with the R bit set to 1. The reason | te request | |||
behind the restriction is if EVEN-PORT with R bit set to 1 is allowed | that contains a RESERVATION-TOKEN attribute. | |||
Clients <bcp14>MUST NOT</bcp14> include | ||||
the ADDITIONAL-ADDRESS-FAMILY attribute in an Allocate request that | ||||
contains an EVEN-PORT attribute with the R (Reserved) bit set to 1. | ||||
The reason behind the restriction is that if the EVEN-PORT attribute wit | ||||
h the R bit set to 1 is allowed | ||||
with the ADDITIONAL-ADDRESS-FAMILY attribute, two tokens will have to | with the ADDITIONAL-ADDRESS-FAMILY attribute, two tokens will have to | |||
be returned in success response and requires changes to the way | be returned in the success response and changes will be required to the | |||
RESERVATION-TOKEN is handled.</t> | way | |||
the RESERVATION-TOKEN attribute is handled.</t> | ||||
<t>If the client wishes the server to initialize the time-to-expiry | <t>If the client wishes the server to initialize the time-to-expiry | |||
field of the allocation to some value other than the default lifetime, | field of the allocation to some value other than the default lifetime, | |||
then it MAY include a LIFETIME attribute specifying its desired value. | then it <bcp14>MAY</bcp14> include a LIFETIME attribute specifying its d esired value. | |||
This is just a hint, and the server may elect to use a different | This is just a hint, and the server may elect to use a different | |||
value. Note that the server will ignore requests to initialize the | value. Note that the server will ignore requests to initialize the | |||
field to less than the default value.</t> | field to less than the default value.</t> | |||
<t>If the client wishes to later use the DONT-FRAGMENT attribute in | <t>If the client wishes to later use the DONT-FRAGMENT attribute in | |||
one or more Send indications on this allocation, then the client | one or more Send indications on this allocation, then the client | |||
SHOULD include the DONT-FRAGMENT attribute in the Allocate request. | <bcp14>SHOULD</bcp14> include the DONT-FRAGMENT attribute in the Allocat e request. | |||
This allows the client to test whether this attribute is supported by | This allows the client to test whether this attribute is supported by | |||
the server.</t> | the server.</t> | |||
<t>If the client requires the port number of the relayed transport | <t>If the client requires the port number of the relayed transport | |||
address be even, the client includes the EVEN-PORT attribute. If this | address to be even, the client includes the EVEN-PORT attribute. If this | |||
attribute is not included, then the port can be even or odd. By | attribute is not included, then the port can be even or odd. By | |||
setting the R bit in the EVEN-PORT attribute to 1, the client can | setting the R bit in the EVEN-PORT attribute to 1, the client can | |||
request that the server reserve the next highest port number (on the | request that the server reserve the next highest port number (on the | |||
same IP address) for a subsequent allocation. If the R bit is 0, no | same IP address) for a subsequent allocation. If the R bit is 0, no | |||
such request is made.</t> | such request is made.</t> | |||
<t>The client <bcp14>MAY</bcp14> also include a RESERVATION-TOKEN attrib | ||||
<t>The client MAY also include a RESERVATION-TOKEN attribute in the | ute in the | |||
request to ask the server to use a previously reserved port for the | request to ask the server to use a previously reserved port for the | |||
allocation. If the RESERVATION-TOKEN attribute is included, then the | allocation. If the RESERVATION-TOKEN attribute is included, then the | |||
client MUST omit the EVEN-PORT attribute.</t> | client <bcp14>MUST</bcp14> omit the EVEN-PORT attribute.</t> | |||
<t>Once constructed, the client sends the Allocate request on the | <t>Once constructed, the client sends the Allocate request on the | |||
5-tuple.</t> | 5-tuple.</t> | |||
</section> | ||||
<section anchor="sec-rcv-allocate" title="Receiving an Allocate Request"> | </section> | |||
<section anchor="sec-rcv-allocate" numbered="true" toc="default"> | ||||
<name>Receiving an Allocate Request</name> | ||||
<t>When the server receives an Allocate request, it performs the | <t>When the server receives an Allocate request, it performs the | |||
following checks:<list style="numbers"> | following checks:</t> | |||
<t>The TURN server provided by the local or access network MAY | <ol spacing="normal" type="1"> | |||
allow unauthenticated request in order to accept Allocation | <li>The TURN server provided by the local or access network | |||
requests from new and/or guest users in the network who do not | <bcp14>MAY</bcp14> allow an unauthenticated request in order to | |||
necessarily possess long term credentials for STUN authentication. | accept Allocation requests from new and/or guest users in the | |||
Making STUN authentication optional and its security implications | network who do not necessarily possess long-term credentials for | |||
are discussed in <xref target="RFC8155"></xref>. Otherwise, the | STUN authentication. The security implications of STUN and making | |||
server MUST require that the request be authenticated. If the | STUN authentication optional are discussed in <xref target="RFC8155" | |||
request is authenticated, the authentication MUST be done either | format="default"/>. Otherwise, the server <bcp14>MUST</bcp14> | |||
using the long-term credential mechanism of <xref | require that the request be authenticated. If the request is | |||
target="I-D.ietf-tram-stunbis"></xref> or the STUN Extension for | authenticated, the authentication <bcp14>MUST</bcp14> be done either | |||
Third-Party Authorization <xref target="RFC7635"></xref> unless | using the long-term credential mechanism of <xref target="RFC8489" | |||
the client and server agree to use another mechanism through some | format="default"/> or using the STUN Extension for Third-Party | |||
procedure outside the scope of this document.</t> | Authorization <xref target="RFC7635" format="default"/> unless the | |||
client and server agree to use another mechanism through some | ||||
<t>The server checks if the 5-tuple is currently in use by an | procedure outside the scope of this document.</li> | |||
<li>The server checks if the 5-tuple is currently in use by an | ||||
existing allocation. If yes, the server rejects the request with a | existing allocation. If yes, the server rejects the request with a | |||
437 (Allocation Mismatch) error.</t> | 437 (Allocation Mismatch) error.</li> | |||
<li>The server checks if the request contains a REQUESTED-TRANSPORT | ||||
<t>The server checks if the request contains a REQUESTED-TRANSPORT | ||||
attribute. If the REQUESTED-TRANSPORT attribute is not included or | attribute. If the REQUESTED-TRANSPORT attribute is not included or | |||
is malformed, the server rejects the request with a 400 (Bad | is malformed, the server rejects the request with a 400 (Bad | |||
Request) error. Otherwise, if the attribute is included but | Request) error. Otherwise, if the attribute is included but | |||
specifies a protocol that is not supported by the server, the | specifies a protocol that is not supported by the server, the | |||
server rejects the request with a 442 (Unsupported Transport | server rejects the request with a 442 (Unsupported Transport | |||
Protocol) error.</t> | Protocol) error.</li> | |||
<li>The request may contain a DONT-FRAGMENT attribute. If it does, | ||||
<t>The request may contain a DONT-FRAGMENT attribute. If it does, | ||||
but the server does not support sending UDP datagrams with the DF | but the server does not support sending UDP datagrams with the DF | |||
bit set to 1 (see <xref target="sec-ip-header-fields"></xref> and | bit set to 1 (see Sections <xref target="sec-ip-header-fields" forma | |||
<xref target="sec-ip-header-fields-tcp-udp"></xref>), then the | t="counter"/> and | |||
<xref target="sec-ip-header-fields-tcp-udp" format="counter"/>), the | ||||
n the | ||||
server treats the DONT-FRAGMENT attribute in the Allocate request | server treats the DONT-FRAGMENT attribute in the Allocate request | |||
as an unknown comprehension-required attribute.</t> | as an unknown comprehension-required attribute.</li> | |||
<li>The server checks if the request contains a RESERVATION-TOKEN | ||||
<t>The server checks if the request contains a RESERVATION-TOKEN | ||||
attribute. If yes, and the request also contains an EVEN-PORT or | attribute. If yes, and the request also contains an EVEN-PORT or | |||
REQUESTED-ADDRESS-FAMILY or ADDITIONAL-ADDRESS-FAMILY attribute, | REQUESTED-ADDRESS-FAMILY or ADDITIONAL-ADDRESS-FAMILY attribute, | |||
the server rejects the request with a 400 (Bad Request) error. | the server rejects the request with a 400 (Bad Request) error. | |||
Otherwise, it checks to see if the token is valid (i.e., the token | Otherwise, it checks to see if the token is valid (i.e., the token | |||
is in range and has not expired and the corresponding relayed | is in range and has not expired, and the corresponding relayed | |||
transport address is still available). If the token is not valid | transport address is still available). If the token is not valid | |||
for some reason, the server rejects the request with a 508 | for some reason, the server rejects the request with a 508 | |||
(Insufficient Capacity) error.</t> | (Insufficient Capacity) error.</li> | |||
<t>The server checks if the request contains both | <li>The server checks if the request contains both | |||
REQUESTED-ADDRESS-FAMILY and ADDITIONAL-ADDRESS-FAMILY attributes. | REQUESTED-ADDRESS-FAMILY and ADDITIONAL-ADDRESS-FAMILY attributes. | |||
If yes, then the server rejects the request with a 400 (Bad | If yes, then the server rejects the request with a 400 (Bad | |||
Request) error.</t> | Request) error.</li> | |||
<li>If the server does not support the address family requested by | ||||
<t>If the server does not support the address family requested by | the client in REQUESTED-ADDRESS-FAMILY, or if the allocation of the | |||
the client in REQUESTED-ADDRESS-FAMILY or if the allocation of the | requested address family is disabled by local policy, it <bcp14>MUST | |||
requested address family is disabled by local policy, it MUST | </bcp14> | |||
generate an Allocate error response, and it MUST include an | generate an Allocate error response, and it <bcp14>MUST</bcp14> incl | |||
ude an | ||||
ERROR-CODE attribute with the 440 (Address Family not Supported) | ERROR-CODE attribute with the 440 (Address Family not Supported) | |||
response code. If the REQUESTED-ADDRESS-FAMILY attribute is absent | response code. If the REQUESTED-ADDRESS-FAMILY attribute is absent | |||
and the server does not support IPv4 address family, the server | and the server does not support the IPv4 address family, the server | |||
MUST include an ERROR-CODE attribute with the 440 (Address Family | <bcp14>MUST</bcp14> include an ERROR-CODE attribute with the 440 (Ad | |||
dress Family | ||||
not Supported) response code. If the REQUESTED-ADDRESS-FAMILY | not Supported) response code. If the REQUESTED-ADDRESS-FAMILY | |||
attribute is absent and the server supports IPv4 address family, | attribute is absent and the server supports the IPv4 address family, | |||
the server MUST allocate an IPv4 relayed transport address for the | the server <bcp14>MUST</bcp14> allocate an IPv4 relayed transport ad | |||
TURN client.</t> | dress for the | |||
TURN client.</li> | ||||
<t>The server checks if the request contains an EVEN-PORT | <li>The server checks if the request contains an EVEN-PORT | |||
attribute with the R bit set to 1. If yes, and the request also | attribute with the R bit set to 1. If yes, and the request also | |||
contains an ADDITIONAL-ADDRESS-FAMILY attribute, the server | contains an ADDITIONAL-ADDRESS-FAMILY attribute, the server | |||
rejects the request with a 400 (Bad Request) error. Otherwise, the | rejects the request with a 400 (Bad Request) error. Otherwise, the | |||
server checks if it can satisfy the request (i.e., can allocate a | server checks if it can satisfy the request (i.e., can allocate a | |||
relayed transport address as described below). If the server | relayed transport address as described below). If the server | |||
cannot satisfy the request, then the server rejects the request | cannot satisfy the request, then the server rejects the request | |||
with a 508 (Insufficient Capacity) error.</t> | with a 508 (Insufficient Capacity) error.</li> | |||
<li>The server checks if the request contains an | ||||
<t>The server checks if the request contains an | ||||
ADDITIONAL-ADDRESS-FAMILY attribute. If yes, and the attribute | ADDITIONAL-ADDRESS-FAMILY attribute. If yes, and the attribute | |||
value is 0x01 (IPv4 address family), then the server rejects the | value is 0x01 (IPv4 address family), then the server rejects the | |||
request with a 400 (Bad Request) error. Otherwise, the server | request with a 400 (Bad Request) error. Otherwise, the server | |||
checks if it can allocate relayed transport addresses of both | checks if it can allocate relayed transport addresses of both | |||
address types. If the server cannot satisfy the request, then the | address types. If the server cannot satisfy the request, then the | |||
server rejects the request with a 508 (Insufficient Capacity) | server rejects the request with a 508 (Insufficient Capacity) | |||
error. If the server can partially meet the request, i.e. if it | error. If the server can partially meet the request, i.e., if it | |||
can only allocate one relayed transport address of a specific | can only allocate one relayed transport address of a specific | |||
address type, then it includes ADDRESS-ERROR-CODE attribute in the | address type, then it includes ADDRESS-ERROR-CODE attribute in the | |||
success response to inform the client the reason for partial | success response to inform the client the reason for partial | |||
failure of the request. The error code value signaled in the | failure of the request. The error code value signaled in the | |||
ADDRESS-ERROR-CODE attribute could be 440 (Address Family not | ADDRESS-ERROR-CODE attribute could be 440 (Address Family not | |||
Supported) or 508 (Insufficient Capacity). If the server can fully | Supported) or 508 (Insufficient Capacity). If the server can fully | |||
meet the request, then the server allocates one IPv4 and one IPv6 | meet the request, then the server allocates one IPv4 and one IPv6 | |||
relay address, and returns an Allocate success response containing | relay address and returns an Allocate success response containing | |||
the relayed transport addresses assigned to the dual allocation in | the relayed transport addresses assigned to the dual allocation in | |||
two XOR-RELAYED-ADDRESS attributes.</t> | two XOR-RELAYED-ADDRESS attributes.</li> | |||
<li>At any point, the server <bcp14>MAY</bcp14> choose to reject the | ||||
<t>At any point, the server MAY choose to reject the request with | request with a 486 (Allocation Quota Reached) error if it feels the | |||
a 486 (Allocation Quota Reached) error if it feels the client is | client is trying to exceed some locally defined allocation | |||
trying to exceed some locally defined allocation quota. The server | quota. The server is free to define this allocation quota any way it | |||
is free to define this allocation quota any way it wishes, but | wishes, but it <bcp14>SHOULD</bcp14> define it based on the username | |||
SHOULD define it based on the username used to authenticate the | used to authenticate the request and not on the client's transport | |||
request, and not on the client's transport address.</t> | address.</li> | |||
<li>Also, at any point, the server <bcp14>MAY</bcp14> choose to reject | ||||
<t>Also at any point, the server MAY choose to reject the request | the request | |||
with a 300 (Try Alternate) error if it wishes to redirect the | with a 300 (Try Alternate) error if it wishes to redirect the | |||
client to a different server. The use of this error code and | client to a different server. The use of this error code and | |||
attribute follow the specification in <xref | attribute follows the specification in <xref target="RFC8489" format | |||
target="I-D.ietf-tram-stunbis"></xref>.</t> | ="default"/>.</li> | |||
</list></t> | </ol> | |||
<t>If all the checks pass, the server creates the allocation. The | <t>If all the checks pass, the server creates the allocation. The | |||
5-tuple is set to the 5-tuple from the Allocate request, while the | 5-tuple is set to the 5-tuple from the Allocate request, while the | |||
list of permissions and the list of channels are initially empty.</t> | list of permissions and the list of channels are initially empty.</t> | |||
<t>The server chooses a relayed transport address for the allocation | <t>The server chooses a relayed transport address for the allocation | |||
as follows:<list style="symbols"> | as follows:</t> | |||
<t>If the request contains a RESERVATION-TOKEN attribute, the | ||||
<ul spacing="normal"> | ||||
<li>If the request contains a RESERVATION-TOKEN attribute, the | ||||
server uses the previously reserved transport address | server uses the previously reserved transport address | |||
corresponding to the included token (if it is still available). | corresponding to the included token (if it is still available). | |||
Note that the reservation is a server-wide reservation and is not | Note that the reservation is a server-wide reservation and is not | |||
specific to a particular allocation, since the Allocate request | specific to a particular allocation since the Allocate request | |||
containing the RESERVATION-TOKEN uses a different 5-tuple than the | containing the RESERVATION-TOKEN uses a different 5-tuple than the | |||
Allocate request that made the reservation. The 5-tuple for the | Allocate request that made the reservation. The 5-tuple for the | |||
Allocate request containing the RESERVATION-TOKEN attribute can be | Allocate request containing the RESERVATION-TOKEN attribute can be | |||
any allowed 5-tuple; it can use a different client IP address and | any allowed 5-tuple; it can use a different client IP address and | |||
port, a different transport protocol, and even different server IP | port, a different transport protocol, and even a different server IP | |||
address and port (provided, of course, that the server IP address | address and port (provided, of course, that the server IP address | |||
and port are ones on which the server is listening for TURN | and port are ones on which the server is listening for TURN | |||
requests).</t> | requests).</li> | |||
<li>If the request contains an EVEN-PORT attribute with the R bit | ||||
<t>If the request contains an EVEN-PORT attribute with the R bit | ||||
set to 0, then the server allocates a relayed transport address | set to 0, then the server allocates a relayed transport address | |||
with an even port number.</t> | with an even port number.</li> | |||
<li>If the request contains an EVEN-PORT attribute with the R bit | ||||
<t>If the request contains an EVEN-PORT attribute with the R bit | ||||
set to 1, then the server looks for a pair of port numbers N and | set to 1, then the server looks for a pair of port numbers N and | |||
N+1 on the same IP address, where N is even. Port N is used in the | N+1 on the same IP address, where N is even. Port N is used in the | |||
current allocation, while the relayed transport address with port | current allocation, while the relayed transport address with port | |||
N+1 is assigned a token and reserved for a future allocation. The | N+1 is assigned a token and reserved for a future allocation. The | |||
server MUST hold this reservation for at least 30 seconds, and MAY | server <bcp14>MUST</bcp14> hold this reservation for at least 30 sec onds and <bcp14>MAY</bcp14> | |||
choose to hold longer (e.g., until the allocation with port N | choose to hold longer (e.g., until the allocation with port N | |||
expires). The server then includes the token in a | expires). The server then includes the token in a | |||
RESERVATION-TOKEN attribute in the success response.</t> | RESERVATION-TOKEN attribute in the success response.</li> | |||
<li>Otherwise, the server allocates any available relayed transport | ||||
<t>Otherwise, the server allocates any available relayed transport | address.</li> | |||
address.</t> | </ul> | |||
</list></t> | <t>In all cases, the server <bcp14>SHOULD</bcp14> only allocate ports fr | |||
om the range | ||||
<t>In all cases, the server SHOULD only allocate ports from the range | 49152 - 65535 (the Dynamic and/or Private Port range <xref target="PORT- | |||
49152 – 65535 (the Dynamic and/or Private Port range <xref | NUMBERS" format="default"/>), unless the TURN server application | |||
target="Port-Numbers"></xref>), unless the TURN server application | ||||
knows, through some means not specified here, that other applications | knows, through some means not specified here, that other applications | |||
running on the same host as the TURN server application will not be | running on the same host as the TURN server application will not be | |||
impacted by allocating ports outside this range. This condition can | impacted by allocating ports outside this range. This condition can | |||
often be satisfied by running the TURN server application on a | often be satisfied by running the TURN server application on a | |||
dedicated machine and/or by arranging that any other applications on | dedicated machine and/or by arranging that any other applications on | |||
the machine allocate ports before the TURN server application starts. | the machine allocate ports before the TURN server application starts. | |||
In any case, the TURN server SHOULD NOT allocate ports in the range 0 | In any case, the TURN server <bcp14>SHOULD NOT</bcp14> allocate ports in the range 0 | |||
- 1023 (the Well-Known Port range) to discourage clients from using | - 1023 (the Well-Known Port range) to discourage clients from using | |||
TURN to run standard services.</t> | TURN to run standard services.</t> | |||
<aside> | ||||
<t><list> | <t>NOTE: The use of randomized port assignments to avoid certain | |||
<t>NOTE: The use of randomized port assignments to avoid certain | types of attacks is described in <xref target="RFC6056" format="defa | |||
types of attacks is described in <xref target="RFC6056"></xref>. | ult"/>. | |||
It is RECOMMENDED that a TURN server implement a randomized port | It is <bcp14>RECOMMENDED</bcp14> that a TURN server implement a rand | |||
assignment algorithm from <xref target="RFC6056"></xref>. This is | omized port | |||
assignment algorithm from <xref target="RFC6056" format="default"/>. | ||||
This is | ||||
especially applicable to servers that choose to pre-allocate a | especially applicable to servers that choose to pre-allocate a | |||
number of ports from the underlying OS and then later assign them | number of ports from the underlying OS and then later assign them | |||
to allocations; for example, a server may choose this technique to | to allocations; for example, a server may choose this technique to | |||
implement the EVEN-PORT attribute.</t> | implement the EVEN-PORT attribute.</t></aside> | |||
</list></t> | ||||
<t>The server determines the initial value of the time-to-expiry field | <t>The server determines the initial value of the time-to-expiry field | |||
as follows. If the request contains a LIFETIME attribute, then the | as follows. If the request contains a LIFETIME attribute, then the | |||
server computes the minimum of the client's proposed lifetime and the | server computes the minimum of the client's proposed lifetime and the | |||
server's maximum allowed lifetime. If this computed value is greater | server's maximum allowed lifetime. If this computed value is greater | |||
than the default lifetime, then the server uses the computed lifetime | than the default lifetime, then the server uses the computed lifetime | |||
as the initial value of the time-to-expiry field. Otherwise, the | as the initial value of the time-to-expiry field. Otherwise, the | |||
server uses the default lifetime. It is RECOMMENDED that the server | server uses the default lifetime. It is <bcp14>RECOMMENDED</bcp14> that the server | |||
use a maximum allowed lifetime value of no more than 3600 seconds (1 | use a maximum allowed lifetime value of no more than 3600 seconds (1 | |||
hour). Servers that implement allocation quotas or charge users for | hour). Servers that implement allocation quotas or charge users for | |||
allocations in some way may wish to use a smaller maximum allowed | allocations in some way may wish to use a smaller maximum allowed | |||
lifetime (perhaps as small as the default lifetime) to more quickly | lifetime (perhaps as small as the default lifetime) to more quickly | |||
remove orphaned allocations (that is, allocations where the | remove orphaned allocations (that is, allocations where the | |||
corresponding client has crashed or terminated or the client | corresponding client has crashed or terminated, or the client | |||
connection has been lost for some reason). Also, note that the time- | connection has been lost for some reason). Also, note that the time- | |||
to-expiry is recomputed with each successful Refresh request, and thus | to-expiry is recomputed with each successful Refresh request, and thus, | |||
the value computed here applies only until the first refresh.</t> | the value computed here applies only until the first refresh.</t> | |||
<t>Once the allocation is created, the server replies with a success | <t>Once the allocation is created, the server replies with a success | |||
response. The success response contains:<list style="symbols"> | response. The success response contains:</t> | |||
<t>An XOR-RELAYED-ADDRESS attribute containing the relayed | <ul spacing="normal"> | |||
<li>An XOR-RELAYED-ADDRESS attribute containing the relayed | ||||
transport address or two XOR-RELAYED-ADDRESS attributes containing | transport address or two XOR-RELAYED-ADDRESS attributes containing | |||
the relayed transport addresses.</t> | the relayed transport addresses.</li> | |||
<li>A LIFETIME attribute containing the current value of the | ||||
<t>A LIFETIME attribute containing the current value of the | time-to-expiry timer.</li> | |||
time-to-expiry timer.</t> | <li>A RESERVATION-TOKEN attribute (if a second relayed transport | |||
address was reserved).</li> | ||||
<t>A RESERVATION-TOKEN attribute (if a second relayed transport | <li>An XOR-MAPPED-ADDRESS attribute containing the client's IP | |||
address was reserved).</t> | address and port (from the 5-tuple).</li> | |||
</ul> | ||||
<t>An XOR-MAPPED-ADDRESS attribute containing the client's IP | <aside> | |||
address and port (from the 5-tuple).</t> | <t>NOTE: The XOR-MAPPED-ADDRESS attribute is included in the | |||
</list></t> | ||||
<t><list> | ||||
<t>NOTE: The XOR-MAPPED-ADDRESS attribute is included in the | ||||
response as a convenience to the client. TURN itself does not make | response as a convenience to the client. TURN itself does not make | |||
use of this value, but clients running ICE can often need this | use of this value, but clients running ICE can often need this | |||
value and can thus avoid having to do an extra Binding transaction | value and can thus avoid having to do an extra Binding transaction | |||
with some STUN server to learn it.</t> | with some STUN server to learn it.</t> | |||
</list></t> | </aside> | |||
<t>The response (either success or error) is sent back to the client | <t>The response (either success or error) is sent back to the client | |||
on the 5-tuple.</t> | on the 5-tuple.</t> | |||
<aside> | ||||
<t><list> | <t>NOTE: When the Allocate request is sent over UDP, <xref target="RFC | |||
<t>NOTE: When the Allocate request is sent over UDP, <xref | 8489" format="default"/> requires that the server | |||
target="I-D.ietf-tram-stunbis"></xref> requires that the server | ||||
handle the possible retransmissions of the request so that | handle the possible retransmissions of the request so that | |||
retransmissions do not cause multiple allocations to be created. | retransmissions do not cause multiple allocations to be created. | |||
Implementations may achieve this using the so-called "stateless | Implementations may achieve this using the so-called "stateless | |||
stack approach" as follows. To detect retransmissions when the | stack approach" as follows. To detect retransmissions when the | |||
original request was successful in creating an allocation, the | original request was successful in creating an allocation, the | |||
server can store the transaction id that created the request with | server can store the transaction id that created the request with | |||
the allocation data and compare it with incoming Allocate requests | the allocation data and compare it with incoming Allocate requests | |||
on the same 5-tuple. Once such a request is detected, the server | on the same 5-tuple. Once such a request is detected, the server | |||
can stop parsing the request and immediately generate a success | can stop parsing the request and immediately generate a success | |||
response. When building this response, the value of the LIFETIME | response. When building this response, the value of the LIFETIME | |||
attribute can be taken from the time-to-expiry field in the | attribute can be taken from the time-to-expiry field in the | |||
allocate state data, even though this value may differ slightly | allocate state data, even though this value may differ slightly | |||
from the LIFETIME value originally returned. In addition, the | from the LIFETIME value originally returned. In addition, the | |||
server may need to store an indication of any reservation token | server may need to store an indication of any reservation token | |||
returned in the original response, so that this may be returned in | returned in the original response so that this may be returned in | |||
any retransmitted responses.</t> | any retransmitted responses.</t> | |||
<t>For the case where the original request was unsuccessful in | ||||
<t>For the case where the original request was unsuccessful in | ||||
creating an allocation, the server may choose to do nothing | creating an allocation, the server may choose to do nothing | |||
special. Note, however, that there is a rare case where the server | special. Note, however, that there is a rare case where the server | |||
rejects the original request but accepts the retransmitted request | rejects the original request but accepts the retransmitted request | |||
(because conditions have changed in the brief intervening time | (because conditions have changed in the brief intervening time | |||
period). If the client receives the first failure response, it | period). If the client receives the first failure response, it | |||
will ignore the second (success) response and believe that an | will ignore the second (success) response and believe that an | |||
allocation was not created. An allocation created in this matter | allocation was not created. | |||
will eventually timeout, since the client will not refresh it. | ||||
An allocation created in this manner | ||||
will eventually time out since the client will not refresh it. | ||||
Furthermore, if the client later retries with the same 5-tuple but | Furthermore, if the client later retries with the same 5-tuple but | |||
different transaction id, it will receive a 437 (Allocation | a different transaction id, it will receive a 437 (Allocation | |||
Mismatch), which will cause it to retry with a different 5-tuple. | Mismatch) error response, which will cause it to retry with a differ | |||
ent 5-tuple. | ||||
The server may use a smaller maximum lifetime value to minimize | The server may use a smaller maximum lifetime value to minimize | |||
the lifetime of allocations "orphaned" in this manner.</t> | the lifetime of allocations "orphaned" in this manner.</t> | |||
</list></t> | </aside> | |||
</section> | </section> | |||
<section numbered="true" toc="default"> | ||||
<section title="Receiving an Allocate Success Response"> | <name>Receiving an Allocate Success Response</name> | |||
<t>If the client receives an Allocate success response, then it MUST | <t>If the client receives an Allocate success response, then it <bcp14>M | |||
UST</bcp14> | ||||
check that the mapped address and the relayed transport address or | check that the mapped address and the relayed transport address or | |||
addresses are part of an address family or families that the client | addresses are part of an address family or families that the client | |||
understands and is prepared to handle. If these addresses are not part | understands and is prepared to handle. If these addresses are not part | |||
of an address family or families which the client is prepared to | of an address family or families that the client is prepared to | |||
handle, then the client MUST delete the allocation (<xref | handle, then the client <bcp14>MUST</bcp14> delete the allocation (<xref | |||
target="sec-refreshing-allocation"></xref>) and MUST NOT attempt to | target="sec-refreshing-allocation" format="default"/>) and <bcp14>MUST NOT</bcp | |||
14> attempt to | ||||
create another allocation on that server until it believes the | create another allocation on that server until it believes the | |||
mismatch has been fixed.</t> | mismatch has been fixed.</t> | |||
<t>Otherwise, the client creates its own copy of the allocation data | <t>Otherwise, the client creates its own copy of the allocation data | |||
structure to track what is happening on the server. In particular, the | structure to track what is happening on the server. In particular, the | |||
client needs to remember the actual lifetime received back from the | client needs to remember the actual lifetime received back from the | |||
server, rather than the value sent to the server in the request. The | server, rather than the value sent to the server in the request. The | |||
client must also remember the 5-tuple used for the request and the | client must also remember the 5-tuple used for the request and the | |||
username and password it used to authenticate the request to ensure | username and password it used to authenticate the request to ensure | |||
that it reuses them for subsequent messages. The client also needs to | that it reuses them for subsequent messages. The client also needs to | |||
track the channels and permissions it establishes on the server.</t> | track the channels and permissions it establishes on the server.</t> | |||
<t>If the client receives an Allocate success response but with an | ||||
<t>If the client receives an Allocate success response but with | ||||
ADDRESS-ERROR-CODE attribute in the response and the error code value | ADDRESS-ERROR-CODE attribute in the response and the error code value | |||
signaled in the ADDRESS-ERROR-CODE attribute is 440 (Address Family | signaled in the ADDRESS-ERROR-CODE attribute is 440 (Address Family | |||
not Supported), the client MUST NOT retry its request for the rejected | not Supported), the client <bcp14>MUST NOT</bcp14> retry its request | |||
address type. If the client receives an ADDRESS-ERROR-CODE attribute | for the rejected address type. If the client receives an | |||
in the response and the error code value signaled in the | ADDRESS-ERROR-CODE attribute in the response and the error code value | |||
ADDRESS-ERROR-CODE attribute is 508 (Insufficient Capacity), the | signaled in the ADDRESS-ERROR-CODE attribute is 508 (Insufficient | |||
client SHOULD wait at least 1 minute before trying to request any more | Capacity), the client <bcp14>SHOULD</bcp14> wait at least 1 minute | |||
allocations on this server for the rejected address type.</t> | before trying to request any more allocations on this server for the | |||
rejected address type.</t> | ||||
<t>The client will probably wish to send the relayed transport address | <t>The client will probably wish to send the relayed transport address | |||
to peers (using some method not specified here) so the peers can | to peers (using some method not specified here) so the peers can | |||
communicate with it. The client may also wish to use the | communicate with it. The client may also wish to use the | |||
server-reflexive address it receives in the XOR-MAPPED-ADDRESS | server-reflexive address it receives in the XOR-MAPPED-ADDRESS | |||
attribute in its ICE processing.</t> | attribute in its ICE processing.</t> | |||
</section> | </section> | |||
<section anchor="sec-allocate-error-response" | <section anchor="sec-allocate-error-response" numbered="true" toc="default | |||
title="Receiving an Allocate Error Response"> | "> | |||
<name>Receiving an Allocate Error Response</name> | ||||
<t>If the client receives an Allocate error response, then the | <t>If the client receives an Allocate error response, then the | |||
processing depends on the actual error code returned:<list | processing depends on the actual error code returned:</t> | |||
style="symbols"> | ||||
<t>(Request timed out): There is either a problem with the server, | ||||
or a problem reaching the server with the chosen transport. The | ||||
client considers the current transaction as having failed but MAY | ||||
choose to retry the Allocate request using a different transport | ||||
(e.g., TCP instead of UDP).</t> | ||||
<t>300 (Try Alternate): The server would like the client to use | <dl newline="true" spacing="normal"> | |||
<dt>408 (Request timed out):</dt> <dd>There is either a problem with t | ||||
he | ||||
server or a problem reaching the server with the chosen | ||||
transport. The client considers the current transaction as having | ||||
failed but <bcp14>MAY</bcp14> choose to retry the Allocate request | ||||
using a different transport (e.g., TCP instead of UDP).</dd> | ||||
<dt>300 (Try Alternate):</dt> <dd>The server would like the client to | ||||
use | ||||
the server specified in the ALTERNATE-SERVER attribute instead. | the server specified in the ALTERNATE-SERVER attribute instead. | |||
The client considers the current transaction as having failed, but | The client considers the current transaction as having failed, but i | |||
SHOULD try the Allocate request with the alternate server before | t | |||
<bcp14>SHOULD</bcp14> try the Allocate request with the alternate se | ||||
rver before | ||||
trying any other servers (e.g., other servers discovered using the | trying any other servers (e.g., other servers discovered using the | |||
DNS resolution procedures). When trying the Allocate request with | DNS resolution procedures). When trying the Allocate request with | |||
the alternate server, the client follows the ALTERNATE-SERVER | the alternate server, the client follows the ALTERNATE-SERVER | |||
procedures specified in <xref | procedures specified in <xref target="RFC8489" format="default"/>.</ | |||
target="I-D.ietf-tram-stunbis"></xref>.</t> | dd> | |||
<dt>400 (Bad Request):</dt> <dd>The server believes the client's reque | ||||
<t>400 (Bad Request): The server believes the client's request is | st is | |||
malformed for some reason. The client considers the current | malformed for some reason. The client considers the current | |||
transaction as having failed. The client MAY notify the user or | transaction as having failed. The client <bcp14>MAY</bcp14> notify t | |||
operator and SHOULD NOT retry the request with this server until | he user or | |||
it believes the problem has been fixed.</t> | operator and <bcp14>SHOULD NOT</bcp14> retry the request with this s | |||
erver until | ||||
<t>401 (Unauthorized): If the client has followed the procedures | it believes the problem has been fixed.</dd> | |||
<dt>401 (Unauthorized):</dt><dd> If the client has followed the proced | ||||
ures | ||||
of the long-term credential mechanism and still gets this error, | of the long-term credential mechanism and still gets this error, | |||
then the server is not accepting the client's credentials. In this | then the server is not accepting the client's credentials. In this | |||
case, the client considers the current transaction as having | case, the client considers the current transaction as having | |||
failed and SHOULD notify the user or operator. The client SHOULD | failed and <bcp14>SHOULD</bcp14> notify the user or operator. The cl | |||
NOT send any further requests to this server until it believes the | ient <bcp14>SHOULD | |||
problem has been fixed.</t> | NOT</bcp14> send any further requests to this server until it believ | |||
es the | ||||
<t>403 (Forbidden): The request is valid, but the server is | problem has been fixed.</dd> | |||
<dt>403 (Forbidden):</dt> <dd>The request is valid, but the server is | ||||
refusing to perform it, likely due to administrative restrictions. | refusing to perform it, likely due to administrative restrictions. | |||
The client considers the current transaction as having failed. The | The client considers the current transaction as having failed. The | |||
client MAY notify the user or operator and SHOULD NOT retry the | client <bcp14>MAY</bcp14> notify the user or operator and <bcp14>SHO ULD NOT</bcp14> retry the | |||
same request with this server until it believes the problem has | same request with this server until it believes the problem has | |||
been fixed.</t> | been fixed.</dd> | |||
<dt>420 (Unknown Attribute):</dt> <dd>If the client included a DONT-FR | ||||
<t>420 (Unknown Attribute): If the client included a DONT-FRAGMENT | AGMENT | |||
attribute in the request and the server rejected the request with | attribute in the request and the server rejected the request with | |||
a 420 error code and listed the DONT-FRAGMENT attribute in the | a 420 error code and listed the DONT-FRAGMENT attribute in the | |||
UNKNOWN-ATTRIBUTES attribute in the error response, then the | UNKNOWN-ATTRIBUTES attribute in the error response, then the | |||
client now knows that the server does not support the | client now knows that the server does not support the | |||
DONT-FRAGMENT attribute. The client considers the current | DONT-FRAGMENT attribute. The client considers the current | |||
transaction as having failed but MAY choose to retry the Allocate | transaction as having failed but <bcp14>MAY</bcp14> choose to retry | |||
request without the DONT-FRAGMENT attribute.</t> | the Allocate | |||
request without the DONT-FRAGMENT attribute.</dd> | ||||
<t>437 (Allocation Mismatch): This indicates that the client has | <dt>437 (Allocation Mismatch):</dt> <dd>This indicates that the client | |||
has | ||||
picked a 5-tuple that the server sees as already in use. One way | picked a 5-tuple that the server sees as already in use. One way | |||
this could happen is if an intervening NAT assigned a mapped | this could happen is if an intervening NAT assigned a mapped | |||
transport address that was used by another client that recently | transport address that was used by another client that recently | |||
crashed. The client considers the current transaction as having | crashed. The client considers the current transaction as having | |||
failed. The client SHOULD pick another client transport address | failed. The client <bcp14>SHOULD</bcp14> pick another client transpo rt address | |||
and retry the Allocate request (using a different transaction id). | and retry the Allocate request (using a different transaction id). | |||
The client SHOULD try three different client transport addresses | The client <bcp14>SHOULD</bcp14> try three different client transpor t addresses | |||
before giving up on this server. Once the client gives up on the | before giving up on this server. Once the client gives up on the | |||
server, it SHOULD NOT try to create another allocation on the | server, it <bcp14>SHOULD NOT</bcp14> try to create another allocatio | |||
server for 2 minutes.</t> | n on the | |||
server for 2 minutes.</dd> | ||||
<t>438 (Stale Nonce): See the procedures for the long-term | <dt>438 (Stale Nonce):</dt> <dd>See the procedures for the long-term | |||
credential mechanism <xref | credential mechanism <xref target="RFC8489" format="default"/>.</dd> | |||
target="I-D.ietf-tram-stunbis"></xref>.</t> | <dt>440 (Address Family not Supported):</dt> <dd>The server does not s | |||
upport | ||||
<t>440 (Address Family not Supported): The server does not support | ||||
the address family requested by the client. If the client receives | the address family requested by the client. If the client receives | |||
an Allocate error response with the 440 (Unsupported Address | an Allocate error response with the 440 (Address Family not | |||
Family) error code, the client MUST NOT retry the request.</t> | Supported) error code, the client <bcp14>MUST NOT</bcp14> retry the r | |||
equest.</dd> | ||||
<t>441 (Wrong Credentials): The client should not receive this | <dt>441 (Wrong Credentials):</dt> <dd>The client should not receive th | |||
error in response to a Allocate request. The client MAY notify the | is | |||
user or operator and SHOULD NOT retry the same request with this | error in response to an Allocate request. The client <bcp14>MAY</bcp | |||
server until it believes the problem has been fixed.</t> | 14> notify the | |||
user or operator and <bcp14>SHOULD NOT</bcp14> retry the same reques | ||||
<t>442 (Unsupported Transport Address): The client should not | t with this | |||
server until it believes the problem has been fixed.</dd> | ||||
<dt>442 (Unsupported Transport Address):</dt> <dd>The client should no | ||||
t | ||||
receive this error in response to a request for a UDP allocation. | receive this error in response to a request for a UDP allocation. | |||
The client MAY notify the user or operator and SHOULD NOT | The client <bcp14>MAY</bcp14> notify the user or operator and <bcp14 >SHOULD NOT</bcp14> | |||
reattempt the request with this server until it believes the | reattempt the request with this server until it believes the | |||
problem has been fixed.</t> | problem has been fixed.</dd> | |||
<dt>486 (Allocation Quota Reached):</dt> <dd>The server is currently u | ||||
<t>486 (Allocation Quota Reached): The server is currently unable | nable | |||
to create any more allocations with this username. The client | to create any more allocations with this username. The client | |||
considers the current transaction as having failed. The client | considers the current transaction as having failed. The client | |||
SHOULD wait at least 1 minute before trying to create any more | <bcp14>SHOULD</bcp14> wait at least 1 minute before trying to create | |||
allocations on the server.</t> | any more | |||
allocations on the server.</dd> | ||||
<t>508 (Insufficient Capacity): The server has no more relayed | <dt>508 (Insufficient Capacity):</dt> <dd> | |||
transport addresses available, or has none with the requested | ||||
properties, or the one that was reserved is no longer available. | ||||
The client considers the current operation as having failed. If | ||||
the client is using either the EVEN-PORT or the RESERVATION-TOKEN | ||||
attribute, then the client MAY choose to remove or modify this | ||||
attribute and try again immediately. Otherwise, the client SHOULD | ||||
wait at least 1 minute before trying to create any more | ||||
allocations on this server.</t> | ||||
</list></t> | ||||
The server has no more relayed transport addresses available or has | ||||
none with the requested properties, or the one that was reserved | ||||
is no longer available. The client considers the current | ||||
operation as having failed. If the client is using either the | ||||
EVEN-PORT or the RESERVATION-TOKEN attribute, then the client | ||||
<bcp14>MAY</bcp14> choose to remove or modify this attribute and | ||||
try again immediately. Otherwise, the client <bcp14>SHOULD</bcp14> | ||||
wait at least 1 minute before trying to create any more | ||||
allocations on this server.</dd> | ||||
</dl> | ||||
<t>Note that the error code values 486 and 508 indicate to a | <t>Note that the error code values 486 and 508 indicate to a | |||
eavesdropper that several other users are using the server at this | eavesdropper that several other users are using the server at this | |||
time, similar to that of the HTTP error response code 503, but does | time, similar to that of the HTTP error response code 503, but | |||
it does | ||||
not reveal any information about the users using the TURN server.</t> | not reveal any information about the users using the TURN server.</t> | |||
<t>An unknown error response <bcp14>MUST</bcp14> be handled as described | ||||
<t>An unknown error response MUST be handled as described in <xref | in <xref target="RFC8489" format="default"/>.</t> | |||
target="I-D.ietf-tram-stunbis"></xref>.</t> | ||||
</section> | </section> | |||
</section> | </section> | |||
<section anchor="sec-refreshing-allocation" numbered="true" toc="default"> | ||||
<section anchor="sec-refreshing-allocation" | <name>Refreshing an Allocation</name> | |||
title="Refreshing an Allocation"> | ||||
<t>A Refresh transaction can be used to either (a) refresh an existing | <t>A Refresh transaction can be used to either (a) refresh an existing | |||
allocation and update its time-to-expiry or (b) delete an existing | allocation and update its time-to-expiry or (b) delete an existing | |||
allocation.</t> | allocation.</t> | |||
<t>If a client wishes to continue using an allocation, then the client | <t>If a client wishes to continue using an allocation, then the client | |||
MUST refresh it before it expires. It is suggested that the client | <bcp14>MUST</bcp14> refresh it before it expires. It is suggested that the client | |||
refresh the allocation roughly 1 minute before it expires. If a client | refresh the allocation roughly 1 minute before it expires. If a client | |||
no longer wishes to use an allocation, then it SHOULD explicitly delete | no longer wishes to use an allocation, then it <bcp14>SHOULD</bcp14> expli | |||
the allocation. A client MAY refresh an allocation at any time for other | citly delete | |||
the allocation. A client <bcp14>MAY</bcp14> refresh an allocation at any t | ||||
ime for other | ||||
reasons.</t> | reasons.</t> | |||
<section title="Sending a Refresh Request"> | <section numbered="true" toc="default"> | |||
<name>Sending a Refresh Request</name> | ||||
<t>If the client wishes to immediately delete an existing allocation, | <t>If the client wishes to immediately delete an existing allocation, | |||
it includes a LIFETIME attribute with a value of 0. All other forms of | it includes a LIFETIME attribute with a value of zero. All other forms o f | |||
the request refresh the allocation.</t> | the request refresh the allocation.</t> | |||
<t>When refreshing a dual allocation, the client includes | <t>When refreshing a dual allocation, the client includes | |||
REQUESTED-ADDRESS-FAMILY attribute indicating the address family type | a REQUESTED-ADDRESS-FAMILY attribute indicating the address family type | |||
that should be refreshed. If no REQUESTED-ADDRESS-FAMILY is included | that should be refreshed. If no REQUESTED-ADDRESS-FAMILY attribute is in | |||
cluded, | ||||
then the request should be treated as applying to all current | then the request should be treated as applying to all current | |||
allocations. The client MUST only include a family type it previously | allocations. The client <bcp14>MUST</bcp14> only include a family type i t previously | |||
allocated and has not yet deleted. This process can also be used to | allocated and has not yet deleted. This process can also be used to | |||
delete an allocation of a specific address type, by setting the | delete an allocation of a specific address type by setting the | |||
lifetime of that refresh request to 0. Deleting a single allocation | lifetime of that Refresh request to zero. Deleting a single allocation | |||
destroys any permissions or channels associated with that particular | destroys any permissions or channels associated with that particular | |||
allocation; it MUST NOT affect any permissions or channels associated | allocation; it <bcp14>MUST NOT</bcp14> affect any permissions or channel s associated | |||
with allocations for the other address family.</t> | with allocations for the other address family.</t> | |||
<t>The Refresh transaction updates the time-to-expiry timer of an | <t>The Refresh transaction updates the time-to-expiry timer of an | |||
allocation. If the client wishes the server to set the time-to-expiry | allocation. If the client wishes the server to set the time-to-expiry | |||
timer to something other than the default lifetime, it includes a | timer to something other than the default lifetime, it includes a | |||
LIFETIME attribute with the requested value. The server then computes | LIFETIME attribute with the requested value. The server then computes | |||
a new time-to-expiry value in the same way as it does for an Allocate | a new time-to-expiry value in the same way as it does for an Allocate | |||
transaction, with the exception that a requested lifetime of 0 causes | transaction, with the exception that a requested lifetime of zero causes | |||
the server to immediately delete the allocation.</t> | the server to immediately delete the allocation.</t> | |||
</section> | </section> | |||
<section anchor="sec-rcv-refresh" numbered="true" toc="default"> | ||||
<section anchor="sec-rcv-refresh" title="Receiving a Refresh Request"> | <name>Receiving a Refresh Request</name> | |||
<t>When the server receives a Refresh request, it processes the | <t>When the server receives a Refresh request, it processes the | |||
request as per <xref target="sec-general-behavior"></xref> plus the | request as per <xref target="sec-general-behavior" format="default"/> pl us the | |||
specific rules mentioned here.</t> | specific rules mentioned here.</t> | |||
<t>If the server receives a Refresh Request with a | <t>If the server receives a Refresh Request with a | |||
REQUESTED-ADDRESS-FAMILY attribute and the attribute value does not | REQUESTED-ADDRESS-FAMILY attribute and the attribute value does not | |||
match the address family of the allocation, the server MUST reply with | match the address family of the allocation, the server <bcp14>MUST</bcp1 4> reply with | |||
a 443 (Peer Address Family Mismatch) Refresh error response.</t> | a 443 (Peer Address Family Mismatch) Refresh error response.</t> | |||
<t>The server computes a value called the "desired lifetime" as | <t>The server computes a value called the "desired lifetime" as | |||
follows: if the request contains a LIFETIME attribute and the | follows: if the request contains a LIFETIME attribute and the | |||
attribute value is 0, then the "desired lifetime" is 0. Otherwise, if | attribute value is zero, then the "desired lifetime" is zero. Otherwise, if | |||
the request contains a LIFETIME attribute, then the server computes | the request contains a LIFETIME attribute, then the server computes | |||
the minimum of the client's requested lifetime and the server's | the minimum of the client's requested lifetime and the server's | |||
maximum allowed lifetime. If this computed value is greater than the | maximum allowed lifetime. If this computed value is greater than the | |||
default lifetime, then the "desired lifetime" is the computed value. | default lifetime, then the "desired lifetime" is the computed value. | |||
Otherwise, the "desired lifetime" is the default lifetime.</t> | Otherwise, the "desired lifetime" is the default lifetime.</t> | |||
<t>Subsequent processing depends on the "desired lifetime" value:</t> | ||||
<t>Subsequent processing depends on the "desired lifetime" value:<list | <ul spacing="normal"> | |||
style="symbols"> | <li>If the "desired lifetime" is zero, then the request succeeds and | |||
<t>If the "desired lifetime" is 0, then the request succeeds and | the allocation is deleted.</li> | |||
the allocation is deleted.</t> | <li>If the "desired lifetime" is non-zero, then the request | |||
<t>If the "desired lifetime" is non-zero, then the request | ||||
succeeds and the allocation's time-to-expiry is set to the | succeeds and the allocation's time-to-expiry is set to the | |||
"desired lifetime".</t> | "desired lifetime".</li> | |||
</list>If the request succeeds, then the server sends a success | </ul> | |||
response containing:<list style="symbols"> | <t>If the request succeeds, then the server sends a success | |||
<t>A LIFETIME attribute containing the current value of the | response containing:</t> | |||
time-to-expiry timer.</t> | <ul spacing="normal"> | |||
</list></t> | <li>A LIFETIME attribute containing the current value of the | |||
time-to-expiry timer.</li> | ||||
<t></t> | </ul> | |||
<t><list> | <aside> | |||
<t>NOTE: A server need not do anything special to implement | <t>NOTE: A server need not do anything special to implement | |||
idempotency of Refresh requests over UDP using the "stateless | idempotency of Refresh requests over UDP using the "stateless | |||
stack approach". Retransmitted Refresh requests with a non-zero | stack approach". Retransmitted Refresh requests with a non-zero | |||
"desired lifetime" will simply refresh the allocation. A | "desired lifetime" will simply refresh the allocation. A | |||
retransmitted Refresh request with a zero "desired lifetime" will | retransmitted Refresh request with a zero "desired lifetime" will | |||
cause a 437 (Allocation Mismatch) response if the allocation has | cause a 437 (Allocation Mismatch) response if the allocation has | |||
already been deleted, but the client will treat this as equivalent | already been deleted, but the client will treat this as equivalent | |||
to a success response (see below).</t> | to a success response (see below).</t> | |||
</list></t> | </aside> | |||
</section> | </section> | |||
<section numbered="true" toc="default"> | ||||
<section title="Receiving a Refresh Response"> | <name>Receiving a Refresh Response</name> | |||
<t>If the client receives a success response to its Refresh request | <t>If the client receives a success response to its Refresh request | |||
with a non-zero lifetime, it updates its copy of the allocation data | with a non-zero lifetime, it updates its copy of the allocation data | |||
structure with the time-to-expiry value contained in the response. If | structure with the time-to-expiry value contained in the response. If | |||
the client receives a 437 (Allocation Mismatch) error response to its | the client receives a 437 (Allocation Mismatch) error response to its | |||
request to refresh the allocation, it should consider the allocation | request to refresh the allocation, it should consider the allocation | |||
no longer exists. If the client receives a 438 (Stale Nonce) error to | no longer exists. If the client receives a 438 (Stale Nonce) error to | |||
its request to refresh the allocation, it should reattempt the request | its request to refresh the allocation, it should reattempt the request | |||
with the new nonce value.</t> | with the new nonce value.</t> | |||
<t>If the client receives a 437 (Allocation Mismatch) error response | <t>If the client receives a 437 (Allocation Mismatch) error response | |||
to a request to delete the allocation, then the allocation no longer | to a request to delete the allocation, then the allocation no longer | |||
exists and it should consider its request as having effectively | exists and it should consider its request as having effectively | |||
succeeded.</t> | succeeded.</t> | |||
</section> | </section> | |||
</section> | </section> | |||
<section anchor="sec-permissions" numbered="true" toc="default"> | ||||
<section anchor="sec-permissions" title="Permissions"> | <name>Permissions</name> | |||
<t>For each allocation, the server keeps a list of zero or more | <t>For each allocation, the server keeps a list of zero or more | |||
permissions. Each permission consists of an IP address and an associated | permissions. Each permission consists of an IP address and an associated | |||
time-to-expiry. While a permission exists, all peers using the IP | time-to-expiry. While a permission exists, all peers using the IP | |||
address in the permission are allowed to send data to the client. The | address in the permission are allowed to send data to the client. The | |||
time-to-expiry is the number of seconds until the permission expires. | time-to-expiry is the number of seconds until the permission expires. | |||
Within the context of an allocation, a permission is uniquely identified | Within the context of an allocation, a permission is uniquely identified | |||
by its associated IP address.</t> | by its associated IP address.</t> | |||
<t>By sending either CreatePermission requests or ChannelBind requests, | <t>By sending either CreatePermission requests or ChannelBind requests, | |||
the client can cause the server to install or refresh a permission for a | the client can cause the server to install or refresh a permission for a | |||
given IP address. This causes one of two things to happen:<list | given IP address. This causes one of two things to happen:</t> | |||
style="symbols"> | <ul spacing="normal"> | |||
<t>If no permission for that IP address exists, then a permission is | <li>If no permission for that IP address exists, then a permission is | |||
created with the given IP address and a time-to-expiry equal to | created with the given IP address and a time-to-expiry equal to | |||
Permission Lifetime.</t> | Permission Lifetime.</li> | |||
<li>If a permission for that IP address already exists, then the | ||||
<t>If a permission for that IP address already exists, then the | ||||
time-to-expiry for that permission is reset to Permission | time-to-expiry for that permission is reset to Permission | |||
Lifetime.</t> | Lifetime.</li> | |||
</list>The Permission Lifetime MUST be 300 seconds (= 5 minutes).</t> | </ul> | |||
<t>The Permission Lifetime <bcp14>MUST</bcp14> be 300 seconds (= 5 minutes | ||||
<t>Each permission’s time-to-expiry decreases down once per second | ).</t> | |||
until it reaches 0; at which point, the permission expires and is | <t>Each permission's time-to-expiry decreases down once per second | |||
until it reaches zero, at which point, the permission expires and is | ||||
deleted.</t> | deleted.</t> | |||
<t>CreatePermission and ChannelBind requests may be freely intermixed on | <t>CreatePermission and ChannelBind requests may be freely intermixed on | |||
a permission. A given permission may be initially installed and/or | a permission. A given permission may be initially installed and/or | |||
refreshed with a CreatePermission request, and then later refreshed with | refreshed with a CreatePermission request and then later refreshed with | |||
a ChannelBind request, or vice versa.</t> | a ChannelBind request, or vice versa.</t> | |||
<t>When a UDP datagram arrives at the relayed transport address for the | <t>When a UDP datagram arrives at the relayed transport address for the | |||
allocation, the server extracts the source IP address from the IP | allocation, the server extracts the source IP address from the IP | |||
header. The server then compares this address with the IP address | header. The server then compares this address with the IP address | |||
associated with each permission in the list of permissions for the | associated with each permission in the list of permissions for the | |||
allocation. Note that only addresses are compared and port numbers are | allocation. Note that only addresses are compared and port numbers are | |||
not considered. If no match is found, relaying is not permitted, and the | not considered. If no match is found, relaying is not permitted and the | |||
server silently discards the UDP datagram. If an exact match is found, | server silently discards the UDP datagram. If an exact match is found, | |||
the permission check is considered to have succeeded and the server | the permission check is considered to have succeeded and the server | |||
continues to process the UDP datagram as specified elsewhere (<xref | continues to process the UDP datagram as specified elsewhere (<xref target | |||
target="sec-sending-data-indication"></xref>).</t> | ="sec-sending-data-indication" format="default"/>).</t> | |||
<t>The permissions for one allocation are totally unrelated to the | <t>The permissions for one allocation are totally unrelated to the | |||
permissions for a different allocation. If an allocation expires, all | permissions for a different allocation. If an allocation expires, all | |||
its permissions expire with it.</t> | its permissions expire with it.</t> | |||
<aside> | ||||
<t><list> | <t>NOTE: Though TURN permissions expire after 5 minutes, many NATs | |||
<t>NOTE: Though TURN permissions expire after 5 minutes, many NATs | ||||
deployed at the time of publication expire their UDP bindings | deployed at the time of publication expire their UDP bindings | |||
considerably faster. Thus, an application using TURN will probably | considerably faster. Thus, an application using TURN will probably | |||
wish to send some sort of keep-alive traffic at a much faster rate. | wish to send some sort of keep-alive traffic at a much faster rate. | |||
Applications using ICE should follow the keep-alive guidelines of | Applications using ICE should follow the keep-alive guidelines of | |||
ICE <xref target="RFC8445"></xref>, and applications not using ICE | ICE <xref target="RFC8445" format="default"/>, and applications not us ing ICE | |||
are advised to do something similar.</t> | are advised to do something similar.</t> | |||
</list></t> | </aside> | |||
</section> | </section> | |||
<section numbered="true" toc="default"> | ||||
<section title="CreatePermission"> | <name>CreatePermission</name> | |||
<t>TURN supports two ways for the client to install or refresh | <t>TURN supports two ways for the client to install or refresh | |||
permissions on the server. This section describes one way: the | permissions on the server. This section describes one way: the | |||
CreatePermission request.</t> | CreatePermission request.</t> | |||
<t>A CreatePermission request may be used in conjunction with either the | <t>A CreatePermission request may be used in conjunction with either the | |||
Send mechanism in <xref target="sec-sendanddata"></xref> or the Channel | Send mechanism in <xref target="sec-sendanddata" format="default"/> or the | |||
mechanism in <xref target="sec-channels"></xref>.</t> | Channel | |||
mechanism in <xref target="sec-channels" format="default"/>.</t> | ||||
<section title="Forming a CreatePermission Request"> | <section numbered="true" toc="default"> | |||
<name>Forming a CreatePermission Request</name> | ||||
<t>The client who wishes to install or refresh one or more permissions | <t>The client who wishes to install or refresh one or more permissions | |||
can send a CreatePermission request to the server.</t> | can send a CreatePermission request to the server.</t> | |||
<t>When forming a CreatePermission request, the client <bcp14>MUST</bcp1 | ||||
<t>When forming a CreatePermission request, the client MUST include at | 4> include at | |||
least one XOR-PEER-ADDRESS attribute, and MAY include more than one | least one XOR-PEER-ADDRESS attribute and <bcp14>MAY</bcp14> include more | |||
than one | ||||
such attribute. The IP address portion of each XOR-PEER-ADDRESS | such attribute. The IP address portion of each XOR-PEER-ADDRESS | |||
attribute contains the IP address for which a permission should be | attribute contains the IP address for which a permission should be | |||
installed or refreshed. The port portion of each XOR-PEER-ADDRESS | installed or refreshed. The port portion of each XOR-PEER-ADDRESS | |||
attribute will be ignored and can be any arbitrary value. The various | attribute will be ignored and can be any arbitrary value. The various | |||
XOR-PEER-ADDRESS attributes MAY appear in any order. The client MUST | XOR-PEER-ADDRESS attributes <bcp14>MAY</bcp14> appear in any order. The client <bcp14>MUST</bcp14> | |||
only include XOR-PEER-ADDRESS attributes with addresses of the same | only include XOR-PEER-ADDRESS attributes with addresses of the same | |||
address family as that of the relayed transport address for the | address family as that of the relayed transport address for the | |||
allocation. For dual allocations obtained using the | allocation. For dual allocations obtained using the | |||
ADDITIONAL-ADDRESS-FAMILY attribute, the client MAY include | ADDITIONAL-ADDRESS-FAMILY attribute, the client <bcp14>MAY</bcp14> inclu de | |||
XOR-PEER-ADDRESS attributes with addresses of IPv4 and IPv6 address | XOR-PEER-ADDRESS attributes with addresses of IPv4 and IPv6 address | |||
families.</t> | families.</t> | |||
</section> | </section> | |||
<section numbered="true" toc="default"> | ||||
<section title="Receiving a CreatePermission Request"> | <name>Receiving a CreatePermission Request</name> | |||
<t>When the server receives the CreatePermission request, it processes | <t>When the server receives the CreatePermission request, it processes | |||
as per <xref target="sec-general-behavior"></xref> plus the specific | as per <xref target="sec-general-behavior" format="default"/> plus the s pecific | |||
rules mentioned here.</t> | rules mentioned here.</t> | |||
<t>The message is checked for validity. The CreatePermission request | <t>The message is checked for validity. The CreatePermission request | |||
MUST contain at least one XOR-PEER-ADDRESS attribute and MAY contain | <bcp14>MUST</bcp14> contain at least one XOR-PEER-ADDRESS attribute and <bcp14>MAY</bcp14> contain | |||
multiple such attributes. If no such attribute exists, or if any of | multiple such attributes. If no such attribute exists, or if any of | |||
these attributes are invalid, then a 400 (Bad Request) error is | these attributes are invalid, then a 400 (Bad Request) error is | |||
returned. If the request is valid, but the server is unable to satisfy | returned. If the request is valid, but the server is unable to satisfy | |||
the request due to some capacity limit or similar, then a 508 | the request due to some capacity limit or similar, then a 508 | |||
(Insufficient Capacity) error is returned.</t> | (Insufficient Capacity) error is returned.</t> | |||
<t>If an XOR-PEER-ADDRESS attribute contains an address of an address | <t>If an XOR-PEER-ADDRESS attribute contains an address of an address | |||
family that is not the same as that of a relayed transport address for | family that is not the same as that of a relayed transport address for | |||
the allocation, the server MUST generate an error response with the | the allocation, the server <bcp14>MUST</bcp14> generate an error respons e with the | |||
443 (Peer Address Family Mismatch) response code.</t> | 443 (Peer Address Family Mismatch) response code.</t> | |||
<t>The server <bcp14>MAY</bcp14> impose restrictions on the IP address a | ||||
<t>The server MAY impose restrictions on the IP address allowed in the | llowed in the | |||
XOR-PEER-ADDRESS attribute -- if a value is not allowed, the server | XOR-PEER-ADDRESS attribute; if a value is not allowed, the server | |||
rejects the request with a 403 (Forbidden) error.</t> | rejects the request with a 403 (Forbidden) error.</t> | |||
<t>If the message is valid and the server is capable of carrying out | <t>If the message is valid and the server is capable of carrying out | |||
the request, then the server installs or refreshes a permission for | the request, then the server installs or refreshes a permission for | |||
the IP address contained in each XOR-PEER-ADDRESS attribute as | the IP address contained in each XOR-PEER-ADDRESS attribute as | |||
described in <xref target="sec-permissions"></xref>. The port portion | described in <xref target="sec-permissions" format="default"/>. The port portion | |||
of each attribute is ignored and may be any arbitrary value.</t> | of each attribute is ignored and may be any arbitrary value.</t> | |||
<t>The server then responds with a CreatePermission success response. | <t>The server then responds with a CreatePermission success response. | |||
There are no mandatory attributes in the success response.</t> | There are no mandatory attributes in the success response.</t> | |||
<aside> | ||||
<t><list> | <t>NOTE: A server need not do anything special to implement | |||
<t>NOTE: A server need not do anything special to implement | ||||
idempotency of CreatePermission requests over UDP using the | idempotency of CreatePermission requests over UDP using the | |||
"stateless stack approach". Retransmitted CreatePermission | "stateless stack approach". Retransmitted CreatePermission | |||
requests will simply refresh the permissions.</t> | requests will simply refresh the permissions.</t> | |||
</list></t> | </aside> | |||
</section> | </section> | |||
<section numbered="true" toc="default"> | ||||
<section title="Receiving a CreatePermission Response"> | <name>Receiving a CreatePermission Response</name> | |||
<t>If the client receives a valid CreatePermission success response, | <t>If the client receives a valid CreatePermission success response, | |||
then the client updates its data structures to indicate that the | then the client updates its data structures to indicate that the | |||
permissions have been installed or refreshed.</t> | permissions have been installed or refreshed.</t> | |||
</section> | </section> | |||
</section> | </section> | |||
<section anchor="sec-sendanddata" numbered="true" toc="default"> | ||||
<section anchor="sec-sendanddata" title="Send and Data Methods"> | <name>Send and Data Methods</name> | |||
<t>TURN supports two mechanisms for sending and receiving data from | <t>TURN supports two mechanisms for sending and receiving data from | |||
peers. This section describes the use of the Send and Data mechanisms, | peers. This section describes the use of the Send and Data mechanisms, | |||
while <xref target="sec-channels"></xref> describes the use of the | while <xref target="sec-channels" format="default"/> describes the use of the | |||
Channel mechanism.</t> | Channel mechanism.</t> | |||
<section anchor="sec-forming-indication" numbered="true" toc="default"> | ||||
<section anchor="sec-forming-indication" | <name>Forming a Send Indication</name> | |||
title="Forming a Send Indication"> | ||||
<t>The client can use a Send indication to pass data to the server for | <t>The client can use a Send indication to pass data to the server for | |||
relaying to a peer. A client may use a Send indication even if a | relaying to a peer. A client may use a Send indication even if a | |||
channel is bound to that peer. However, the client MUST ensure that | channel is bound to that peer. However, the client <bcp14>MUST</bcp14> e nsure that | |||
there is a permission installed for the IP address of the peer to | there is a permission installed for the IP address of the peer to | |||
which the Send indication is being sent; this prevents a third party | which the Send indication is being sent; this prevents a third party | |||
from using a TURN server to send data to arbitrary destinations.</t> | from using a TURN server to send data to arbitrary destinations.</t> | |||
<t>When forming a Send indication, the client <bcp14>MUST</bcp14> includ | ||||
<t>When forming a Send indication, the client MUST include an | e an | |||
XOR-PEER-ADDRESS attribute and a DATA attribute. The XOR-PEER-ADDRESS | XOR-PEER-ADDRESS attribute and a DATA attribute. The XOR-PEER-ADDRESS | |||
attribute contains the transport address of the peer to which the data | attribute contains the transport address of the peer to which the data | |||
is to be sent, and the DATA attribute contains the actual application | is to be sent, and the DATA attribute contains the actual application | |||
data to be sent to the peer.</t> | data to be sent to the peer.</t> | |||
<t>The client <bcp14>MAY</bcp14> include a DONT-FRAGMENT attribute in th | ||||
<t>The client MAY include a DONT-FRAGMENT attribute in the Send | e Send | |||
indication if it wishes the server to set the DF bit on the UDP | indication if it wishes the server to set the DF bit on the UDP | |||
datagram sent to the peer.</t> | datagram sent to the peer.</t> | |||
</section> | </section> | |||
<section numbered="true" toc="default"> | ||||
<section title="Receiving a Send Indication"> | <name>Receiving a Send Indication</name> | |||
<t>When the server receives a Send indication, it processes as per | <t>When the server receives a Send indication, it processes as per | |||
<xref target="sec-general-behavior"></xref> plus the specific rules | <xref target="sec-general-behavior" format="default"/> plus the specific rules | |||
mentioned here.</t> | mentioned here.</t> | |||
<t>The message is first checked for validity. The Send indication <bcp14 | ||||
<t>The message is first checked for validity. The Send indication MUST | >MUST</bcp14> | |||
contain both an XOR-PEER-ADDRESS attribute and a DATA attribute. If | contain both an XOR-PEER-ADDRESS attribute and a DATA attribute. If | |||
one of these attributes is missing or invalid, then the message is | one of these attributes is missing or invalid, then the message is | |||
discarded. Note that the DATA attribute is allowed to contain zero | discarded. Note that the DATA attribute is allowed to contain zero | |||
bytes of data.</t> | bytes of data.</t> | |||
<t>The Send indication may also contain the DONT-FRAGMENT attribute. | <t>The Send indication may also contain the DONT-FRAGMENT attribute. | |||
If the server is unable to set the DF bit on outgoing UDP datagrams | If the server is unable to set the DF bit on outgoing UDP datagrams | |||
when this attribute is present, then the server acts as if the | when this attribute is present, then the server acts as if the | |||
DONT-FRAGMENT attribute is an unknown comprehension-required attribute | DONT-FRAGMENT attribute is an unknown comprehension-required attribute | |||
(and thus the Send indication is discarded).</t> | (and thus the Send indication is discarded).</t> | |||
<t>The server also checks that there is a permission installed for the | <t>The server also checks that there is a permission installed for the | |||
IP address contained in the XOR-PEER-ADDRESS attribute. If no such | IP address contained in the XOR-PEER-ADDRESS attribute. If no such | |||
permission exists, the message is discarded. Note that a Send | permission exists, the message is discarded. Note that a Send | |||
indication never causes the server to refresh the permission.</t> | indication never causes the server to refresh the permission.</t> | |||
<t>The server <bcp14>MAY</bcp14> impose restrictions on the IP address a | ||||
<t>The server MAY impose restrictions on the IP address and port | nd port | |||
values allowed in the XOR-PEER-ADDRESS attribute -- if a value is not | values allowed in the XOR-PEER-ADDRESS attribute; if a value is not | |||
allowed, the server silently discards the Send indication.</t> | allowed, the server silently discards the Send indication.</t> | |||
<t>If everything is OK, then the server forms a UDP datagram as | <t>If everything is OK, then the server forms a UDP datagram as | |||
follows:<list style="symbols"> | follows:</t> | |||
<t>the source transport address is the relayed transport address | <ul spacing="normal"> | |||
<li>the source transport address is the relayed transport address | ||||
of the allocation, where the allocation is determined by the | of the allocation, where the allocation is determined by the | |||
5-tuple on which the Send indication arrived;</t> | 5-tuple on which the Send indication arrived;</li> | |||
<li>the destination transport address is taken from the | ||||
<t>the destination transport address is taken from the | XOR-PEER-ADDRESS attribute;</li> | |||
XOR-PEER-ADDRESS attribute;</t> | <li>the data following the UDP header is the contents of the value | |||
field of the DATA attribute.</li> | ||||
<t>the data following the UDP header is the contents of the value | </ul> | |||
field of the DATA attribute.</t> | ||||
</list></t> | ||||
<t>The handling of the DONT-FRAGMENT attribute (if present), is | <t>The handling of the DONT-FRAGMENT attribute (if present), is | |||
described in <xref target="sec-ip-header-fields"></xref> and <xref | described in Sections <xref target="sec-ip-header-fields" format="counte | |||
target="sec-ip-header-fields-tcp-udp"></xref>.</t> | r"/> and <xref target="sec-ip-header-fields-tcp-udp" format="counter"/>.</t> | |||
<t>The resulting UDP datagram is then sent to the peer.</t> | <t>The resulting UDP datagram is then sent to the peer.</t> | |||
</section> | </section> | |||
<section anchor="sec-sending-data-indication" numbered="true" toc="default | ||||
<section anchor="sec-sending-data-indication" | "> | |||
title="Receiving a UDP Datagram"> | <name>Receiving a UDP Datagram</name> | |||
<t>When the server receives a UDP datagram at a currently allocated | <t>When the server receives a UDP datagram at a currently allocated | |||
relayed transport address, the server looks up the allocation | relayed transport address, the server looks up the allocation | |||
associated with the relayed transport address. The server then checks | associated with the relayed transport address. The server then checks | |||
to see whether the set of permissions for the allocation allow the | to see whether the set of permissions for the allocation allow the | |||
relaying of the UDP datagram as described in <xref | relaying of the UDP datagram as described in <xref target="sec-permissio | |||
target="sec-permissions"></xref>.</t> | ns" format="default"/>.</t> | |||
<t>If relaying is permitted, then the server checks if there is a | <t>If relaying is permitted, then the server checks if there is a | |||
channel bound to the peer that sent the UDP datagram (see <xref | channel bound to the peer that sent the UDP datagram (see <xref target=" | |||
target="sec-channels"></xref>). If a channel is bound, then processing | sec-channels" format="default"/>). If a channel is bound, then processing | |||
proceeds as described in <xref | proceeds as described in <xref target="sec-channel-relaying" format="def | |||
target="sec-channel-relaying"></xref>.</t> | ault"/>.</t> | |||
<t>If relaying is permitted but no channel is bound to the peer, then | <t>If relaying is permitted but no channel is bound to the peer, then | |||
the server forms and sends a Data indication. The Data indication MUST | the server forms and sends a Data indication. The Data indication <bcp14 >MUST</bcp14> | |||
contain both an XOR-PEER-ADDRESS and a DATA attribute. The DATA | contain both an XOR-PEER-ADDRESS and a DATA attribute. The DATA | |||
attribute is set to the value of the ‘data octets’ field | attribute is set to the value of the "data octets" field | |||
from the datagram, and the XOR-PEER-ADDRESS attribute is set to the | from the datagram, and the XOR-PEER-ADDRESS attribute is set to the | |||
source transport address of the received UDP datagram. The Data | source transport address of the received UDP datagram. The Data | |||
indication is then sent on the 5-tuple associated with the | indication is then sent on the 5-tuple associated with the | |||
allocation.</t> | allocation.</t> | |||
</section> | </section> | |||
<section numbered="true" toc="default"> | ||||
<section title="Receiving a Data Indication"> | <name>Receiving a Data Indication</name> | |||
<t>When the client receives a Data indication, it checks that the Data | <t>When the client receives a Data indication, it checks that the Data | |||
indication contains an XOR-PEER-ADDRESS attribute, and discards the | indication contains an XOR-PEER-ADDRESS attribute and discards the | |||
indication if it does not. The client SHOULD also check that the | indication if it does not. The client <bcp14>SHOULD</bcp14> also check t | |||
hat the | ||||
XOR-PEER-ADDRESS attribute value contains an IP address with which the | XOR-PEER-ADDRESS attribute value contains an IP address with which the | |||
client believes there is an active permission, and discard the Data | client believes there is an active permission and discard the Data | |||
indication otherwise.</t> | indication otherwise.</t> | |||
<aside> | ||||
<t><list> | <t>NOTE: The latter check protects the client against an attacker | |||
<t>NOTE: The latter check protects the client against an attacker | ||||
who somehow manages to trick the server into installing | who somehow manages to trick the server into installing | |||
permissions not desired by the client.</t> | permissions not desired by the client.</t> | |||
</list></t> | </aside> | |||
<t>If the XOR-PEER-ADDRESS is present and valid, the client checks | <t>If the XOR-PEER-ADDRESS is present and valid, the client checks | |||
that the Data indication contains either a DATA attribute or an ICMP | that the Data indication contains either a DATA attribute or an ICMP | |||
attribute and discards the indication if it does not. Note that a DATA | attribute and discards the indication if it does not. Note that a DATA | |||
attribute is allowed to contain zero bytes of data. Processing of Data | attribute is allowed to contain zero bytes of data. Processing of Data | |||
indications with an ICMP attribute is described in <xref | indications with an ICMP attribute is described in <xref target="receive | |||
target="receive-senderror"></xref>.</t> | -senderror" format="default"/>.</t> | |||
<t>If the Data indication passes the above checks, the client delivers | <t>If the Data indication passes the above checks, the client delivers | |||
the data octets inside the DATA attribute to the application, along | the data octets inside the DATA attribute to the application, along | |||
with an indication that they were received from the peer whose | with an indication that they were received from the peer whose | |||
transport address is given by the XOR-PEER-ADDRESS attribute.</t> | transport address is given by the XOR-PEER-ADDRESS attribute.</t> | |||
</section> | </section> | |||
<section anchor="sec-sending-senderror-indication" numbered="true" toc="de | ||||
<section anchor="sec-sending-senderror-indication" | fault"> | |||
title="Receiving an ICMP Packet"> | <name>Receiving an ICMP Packet</name> | |||
<t>When the server receives an ICMP packet, the server verifies that | <t>When the server receives an ICMP packet, the server verifies that | |||
the type is either 3 or 11 for an ICMPv4 <xref | the type is either 3 or 11 for an ICMPv4 <xref target="RFC0792" format=" | |||
target="RFC0792"></xref> packet or either 1, 2, or 3 for an ICMPv6 | default"/> packet or either 1, 2, or 3 for an ICMPv6 | |||
<xref target="RFC4443"></xref> packet. It also verifies that the IP | <xref target="RFC4443" format="default"/> packet. It also verifies that | |||
the IP | ||||
packet in the ICMP packet payload contains a UDP header. If either of | packet in the ICMP packet payload contains a UDP header. If either of | |||
these conditions fail, then the ICMP packet is silently dropped. If a | these conditions fail, then the ICMP packet is silently dropped. If a | |||
UDP header is present, the server extracts the source and destination | UDP header is present, the server extracts the source and destination | |||
IP address and UDP port information.</t> | IP address and UDP port information.</t> | |||
<t>The server looks up the allocation whose relayed transport address | <t>The server looks up the allocation whose relayed transport address | |||
corresponds to the encapsulated packet's source IP address and UDP | corresponds to the encapsulated packet's source IP address and UDP | |||
port. If no such allocation exists, the packet is silently dropped. | port. If no such allocation exists, the packet is silently dropped. | |||
The server then checks to see whether the set of permissions for the | The server then checks to see whether the set of permissions for the | |||
allocation allows the relaying of the ICMP packet. For ICMP packets, | allocation allows the relaying of the ICMP packet. For ICMP packets, | |||
the source IP address MUST NOT be checked against the permissions list | the source IP address <bcp14>MUST NOT</bcp14> be checked against the per missions list | |||
as it would be for UDP packets. Instead, the server extracts the | as it would be for UDP packets. Instead, the server extracts the | |||
destination IP address from the encapsulated IP header. The server | destination IP address from the encapsulated IP header. The server | |||
then compares this address with the IP address associated with each | then compares this address with the IP address associated with each | |||
permission in the list of permissions for the allocation. If no match | permission in the list of permissions for the allocation. If no match | |||
is found, relaying is not permitted, and the server silently discards | is found, relaying is not permitted and the server silently discards | |||
the ICMP packet. Note that only addresses are compared and port | the ICMP packet. Note that only addresses are compared and port | |||
numbers are not considered.</t> | numbers are not considered.</t> | |||
<t>If relaying is permitted, then the server forms and sends a Data | ||||
<t>If relaying is permitted then the server forms and sends a Data | indication. The Data indication <bcp14>MUST</bcp14> contain both an XOR- | |||
indication. The Data indication MUST contain both an XOR-PEER-ADDRESS | PEER-ADDRESS | |||
and an ICMP attribute. The ICMP attribute is set to the value of the | and an ICMP attribute. The ICMP attribute is set to the value of the | |||
type and code fields from the ICMP packet. The IP address portion of | type and code fields from the ICMP packet. The IP address portion of | |||
XOR-PEER-ADDRESS attribute is set to the destination IP address in the | XOR-PEER-ADDRESS attribute is set to the destination IP address in the | |||
encapsulated IP header. At the time of writing of this specification, | encapsulated IP header. At the time of writing of this specification, | |||
Socket APIs on some operating systems do not deliver the destination | Socket APIs on some operating systems do not deliver the destination | |||
port in the encapsulated UDP header to applications without superuser | port in the encapsulated UDP header to applications without superuser | |||
privileges. If destination port in the encapsulated UDP header is | privileges. If destination port in the encapsulated UDP header is | |||
available to the server then the port portion of XOR-PEER-ADDRESS | available to the server, then the port portion of the XOR-PEER-ADDRESS | |||
attribute is set to the destination port otherwise the port portion is | attribute is set to the destination port; otherwise, the port portion is | |||
set to 0. The Data indication is then sent on the 5-tuple associated | set to zero. The Data indication is then sent on the 5-tuple associated | |||
with the allocation.</t> | with the allocation.</t> | |||
<aside> | ||||
<t>Implementation Note: New ICMP types or codes can be defined in | <t>Implementation Note: New ICMP types or codes can be defined in | |||
future specifications. If the server receives an ICMP error packet, | future specifications. If the server receives an ICMP error packet, | |||
and the new type or code field can help the client to make use of the | and the new type or code field can help the client to make use of the | |||
ICMP error notification and generate feedback to the application | ICMP error notification and generate feedback to the application | |||
layer, the server sends the Data indication with an ICMP attribute | layer, the server sends the Data indication with an ICMP attribute | |||
conveying the new ICMP type or code.</t> | conveying the new ICMP type or code.</t></aside> | |||
</section> | </section> | |||
<section anchor="receive-senderror" numbered="true" toc="default"> | ||||
<section anchor="receive-senderror" | <name>Receiving a Data Indication with an ICMP Attribute</name> | |||
title="Receiving a Data Indication with an ICMP attribute"> | ||||
<t>When the client receives a Data indication with an ICMP attribute, | <t>When the client receives a Data indication with an ICMP attribute, | |||
it checks that the Data indication contains an XOR-PEER-ADDRESS | it checks that the Data indication contains an XOR-PEER-ADDRESS | |||
attribute, and discards the indication if it does not. The client | attribute and discards the indication if it does not. The client | |||
SHOULD also check that the XOR-PEER-ADDRESS attribute value contains | <bcp14>SHOULD</bcp14> also check that the XOR-PEER-ADDRESS attribute val | |||
an IP address with an active permission, and discard the Data | ue contains | |||
an IP address with an active permission and discard the Data | ||||
indication otherwise.</t> | indication otherwise.</t> | |||
<t>If the Data indication passes the above checks, the client signals | <t>If the Data indication passes the above checks, the client signals | |||
the application of the error condition, along with an indication that | the application of the error condition along with an indication that | |||
it was received from the peer whose transport address is given by the | it was received from the peer whose transport address is given by the | |||
XOR-PEER-ADDRESS attribute. The application can make sense of the | XOR-PEER-ADDRESS attribute. The application can make sense of the | |||
meaning of the type and code values in the ICMP attribute by using the | meaning of the type and code values in the ICMP attribute by using the | |||
family field in the XOR-PEER-ADDRESS attribute.</t> | family field in the XOR-PEER-ADDRESS attribute.</t> | |||
</section> | </section> | |||
</section> | </section> | |||
<!-- Sending and Receiving Data --> | <section anchor="sec-channels" numbered="true" toc="default"> | |||
<name>Channels</name> | ||||
<section anchor="sec-channels" title="Channels"> | ||||
<t>Channels provide a way for the client and server to send application | <t>Channels provide a way for the client and server to send application | |||
data using ChannelData messages, which have less overhead than Send and | data using ChannelData messages, which have less overhead than Send and | |||
Data indications.</t> | Data indications.</t> | |||
<t>The ChannelData message (see <xref target="sec-channeldata-msg" format= | ||||
<t>The ChannelData message (see <xref | "default"/>) starts with a two-byte field that | |||
target="sec-channeldata-msg"></xref>) starts with a two-byte field that | ||||
carries the channel number. The values of this field are allocated as | carries the channel number. The values of this field are allocated as | |||
follows:<list style="empty"> | follows:</t> | |||
<t>0x0000 through 0x3FFF: These values can never be used for channel | ||||
numbers.</t> | ||||
<t>0x4000 through 0x4FFF: These values are the allowed channel | <table anchor="channels"> | |||
numbers (4096 possible values).</t> | ||||
<t>0x5000-0xFFFF: Reserved (For DTLS-SRTP multiplexing collision | <tbody> | |||
avoidance, see <xref target="RFC7983"></xref>.</t> | <tr> | |||
</list></t> | <td>0x0000 through 0x3FFF:</td> | |||
<td>These values can never be used for channel numbers.</td> | ||||
</tr> | ||||
<tr> | ||||
<td>0x4000 through 0x4FFF:</td> | ||||
<td>These values are the allowed channel numbers (4096 possible values).</ | ||||
td> | ||||
</tr> | ||||
<tr> | ||||
<td>0x5000 through 0xFFFF:</td> | ||||
<td>Reserved (For DTLS-SRTP multiplexing collision avoidance, see <xref | ||||
target="RFC7983" format="default"/>).</td> | ||||
</tr> | ||||
</tbody> | ||||
</table> | ||||
<t>Note that the channel number range is not backwards compatible with | <t>Note that the channel number range is not backwards compatible with | |||
<xref target="RFC5766"></xref>, which could prevent an RFC5766-compliant | <xref target="RFC5766" format="default"/>, which could prevent a client | |||
client from establishing channel bindings with a TURN server that | compliant with RFC 5766 from establishing channel bindings with a | |||
complies with this specification. .</t> | TURN server that complies with this specification.</t> | |||
<t>According to <xref target="RFC7983" format="default"/>, ChannelData mes | ||||
<t>According to <xref target="RFC7983"></xref>, ChannelData messages can | sages can | |||
be distinguished from other multiplexed protocols by examining the first | be distinguished from other multiplexed protocols by examining the first | |||
byte of the message:</t> | byte of the message:</t> | |||
<t><figure anchor="fig-demultiplexing"> | <table anchor="fig-demultiplexing"> | |||
<artwork><![CDATA[+------------+------------------------------+ | ||||
| [0..3] | STUN | | <tbody> | |||
| | | | <tr> | |||
+-------------------------------------------+ | <td align="left">[0..3]</td> | |||
| [16..19] | ZRTP | | <td align="center">STUN</td> | |||
| | | | ||||
+-------------------------------------------+ | </tr> | |||
| [20..63] | DTLS | | <tr> | |||
| | | | <td align="left">[16..19]</td> | |||
+-------------------------------------------+ | <td align="center">ZRTP</td> | |||
| [64..79] | TURN Channel | | ||||
| | | | </tr> | |||
+-------------------------------------------+ | <tr> | |||
| [128..191] | RTP/RTCP | | <td align="left">[20..63]</td> | |||
| | | | <td align="center">DTLS</td> | |||
+-------------------------------------------+ | ||||
| Others | Reserved, MUST be dropped | | </tr> | |||
| | and an alert MAY be logged | | <tr> | |||
+-------------------------------------------+ | <td align="left">[64..79]</td> | |||
]]></artwork> | <td align="center">TURN Channel</td> | |||
</figure></t> | ||||
</tr> | ||||
<tr> | ||||
<td align="left">[128..191]</td> | ||||
<td align="center">RTP/RTCP</td> | ||||
</tr> | ||||
<tr> | ||||
<td align="left">Others</td> | ||||
<td align="center">Reserved; <bcp14>MUST</bcp14> be dropped and an alert | ||||
<bcp14>MAY</bcp14> be logged</td> | ||||
</tr> | ||||
</tbody> | ||||
</table> | ||||
<t>Reserved values may be used in the future by other protocols. When | <t>Reserved values may be used in the future by other protocols. When | |||
the client uses channel binding, it MUST comply with the demultiplexing | the client uses channel binding, it <bcp14>MUST</bcp14> comply with the de multiplexing | |||
scheme discussed above.</t> | scheme discussed above.</t> | |||
<t>Channel bindings are always initiated by the client. The client can | <t>Channel bindings are always initiated by the client. The client can | |||
bind a channel to a peer at any time during the lifetime of the | bind a channel to a peer at any time during the lifetime of the | |||
allocation. The client may bind a channel to a peer before exchanging | allocation. The client may bind a channel to a peer before exchanging | |||
data with it, or after exchanging data with it (using Send and Data | data with it or after exchanging data with it (using Send and Data | |||
indications) for some time, or may choose never to bind a channel to it. | indications) for some time, or may choose never to bind a channel to it. | |||
The client can also bind channels to some peers while not binding | The client can also bind channels to some peers while not binding | |||
channels to other peers.</t> | channels to other peers.</t> | |||
<t>Channel bindings are specific to an allocation so that the use of a | ||||
<t>Channel bindings are specific to an allocation, so that the use of a | ||||
channel number or peer transport address in a channel binding in one | channel number or peer transport address in a channel binding in one | |||
allocation has no impact on their use in a different allocation. If an | allocation has no impact on their use in a different allocation. If an | |||
allocation expires, all its channel bindings expire with it.</t> | allocation expires, all its channel bindings expire with it.</t> | |||
<t>A channel binding consists of:</t> | ||||
<t>A channel binding consists of:<list style="symbols"> | <ul spacing="normal"> | |||
<t>a channel number;</t> | <li>a channel number;</li> | |||
<li>a transport address (of the peer); and</li> | ||||
<t>a transport address (of the peer); and</t> | <li>A time-to-expiry timer.</li> | |||
</ul> | ||||
<t>A time-to-expiry timer.</t> | <t>Within the context of an allocation, a channel binding is | |||
</list>Within the context of an allocation, a channel binding is | ||||
uniquely identified either by the channel number or by the peer's | uniquely identified either by the channel number or by the peer's | |||
transport address. Thus, the same channel cannot be bound to two | transport address. Thus, the same channel cannot be bound to two | |||
different transport addresses, nor can the same transport address be | different transport addresses, nor can the same transport address be | |||
bound to two different channels.</t> | bound to two different channels.</t> | |||
<t>A channel binding lasts for 10 minutes unless refreshed. Refreshing | <t>A channel binding lasts for 10 minutes unless refreshed. Refreshing | |||
the binding (by the server receiving a ChannelBind request rebinding the | the binding (by the server receiving a ChannelBind request rebinding the | |||
channel to the same peer) resets the time-to-expiry timer back to 10 | channel to the same peer) resets the time-to-expiry timer back to 10 | |||
minutes.</t> | minutes.</t> | |||
<t>When the channel binding expires, the channel becomes unbound. Once | <t>When the channel binding expires, the channel becomes unbound. Once | |||
unbound, the channel number can be bound to a different transport | unbound, the channel number can be bound to a different transport | |||
address, and the transport address can be bound to a different channel | address, and the transport address can be bound to a different channel | |||
number. To prevent race conditions, the client MUST wait 5 minutes after | number. To prevent race conditions, the client <bcp14>MUST</bcp14> wait 5 minutes after | |||
the channel binding expires before attempting to bind the channel number | the channel binding expires before attempting to bind the channel number | |||
to a different transport address or the transport address to a different | to a different transport address or the transport address to a different | |||
channel number.</t> | channel number.</t> | |||
<t>When binding a channel to a peer, the client <bcp14>SHOULD</bcp14> be p | ||||
<t>When binding a channel to a peer, the client SHOULD be prepared to | repared to | |||
receive ChannelData messages on the channel from the server as soon as | receive ChannelData messages on the channel from the server as soon as | |||
it has sent the ChannelBind request. Over UDP, it is possible for the | it has sent the ChannelBind request. Over UDP, it is possible for the | |||
client to receive ChannelData messages from the server before it | client to receive ChannelData messages from the server before it | |||
receives a ChannelBind success response.</t> | receives a ChannelBind success response.</t> | |||
<t>In the other direction, the client <bcp14>MAY</bcp14> elect to send Cha | ||||
<t>In the other direction, the client MAY elect to send ChannelData | nnelData | |||
messages before receiving the ChannelBind success response. Doing so, | messages before receiving the ChannelBind success response. Doing so, | |||
however, runs the risk of having the ChannelData messages dropped by the | however, runs the risk of having the ChannelData messages dropped by the | |||
server if the ChannelBind request does not succeed for some reason | server if the ChannelBind request does not succeed for some reason | |||
(e.g., packet lost if the request is sent over UDP, or the server being | (e.g., packet lost if the request is sent over UDP or the server being | |||
unable to fulfill the request). A client that wishes to be safe should | unable to fulfill the request). A client that wishes to be safe should | |||
either queue the data or use Send indications until the channel binding | either queue the data or use Send indications until the channel binding | |||
is confirmed.</t> | is confirmed.</t> | |||
<section title="Sending a ChannelBind Request"> | <section numbered="true" toc="default"> | |||
<name>Sending a ChannelBind Request</name> | ||||
<t>A channel binding is created or refreshed using a ChannelBind | <t>A channel binding is created or refreshed using a ChannelBind | |||
transaction. A ChannelBind transaction also creates or refreshes a | transaction. A ChannelBind transaction also creates or refreshes a | |||
permission towards the peer (see <xref | permission towards the peer (see <xref target="sec-permissions" format=" | |||
target="sec-permissions"></xref>).</t> | default"/>).</t> | |||
<t>To initiate the ChannelBind transaction, the client forms a | <t>To initiate the ChannelBind transaction, the client forms a | |||
ChannelBind request. The channel to be bound is specified in a | ChannelBind request. The channel to be bound is specified in a | |||
CHANNEL-NUMBER attribute, and the peer's transport address is | CHANNEL-NUMBER attribute, and the peer's transport address is | |||
specified in an XOR-PEER-ADDRESS attribute. <xref | specified in an XOR-PEER-ADDRESS attribute. <xref target="sec-receiving- | |||
target="sec-receiving-ChannelBind"></xref> describes the restrictions | ChannelBind" format="default"/> describes the restrictions | |||
on these attributes. The client MUST only include an XOR-PEER-ADDRESS | on these attributes. The client <bcp14>MUST</bcp14> only include an XOR- | |||
PEER-ADDRESS | ||||
attribute with an address of the same address family as that of a | attribute with an address of the same address family as that of a | |||
relayed transport address for the allocation.</t> | relayed transport address for the allocation.</t> | |||
<t>Rebinding a channel to the same transport address that it is | <t>Rebinding a channel to the same transport address that it is | |||
already bound to provides a way to refresh a channel binding and the | already bound to provides a way to refresh a channel binding and the | |||
corresponding permission without sending data to the peer. Note | corresponding permission without sending data to the peer. Note, | |||
however, that permissions need to be refreshed more frequently than | however, that permissions need to be refreshed more frequently than | |||
channels.</t> | channels.</t> | |||
</section> | </section> | |||
<section anchor="sec-receiving-ChannelBind" numbered="true" toc="default"> | ||||
<section anchor="sec-receiving-ChannelBind" | <name>Receiving a ChannelBind Request</name> | |||
title="Receiving a ChannelBind Request"> | ||||
<t>When the server receives a ChannelBind request, it processes as per | <t>When the server receives a ChannelBind request, it processes as per | |||
<xref target="sec-general-behavior"></xref> plus the specific rules | <xref target="sec-general-behavior" format="default"/> plus the specific rules | |||
mentioned here.</t> | mentioned here.</t> | |||
<t>The server checks the following:</t> | ||||
<t>The server checks the following:<list style="symbols"> | <ul spacing="normal"> | |||
<t>The request contains both a CHANNEL-NUMBER and an | <li>The request contains both a CHANNEL-NUMBER and an | |||
XOR-PEER-ADDRESS attribute;</t> | XOR-PEER-ADDRESS attribute;</li> | |||
<li>The channel number is in the range 0x4000 through 0x4FFF | ||||
<t>The channel number is in the range 0x4000 through 0x4FFF | (inclusive);</li> | |||
(inclusive);</t> | <li>The channel number is not currently bound to a different | |||
transport address (same transport address is OK);</li> | ||||
<t>The channel number is not currently bound to a different | <li>The transport address is not currently bound to a different | |||
transport address (same transport address is OK);</t> | channel number.</li> | |||
</ul> | ||||
<t>The transport address is not currently bound to a different | ||||
channel number.</t> | ||||
</list></t> | ||||
<t>If any of these tests fail, the server replies with a 400 (Bad | <t>If any of these tests fail, the server replies with a 400 (Bad | |||
Request) error. If the XOR-PEER-ADDRESS attribute contains an address | Request) error. If the XOR-PEER-ADDRESS attribute contains an address | |||
of an address family that is not the same as that of a relayed | of an address family that is not the same as that of a relayed | |||
transport address for the allocation, the server MUST generate an | transport address for the allocation, the server <bcp14>MUST</bcp14> gen erate an | |||
error response with the 443 (Peer Address Family Mismatch) response | error response with the 443 (Peer Address Family Mismatch) response | |||
code.</t> | code.</t> | |||
<t>The server <bcp14>MAY</bcp14> impose restrictions on the IP address a | ||||
<t>The server MAY impose restrictions on the IP address and port | nd port | |||
values allowed in the XOR-PEER-ADDRESS attribute -- if a value is not | values allowed in the XOR-PEER-ADDRESS attribute; if a value is not | |||
allowed, the server rejects the request with a 403 (Forbidden) | allowed, the server rejects the request with a 403 (Forbidden) | |||
error.</t> | error.</t> | |||
<t>If the request is valid, but the server is unable to fulfill the | <t>If the request is valid, but the server is unable to fulfill the | |||
request due to some capacity limit or similar, the server replies with | request due to some capacity limit or similar, the server replies with | |||
a 508 (Insufficient Capacity) error.</t> | a 508 (Insufficient Capacity) error.</t> | |||
<t>Otherwise, the server replies with a ChannelBind success response. | <t>Otherwise, the server replies with a ChannelBind success response. | |||
There are no required attributes in a successful ChannelBind | There are no required attributes in a successful ChannelBind | |||
response.</t> | response.</t> | |||
<t>If the server can satisfy the request, then the server creates or | <t>If the server can satisfy the request, then the server creates or | |||
refreshes the channel binding using the channel number in the | refreshes the channel binding using the channel number in the | |||
CHANNEL-NUMBER attribute and the transport address in the | CHANNEL-NUMBER attribute and the transport address in the | |||
XOR-PEER-ADDRESS attribute. The server also installs or refreshes a | XOR-PEER-ADDRESS attribute. The server also installs or refreshes a | |||
permission for the IP address in the XOR-PEER-ADDRESS attribute as | permission for the IP address in the XOR-PEER-ADDRESS attribute as | |||
described in <xref target="sec-permissions"></xref>.</t> | described in <xref target="sec-permissions" format="default"/>.</t> | |||
<aside> | ||||
<t><list> | <t>NOTE: A server need not do anything special to implement | |||
<t>NOTE: A server need not do anything special to implement | ||||
idempotency of ChannelBind requests over UDP using the "stateless | idempotency of ChannelBind requests over UDP using the "stateless | |||
stack approach". Retransmitted ChannelBind requests will simply | stack approach". Retransmitted ChannelBind requests will simply | |||
refresh the channel binding and the corresponding permission. | refresh the channel binding and the corresponding permission. | |||
Furthermore, the client must wait 5 minutes before binding a | Furthermore, the client must wait 5 minutes before binding a | |||
previously bound channel number or peer address to a different | previously bound channel number or peer address to a different | |||
channel, eliminating the possibility that the transaction would | channel, eliminating the possibility that the transaction would | |||
initially fail but succeed on a retransmission.</t> | initially fail but succeed on a retransmission.</t> | |||
</list></t> | </aside> | |||
</section> | </section> | |||
<section numbered="true" toc="default"> | ||||
<section title="Receiving a ChannelBind Response"> | <name>Receiving a ChannelBind Response</name> | |||
<t>When the client receives a ChannelBind success response, it updates | <t>When the client receives a ChannelBind success response, it updates | |||
its data structures to record that the channel binding is now active. | its data structures to record that the channel binding is now active. | |||
It also updates its data structures to record that the corresponding | It also updates its data structures to record that the corresponding | |||
permission has been installed or refreshed.</t> | permission has been installed or refreshed.</t> | |||
<t>If the client receives a ChannelBind failure response that | <t>If the client receives a ChannelBind failure response that | |||
indicates that the channel information is out-of-sync between the | indicates that the channel information is out of sync between the | |||
client and the server (e.g., an unexpected 400 "Bad Request" | client and the server (e.g., an unexpected 400 "Bad Request" | |||
response), then it is RECOMMENDED that the client immediately delete | response), then it is <bcp14>RECOMMENDED</bcp14> that the client immedia tely delete | |||
the allocation and start afresh with a new allocation.</t> | the allocation and start afresh with a new allocation.</t> | |||
</section> | </section> | |||
<section anchor="sec-channeldata-msg" numbered="true" toc="default"> | ||||
<section anchor="sec-channeldata-msg" title="The ChannelData Message"> | <name>The ChannelData Message</name> | |||
<t>The ChannelData message is used to carry application data between | <t>The ChannelData message is used to carry application data between | |||
the client and the server. It has the following format:</t> | the client and the server. It has the following format:</t> | |||
<figure> | ||||
<figure> | <artwork name="" type="" align="left" alt=""><![CDATA[ | |||
<artwork><![CDATA[ | ||||
0 1 2 3 | 0 1 2 3 | |||
0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 | 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 | |||
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | |||
| Channel Number | Length | | | Channel Number | Length | | |||
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | |||
| | | | | | |||
/ Application Data / | / Application Data / | |||
/ / | / / | |||
| | | | | | |||
| +-------------------------------+ | | +-------------------------------+ | |||
| | | | | | |||
+-------------------------------+]]></artwork> | +-------------------------------+]]></artwork> | |||
</figure> | </figure> | |||
<t>The Channel Number field specifies the number of the channel on | <t>The Channel Number field specifies the number of the channel on | |||
which the data is traveling, and thus the address of the peer that is | which the data is traveling, and thus, the address of the peer that is | |||
sending or is to receive the data.</t> | sending or is to receive the data.</t> | |||
<t>The Length field specifies the length in bytes of the application | <t>The Length field specifies the length in bytes of the application | |||
data field (i.e., it does not include the size of the ChannelData | data field (i.e., it does not include the size of the ChannelData | |||
header). Note that 0 is a valid length.</t> | header). Note that 0 is a valid length.</t> | |||
<t>The Application Data field carries the data the client is trying to | <t>The Application Data field carries the data the client is trying to | |||
send to the peer, or that the peer is sending to the client.</t> | send to the peer, or that the peer is sending to the client.</t> | |||
</section> | </section> | |||
<section anchor="sec-sending-channeldata-msg" numbered="true" toc="default | ||||
<section anchor="sec-sending-channeldata-msg" | "> | |||
title="Sending a ChannelData Message"> | <name>Sending a ChannelData Message</name> | |||
<t>Once a client has bound a channel to a peer, then when the client | <t>Once a client has bound a channel to a peer, then when the client | |||
has data to send to that peer it may use either a ChannelData message | has data to send to that peer, it may use either a ChannelData message | |||
or a Send indication; that is, the client is not obligated to use the | or a Send indication; that is, the client is not obligated to use the | |||
channel when it exists and may freely intermix the two message types | channel when it exists and may freely intermix the two message types | |||
when sending data to the peer. The server, on the other hand, MUST use | when sending data to the peer. The server, on the other hand, <bcp14>MUS T</bcp14> use | |||
the ChannelData message if a channel has been bound to the peer. The | the ChannelData message if a channel has been bound to the peer. The | |||
server uses a Data indication to signal the XOR-PEER-ADDRESS and ICMP | server uses a Data indication to signal the XOR-PEER-ADDRESS and ICMP | |||
attributes to the client even if a channel has been bound to the | attributes to the client even if a channel has been bound to the | |||
peer.</t> | peer.</t> | |||
<t>The fields of the ChannelData message are filled in as described in | <t>The fields of the ChannelData message are filled in as described in | |||
<xref target="sec-channeldata-msg"></xref>.</t> | <xref target="sec-channeldata-msg" format="default"/>.</t> | |||
<t>Over TCP and TLS-over-TCP, the ChannelData message <bcp14>MUST</bcp14 | ||||
<t>Over TCP and TLS-over-TCP, the ChannelData message MUST be padded | > be padded | |||
to a multiple of four bytes in order to ensure the alignment of | to a multiple of four bytes in order to ensure the alignment of | |||
subsequent messages. The padding is not reflected in the length field | subsequent messages. The padding is not reflected in the length field | |||
of the ChannelData message, so the actual size of a ChannelData | of the ChannelData message, so the actual size of a ChannelData | |||
message (including padding) is (4 + Length) rounded up to the nearest | message (including padding) is (4 + Length) rounded up to the nearest | |||
multiple of 4 (See section 14 in <xref | multiple of 4 (see <xref target="RFC8489" section="14" sectionFormat="of | |||
target="I-D.ietf-tram-stunbis"></xref>). Over UDP, the padding is not | "/>). Over UDP, the padding is not | |||
required but MAY be included.</t> | required but <bcp14>MAY</bcp14> be included.</t> | |||
<t>The ChannelData message is then sent on the 5-tuple associated with | <t>The ChannelData message is then sent on the 5-tuple associated with | |||
the allocation.</t> | the allocation.</t> | |||
</section> | </section> | |||
<section numbered="true" toc="default"> | ||||
<section title="Receiving a ChannelData Message"> | <name>Receiving a ChannelData Message</name> | |||
<t>The receiver of the ChannelData message uses the first byte to | <t>The receiver of the ChannelData message uses the first byte to | |||
distinguish it from other multiplexed protocols, as described in <xref | distinguish it from other multiplexed protocols as described in <xref | |||
target="fig-demultiplexing"></xref>. If the message uses a value in | target="fig-demultiplexing" format="default"/>. If the message uses a | |||
the reserved range (0x5000 through 0xFFFF), then the message is | value in the reserved range (0x5000 through 0xFFFF), then the message | |||
silently discarded.</t> | is silently discarded.</t> | |||
<t>If the ChannelData message is received in a UDP datagram, and if | <t>If the ChannelData message is received in a UDP datagram, and if | |||
the UDP datagram is too short to contain the claimed length of the | the UDP datagram is too short to contain the claimed length of the | |||
ChannelData message (i.e., the UDP header length field value is less | ChannelData message (i.e., the UDP header length field value is less | |||
than the ChannelData header length field value + 4 + 8), then the | than the ChannelData header length field value + 4 + 8), then the | |||
message is silently discarded.</t> | message is silently discarded.</t> | |||
<t>If the ChannelData message is received over TCP or over | <t>If the ChannelData message is received over TCP or over | |||
TLS-over-TCP, then the actual length of the ChannelData message is as | TLS-over-TCP, then the actual length of the ChannelData message is as | |||
described in <xref target="sec-sending-channeldata-msg"></xref>.</t> | described in <xref target="sec-sending-channeldata-msg" format="default" | |||
/>.</t> | ||||
<t>If the ChannelData message is received on a channel that is not | <t>If the ChannelData message is received on a channel that is not | |||
bound to any peer, then the message is silently discarded.</t> | bound to any peer, then the message is silently discarded.</t> | |||
<t>On the client, it is <bcp14>RECOMMENDED</bcp14> that the client disca | ||||
<t>On the client, it is RECOMMENDED that the client discard the | rd the | |||
ChannelData message if the client believes there is no active | ChannelData message if the client believes there is no active | |||
permission towards the peer. On the server, the receipt of a | permission towards the peer. On the server, the receipt of a | |||
ChannelData message MUST NOT refresh either the channel binding or the | ChannelData message <bcp14>MUST NOT</bcp14> refresh either the channel b inding or the | |||
permission towards the peer.</t> | permission towards the peer.</t> | |||
<t>On the server, if no errors are detected, the server relays the | <t>On the server, if no errors are detected, the server relays the | |||
application data to the peer by forming a UDP datagram as | application data to the peer by forming a UDP datagram as | |||
follows:<list style="symbols"> | follows:</t> | |||
<t>the source transport address is the relayed transport address | <ul spacing="normal"> | |||
<li>the source transport address is the relayed transport address | ||||
of the allocation, where the allocation is determined by the | of the allocation, where the allocation is determined by the | |||
5-tuple on which the ChannelData message arrived;</t> | 5-tuple on which the ChannelData message arrived;</li> | |||
<li>the destination transport address is the transport address to | ||||
<t>the destination transport address is the transport address to | which the channel is bound;</li> | |||
which the channel is bound;</t> | <li>the data following the UDP header is the contents of the data | |||
field of the ChannelData message.</li> | ||||
<t>the data following the UDP header is the contents of the data | </ul> | |||
field of the ChannelData message.</t> | <t>The resulting UDP datagram is then sent to the peer. Note | |||
</list>The resulting UDP datagram is then sent to the peer. Note | ||||
that if the Length field in the ChannelData message is 0, then there | that if the Length field in the ChannelData message is 0, then there | |||
will be no data in the UDP datagram, but the UDP datagram is still | will be no data in the UDP datagram, but the UDP datagram is still | |||
formed and sent (Section 4.1 in <xref target="RFC6263"></xref>).</t> | formed and sent (<xref target="RFC6263" | |||
sectionFormat="of" section="4.1"/>).</t> | ||||
</section> | </section> | |||
<section anchor="sec-channel-relaying" numbered="true" toc="default"> | ||||
<section anchor="sec-channel-relaying" | <name>Relaying Data from the Peer</name> | |||
title="Relaying Data from the Peer"> | ||||
<t>When the server receives a UDP datagram on the relayed transport | <t>When the server receives a UDP datagram on the relayed transport | |||
address associated with an allocation, the server processes it as | address associated with an allocation, the server processes it as | |||
described in <xref target="sec-sending-data-indication"></xref>. If | described in <xref target="sec-sending-data-indication" format="default" />. If | |||
that section indicates that a ChannelData message should be sent | that section indicates that a ChannelData message should be sent | |||
(because there is a channel bound to the peer that sent to the UDP | (because there is a channel bound to the peer that sent to the UDP | |||
datagram), then the server forms and sends a ChannelData message as | datagram), then the server forms and sends a ChannelData message as | |||
described in <xref target="sec-sending-channeldata-msg"></xref>.</t> | described in <xref target="sec-sending-channeldata-msg" format="default" | |||
/>.</t> | ||||
<t>When the server receives an ICMP packet, the server processes it as | <t>When the server receives an ICMP packet, the server processes it as | |||
described in <xref | described in <xref target="sec-sending-senderror-indication" format="def | |||
target="sec-sending-senderror-indication"></xref>.</t> | ault"/>.</t> | |||
</section> | </section> | |||
</section> | </section> | |||
<section title="Packet Translations"> | <section numbered="true" toc="default"> | |||
<name>Packet Translations</name> | ||||
<t>This section addresses IPv4-to-IPv6, IPv6-to-IPv4, and IPv6-to-IPv6 | <t>This section addresses IPv4-to-IPv6, IPv6-to-IPv4, and IPv6-to-IPv6 | |||
translations. Requirements for translation of the IP addresses and port | translations. Requirements for translation of the IP addresses and port | |||
numbers of the packets are described above. The following sections | numbers of the packets are described above. The following sections | |||
specify how to translate other header fields.</t> | specify how to translate other header fields.</t> | |||
<t>As discussed in <xref target="unpriv" format="default"/>, translations | ||||
<t>As discussed in <xref target="unpriv"></xref>, translations in TURN | in TURN | |||
are designed so that a TURN server can be implemented as an application | are designed so that a TURN server can be implemented as an application | |||
that runs in user space under commonly available operating systems and | that runs in user space under commonly available operating systems and | |||
that does not require special privileges. The translations specified in | that does not require special privileges. The translations specified in | |||
the following sections follow this principle.</t> | the following sections follow this principle.</t> | |||
<t>The descriptions below have two parts: a preferred behavior and an | <t>The descriptions below have two parts: a preferred behavior and an | |||
alternate behavior. The server SHOULD implement the preferred behavior, | alternate behavior. The server <bcp14>SHOULD</bcp14> implement the preferr | |||
but if that is not possible for a particular field, the server MUST | ed behavior, | |||
implement the alternate behavior and MUST NOT do anything else for the | but if that is not possible for a particular field, the server <bcp14>MUST | |||
reasons detailed in <xref target="RFC7915"></xref>. The TURN server | </bcp14> | |||
solely relies on the DF bit in the IPv4 header and Fragmentation header | implement the alternate behavior and <bcp14>MUST NOT</bcp14> do anything e | |||
in IPv6 header to handle fragmentation using the approach described in | lse for the | |||
<xref target="RFC7915"></xref> and does not rely on the DONT-FRAGMENT | reasons detailed in <xref target="RFC7915" format="default"/>. The TURN se | |||
attribute, ignoring the DONT-FRAGMENT is only applicable for UDP-to-UDP | rver | |||
relay, and not for TCP-to-UDP relay.</t> | solely relies on the DF bit in the IPv4 header and the Fragment header | |||
in the IPv6 header to handle fragmentation using the approach described in | ||||
<section title="IPv4-to-IPv6 Translations"> | <xref target="RFC7915" format="default"/> and does not rely on the DONT-FR | |||
<t>Time to Live (TTL) field<list style="empty"> | AGMENT | |||
<t>Preferred Behavior: As specified in Section 4 of <xref | attribute; ignoring the DONT-FRAGMENT attribute is only applicable for UDP | |||
target="RFC7915"></xref>.</t> | -to-UDP | |||
relay and not for TCP-to-UDP relay.</t> | ||||
<t>Alternate Behavior: Set the outgoing value to the default for | <section numbered="true" toc="default"> | |||
outgoing packets.</t> | <name>IPv4-to-IPv6 Translations</name> | |||
</list></t> | ||||
<t>Time to Live (TTL) field</t> | ||||
<ul empty="true" spacing="normal"> | ||||
<li>Preferred Behavior: As specified in <xref | ||||
target="RFC7915" sectionFormat="of" section="4"/>.</li> | ||||
<li>Alternate Behavior: Set the outgoing value to the default for | ||||
outgoing packets.</li> | ||||
</ul> | ||||
<t>Traffic Class</t> | <t>Traffic Class</t> | |||
<ul empty="true" spacing="normal"> | ||||
<t><list> | <li>Preferred behavior: As specified in <xref | |||
<t>Preferred behavior: As specified in Section 4 of <xref | target="RFC7915" sectionFormat="of" section="4"/>.</li> | |||
target="RFC7915"></xref>.</t> | <li>Alternate behavior: The TURN server sets the Traffic Class to | |||
the default value for outgoing packets.</li> | ||||
<t>Alternate behavior: The TURN server sets the Traffic Class to | </ul> | |||
the default value for outgoing packets.</t> | ||||
</list></t> | ||||
<t>Flow Label</t> | <t>Flow Label</t> | |||
<ul empty="true" spacing="normal"> | ||||
<t><list> | <li>Preferred behavior: The TURN server can use the 5-tuple of | |||
<t>Preferred behavior: The TURN server can use the 5-tuple of | relayed transport address, peer transport address, and UDP protocol | |||
relayed transport address, peer transport address and UDP protocol | number to identify each flow and to generate and set the flow | |||
number to identify each flow, and to generate and set the flow | label value in the IPv6 packet as discussed in <xref | |||
label value in the IPv6 packet as discussed in Section 3 of <xref | target="RFC6437" sectionFormat="of" section="3" format="default"/>. I | |||
target="RFC6437"></xref>. If the TURN server is incapable of | f the TURN server is incapable of | |||
generating the flow label value from the IPv6 packet's 5-tuple, it | generating the flow label value from the IPv6 packet's 5-tuple, it | |||
sets the Flow label to 0.</t> | sets the Flow label to zero.</li> | |||
<li>Alternate behavior: The alternate behavior is the same as the | ||||
<t>Alternate behavior: The alternate behavior is the same as the | ||||
preferred behavior for a TURN server that does not support flow | preferred behavior for a TURN server that does not support flow | |||
labels.</t> | labels.</li> | |||
</list></t> | </ul> | |||
<t>Hop Limit</t> | <t>Hop Limit</t> | |||
<ul empty="true" spacing="normal"> | ||||
<t><list> | <li>Preferred behavior: As specified in <xref | |||
<t>Preferred behavior: As specified in Section 4 of <xref | target="RFC7915" sectionFormat="of" section="4" />.</li> | |||
target="RFC7915"></xref>.</t> | <li>Alternate behavior: The TURN server sets the Hop Limit to the | |||
default value for outgoing packets.</li> | ||||
<t>Alternate behavior: The TURN server sets the Hop Limit to the | </ul> | |||
default value for outgoing packets.</t> | ||||
</list></t> | ||||
<t>Fragmentation</t> | <t>Fragmentation</t> | |||
<ul empty="true" spacing="normal"> | ||||
<t><list> | <li>Preferred behavior: As specified in <xref | |||
<t>Preferred behavior: As specified in Section 4 of <xref | target="RFC7915" sectionFormat="of" section="4"/>.</li> | |||
target="RFC7915"></xref>.</t> | <li>Alternate behavior: The TURN server assembles incoming | |||
<t>Alternate behavior: The TURN server assembles incoming | ||||
fragments. The TURN server follows its default behavior to send | fragments. The TURN server follows its default behavior to send | |||
outgoing packets.</t> | outgoing packets.</li> | |||
<li>For both preferred and alternate behavior, the DONT-FRAGMENT | ||||
<t>For both preferred and alternate behavior, the DONT-FRAGMENT | attribute <bcp14>MUST</bcp14> be ignored by the server.</li> | |||
attribute MUST be ignored by the server.</t> | </ul> | |||
</list></t> | ||||
<t>Extension Headers</t> | <t>Extension Headers</t> | |||
<ul empty="true" spacing="normal"> | ||||
<t><list> | <li>Preferred behavior: The outgoing packet uses the system | |||
<t>Preferred behavior: The outgoing packet uses the system | ||||
defaults for IPv6 extension headers, with the exception of the | defaults for IPv6 extension headers, with the exception of the | |||
Fragmentation header as described above.</t> | Fragment header as described above.</li> | |||
<li>Alternate behavior: Same as preferred.</li> | ||||
<t>Alternate behavior: Same as preferred.</t> | </ul> | |||
</list></t> | ||||
</section> | </section> | |||
<section numbered="true" toc="default"> | ||||
<section title="IPv6-to-IPv6 Translations"> | <name>IPv6-to-IPv6 Translations</name> | |||
<t>Flow Label</t> | <t>Flow Label</t> | |||
<t>The TURN server should consider that it is handling two different | <t>NOTE: The TURN server should consider that it is handling two different | |||
IPv6 flows. Therefore, the Flow label <xref target="RFC6437"></xref> | IPv6 flows. Therefore, the Flow label <xref target="RFC6437" format="def | |||
SHOULD NOT be copied as part of the translation.</t> | ault"/> | |||
<bcp14>SHOULD NOT</bcp14> be copied as part of the translation. | ||||
<t><list> | </t> | |||
<t>Preferred behavior: The TURN server can use the 5-tuple of | <ul empty="true" spacing="normal"> | |||
relayed transport address, peer transport address and UDP protocol | ||||
number to identify each flow, and to generate and set the flow | ||||
label value in the IPv6 packet as discussed in Section 3 of <xref | ||||
target="RFC6437"></xref>. If the TURN server is incapable of | ||||
generating the flow label value from the IPv6 packet's 5-tuple, it | ||||
sets the Flow label to 0.</t> | ||||
<t>Alternate behavior: The alternate behavior is the same as the | <li>Preferred behavior: The TURN server can use the 5-tuple of relayed | |||
transport address, peer transport address, and UDP protocol number to | ||||
identify each flow and to generate and set the flow label value in the IPv6 | ||||
packet as discussed in <xref target="RFC6437" sectionFormat="of" | ||||
section="3"/>. If the TURN server is incapable of generating the flow | ||||
label value from the IPv6 packet's 5-tuple, it sets the Flow label to | ||||
zero.</li> | ||||
<li>Alternate behavior: The alternate behavior is the same as the | ||||
preferred behavior for a TURN server that does not support flow | preferred behavior for a TURN server that does not support flow | |||
labels.</t> | labels.</li> | |||
</list></t> | </ul> | |||
<t>Hop Limit</t> | <t>Hop Limit</t> | |||
<ul empty="true" spacing="normal"> | ||||
<t><list> | <li>Preferred behavior: The TURN server acts as a regular router | |||
<t>Preferred behavior: The TURN server acts as a regular router | ||||
with respect to decrementing the Hop Limit and generating an | with respect to decrementing the Hop Limit and generating an | |||
ICMPv6 error if it reaches zero.</t> | ICMPv6 error if it reaches zero.</li> | |||
<li>Alternate behavior: The TURN server sets the Hop Limit to the | ||||
<t>Alternate behavior: The TURN server sets the Hop Limit to the | default value for outgoing packets.</li> | |||
default value for outgoing packets.</t> | </ul> | |||
</list></t> | ||||
<t>Fragmentation</t> | <t>Fragmentation</t> | |||
<ul empty="true" spacing="normal"> | ||||
<t><list> | <li>Preferred behavior: If the incoming packet did not include a | |||
<t>Preferred behavior: If the incoming packet did not include a | ||||
Fragment header and the outgoing packet size does not exceed the | Fragment header and the outgoing packet size does not exceed the | |||
outgoing link's MTU, the TURN server sends the outgoing packet | outgoing link's MTU, the TURN server sends the outgoing packet | |||
without a Fragment header.</t> | without a Fragment header.</li> | |||
<li>If the incoming packet did not include a Fragment header and | ||||
<t>If the incoming packet did not include a Fragment header and | ||||
the outgoing packet size exceeds the outgoing link's MTU, the TURN | the outgoing packet size exceeds the outgoing link's MTU, the TURN | |||
server drops the outgoing packet and send an ICMP message of type | server drops the outgoing packet and sends an ICMP message of type | |||
2 code 0 ("Packet too big") to the sender of the incoming packet. | 2 code 0 ("Packet too big") to the sender of the incoming packet. | |||
If the ICMPv6 packet ("Packet too big") is being sent to the peer, | If the ICMPv6 packet ("Packet too big") is being sent to the peer, | |||
the TURN server SHOULD reduce the MTU reported in the ICMP message | the TURN server <bcp14>SHOULD</bcp14> reduce the MTU reported in the ICMP message | |||
by 48 bytes to allow room for the overhead of a Data | by 48 bytes to allow room for the overhead of a Data | |||
indication.</t> | indication.</li> | |||
<li>If the incoming packet included a Fragment header and the | ||||
<t>If the incoming packet included a Fragment header and the | ||||
outgoing packet size (with a Fragment header included) does not | outgoing packet size (with a Fragment header included) does not | |||
exceed the outgoing link's MTU, the TURN server sends the outgoing | exceed the outgoing link's MTU, the TURN server sends the outgoing | |||
packet with a Fragment header. The TURN server sets the fields of | packet with a Fragment header. The TURN server sets the fields of | |||
the Fragment header as appropriate for a packet originating from | the Fragment header as appropriate for a packet originating from | |||
the server.</t> | the server.</li> | |||
<li>If the incoming packet included a Fragment header and the | ||||
<t>If the incoming packet included a Fragment header and the | ||||
outgoing packet size exceeds the outgoing link's MTU, the TURN | outgoing packet size exceeds the outgoing link's MTU, the TURN | |||
server MUST fragment the outgoing packet into fragments of no more | server <bcp14>MUST</bcp14> fragment the outgoing packet into fragmen ts of no more | |||
than 1280 bytes. The TURN server sets the fields of the Fragment | than 1280 bytes. The TURN server sets the fields of the Fragment | |||
header as appropriate for a packet originating from the | header as appropriate for a packet originating from the | |||
server.</t> | server.</li> | |||
<li>Alternate behavior: The TURN server assembles incoming | ||||
<t>Alternate behavior: The TURN server assembles incoming | ||||
fragments. The TURN server follows its default behavior to send | fragments. The TURN server follows its default behavior to send | |||
outgoing packets.</t> | outgoing packets.</li> | |||
<li>For both preferred and alternate behavior, the DONT-FRAGMENT | ||||
<t>For both preferred and alternate behavior, the DONT-FRAGMENT | attribute <bcp14>MUST</bcp14> be ignored by the server.</li> | |||
attribute MUST be ignored by the server.</t> | </ul> | |||
</list></t> | ||||
<t>Extension Headers</t> | <t>Extension Headers</t> | |||
<ul empty="true" spacing="normal"> | ||||
<t><list> | <li>Preferred behavior: The outgoing packet uses the system | |||
<t>Preferred behavior: The outgoing packet uses the system | ||||
defaults for IPv6 extension headers, with the exception of the | defaults for IPv6 extension headers, with the exception of the | |||
Fragmentation header as described above.</t> | Fragment header as described above.</li> | |||
<li>Alternate behavior: Same as preferred.</li> | ||||
<t>Alternate behavior: Same as preferred.</t> | </ul> | |||
</list></t> | ||||
</section> | </section> | |||
<section numbered="true" toc="default"> | ||||
<section title="IPv6-to-IPv4 Translations"> | <name>IPv6-to-IPv4 Translations</name> | |||
<t>Type of Service and Precedence</t> | <t>Type of Service and Precedence</t> | |||
<ul empty="true" spacing="normal"> | ||||
<t><list> | <li>Preferred behavior: As specified in <xref | |||
<t>Preferred behavior: As specified in Section 5 of <xref | target="RFC7915" sectionFormat="of" section="5"/>.</li> | |||
target="RFC7915"></xref>.</t> | <li>Alternate behavior: The TURN server sets the Type of Service | |||
and Precedence to the default value for outgoing packets.</li> | ||||
<t>Alternate behavior: The TURN server sets the Type of Service | </ul> | |||
and Precedence to the default value for outgoing packets.</t> | ||||
</list></t> | ||||
<t>Time to Live</t> | <t>Time to Live</t> | |||
<ul empty="true" spacing="normal"> | ||||
<t><list> | <li>Preferred behavior: As specified in <xref | |||
<t>Preferred behavior: As specified in Section 5 of <xref | target="RFC7915" sectionFormat="of" section="5"/>.</li> | |||
target="RFC7915"></xref>.</t> | <li>Alternate behavior: The TURN server sets the Time to Live to | |||
the default value for outgoing packets.</li> | ||||
<t>Alternate behavior: The TURN server sets the Time to Live to | </ul> | |||
the default value for outgoing packets.</t> | ||||
</list></t> | ||||
<t>Fragmentation</t> | <t>Fragmentation</t> | |||
<ul empty="true" spacing="normal"> | ||||
<t><list> | <li>Preferred behavior: As specified in <xref | |||
<t>Preferred behavior: As specified in Section 5 of <xref | target="RFC7915" sectionFormat="of" section="5"/>. Additionally, when t | |||
target="RFC7915"></xref>. Additionally, when the outgoing packet's | he outgoing packet's | |||
size exceeds the outgoing link's MTU, the TURN server needs to | size exceeds the outgoing link's MTU, the TURN server needs to | |||
generate an ICMP error (ICMPv6 Packet Too Big) reporting the MTU | generate an ICMP error (ICMPv6 "Packet too big") reporting the MTU | |||
size. If the ICMPv4 packet (Destination Unreachable (Type 3) with | size. If the ICMPv4 packet (Destination Unreachable (Type 3) with | |||
Code 4) is being sent to the peer, the TURN server SHOULD reduce | Code 4) is being sent to the peer, the TURN server <bcp14>SHOULD</bc p14> reduce | |||
the MTU reported in the ICMP message by 48 bytes to allow room for | the MTU reported in the ICMP message by 48 bytes to allow room for | |||
the overhead of a Data indication.</t> | the overhead of a Data indication.</li> | |||
<li>Alternate behavior: The TURN server assembles incoming | ||||
<t>Alternate behavior: The TURN server assembles incoming | ||||
fragments. The TURN server follows its default behavior to send | fragments. The TURN server follows its default behavior to send | |||
outgoing packets.</t> | outgoing packets.</li> | |||
<li>For both preferred and alternate behavior, the DONT-FRAGMENT | ||||
<t>For both preferred and alternate behavior, the DONT-FRAGMENT | attribute <bcp14>MUST</bcp14> be ignored by the server.</li> | |||
attribute MUST be ignored by the server.</t> | </ul> | |||
</list></t> | ||||
</section> | </section> | |||
</section> | </section> | |||
<section anchor="sec-ip-header-fields" numbered="true" toc="default"> | ||||
<section anchor="sec-ip-header-fields" title="UDP-to-UDP relay"> | <name>UDP-to-UDP Relay</name> | |||
<t>This section describes how the server sets various fields in the IP | <t>This section describes how the server sets various fields in the IP | |||
header for UDP-to-UDP relay from the client to the peer or vice versa. | header for UDP-to-UDP relay from the client to the peer or vice versa. | |||
The descriptions in this section apply: (a) when the server sends a UDP | The descriptions in this section apply (a) when the server sends a UDP | |||
datagram to the peer, or (b) when the server sends a Data indication or | datagram to the peer or (b) when the server sends a Data indication or | |||
ChannelData message to the client over UDP transport. The descriptions | ChannelData message to the client over UDP transport. The descriptions | |||
in this section do not apply to TURN messages sent over TCP or TLS | in this section do not apply to TURN messages sent over TCP or TLS | |||
transport from the server to the client.</t> | transport from the server to the client.</t> | |||
<t>The descriptions below have two parts: a preferred behavior and an | <t>The descriptions below have two parts: a preferred behavior and an | |||
alternate behavior. The server SHOULD implement the preferred behavior, | alternate behavior. The server <bcp14>SHOULD</bcp14> implement the preferr | |||
but if that is not possible for a particular field, then it SHOULD | ed behavior, | |||
but if that is not possible for a particular field, then it <bcp14>SHOULD< | ||||
/bcp14> | ||||
implement the alternative behavior.</t> | implement the alternative behavior.</t> | |||
<t>Differentiated Services Code Point (DSCP) field <xref target="RFC2474" | ||||
<t>Differentiated Services Code Point (DSCP) field <xref | format="default"/></t> | |||
target="RFC2474"></xref><list style="empty"> | <ul empty="true" spacing="normal"> | |||
<t>Preferred Behavior: Set the outgoing value to the incoming value, | <li>Preferred Behavior: Set the outgoing value to the incoming value | |||
unless the server includes a differentiated services classifier and | unless the server includes a differentiated services classifier and | |||
marker <xref target="RFC2474"></xref>.</t> | marker <xref target="RFC2474" format="default"/>.</li> | |||
<li>Alternate Behavior: Set the outgoing value to a fixed value, | ||||
<t>Alternate Behavior: Set the outgoing value to a fixed value, | which by default is Best Effort unless configured otherwise.</li> | |||
which by default is Best Effort unless configured otherwise.</t> | <li>In both cases, if the server is immediately adjacent to a | |||
differentiated services classifier and marker, then DSCP <bcp14>MAY</b | ||||
<t>In both cases, if the server is immediately adjacent to a | cp14> be set | |||
differentiated services classifier and marker, then DSCP MAY be set | to any arbitrary value in the direction towards the classifier.</li> | |||
to any arbitrary value in the direction towards the classifier.</t> | </ul> | |||
</list></t> | ||||
<t><vspace blankLines="1" /></t> | ||||
<t>Explicit Congestion Notification (ECN) field <xref | <t>Explicit Congestion Notification (ECN) field <xref target="RFC3168" for | |||
target="RFC3168"></xref><list style="empty"> | mat="default"/></t> | |||
<t>Preferred Behavior: Set the outgoing value to the incoming value. | <ul empty="true" spacing="normal"> | |||
<li>Preferred Behavior: Set the outgoing value to the incoming value. | ||||
The server may perform Active Queue Management, in which case it | The server may perform Active Queue Management, in which case it | |||
SHOULD behave as a ECN aware router <xref target="RFC3168"></xref> | <bcp14>SHOULD</bcp14> behave as an ECN-aware router <xref target="RFC3 168" format="default"/> | |||
and can mark traffic with Congestion Experienced (CE) instead of | and can mark traffic with Congestion Experienced (CE) instead of | |||
dropping the packet. The use of ECT(1) is subject to experimental | dropping the packet. The use of ECT(1) is subject to experimental | |||
usage <xref target="RFC8311"></xref>.</t> | usage <xref target="RFC8311" format="default"/>.</li> | |||
<li>Alternate Behavior: Set the outgoing value to Not-ECT | ||||
<t>Alternate Behavior: Set the outgoing value to Not-ECT | (=0b00).</li> | |||
(=0b00).</t> | </ul> | |||
</list></t> | ||||
<t><vspace blankLines="1" /></t> | ||||
<t>IPv4 Fragmentation fields (applicable only for IPv4-to-IPv4 | <t>IPv4 Fragmentation fields (applicable only for IPv4-to-IPv4 | |||
relay)<list> | relay)</t> | |||
<t>Preferred Behavior: When the server sends a packet to a peer in | <ul empty="true" spacing="normal"> | |||
<li>Preferred Behavior: When the server sends a packet to a peer in | ||||
response to a Send indication containing the DONT-FRAGMENT | response to a Send indication containing the DONT-FRAGMENT | |||
attribute, then set the outgoing UDP packet to not fragment. In all | attribute, then set the outgoing UDP packet to not fragment. In all | |||
other cases when sending an outgoing packet containing application | other cases, when sending an outgoing packet containing application | |||
data (e.g., Data indication, ChannelData message, or DONT-FRAGMENT | data (e.g., Data indication, a ChannelData message, or the DONT-FRAGME | |||
NT | ||||
attribute not included in the Send indication), copy the DF bit from | attribute not included in the Send indication), copy the DF bit from | |||
the DF bit of the incoming packet that contained the application | the DF bit of the incoming packet that contained the application | |||
data.</t> | data.</li> | |||
<li>Set the other fragmentation fields (Identification, More | ||||
<t>Set the other fragmentation fields (Identification, More | ||||
Fragments, Fragment Offset) as appropriate for a packet originating | Fragments, Fragment Offset) as appropriate for a packet originating | |||
from the server.</t> | from the server.</li> | |||
<li>Alternate Behavior: As described in the Preferred Behavior, | ||||
<t>Alternate Behavior: As described in the Preferred Behavior, | except always assume the incoming DF bit is 0.</li> | |||
except always assume the incoming DF bit is 0.</t> | <li>In both the Preferred and Alternate Behaviors, the resulting | |||
<t>In both the Preferred and Alternate Behaviors, the resulting | ||||
packet may be too large for the outgoing link. If this is the case, | packet may be too large for the outgoing link. If this is the case, | |||
then the normal fragmentation rules apply <xref | then the normal fragmentation rules apply <xref target="RFC1122" forma | |||
target="RFC1122"></xref>.</t> | t="default"/>.</li> | |||
</list></t> | </ul> | |||
<t><vspace blankLines="1" /></t> | ||||
<t>IPv4 Options<list> | ||||
<t>Preferred Behavior: The outgoing packet uses the system defaults | ||||
for IPv4 options.</t> | ||||
<t>Alternate Behavior: Same as preferred.</t> | <t>IPv4 Options</t> | |||
</list></t> | <ul empty="true" spacing="normal"> | |||
<li>Preferred Behavior: The outgoing packet uses the system defaults | ||||
for IPv4 options.</li> | ||||
<li>Alternate Behavior: Same as preferred.</li> | ||||
</ul> | ||||
</section> | </section> | |||
<section anchor="sec-ip-header-fields-tcp-udp" title="TCP-to-UDP relay"> | <section anchor="sec-ip-header-fields-tcp-udp" numbered="true" toc="default" | |||
> | ||||
<name>TCP-to-UDP Relay</name> | ||||
<t>This section describes how the server sets various fields in the IP | <t>This section describes how the server sets various fields in the IP | |||
header for TCP-to-UDP relay from the client to the peer. The | header for TCP-to-UDP relay from the client to the peer. The | |||
descriptions in this section apply when the server sends a UDP datagram | descriptions in this section apply when the server sends a UDP datagram | |||
to the peer. Note that the server does not perform per-packet | to the peer. Note that the server does not perform per-packet | |||
translation for TCP-to-UDP relaying.</t> | translation for TCP-to-UDP relaying.</t> | |||
<t>Multipath TCP <xref target="I-D.ietf-mptcp-rfc6824bis" | ||||
<t>Multipath TCP <xref target="I-D.ietf-mptcp-rfc6824bis"></xref> is not | format="default"/> is not supported by this version of TURN because TCP | |||
supported by this version of TURN because TCP multi-path is not used by | multipath is not used by either SIP or WebRTC protocols <xref | |||
either SIP or WebRTC protocols <xref target="RFC7478"></xref> for media | target="RFC7478" format="default"/> for media and non-media data. TCP | |||
and non-media data. TCP connection between the TURN client and server | connection between the TURN client and server can use the TCP | |||
can use TCP-AO <xref target="RFC5925"></xref> but UDP does not provide a | Authentication Option (TCP-AO) <xref target="RFC5925" | |||
similar type of authentication though it might be added in the future | format="default"/>, but UDP does not provide a similar type of | |||
<xref target="I-D.ietf-tsvwg-udp-options"></xref>. Even if both TCP-AO | authentication, though it might be added in the future <xref | |||
and UDP authentication would be used between TURN client and server, it | target="I-D.ietf-tsvwg-udp-options" format="default"/>. Even if both | |||
would not change the end-to-end security properties of the application | TCP-AO and UDP authentication would be used between TURN client and | |||
payload being relayed. Therefore applications using TURN will need to | server, it would not change the end-to-end security properties of the | |||
secure their application data end-to-end appropriately, e.g., SRTP for | application payload being relayed. Therefore, applications using TURN | |||
RTP applications. Note that TCP-AO option obsoletes TCP MD5 option.</t> | will need to secure their application data end to end appropriately, | |||
e.g., Secure Real-time Transport Protocol (SRTP) for RTP | ||||
applications. Note that the TCP-AO option obsoletes the TCP MD5 | ||||
option.</t> | ||||
<t>Unlike UDP, TCP without the TCP Fast Open extension <xref | <t>Unlike UDP, TCP without the TCP Fast Open extension <xref | |||
target="RFC7413"></xref> does not support 0-RTT session resumption. The | target="RFC7413" format="default"/> does not support 0-RTT session | |||
TCP user timeout <xref target="RFC5482"></xref> equivalent for | resumption. The TCP user timeout <xref target="RFC5482" | |||
application data relayed by the TURN is the use of RTP control protocol | format="default"/> equivalent for application data relayed by the TURN | |||
(RTCP). As a reminder, RTCP is a fundamental and integral part of | is the use of RTP control protocol (RTCP). As a reminder, RTCP is a | |||
RTP.</t> | fundamental and integral part of RTP.</t> | |||
<t>The descriptions below have two parts: a preferred behavior and an | <t>The descriptions below have two parts: a preferred behavior and an | |||
alternate behavior. The server SHOULD implement the preferred behavior, | alternate behavior. The server <bcp14>SHOULD</bcp14> implement the preferr | |||
but if that is not possible for a particular field, then it SHOULD | ed behavior, | |||
but if that is not possible for a particular field, then it <bcp14>SHOULD< | ||||
/bcp14> | ||||
implement the alternative behavior.</t> | implement the alternative behavior.</t> | |||
<t>For the UDP datagram sent to the peer based on a Send Indication or | ||||
<t>For the UDP datagram sent to the peer based on Send Indication or | ||||
ChannelData message arriving at the TURN server over a TCP Transport, | ChannelData message arriving at the TURN server over a TCP Transport, | |||
the server sets various fields in the IP header as follows:</t> | the server sets various fields in the IP header as follows:</t> | |||
<t>Differentiated Services Code Point (DSCP) field <xref | <t>Differentiated Services Code Point (DSCP) field <xref target="RFC2474" | |||
target="RFC2474"></xref><list style="empty"> | format="default"/></t> | |||
<t>Preferred Behavior: The TCP connection can only use a single DSCP | <ul empty="true" spacing="normal"> | |||
code point so inter flow differentiation is not possible, see | <li>Preferred Behavior: The TCP connection can only use a single DSCP, | |||
Section 5.1 of <xref target="RFC7657"></xref>. The server sets the | so inter-flow differentiation is not possible; see | |||
outgoing value to the DSCP code point used by the TCP connection, | <xref target="RFC7657" sectionFormat="of" section="5.1"/>. The server | |||
sets the | ||||
outgoing value to the DSCP used by the TCP connection, | ||||
unless the server includes a differentiated services classifier and | unless the server includes a differentiated services classifier and | |||
marker <xref target="RFC2474"></xref>.</t> | marker <xref target="RFC2474" format="default"/>.</li> | |||
<li>Alternate Behavior: Set the outgoing value to a fixed value, | ||||
<t>Alternate Behavior: Set the outgoing value to a fixed value, | which by default is Best Effort unless configured otherwise.</li> | |||
which by default is Best Effort unless configured otherwise.</t> | <li>In both cases, if the server is immediately adjacent to a | |||
differentiated services classifier and marker, then DSCP <bcp14>MAY</b | ||||
<t>In both cases, if the server is immediately adjacent to a | cp14> be set | |||
differentiated services classifier and marker, then DSCP MAY be set | to any arbitrary value in the direction towards the classifier.</li> | |||
to any arbitrary value in the direction towards the classifier.</t> | </ul> | |||
</list></t> | ||||
<t><vspace blankLines="1" /></t> | ||||
<t>Explicit Congestion Notification (ECN) field <xref | <t>Explicit Congestion Notification (ECN) field <xref target="RFC3168" for | |||
target="RFC3168"></xref><list style="empty"> | mat="default"/></t> | |||
<t>Preferred Behavior: No mechanism is defined to indicate what ECN | <ul empty="true" spacing="normal"> | |||
<li>Preferred Behavior: No mechanism is defined to indicate what ECN | ||||
value should be used for the outgoing UDP datagrams of an | value should be used for the outgoing UDP datagrams of an | |||
allocation, therefore set the outgoing value to Not-ECT (=0b00).</t> | allocation; therefore, set the outgoing value to Not-ECT (=0b00).</li> | |||
<li>Alternate Behavior: Same as preferred.</li> | ||||
<t>Alternate Behavior: Same as preferred.</t> | </ul> | |||
</list></t> | ||||
<t><vspace blankLines="1" /></t> | ||||
<t>IPv4 Fragmentation fields (applicable only for IPv4-to-IPv4 | <t>IPv4 Fragmentation fields (applicable only for IPv4-to-IPv4 | |||
relay)<list> | relay)</t> | |||
<t>Preferred Behavior: When the server sends a packet to a peer in | <ul empty="true" spacing="normal"> | |||
<li>Preferred Behavior: When the server sends a packet to a peer in | ||||
response to a Send indication containing the DONT-FRAGMENT | response to a Send indication containing the DONT-FRAGMENT | |||
attribute, then set the outgoing UDP packet to not fragment. In all | attribute, set the outgoing UDP packet to not fragment. In all | |||
other cases when sending an outgoing UDP packet containing | other cases, when sending an outgoing UDP packet containing | |||
application data (e.g., Data indication, ChannelData message, or | application data (e.g., Data indication, ChannelData message, or | |||
DONT-FRAGMENT attribute not included in the Send indication), set | DONT-FRAGMENT attribute not included in the Send indication), set | |||
the DF bit in the outgoing IP header to 0.</t> | the DF bit in the outgoing IP header to 0.</li> | |||
<li>Alternate Behavior: Same as preferred.</li> | ||||
<t>Alternate Behavior: Same as preferred.</t> | </ul> | |||
</list></t> | <t>IPv6 Fragmentation fields</t> | |||
<ul empty="true" spacing="normal"> | ||||
<t>IPv6 Fragmentation fields<list> | <li>Preferred Behavior: If the TCP traffic arrives over IPv6, the | |||
<t>Preferred Behavior: If the TCP traffic arrives over IPv6, the | server relies on the presence of the DONT-FRAGMENT attribute in the se | |||
server relies on the presence of DONT-FRAGMENT attribute in the send | nd | |||
indication to set the outgoing UDP packet to not fragment.</t> | indication to set the outgoing UDP packet to not fragment.</li> | |||
<li>Alternate Behavior: Same as preferred.</li> | ||||
<t>Alternate Behavior: Same as preferred.</t> | </ul> | |||
</list></t> | ||||
<t><vspace blankLines="1" /></t> | ||||
<t>IPv4 Options<list> | ||||
<t>Preferred Behavior: The outgoing packet uses the system defaults | ||||
for IPv4 options.</t> | ||||
<t>Alternate Behavior: Same as preferred.</t> | <t>IPv4 Options</t> | |||
</list></t> | <ul empty="true" spacing="normal"> | |||
<li>Preferred Behavior: The outgoing packet uses the system defaults | ||||
for IPv4 options.</li> | ||||
<li>Alternate Behavior: Same as preferred.</li> | ||||
</ul> | ||||
</section> | </section> | |||
<section anchor="UDP-to-TCP" numbered="true" toc="default"> | ||||
<section anchor="UDP-to-TCP" title="UDP-to-TCP relay"> | <name>UDP-to-TCP Relay</name> | |||
<t>This section describes how the server sets various fields in the IP | <t>This section describes how the server sets various fields in the IP | |||
header for UDP-to-TCP relay from the peer to the client. The | header for UDP-to-TCP relay from the peer to the client. The | |||
descriptions in this section apply when the server sends a Data | descriptions in this section apply when the server sends a Data | |||
indication or ChannelData message to the client over TCP or TLS | indication or ChannelData message to the client over TCP or TLS | |||
transport. Note that the server does not perform per-packet translation | transport. Note that the server does not perform per-packet translation | |||
for UDP-to-TCP relaying.</t> | for UDP-to-TCP relaying.</t> | |||
<t>The descriptions below have two parts: a preferred behavior and an | <t>The descriptions below have two parts: a preferred behavior and an | |||
alternate behavior. The server SHOULD implement the preferred behavior, | alternate behavior. The server <bcp14>SHOULD</bcp14> implement the preferr | |||
but if that is not possible for a particular field, then it SHOULD | ed behavior, | |||
but if that is not possible for a particular field, then it <bcp14>SHOULD< | ||||
/bcp14> | ||||
implement the alternative behavior.</t> | implement the alternative behavior.</t> | |||
<t>The TURN server sets IP header fields in the TCP packets on a | <t>The TURN server sets IP header fields in the TCP packets on a | |||
per-connection basis for the TCP connection as follows:</t> | per-connection basis for the TCP connection as follows:</t> | |||
<t>Differentiated Services Code Point (DSCP) field <xref target="RFC2474" | ||||
<t>Differentiated Services Code Point (DSCP) field <xref | format="default"/></t> | |||
target="RFC2474"></xref><list style="empty"> | <ul empty="true" spacing="normal"> | |||
<t>Preferred Behavior: Ignore the incoming DSCP value. When TCP is | <li>Preferred Behavior: Ignore the incoming DSCP value. When TCP is | |||
used between the client and the server, a single DSCP should be used | used between the client and the server, a single DSCP should be used | |||
for all traffic on that TCP connection. Note, TURN/ICE occurs before | for all traffic on that TCP connection. Note, TURN/ICE occurs before | |||
application data is exchanged.</t> | application data is exchanged.</li> | |||
<li>Alternate Behavior: Same as preferred.</li> | ||||
<t>Alternate Behavior: Same as preferred.</t> | </ul> | |||
</list></t> | ||||
<t><vspace blankLines="1" /></t> | ||||
<t>Explicit Congestion Notification (ECN) field <xref | ||||
target="RFC3168"></xref><list style="empty"> | ||||
<t>Preferred Behavior: Ignore, ECN signals are dropped in the TURN | ||||
server for the incoming UDP datagrams from the peer.</t> | ||||
<t>Alternate Behavior: Same as preferred.</t> | ||||
</list></t> | ||||
<t><vspace blankLines="1" /></t> | <t>Explicit Congestion Notification (ECN) field <xref target="RFC3168" for | |||
mat="default"/></t> | ||||
<ul empty="true" spacing="normal"> | ||||
<li>Preferred Behavior: Ignore; ECN signals are dropped in the TURN | ||||
server for the incoming UDP datagrams from the peer.</li> | ||||
<li>Alternate Behavior: Same as preferred.</li> | ||||
</ul> | ||||
<t>Fragmentation <list> | <t>Fragmentation </t> | |||
<t>Preferred Behavior: Any fragmented packets are reassembled in the | <ul empty="true" spacing="normal"> | |||
<li>Preferred Behavior: Any fragmented packets are reassembled in the | ||||
server and then forwarded to the client over the TCP connection. | server and then forwarded to the client over the TCP connection. | |||
ICMP messages resulting from the UDP datagrams sent to the peer are | ICMP messages resulting from the UDP datagrams sent to the peer are | |||
processed by the server as described in <xref | processed by the server as described in <xref target="sec-sending-send | |||
target="sec-sending-senderror-indication"></xref> and forwarded to | error-indication" format="default"/> and forwarded to | |||
the client using TURN's mechanism for relevant ICMP types and | the client using TURN's mechanism for relevant ICMP types and | |||
codes.</t> | codes.</li> | |||
<li>Alternate Behavior: Same as preferred.</li> | ||||
<t>Alternate Behavior: Same as preferred.</t> | </ul> | |||
</list></t> | ||||
<t><vspace blankLines="1" /></t> | ||||
<t>Extension Headers</t> | <t>Extension Headers</t> | |||
<ul empty="true" spacing="normal"> | ||||
<t><list> | <li>Preferred behavior: The outgoing packet uses the system defaults | |||
<t>Preferred behavior: The outgoing packet uses the system defaults | for IPv6 extension headers.</li> | |||
for IPv6 extension headers.</t> | <li>Alternate behavior: Same as preferred.</li> | |||
</ul> | ||||
<t>Alternate behavior: Same as preferred.</t> | <t>IPv4 Options</t> | |||
</list></t> | <ul empty="true" spacing="normal"> | |||
<li>Preferred Behavior: The outgoing packet uses the system defaults | ||||
<t>IPv4 Options<list> | for IPv4 options.</li> | |||
<t>Preferred Behavior: The outgoing packet uses the system defaults | <li>Alternate Behavior: Same as preferred.</li> | |||
for IPv4 options.</t> | </ul> | |||
<t>Alternate Behavior: Same as preferred.</t> | ||||
</list></t> | ||||
</section> | </section> | |||
<section anchor="sec-stun-methods" numbered="true" toc="default"> | ||||
<section anchor="sec-stun-methods" title="STUN Methods"> | <name>STUN Methods</name> | |||
<t>This section lists the codepoints for the STUN methods defined in | <t>This section lists the code points for the STUN methods defined in | |||
this specification. See elsewhere in this document for the semantics of | this specification. See elsewhere in this document for the semantics of | |||
these methods.</t> | these methods.</t> | |||
<figure> | <table anchor="stun-methods"> | |||
<preamble></preamble> | <tbody> | |||
<tr> | ||||
<artwork><![CDATA[ 0x003 : Allocate (only request/response s | <td>0x003</td> | |||
emantics defined) | <td>Allocate</td> | |||
0x004 : Refresh (only request/response semantics defined) | <td>(only request/response semantics defined)</td> | |||
0x006 : Send (only indication semantics defined) | </tr> | |||
0x007 : Data (only indication semantics defined) | <tr> | |||
0x008 : CreatePermission (only request/response semantics defined | <td>0x004</td> | |||
0x009 : ChannelBind (only request/response semantics defined) | <td>Refresh</td> | |||
<td>(only request/response semantics defined)</td> | ||||
</tr> | ||||
<tr> | ||||
<td>0x006</td> | ||||
<td>Send</td> | ||||
<td>(only indication semantics defined)</td> | ||||
</tr> | ||||
<tr> | ||||
<td>0x007</td> | ||||
<td>Data</td> | ||||
<td>(only indication semantics defined)</td> | ||||
</tr> | ||||
<tr> | ||||
<td>0x008</td> | ||||
<td>CreatePermission</td> | ||||
<td>(only request/response semantics defined)</td> | ||||
</tr> | ||||
<tr> | ||||
<td>0x009</td> | ||||
<td>ChannelBind</td> | ||||
<td>(only request/response semantics defined)</td> | ||||
</tr> | ||||
</tbody> | ||||
</table> | ||||
]]></artwork> | ||||
</figure> | ||||
</section> | </section> | |||
<section anchor="sec-stun-attributes" numbered="true" toc="default"> | ||||
<name>STUN Attributes</name> | ||||
<t>This STUN extension defines the following | ||||
attributes:</t> | ||||
<section anchor="sec-stun-attributes" title="STUN Attributes"> | <table anchor="stun-attributes"> | |||
<figure> | ||||
<preamble>This STUN extension defines the following | ||||
attributes:</preamble> | ||||
<artwork><![CDATA[ | ||||
0x000C: CHANNEL-NUMBER | ||||
0x000D: LIFETIME | ||||
0x0010: Reserved (was BANDWIDTH) | ||||
0x0012: XOR-PEER-ADDRESS | ||||
0x0013: DATA | ||||
0x0016: XOR-RELAYED-ADDRESS | ||||
0x0017: REQUESTED-ADDRESS-FAMILY | ||||
0x0018: EVEN-PORT | ||||
0x0019: REQUESTED-TRANSPORT | ||||
0x001A: DONT-FRAGMENT | ||||
0x0021: Reserved (was TIMER-VAL) | ||||
0x0022: RESERVATION-TOKEN | ||||
TBD-CA: ADDITIONAL-ADDRESS-FAMILY | ||||
TBD-CA: ADDRESS-ERROR-CODE | ||||
TBD-CA: ICMP | ||||
]]></artwork> | ||||
<postamble></postamble> | <tbody> | |||
</figure> | <tr> | |||
<td>0x000C</td> | ||||
<td>CHANNEL-NUMBER</td> | ||||
</tr> | ||||
<tr> | ||||
<td>0x000D</td> | ||||
<td>LIFETIME</td> | ||||
</tr> | ||||
<tr> | ||||
<td>0x0010</td> | ||||
<td>Reserved (was BANDWIDTH)</td> | ||||
</tr> | ||||
<tr> | ||||
<td>0x0012</td> | ||||
<td>XOR-PEER-ADDRESS</td> | ||||
</tr> | ||||
<tr> | ||||
<td>0x0013</td> | ||||
<td>DATA</td> | ||||
</tr> | ||||
<tr> | ||||
<td>0x0016</td> | ||||
<td>XOR-RELAYED-ADDRESS</td> | ||||
</tr> | ||||
<tr> | ||||
<td>0x0017</td> | ||||
<td>REQUESTED-ADDRESS-FAMILY</td> | ||||
</tr> | ||||
<tr> | ||||
<td>0x0018</td> | ||||
<td>EVEN-PORT</td> | ||||
</tr> | ||||
<tr> | ||||
<td>0x0019</td> | ||||
<td>REQUESTED-TRANSPORT</td> | ||||
</tr> | ||||
<tr> | ||||
<td>0x001A</td> | ||||
<td>DONT-FRAGMENT</td> | ||||
</tr> | ||||
<tr> | ||||
<td>0x0021</td> | ||||
<td>Reserved (was TIMER-VAL)</td> | ||||
</tr> | ||||
<tr> | ||||
<td>0x0022</td> | ||||
<td>RESERVATION-TOKEN</td> | ||||
</tr> | ||||
<tr> | ||||
<td>0x8000</td> | ||||
<td>ADDITIONAL-ADDRESS-FAMILY</td> | ||||
</tr> | ||||
<tr> | ||||
<td>0x8001</td> | ||||
<td>ADDRESS-ERROR-CODE</td> | ||||
</tr> | ||||
<tr> | ||||
<td>0x8004</td> | ||||
<td>ICMP</td> | ||||
</tr> | ||||
</tbody> | ||||
</table> | ||||
<t>Some of these attributes have lengths that are not multiples of 4. By | <t>Some of these attributes have lengths that are not multiples of 4. By | |||
the rules of STUN, any attribute whose length is not a multiple of 4 | the rules of STUN, any attribute whose length is not a multiple of 4 | |||
bytes MUST be immediately followed by 1 to 3 padding bytes to ensure the | bytes <bcp14>MUST</bcp14> be immediately followed by 1 to 3 padding bytes | |||
next attribute (if any) would start on a 4-byte boundary (see <xref | to ensure the | |||
target="I-D.ietf-tram-stunbis"></xref>).</t> | next attribute (if any) would start on a 4-byte boundary (see <xref target | |||
="RFC8489" format="default"/>).</t> | ||||
<section anchor="channelnums" title="CHANNEL-NUMBER"> | <section anchor="channelnums" numbered="true" toc="default"> | |||
<name>CHANNEL-NUMBER</name> | ||||
<t>The CHANNEL-NUMBER attribute contains the number of the channel. | <t>The CHANNEL-NUMBER attribute contains the number of the channel. | |||
The value portion of this attribute is 4 bytes long and consists of a | The value portion of this attribute is 4 bytes long and consists of a | |||
16-bit unsigned integer, followed by a two-octet RFFU (Reserved For | 16-bit unsigned integer followed by a two-octet RFFU (Reserved For | |||
Future Use) field, which MUST be set to 0 on transmission and MUST be | Future Use) field, which <bcp14>MUST</bcp14> be set to 0 on transmission | |||
and <bcp14>MUST</bcp14> be | ||||
ignored on reception.</t> | ignored on reception.</t> | |||
<figure> | ||||
<figure> | <artwork name="" type="" align="left" alt=""><![CDATA[ | |||
<artwork><![CDATA[ | 0 1 2 3 | |||
0 1 2 3 | 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 | |||
0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 | +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | |||
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | | Channel Number | RFFU = 0 | | |||
| Channel Number | RFFU = 0 | | +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | |||
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | ||||
]]></artwork> | ]]></artwork> | |||
</figure> | -+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | |||
</figure> | ||||
</section> | </section> | |||
<section numbered="true" toc="default"> | ||||
<section title="LIFETIME"> | <name>LIFETIME</name> | |||
<t>The LIFETIME attribute represents the duration for which the server | <t>The LIFETIME attribute represents the duration for which the server | |||
will maintain an allocation in the absence of a refresh. The TURN | will maintain an allocation in the absence of a refresh. The TURN | |||
client can include the LIFETIME attribute with the desired lifetime in | client can include the LIFETIME attribute with the desired lifetime in | |||
Allocate and Refresh requests. The value portion of this attribute is | Allocate and Refresh requests. The value portion of this attribute is | |||
4-bytes long and consists of a 32-bit unsigned integral value | 4 bytes long and consists of a 32-bit unsigned integral value | |||
representing the number of seconds remaining until expiration.</t> | representing the number of seconds remaining until expiration.</t> | |||
</section> | </section> | |||
<section numbered="true" toc="default"> | ||||
<section title="XOR-PEER-ADDRESS"> | <name>XOR-PEER-ADDRESS</name> | |||
<t>The XOR-PEER-ADDRESS specifies the address and port of the peer as | <t>The XOR-PEER-ADDRESS attribute specifies the address and port of the | |||
peer as | ||||
seen from the TURN server. (For example, the peer's server-reflexive | seen from the TURN server. (For example, the peer's server-reflexive | |||
transport address if the peer is behind a NAT.) It is encoded in the | transport address if the peer is behind a NAT.) It is encoded in the | |||
same way as XOR-MAPPED-ADDRESS <xref | same way as the XOR-MAPPED-ADDRESS attribute <xref target="RFC8489" form | |||
target="I-D.ietf-tram-stunbis"></xref>.</t> | at="default"/>.</t> | |||
</section> | </section> | |||
<section title="DATA"> | <section numbered="true" toc="default"> | |||
<name>DATA</name> | ||||
<t>The DATA attribute is present in all Send indications. If the ICMP | <t>The DATA attribute is present in all Send indications. If the ICMP | |||
attribute is not present in a Data indication, it contains a DATA | attribute is not present in a Data indication, it contains a DATA | |||
attribute. The value portion of this attribute is variable length and | attribute. The value portion of this attribute is variable length and | |||
consists of the application data (that is, the data that would | consists of the application data (that is, the data that would | |||
immediately follow the UDP header if the data was been sent directly | immediately follow the UDP header if the data was sent directly | |||
between the client and the peer). The application data is equivalent | between the client and the peer). The application data is equivalent | |||
to the "UDP user data" and does not include the "surplus area" defined | to the "UDP user data" and does not include the "surplus area" defined | |||
in Section 4 of <xref target="I-D.ietf-tsvwg-udp-options"></xref>. If | in <xref target="I-D.ietf-tsvwg-udp-options" | |||
sectionFormat="of" section="4" />. If | ||||
the length of this attribute is not a multiple of 4, then padding must | the length of this attribute is not a multiple of 4, then padding must | |||
be added after this attribute.</t> | be added after this attribute.</t> | |||
</section> | </section> | |||
<section title="XOR-RELAYED-ADDRESS"> | <section numbered="true" toc="default"> | |||
<t>The XOR-RELAYED-ADDRESS is present in Allocate responses. It | <name>XOR-RELAYED-ADDRESS</name> | |||
<t>The XOR-RELAYED-ADDRESS attribute is present in Allocate responses. I | ||||
t | ||||
specifies the address and port that the server allocated to the | specifies the address and port that the server allocated to the | |||
client. It is encoded in the same way as XOR-MAPPED-ADDRESS <xref | client. It is encoded in the same way as the XOR-MAPPED-ADDRESS | |||
target="I-D.ietf-tram-stunbis"></xref>.</t> | attribute <xref target="RFC8489" format="default"/>.</t> | |||
</section> | </section> | |||
<section anchor="sec-requested-address-family" numbered="true" toc="defaul | ||||
<section anchor="sec-requested-address-family" | t"> | |||
title="REQUESTED-ADDRESS-FAMILY"> | <name>REQUESTED-ADDRESS-FAMILY</name> | |||
<t>This attribute is used in Allocate and Refresh requests to specify | <t>This attribute is used in Allocate and Refresh requests to specify | |||
the address type requested by the client. The value of this attribute | the address type requested by the client. The value of this attribute | |||
is 4 bytes with the following format:</t> | is 4 bytes with the following format:</t> | |||
<figure> | ||||
<figure> | <artwork name="" type="" align="left" alt=""><![CDATA[ | |||
<artwork><![CDATA[ | 0 1 2 3 | |||
0 1 2 3 | 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 | |||
0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 | +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | |||
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | | Family | Reserved | | |||
| Family | Reserved | | +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | |||
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | ||||
]]></artwork> | ]]></artwork> | |||
</figure> | -+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | |||
</figure> | ||||
<t></t> | <dl newline="false" spacing="normal"> | |||
<dt>Family:</dt> | ||||
<t><list style="hanging"> | <dd>There are two values defined for this field and specified in | |||
<t hangText="Family:">there are two values defined for this field | <xref target="RFC8489" section="14.1" sectionFormat="of"/>: 0x01 for | |||
and specified in <xref target="I-D.ietf-tram-stunbis"></xref>, | IPv4 addresses and 0x02 for IPv6 addresses.</dd> | |||
Section 14.1: 0x01 for IPv4 addresses and 0x02 for IPv6 | <dt>Reserved:</dt> | |||
addresses.</t> | <dd>At this point, the 24 bits in the Reserved | |||
field <bcp14>MUST</bcp14> be set to zero by the client and <bcp14>MU | ||||
<t hangText="Reserved:">at this point, the 24 bits in the Reserved | ST</bcp14> be ignored by the | |||
field MUST be set to zero by the client and MUST be ignored by the | server.</dd> | |||
server.</t> | </dl> | |||
</list></t> | ||||
</section> | </section> | |||
<section numbered="true" toc="default"> | ||||
<section title="EVEN-PORT"> | <name>EVEN-PORT</name> | |||
<t>This attribute allows the client to request that the port in the | <t>This attribute allows the client to request that the port in the | |||
relayed transport address be even, and (optionally) that the server | relayed transport address be even and (optionally) that the server | |||
reserve the next-higher port number. The value portion of this | reserve the next-higher port number. The value portion of this | |||
attribute is 1 byte long. Its format is:</t> | attribute is 1 byte long. Its format is:</t> | |||
<figure> | ||||
<figure> | <artwork name="" type="" align="left" alt=""><![CDATA[ | |||
<preamble></preamble> | 0 | |||
<artwork><![CDATA[ 0 | ||||
0 1 2 3 4 5 6 7 | 0 1 2 3 4 5 6 7 | |||
+-+-+-+-+-+-+-+-+ | +-+-+-+-+-+-+-+-+ | |||
|R| RFFU | | |R| RFFU | | |||
+-+-+-+-+-+-+-+-+]]></artwork> | +-+-+-+-+-+-+-+-+]]></artwork> | |||
</figure> | </figure> | |||
<t>The value contains a single 1-bit flag:</t> | ||||
<t></t> | <dl newline="false" spacing="normal"> | |||
<dt>R:</dt> | ||||
<t>The value contains a single 1-bit flag:<list style="hanging"> | <dd>If 1, the server is requested to reserve the | |||
<t hangText="R:">If 1, the server is requested to reserve the | ||||
next-higher port number (on the same IP address) for a subsequent | next-higher port number (on the same IP address) for a subsequent | |||
allocation. If 0, no such reservation is requested.</t> | allocation. If 0, no such reservation is requested.</dd> | |||
<dt>RFFU:</dt> | ||||
<t hangText="RFFU:">Reserved For Future Use.</t> | <dd>Reserved For Future Use.</dd> | |||
</list>The RFFU field must be set to zero on transmission and | </dl> | |||
<t>The RFFU field must be set to zero on transmission and | ||||
ignored on reception.</t> | ignored on reception.</t> | |||
<t>Since the length of this attribute is not a multiple of 4, padding | <t>Since the length of this attribute is not a multiple of 4, padding | |||
must immediately follow this attribute.</t> | must immediately follow this attribute.</t> | |||
</section> | </section> | |||
<section anchor="sec-requested-transport" numbered="true" toc="default"> | ||||
<section anchor="sec-requested-transport" title="REQUESTED-TRANSPORT"> | <name>REQUESTED-TRANSPORT</name> | |||
<t>This attribute is used by the client to request a specific | <t>This attribute is used by the client to request a specific | |||
transport protocol for the allocated transport address. The value of | transport protocol for the allocated transport address. The value of | |||
this attribute is 4 bytes with the following format:</t> | this attribute is 4 bytes with the following format:</t> | |||
<figure> | ||||
<figure> | <artwork name="" type="" align="left" alt=""><![CDATA[ | |||
<artwork><![CDATA[ 0 1 2 | 0 1 2 3 | |||
3 | 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 | |||
0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 | +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | |||
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | | Protocol | RFFU | | |||
| Protocol | RFFU | | +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | |||
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | ||||
]]></artwork> | ]]></artwork> | |||
</figure> | -+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | |||
</figure> | ||||
<t>The Protocol field specifies the desired protocol. The codepoints | <t>The Protocol field specifies the desired protocol. The code points | |||
used in this field are taken from those allowed in the Protocol field | used in this field are taken from those allowed in the Protocol field | |||
in the IPv4 header and the NextHeader field in the IPv6 header <xref | in the IPv4 header and the NextHeader field in the IPv6 header <xref | |||
target="Protocol-Numbers"></xref>. This specification only allows the | target="PROTOCOL-NUMBERS" format="default"/>. This specification only | |||
use of codepoint 17 (User Datagram Protocol).</t> | allows the use of code point 17 (User Datagram Protocol).</t> | |||
<t>The RFFU field <bcp14>MUST</bcp14> be set to zero on transmission and | ||||
<t>The RFFU field MUST be set to zero on transmission and MUST be | <bcp14>MUST</bcp14> be | |||
ignored on reception. It is reserved for future uses.</t> | ignored on reception. It is reserved for future uses.</t> | |||
</section> | </section> | |||
<section numbered="true" toc="default"> | ||||
<section title="DONT-FRAGMENT"> | <name>DONT-FRAGMENT</name> | |||
<t>This attribute is used by the client to request that the server set | <t>This attribute is used by the client to request that the server set | |||
the DF (Don't Fragment) bit in the IP header when relaying the | the DF (Don't Fragment) bit in the IP header when relaying the | |||
application data onward to the peer, and for determining the server | application data onward to the peer and for determining the server | |||
capability in Allocate requests. This attribute has no value part and | capability in Allocate requests. This attribute has no value part, and | |||
thus the attribute length field is 0.</t> | thus, the attribute length field is 0.</t> | |||
</section> | </section> | |||
<section numbered="true" toc="default"> | ||||
<section title="RESERVATION-TOKEN"> | <name>RESERVATION-TOKEN</name> | |||
<t>The RESERVATION-TOKEN attribute contains a token that uniquely | <t>The RESERVATION-TOKEN attribute contains a token that uniquely | |||
identifies a relayed transport address being held in reserve by the | identifies a relayed transport address being held in reserve by the | |||
server. The server includes this attribute in a success response to | server. The server includes this attribute in a success response to | |||
tell the client about the token, and the client includes this | tell the client about the token, and the client includes this | |||
attribute in a subsequent Allocate request to request the server use | attribute in a subsequent Allocate request to request the server use | |||
that relayed transport address for the allocation.</t> | that relayed transport address for the allocation.</t> | |||
<t>The attribute value is 8 bytes and contains the token value.</t> | <t>The attribute value is 8 bytes and contains the token value.</t> | |||
</section> | </section> | |||
<section anchor="sec-additional-address-family" numbered="true" toc="defau | ||||
<section anchor="sec-additional-address-family" | lt"> | |||
title="ADDITIONAL-ADDRESS-FAMILY"> | <name>ADDITIONAL-ADDRESS-FAMILY</name> | |||
<t>This attribute is used by clients to request the allocation of a | <t>This attribute is used by clients to request the allocation of an | |||
IPv4 and IPv6 address type from a server. It is encoded in the same | IPv4 and IPv6 address type from a server. It is encoded in the same | |||
way as REQUESTED-ADDRESS-FAMILY <xref | way as the REQUESTED-ADDRESS-FAMILY attribute; see <xref | |||
target="sec-requested-address-family"></xref>. The | target="sec-requested-address-family" format="default"/>. The | |||
ADDITIONAL-ADDRESS-FAMILY attribute MAY be present in Allocate | ADDITIONAL-ADDRESS-FAMILY attribute <bcp14>MAY</bcp14> be present in | |||
request. The attribute value of 0x02 (IPv6 address) is the only valid | the Allocate request. The attribute value of 0x02 (IPv6 address) is | |||
value in Allocate request.</t> | the only valid value in Allocate request.</t> | |||
</section> | </section> | |||
<section anchor="sec-address-error-code" numbered="true" toc="default"> | ||||
<section anchor="sec-address-error-code" title="ADDRESS-ERROR-CODE "> | <name>ADDRESS-ERROR-CODE</name> | |||
<t>This attribute is used by servers to signal the reason for not | <t>This attribute is used by servers to signal the reason for not | |||
allocating the requested address family. The value portion of this | allocating the requested address family. The value portion of this | |||
attribute is variable length with the following format:</t> | attribute is variable length with the following format:</t> | |||
<figure> | ||||
<figure> | <artwork name="" type="" align="left" alt=""><![CDATA[ | |||
<artwork><![CDATA[ 0 1 2 | 0 1 2 3 | |||
3 | 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 | |||
0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 | +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | |||
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | | Family | Reserved |Class| Number | | |||
| Family | Reserved |Class| Number | | +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | |||
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | | Reason Phrase (variable) .. | |||
| Reason Phrase (variable) .. | +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | |||
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | ||||
]]></artwork> | ]]></artwork> | |||
</figure> | </figure> | |||
<dl newline="false" spacing="normal"> | ||||
<t><list style="hanging"> | <dt>Family:</dt> | |||
<t hangText="Family:">there are two values defined for this field | <dd>There are two values defined for this field and specified in | |||
and specified in <xref target="I-D.ietf-tram-stunbis"></xref>, | <xref target="RFC8489" sectionFormat="of" section="14.1"/>: 0x01 for | |||
Section 14.1: 0x01 for IPv4 addresses and 0x02 for IPv6 | IPv4 addresses and 0x02 for IPv6 addresses.</dd> | |||
addresses.</t> | <dt>Reserved:</dt> | |||
<dd>At this point, the 13 bits in the Reserved | ||||
<t hangText="Reserved:">at this point, the 13 bits in the Reserved | field <bcp14>MUST</bcp14> be set to zero by the server and <bcp14>MU | |||
field MUST be set to zero by the server and MUST be ignored by the | ST</bcp14> be ignored by the | |||
client.</t> | client.</dd> | |||
<dt>Class:</dt> | ||||
<t hangText="Class:">The Class represents the hundreds digit of | <dd>The Class represents the hundreds digit of | |||
the error code and is defined in section 14.8 of <xref | the error code and is defined in <xref | |||
target="I-D.ietf-tram-stunbis"></xref>.</t> | target="RFC8489" sectionFormat="of" section="14.8"/>.</dd> | |||
<dt>Number:</dt> | ||||
<t hangText="Number:">this 8-bit field contains the reason server | <dd>This 8-bit field contains the reason the server | |||
cannot allocate one of the requested address types. The error code | cannot allocate one of the requested address types. The error code | |||
values could be either 440 (unsupported address family) or 508 | values could be either 440 (Address Family not Supported) or 508 | |||
(insufficient capacity). The number representation is defined in | (Insufficient Capacity). The number representation is defined in | |||
section 14.8 of <xref target="I-D.ietf-tram-stunbis"></xref>.</t> | <xref target="RFC8489" sectionFormat="of" section="14.8"/>.</dd> | |||
<dt>Reason Phrase:</dt> | ||||
<t hangText="Reason Phrase:">The recommended reason phrases for | <dd>The recommended reason phrases for | |||
error codes 440 and 508 are explained in <xref | error codes 440 and 508 are explained in <xref target="sec-stun-erro | |||
target="sec-stun-errors"></xref>. The reason phrase MUST be a | rs" format="default"/>. The reason phrase <bcp14>MUST</bcp14> be a | |||
UTF-8 <xref target="RFC3629"></xref> encoded sequence of less than | UTF-8 <xref target="RFC3629" format="default"/> encoded sequence of | |||
less than | ||||
128 characters (which can be as long as 509 bytes when encoding | 128 characters (which can be as long as 509 bytes when encoding | |||
them or 763 bytes when decoding them).</t> | them or 763 bytes when decoding them).</dd> | |||
</list></t> | </dl> | |||
</section> | </section> | |||
<section anchor="icmp" numbered="true" toc="default"> | ||||
<section anchor="icmp" title="ICMP "> | <name>ICMP</name> | |||
<t>This attribute is used by servers to signal the reason an UDP | <t>This attribute is used by servers to signal the reason a UDP | |||
packet was dropped. The following is the format of the ICMP | packet was dropped. The following is the format of the ICMP | |||
attribute.</t> | attribute.</t> | |||
<figure> | ||||
<figure> | <artwork name="" type="" align="left" alt=""><![CDATA[ | |||
<artwork><![CDATA[ 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 | 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 | |||
2 3 4 5 6 7 8 9 0 1 | +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | |||
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | | Reserved | ICMP Type | ICMP Code | | |||
| Reserved | ICMP Type | ICMP Code | | +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | |||
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | | Error Data | | |||
| Error Data | | +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | |||
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | ||||
]]></artwork> | ]]></artwork> | |||
</figure> | </figure> | |||
<t><list style="hanging"> | ||||
<t hangText="Reserved:">This field MUST be set to 0 when sent, and | ||||
MUST be ignored when received.</t> | ||||
<t hangText="ICMP Type:">The field contains the value in the ICMP | ||||
type. Its interpretation depends whether the ICMP was received | ||||
over IPv4 or IPv6.</t> | ||||
<t hangText="ICMP Code:">The field contains the value in the ICMP | ||||
code. Its interpretation depends whether the ICMP was received | ||||
over IPv4 or IPv6.</t> | ||||
<t hangText="Error Data:">This field size is 4 bytes long. If the | <dl newline="false" spacing="normal"> | |||
ICMPv6 type is 2 (Packet Too Big Message) or ICMPv4 type is 3 ( | <dt>Reserved:</dt> | |||
Destination Unreachable) and Code is 4 (fragmentation needed and | <dd>This field <bcp14>MUST</bcp14> be set to 0 when sent and | |||
DF set), the Error Data field will be set to the Maximum | <bcp14>MUST</bcp14> be ignored when received.</dd> | |||
Transmission Unit of the next-hop link (Section 3.2 of <xref | <dt>ICMP Type:</dt> | |||
target="RFC4443"></xref>) and Section 4 of <xref | <dd>The field contains the value of the ICMP | |||
target="RFC1191"></xref>). For other ICMPv6 types and ICMPv4 types | type. Its interpretation depends on whether the ICMP was received | |||
and codes, Error Data field MUST be set to zero.</t> | over IPv4 or IPv6.</dd> | |||
</list></t> | <dt>ICMP Code:</dt> | |||
<dd>The field contains the value of the ICMP | ||||
code. Its interpretation depends on whether the ICMP was received | ||||
over IPv4 or IPv6.</dd> | ||||
<dt>Error Data:</dt> | ||||
<dd>This field size is 4 bytes long. If the ICMPv6 type is 2 | ||||
("Packet too big" message) or ICMPv4 type is 3 (Destination | ||||
Unreachable) and Code is 4 (fragmentation needed and DF set), the | ||||
Error Data field will be set to the Maximum Transmission Unit of the | ||||
next-hop link (<xref target="RFC4443" sectionFormat="of" | ||||
section="3.2"/> and <xref target="RFC1191" | ||||
sectionFormat="of" section="4"/>). For other ICMPv6 types and ICMPv4 t | ||||
ypes and | ||||
codes, the Error Data field <bcp14>MUST</bcp14> be set to zero.</dd> | ||||
</dl> | ||||
</section> | </section> | |||
</section> | </section> | |||
<section anchor="sec-stun-errors" numbered="true" toc="default"> | ||||
<section anchor="sec-stun-errors" title="STUN Error Response Codes"> | <name>STUN Error Response Codes</name> | |||
<t>This document defines the following error response codes:<list | <t>This document defines the following error response codes:</t> | |||
style="hanging"> | <dl newline="true" spacing="normal"> | |||
<t hangText="403">(Forbidden): The request was valid but cannot be | <dt>403 (Forbidden):</dt> | |||
performed due to administrative or similar restrictions.</t> | <dd>The request was valid but cannot be | |||
performed due to administrative or similar restrictions.</dd> | ||||
<t hangText="437">(Allocation Mismatch): A request was received by | <dt>437 (Allocation Mismatch):</dt> | |||
<dd>A request was received by | ||||
the server that requires an allocation to be in place, but no | the server that requires an allocation to be in place, but no | |||
allocation exists, or a request was received that requires no | allocation exists, or a request was received that requires no | |||
allocation, but an allocation exists.</t> | allocation, but an allocation exists.</dd> | |||
<dt>440 (Address Family not Supported):</dt> | ||||
<t hangText="440">(Address Family not Supported): The server does | <dd>The server does | |||
not support the address family requested by the client.</t> | not support the address family requested by the client.</dd> | |||
<dt>441 (Wrong Credentials):</dt> | ||||
<t hangText="441">(Wrong Credentials): The credentials in the | <dd>(Wrong Credentials): The credentials in the | |||
(non-Allocate) request do not match those used to create the | (non-Allocate) request do not match those used to create the | |||
allocation.</t> | allocation.</dd> | |||
<dt>442 (Unsupported Transport Protocol):</dt> | ||||
<t hangText="442">(Unsupported Transport Protocol): The Allocate | <dd>The Allocate | |||
request asked the server to use a transport protocol between the | request asked the server to use a transport protocol between the | |||
server and the peer that the server does not support. NOTE: This | server and the peer that the server does not support. NOTE: This | |||
does NOT refer to the transport protocol used in the 5-tuple.</t> | does NOT refer to the transport protocol used in the 5-tuple.</dd> | |||
<dt>443 (Peer Address Family Mismatch):</dt> | ||||
<t hangText="443">(Peer Address Family Mismatch). A peer address is | <dd>A peer address is | |||
part of a different address family than that of the relayed | part of a different address family than that of the relayed | |||
transport address of the allocation.</t> | transport address of the allocation.</dd> | |||
<dt>486 (Allocation Quota Reached):</dt> | ||||
<t hangText="486">(Allocation Quota Reached): No more allocations | <dd>No more allocations | |||
using this username can be created at the present time.</t> | using this username can be created at the present time.</dd> | |||
<dt>508 (Insufficient Capacity):</dt> | ||||
<t hangText="508">(Insufficient Capacity): The server is unable to | <dd>The server is unable to | |||
carry out the request due to some capacity limit being reached. In | carry out the request due to some capacity limit being reached. In | |||
an Allocate response, this could be due to the server having no more | an Allocate response, this could be due to the server having no more | |||
relayed transport addresses available at that time, having none with | relayed transport addresses available at that time, having none with | |||
the requested properties, or the one that corresponds to the | the requested properties, or the one that corresponds to the | |||
specified reservation token is not available.</t> | specified reservation token is not available.</dd> | |||
</list></t> | </dl> | |||
</section> | </section> | |||
<section numbered="true" toc="default"> | ||||
<section title="Detailed Example"> | <name>Detailed Example</name> | |||
<t>This section gives an example of the use of TURN, showing in detail | <t>This section gives an example of the use of TURN, showing in detail | |||
the contents of the messages exchanged. The example uses the network | the contents of the messages exchanged. The example uses the network | |||
diagram shown in the Overview (<xref | diagram shown in the Overview (<xref target="fig-turn-model" format="defau | |||
target="fig-turn-model"></xref>).</t> | lt"/>).</t> | |||
<t>For each message, the attributes included in the message and their | <t>For each message, the attributes included in the message and their | |||
values are shown. For convenience, values are shown in a human-readable | values are shown. For convenience, values are shown in a human-readable | |||
format rather than showing the actual octets; for example, | format rather than showing the actual octets; for example, | |||
"XOR-RELAYED-ADDRESS=192.0.2.15:9000" shows that the XOR-RELAYED-ADDRESS | "XOR-RELAYED-ADDRESS=192.0.2.15:9000" shows that the XOR-RELAYED-ADDRESS | |||
attribute is included with an address of 192.0.2.15 and a port of 9000, | attribute is included with an address of 192.0.2.15 and a port of 9000; | |||
here the address and port are shown before the xor-ing is done. For | here, the address and port are shown before the xor-ing is done. For | |||
attributes with string-like values (e.g., SOFTWARE="Example client, | attributes with string-like values (e.g., SOFTWARE="Example client, | |||
version 1.03" and NONCE="obMatJos2gAAAadl7W7PeDU4hKE72jda"), the value | version 1.03" and NONCE="obMatJos2gAAAadl7W7PeDU4hKE72jda"), the value | |||
of the attribute is shown in quotes for readability, but these quotes do | of the attribute is shown in quotes for readability, but these quotes do | |||
not appear in the actual value.</t> | not appear in the actual value.</t> | |||
<figure> | ||||
<t></t> | <artwork name="" type="" align="left" alt=""><![CDATA[ | |||
TURN TURN Peer Peer | ||||
<figure> | client server A B | |||
<artwork><![CDATA[TURN TURN Pe | | | | | | |||
er Peer | |--- Allocate request -------------->| | | | |||
client server A B | | Transaction-Id=0xA56250D3F17ABE679422DE85 | | | |||
| | | | | | SOFTWARE="Example client, version 1.03" | | | |||
|--- Allocate request -------------->| | | | | LIFETIME=3600 (1 hour) | | | | |||
| Transaction-Id=0xA56250D3F17ABE679422DE85 | | | | REQUESTED-TRANSPORT=17 (UDP) | | | | |||
| SOFTWARE="Example client, version 1.03" | | | | DONT-FRAGMENT | | | | |||
| LIFETIME=3600 (1 hour) | | | | | | | | | |||
| REQUESTED-TRANSPORT=17 (UDP) | | | | |<-- Allocate error response --------| | | | |||
| DONT-FRAGMENT | | | | | Transaction-Id=0xA56250D3F17ABE679422DE85 | | | |||
| | | | | | SOFTWARE="Example server, version 1.17" | | | |||
|<-- Allocate error response --------| | | | | ERROR-CODE=401 (Unauthorized) | | | | |||
| Transaction-Id=0xA56250D3F17ABE679422DE85 | | | | REALM="example.com" | | | | |||
| SOFTWARE="Example server, version 1.17" | | | | NONCE="obMatJos2gAAAadl7W7PeDU4hKE72jda" | | | |||
| ERROR-CODE=401 (Unauthorized) | | | | | PASSWORD-ALGORITHMS=MD5 and SHA256 | | | |||
| REALM="example.com" | | | | | | | | | |||
| NONCE="obMatJos2gAAAadl7W7PeDU4hKE72jda" | | | |--- Allocate request -------------->| | | | |||
| PASSWORD-ALGORITHMS=MD5 and SHA256 | | | | Transaction-Id=0xC271E932AD7446A32C234492 | | | |||
| | | | | | SOFTWARE="Example client 1.03" | | | | |||
|--- Allocate request -------------->| | | | | LIFETIME=3600 (1 hour) | | | | |||
| Transaction-Id=0xC271E932AD7446A32C234492 | | | | REQUESTED-TRANSPORT=17 (UDP) | | | | |||
| SOFTWARE="Example client 1.03" | | | | | DONT-FRAGMENT | | | | |||
| LIFETIME=3600 (1 hour) | | | | | USERNAME="George" | | | | |||
| REQUESTED-TRANSPORT=17 (UDP) | | | | | REALM="example.com" | | | | |||
| DONT-FRAGMENT | | | | | NONCE="obMatJos2gAAAadl7W7PeDU4hKE72jda" | | | |||
| USERNAME="George" | | | | | PASSWORD-ALGORITHMS=MD5 and SHA256 | | | |||
| REALM="example.com" | | | | | PASSWORD-ALGORITHM=SHA256 | | | | |||
| NONCE="obMatJos2gAAAadl7W7PeDU4hKE72jda" | | | | MESSAGE-INTEGRITY=... | | | | |||
| PASSWORD-ALGORITHMS=MD5 and SHA256 | | | | MESSAGE-INTEGRITY-SHA256=... | | | | |||
| PASSWORD-ALGORITHM=SHA256 | | | | | | | | | |||
| MESSAGE-INTEGRITY=... | | | | |<-- Allocate success response ------| | | | |||
| MESSAGE-INTEGRITY-SHA256=... | | | | | Transaction-Id=0xC271E932AD7446A32C234492 | | | |||
| | | | | | SOFTWARE="Example server, version 1.17" | | | |||
|<-- Allocate success response ------| | | | | LIFETIME=1200 (20 minutes) | | | | |||
| Transaction-Id=0xC271E932AD7446A32C234492 | | | | XOR-RELAYED-ADDRESS=192.0.2.15:50000 | | | |||
| SOFTWARE="Example server, version 1.17" | | | | XOR-MAPPED-ADDRESS=192.0.2.1:7000 | | | |||
| LIFETIME=1200 (20 minutes) | | | | | MESSAGE-INTEGRITY-SHA256=... | | | | |||
| XOR-RELAYED-ADDRESS=192.0.2.15:50000 | | | ||||
| XOR-MAPPED-ADDRESS=192.0.2.1:7000 | | | ||||
| MESSAGE-INTEGRITY-SHA256=... | | | | ||||
]]></artwork> | ]]></artwork> | |||
</figure> | ||||
<postamble></postamble> | ||||
</figure> | ||||
<t>The client begins by selecting a host transport address to use for | <t>The client begins by selecting a host transport address to use for | |||
the TURN session; in this example, the client has selected | the TURN session; in this example, the client has selected | |||
198.51.100.2:49721 as shown in <xref target="fig-turn-model"></xref>. | 198.51.100.2:49721 as shown in <xref target="fig-turn-model" format="defau lt"/>. | |||
The client then sends an Allocate request to the server at the server | The client then sends an Allocate request to the server at the server | |||
transport address. The client randomly selects a 96-bit transaction id | transport address. The client randomly selects a 96-bit transaction id | |||
of 0xA56250D3F17ABE679422DE85 for this transaction; this is encoded in | of 0xA56250D3F17ABE679422DE85 for this transaction; this is encoded in | |||
the transaction id field in the fixed header. The client includes a | the transaction id field in the fixed header. The client includes a | |||
SOFTWARE attribute that gives information about the client's software; | SOFTWARE attribute that gives information about the client's software; | |||
here the value is "Example client, version 1.03" to indicate that this | here, the value is "Example client, version 1.03" to indicate that this | |||
is version 1.03 of something called the Example client. The client | is version 1.03 of something called the "Example client". The client | |||
includes the LIFETIME attribute because it wishes the allocation to have | includes the LIFETIME attribute because it wishes the allocation to have | |||
a longer lifetime than the default of 10 minutes; the value of this | a longer lifetime than the default of 10 minutes; the value of this | |||
attribute is 3600 seconds, which corresponds to 1 hour. The client must | attribute is 3600 seconds, which corresponds to 1 hour. The client must | |||
always include a REQUESTED-TRANSPORT attribute in an Allocate request | always include a REQUESTED-TRANSPORT attribute in an Allocate request, | |||
and the only value allowed by this specification is 17, which indicates | and the only value allowed by this specification is 17, which indicates | |||
UDP transport between the server and the peers. The client also includes | UDP transport between the server and the peers. The client also includes | |||
the DONT-FRAGMENT attribute because it wishes to use the DONT-FRAGMENT | the DONT-FRAGMENT attribute because it wishes to use the DONT-FRAGMENT | |||
attribute later in Send indications; this attribute consists of only an | attribute later in Send indications; this attribute consists of only an | |||
attribute header, there is no value part. We assume the client has not | attribute header; there is no value part. We assume the client has not | |||
recently interacted with the server, thus the client does not include | recently interacted with the server; thus, the client does not include | |||
USERNAME, USERHASH, REALM, NONCE, PASSWORD-ALGORITHMS, | the USERNAME, USERHASH, REALM, NONCE, PASSWORD-ALGORITHMS, | |||
PASSWORD-ALGORITHM, MESSAGE-INTEGRITY or MESSAGE-INTEGRITY-SHA256 | PASSWORD-ALGORITHM, MESSAGE-INTEGRITY, or MESSAGE-INTEGRITY-SHA256 | |||
attribute. Finally, note that the order of attributes in a message is | attribute. Finally, note that the order of attributes in a message is | |||
arbitrary (except for the MESSAGE-INTEGRITY, MESSAGE-INTEGRITY-SHA256 | arbitrary (except for the MESSAGE-INTEGRITY, MESSAGE-INTEGRITY-SHA256 | |||
and FINGERPRINT attributes) and the client could have used a different | and FINGERPRINT attributes), and the client could have used a different | |||
order.</t> | order.</t> | |||
<t>Servers require any request to be authenticated. Thus, when the | <t>Servers require any request to be authenticated. Thus, when the | |||
server receives the initial Allocate request, it rejects the request | server receives the initial Allocate request, it rejects the request | |||
because the request does not contain the authentication attributes. | because the request does not contain the authentication attributes. | |||
Following the procedures of the long-term credential mechanism of STUN | Following the procedures of the long-term credential mechanism of STUN | |||
<xref target="I-D.ietf-tram-stunbis"></xref>, the server includes an | <xref target="RFC8489" format="default"/>, the server includes an | |||
ERROR-CODE attribute with a value of 401 (Unauthorized), a REALM | ERROR-CODE attribute with a value of 401 (Unauthorized), a REALM | |||
attribute that specifies the authentication realm used by the server (in | attribute that specifies the authentication realm used by the server (in | |||
this case, the server's domain "example.com"), and a nonce value in a | this case, the server's domain "example.com"), and a nonce value in a | |||
NONCE attribute. The NONCE attribute starts with the "nonce cookie" with | NONCE attribute. The NONCE attribute starts with the "nonce cookie" with | |||
the STUN Security Feature "Password algorithm" bit set to 1. The server | the STUN Security Feature "Password algorithm" bit set to 1. The server | |||
includes a PASSWORD-ALGORITHMS attribute that specifies the list of | includes a PASSWORD-ALGORITHMS attribute that specifies the list of | |||
algorithms that the server can use to derive the long-term password. If | algorithms that the server can use to derive the long-term password. If | |||
the server sets the STUN Security Feature "Username anonymity" bit to 1 | the server sets the STUN Security Feature "Username anonymity" bit to 1, | |||
then the client uses the USERHASH attribute instead of the USERNAME | then the client uses the USERHASH attribute instead of the USERNAME | |||
attribute in the Allocate request to anonymise the username. The server | attribute in the Allocate request to anonymize the username. The server | |||
also includes a SOFTWARE attribute that gives information about the | also includes a SOFTWARE attribute that gives information about the | |||
server's software.</t> | server's software.</t> | |||
<t>The client, upon receipt of the 401 error, reattempts the Allocate | ||||
<t>The client, upon receipt of the 401 error, re-attempts the Allocate | ||||
request, this time including the authentication attributes. The client | request, this time including the authentication attributes. The client | |||
selects a new transaction id, and then populates the new Allocate | selects a new transaction id and then populates the new Allocate | |||
request with the same attributes as before. The client includes a | request with the same attributes as before. The client includes a | |||
USERNAME attribute and uses the realm value received from the server to | USERNAME attribute and uses the realm value received from the server to | |||
help it determine which value to use; here the client is configured to | help it determine which value to use; here, the client is configured to | |||
use the username "George" for the realm "example.com". The client | use the username "George" for the realm "example.com". The client | |||
includes the PASSWORD-ALGORITHM attribute indicating the algorithm that | includes the PASSWORD-ALGORITHM attribute indicating the algorithm that | |||
the server must use to derive the long- term password. The client also | the server must use to derive the long-term password. The client also | |||
includes the REALM, PASSWORD-ALGORITHMS and NONCE attributes, which are | includes the REALM, PASSWORD-ALGORITHMS, and NONCE attributes, which are | |||
just copied from the 401 error response. Finally, the client includes | just copied from the 401 error response. Finally, the client includes | |||
MESSAGE-INTEGRITY-SHA256 attribute as the last attributes in the | MESSAGE-INTEGRITY-SHA256 attribute as the last attributes in the | |||
message, whose value is Hashed Message Authentication Code - Secure Hash | message whose value is Hashed Message Authentication Code - Secure Hash | |||
Algorithm 2 (HMAC-SHA2) hash over the contents of the message (shown as | Algorithm 2 (HMAC-SHA2) hash over the contents of the message (shown as | |||
just "..." above); this HMAC-SHA2 computation includes a password value. | just "..." above); this HMAC-SHA2 computation includes a password value. | |||
Thus, an attacker cannot compute the message integrity value without | Thus, an attacker cannot compute the message integrity value without | |||
somehow knowing the secret password.</t> | somehow knowing the secret password.</t> | |||
<t>The server, upon receipt of the authenticated Allocate request, | <t>The server, upon receipt of the authenticated Allocate request, | |||
checks that everything is OK, then creates an allocation. The server | checks that everything is OK, then creates an allocation. The server | |||
replies with an Allocate success response. The server includes a | replies with an Allocate success response. The server includes a | |||
LIFETIME attribute giving the lifetime of the allocation; here, the | LIFETIME attribute giving the lifetime of the allocation; here, the | |||
server has reduced the client's requested 1-hour lifetime to just 20 | server has reduced the client's requested 1-hour lifetime to just 20 | |||
minutes, because this particular server doesn't allow lifetimes longer | minutes because this particular server doesn't allow lifetimes longer | |||
than 20 minutes. The server includes an XOR-RELAYED-ADDRESS attribute | than 20 minutes. The server includes an XOR-RELAYED-ADDRESS attribute | |||
whose value is the relayed transport address of the allocation. The | whose value is the relayed transport address of the allocation. The | |||
server includes an XOR-MAPPED-ADDRESS attribute whose value is the | server includes an XOR-MAPPED-ADDRESS attribute whose value is the | |||
server-reflexive address of the client; this value is not used otherwise | server-reflexive address of the client; this value is not used otherwise | |||
in TURN but is returned as a convenience to the client. The server | in TURN but is returned as a convenience to the client. The server | |||
includes a MESSAGE-INTEGRITY-SHA256 attribute to authenticate the | includes a MESSAGE-INTEGRITY-SHA256 attribute to authenticate the | |||
response and to ensure its integrity; note that the response does not | response and to ensure its integrity; note that the response does not | |||
contain the USERNAME, REALM, and NONCE attributes. The server also | contain the USERNAME, REALM, and NONCE attributes. The server also | |||
includes a SOFTWARE attribute.</t> | includes a SOFTWARE attribute.</t> | |||
<figure> | ||||
<t></t> | <artwork name="" type="" align="left" alt=""><![CDATA[ | |||
TURN TURN Peer Peer | ||||
<figure> | client server A B | |||
<artwork><![CDATA[TURN TURN Pe | |--- CreatePermission request ------>| | | | |||
er Peer | | Transaction-Id=0xE5913A8F460956CA277D3319 | | | |||
client server A B | | XOR-PEER-ADDRESS=192.0.2.150:0 | | | | |||
|--- CreatePermission request ------>| | | | | USERNAME="George" | | | | |||
| Transaction-Id=0xE5913A8F460956CA277D3319 | | | | REALM="example.com" | | | | |||
| XOR-PEER-ADDRESS=192.0.2.150:0 | | | | | NONCE="obMatJos2gAAAadl7W7PeDU4hKE72jda" | | | |||
| USERNAME="George" | | | | | PASSWORD-ALGORITHMS=MD5 and SHA256 | | | |||
| REALM="example.com" | | | | | PASSWORD-ALGORITHM=SHA256 | | | | |||
| NONCE="obMatJos2gAAAadl7W7PeDU4hKE72jda" | | | | MESSAGE-INTEGRITY-SHA256=... | | | | |||
| PASSWORD-ALGORITHMS=MD5 and SHA256 | | | | | | | | |||
| PASSWORD-ALGORITHM=SHA256 | | | | |<-- CreatePermission success resp.--| | | | |||
| MESSAGE-INTEGRITY-SHA256=... | | | | | Transaction-Id=0xE5913A8F460956CA277D3319 | | | |||
| | | | | | MESSAGE-INTEGRITY-SHA256=... | | | | |||
|<-- CreatePermission success resp.--| | | | ||||
| Transaction-Id=0xE5913A8F460956CA277D3319 | | | ||||
| MESSAGE-INTEGRITY-SHA256=... | | | | ||||
]]></artwork> | ]]></artwork> | |||
</figure> | ||||
<postamble></postamble> | ||||
</figure> | ||||
<t>The client then creates a permission towards Peer A in preparation | <t>The client then creates a permission towards Peer A in preparation | |||
for sending it some application data. This is done through a | for sending it some application data. This is done through a | |||
CreatePermission request. The XOR-PEER-ADDRESS attribute contains the IP | CreatePermission request. The XOR-PEER-ADDRESS attribute contains the IP | |||
address for which a permission is established (the IP address of peer | address for which a permission is established (the IP address of peer | |||
A); note that the port number in the attribute is ignored when used in a | A); note that the port number in the attribute is ignored when used in a | |||
CreatePermission request, and here it has been set to 0; also, note how | CreatePermission request, and here it has been set to 0; also, note how | |||
the client uses Peer A's server-reflexive IP address and not its | the client uses Peer A's server-reflexive IP address and not its | |||
(private) host address. The client uses the same username, realm, and | (private) host address. The client uses the same username, realm, and | |||
nonce values as in the previous request on the allocation. Though it is | nonce values as in the previous request on the allocation. Though it is | |||
allowed to do so, the client has chosen not to include a SOFTWARE | allowed to do so, the client has chosen not to include a SOFTWARE | |||
skipping to change at line 3442 ¶ | skipping to change at line 3196 ¶ | |||
for sending it some application data. This is done through a | for sending it some application data. This is done through a | |||
CreatePermission request. The XOR-PEER-ADDRESS attribute contains the IP | CreatePermission request. The XOR-PEER-ADDRESS attribute contains the IP | |||
address for which a permission is established (the IP address of peer | address for which a permission is established (the IP address of peer | |||
A); note that the port number in the attribute is ignored when used in a | A); note that the port number in the attribute is ignored when used in a | |||
CreatePermission request, and here it has been set to 0; also, note how | CreatePermission request, and here it has been set to 0; also, note how | |||
the client uses Peer A's server-reflexive IP address and not its | the client uses Peer A's server-reflexive IP address and not its | |||
(private) host address. The client uses the same username, realm, and | (private) host address. The client uses the same username, realm, and | |||
nonce values as in the previous request on the allocation. Though it is | nonce values as in the previous request on the allocation. Though it is | |||
allowed to do so, the client has chosen not to include a SOFTWARE | allowed to do so, the client has chosen not to include a SOFTWARE | |||
attribute in this request.</t> | attribute in this request.</t> | |||
<t>The server receives the CreatePermission request, creates the | <t>The server receives the CreatePermission request, creates the | |||
corresponding permission, and then replies with a CreatePermission | corresponding permission, and then replies with a CreatePermission | |||
success response. Like the client, the server chooses not to include the | success response. Like the client, the server chooses not to include the | |||
SOFTWARE attribute in its reply. Again, note how success responses | SOFTWARE attribute in its reply. Again, note how success responses | |||
contains a MESSAGE-INTEGRITY-SHA256 attribute (assuming the server uses | contain a MESSAGE-INTEGRITY-SHA256 attribute (assuming the server uses | |||
the long-term credential mechanism), but no USERNAME, REALM, and NONCE | the long-term credential mechanism) but no USERNAME, REALM, and NONCE | |||
attributes.</t> | attributes.</t> | |||
<figure> | ||||
<t></t> | <artwork name="" type="" align="left" alt=""><![CDATA[ | |||
TURN TURN Peer Peer | ||||
<figure> | client server A B | |||
<artwork><![CDATA[TURN TURN Pe | |--- Send indication --------------->| | | | |||
er Peer | | Transaction-Id=0x1278E9ACA2711637EF7D3328 | | | |||
client server A B | | XOR-PEER-ADDRESS=192.0.2.150:32102 | | | |||
|--- Send indication --------------->| | | | | DONT-FRAGMENT | | | | |||
| Transaction-Id=0x1278E9ACA2711637EF7D3328 | | | | DATA=... | | | | |||
| XOR-PEER-ADDRESS=192.0.2.150:32102 | | | | |- UDP dgm ->| | | |||
| DONT-FRAGMENT | | | | | | data=... | | | |||
| DATA=... | | | | | | | | | |||
| |-- UDP dgm ->| | | | |<- UDP dgm -| | | |||
| | data=... | | | | | data=... | | | |||
| | | | | |<-- Data indication ----------------| | | | |||
| |<- UDP dgm --| | | | Transaction-Id=0x8231AE8F9242DA9FF287FEFF | | | |||
| | data=... | | | | XOR-PEER-ADDRESS=192.0.2.150:32102 | | | |||
|<-- Data indication ----------------| | | | | DATA=... | | | | |||
| Transaction-Id=0x8231AE8F9242DA9FF287FEFF | | | ||||
| XOR-PEER-ADDRESS=192.0.2.150:32102 | | | ||||
| DATA=... | | | | ||||
]]></artwork> | ]]></artwork> | |||
</figure> | ||||
<postamble></postamble> | ||||
</figure> | ||||
<t>The client now sends application data to Peer A using a Send | <t>The client now sends application data to Peer A using a Send | |||
indication. Peer A's server-reflexive transport address is specified in | indication. Peer A's server-reflexive transport address is specified in | |||
the XOR-PEER-ADDRESS attribute, and the application data (shown here as | the XOR-PEER-ADDRESS attribute, and the application data (shown here as | |||
just "...") is specified in the DATA attribute. The client is doing a | just "...") is specified in the DATA attribute. The client is doing a | |||
form of path MTU discovery at the application layer and thus specifies | form of path MTU discovery at the application layer and, thus, specifies | |||
(by including the DONT-FRAGMENT attribute) that the server should set | (by including the DONT-FRAGMENT attribute) that the server should set | |||
the DF bit in the UDP datagram to send to the peer. Indications cannot | the DF bit in the UDP datagram to send to the peer. Indications cannot | |||
be authenticated using the long-term credential mechanism of STUN, so no | be authenticated using the long-term credential mechanism of STUN, so no | |||
MESSAGE-INTEGRITY or MESSAGE-INTEGRITY-SHA256 attribute is included in | MESSAGE-INTEGRITY or MESSAGE-INTEGRITY-SHA256 attribute is included in | |||
the message. An application wishing to ensure that its data is not | the message. An application wishing to ensure that its data is not | |||
altered or forged must integrity-protect its data at the application | altered or forged must integrity-protect its data at the application | |||
level.</t> | level.</t> | |||
<t>Upon receipt of the Send indication, the server extracts the | <t>Upon receipt of the Send indication, the server extracts the | |||
application data and sends it in a UDP datagram to Peer A, with the | application data and sends it in a UDP datagram to Peer A, with the | |||
relayed transport address as the source transport address of the | relayed transport address as the source transport address of the | |||
datagram, and with the DF bit set as requested. Note that, had the | datagram and with the DF bit set as requested. Note that had the | |||
client not previously established a permission for Peer A's | client not previously established a permission for Peer A's | |||
server-reflexive IP address, then the server would have silently | server-reflexive IP address, the server would have silently | |||
discarded the Send indication instead.</t> | discarded the Send indication instead.</t> | |||
<t>Peer A then replies with its own UDP datagram containing application | <t>Peer A then replies with its own UDP datagram containing application | |||
data. The datagram is sent to the relayed transport address on the | data. The datagram is sent to the relayed transport address on the | |||
server. When this arrives, the server creates a Data indication | server. When this arrives, the server creates a Data indication | |||
containing the source of the UDP datagram in the XOR-PEER-ADDRESS | containing the source of the UDP datagram in the XOR-PEER-ADDRESS | |||
attribute, and the data from the UDP datagram in the DATA attribute. The | attribute, and the data from the UDP datagram in the DATA attribute. The | |||
resulting Data indication is then sent to the client.</t> | resulting Data indication is then sent to the client.</t> | |||
<figure> | ||||
<t></t> | <artwork name="" type="" align="left" alt=""><![CDATA[ | |||
TURN TURN Peer Peer | ||||
<figure> | client server A B | |||
<artwork><![CDATA[TURN TURN Pe | |--- ChannelBind request ----------->| | | | |||
er Peer | | Transaction-Id=0x6490D3BC175AFF3D84513212 | | | |||
client server A B | | CHANNEL-NUMBER=0x4000 | | | | |||
|--- ChannelBind request ----------->| | | | | XOR-PEER-ADDRESS=192.0.2.210:49191 | | | |||
| Transaction-Id=0x6490D3BC175AFF3D84513212 | | | | USERNAME="George" | | | | |||
| CHANNEL-NUMBER=0x4000 | | | | | REALM="example.com" | | | | |||
| XOR-PEER-ADDRESS=192.0.2.210:49191 | | | | NONCE="obMatJos2gAAAadl7W7PeDU4hKE72jda" | | | |||
| USERNAME="George" | | | | | PASSWORD-ALGORITHMS=MD5 and SHA256 | | | |||
| REALM="example.com" | | | | | PASSWORD-ALGORITHM=SHA256 | | | | |||
| NONCE="obMatJos2gAAAadl7W7PeDU4hKE72jda" | | | | MESSAGE-INTEGRITY-SHA256=... | | | | |||
| PASSWORD-ALGORITHMS=MD5 and SHA256 | | | | | | | | |||
| PASSWORD-ALGORITHM=SHA256 | | | | |<-- ChannelBind success response ---| | | | |||
| MESSAGE-INTEGRITY-SHA256=... | | | | | Transaction-Id=0x6490D3BC175AFF3D84513212 | | | |||
| | | | | | MESSAGE-INTEGRITY-SHA256=... | | | | |||
|<-- ChannelBind success response ---| | | | ||||
| Transaction-Id=0x6490D3BC175AFF3D84513212 | | | ||||
| MESSAGE-INTEGRITY-SHA256=... | | | | ||||
]]></artwork> | ]]></artwork> | |||
</figure> | ||||
<postamble></postamble> | ||||
</figure> | ||||
<t>The client now binds a channel to Peer B, specifying a free channel | <t>The client now binds a channel to Peer B, specifying a free channel | |||
number (0x4000) in the CHANNEL-NUMBER attribute, and Peer B's transport | number (0x4000) in the CHANNEL-NUMBER attribute, and Peer B's transport | |||
address in the XOR-PEER-ADDRESS attribute. As before, the client re-uses | address in the XOR-PEER-ADDRESS attribute. As before, the client reuses | |||
the username, realm, and nonce from its last request in the message.</t> | the username, realm, and nonce from its last request in the message.</t> | |||
<t>Upon receipt of the request, the server binds the channel number to | <t>Upon receipt of the request, the server binds the channel number to | |||
the peer, installs a permission for Peer B's IP address, and then | the peer, installs a permission for Peer B's IP address, and then | |||
replies with ChannelBind success response.</t> | replies with a ChannelBind success response.</t> | |||
<figure> | ||||
<t></t> | <artwork name="" type="" align="left" alt=""><![CDATA[ | |||
TURN TURN Peer Peer | ||||
<figure> | client server A B | |||
<artwork><![CDATA[TURN TURN Pe | |--- ChannelData ------------------>| | | | |||
er Peer | | Channel-number=0x4000 |--- UDP datagram --------->| | |||
client server A B | | Data=... | Data=... | | |||
|--- ChannelData ------------------->| | | | | | | | | |||
| Channel-number=0x4000 |--- UDP datagram --------->| | | |<-- UDP datagram ----------| | |||
| Data=... | Data=... | | | | Data=... | | | |||
| | | | | |<-- ChannelData -------------------| | | | |||
| |<-- UDP datagram ----------| | | Channel-number=0x4000 | | | | |||
| | Data=... | | | | Data=... | | | | |||
|<-- ChannelData --------------------| | | | ||||
| Channel-number=0x4000 | | | | ||||
| Data=... | | | | ||||
]]></artwork> | ]]></artwork> | |||
</figure> | ||||
<postamble></postamble> | ||||
</figure> | ||||
<t>The client now sends a ChannelData message to the server with data | <t>The client now sends a ChannelData message to the server with data | |||
destined for Peer B. The ChannelData message is not a STUN message, and | destined for Peer B. The ChannelData message is not a STUN message; | |||
thus has no transaction id. Instead, it has only three fields: a channel | thus, it has no transaction id. Instead, it has only three fields: a chann | |||
number, data, and data length; here the channel number field is 0x4000 | el | |||
number, data, and data length; here, the channel number field is 0x4000 | ||||
(the channel the client just bound to Peer B). When the server receives | (the channel the client just bound to Peer B). When the server receives | |||
the ChannelData message, it checks that the channel is currently bound | the ChannelData message, it checks that the channel is currently bound | |||
(which it is) and then sends the data onward to Peer B in a UDP | (which it is) and then sends the data onward to Peer B in a UDP | |||
datagram, using the relayed transport address as the source transport | datagram, using the relayed transport address as the source transport | |||
address and 192.0.2.210:49191 (the value of the XOR-PEER-ADDRESS | address, and 192.0.2.210:49191 (the value of the XOR-PEER-ADDRESS | |||
attribute in the ChannelBind request) as the destination transport | attribute in the ChannelBind request) as the destination transport | |||
address.</t> | address.</t> | |||
<t>Later, Peer B sends a UDP datagram back to the relayed transport | <t>Later, Peer B sends a UDP datagram back to the relayed transport | |||
address. This causes the server to send a ChannelData message to the | address. This causes the server to send a ChannelData message to the | |||
client containing the data from the UDP datagram. The server knows to | client containing the data from the UDP datagram. The server knows to | |||
which client to send the ChannelData message because of the relayed | which client to send the ChannelData message because of the relayed | |||
transport address at which the UDP datagram arrived, and knows to use | transport address at which the UDP datagram arrived, and it knows to use | |||
channel 0x4000 because this is the channel bound to 192.0.2.210:49191. | channel 0x4000 because this is the channel bound to 192.0.2.210:49191. | |||
Note that if there had not been any channel number bound to that | Note that if there had not been any channel number bound to that | |||
address, the server would have used a Data indication instead.</t> | address, the server would have used a Data indication instead.</t> | |||
<figure> | ||||
<t><figure> | <artwork name="" type="" align="left" alt=""><![CDATA[ | |||
<artwork><![CDATA[TURN TURN | TURN TURN Peer Peer | |||
Peer Peer | client server A B | |||
client server A B | |--- ChannelBind request ----------->| | | | |||
|--- ChannelBind request ----------->| | | | | Transaction-Id=0xE5913A8F46091637EF7D3328 | | | |||
| Transaction-Id=0xE5913A8F46091637EF7D3328 | | | | CHANNEL-NUMBER=0x4000 | | | | |||
| CHANNEL-NUMBER=0x4000 | | | | | XOR-PEER-ADDRESS=192.0.2.210:49191 | | | |||
| XOR-PEER-ADDRESS=192.0.2.210:49191 | | | | USERNAME="George" | | | | |||
| USERNAME="George" | | | | | REALM="example.com" | | | | |||
| REALM="example.com" | | | | | NONCE="obMatJos2gAAAadl7W7PeDU4hKE72jda" | | | |||
| NONCE="obMatJos2gAAAadl7W7PeDU4hKE72jda" | | | | PASSWORD-ALGORITHMS=MD5 and SHA256 | | | |||
| PASSWORD-ALGORITHMS=MD5 and SHA256 | | | | PASSWORD-ALGORITHM=SHA256 | | | | |||
| PASSWORD-ALGORITHM=SHA256 | | | | | MESSAGE-INTEGRITY-SHA256=... | | | | |||
| MESSAGE-INTEGRITY-SHA256=... | | | | | | | | | |||
| | | | | |<-- ChannelBind success response ---| | | | |||
|<-- ChannelBind success response ---| | | | | Transaction-Id=0xE5913A8F46091637EF7D3328 | | | |||
| Transaction-Id=0xE5913A8F46091637EF7D3328 | | | | MESSAGE-INTEGRITY-SHA256=... | | | | |||
| MESSAGE-INTEGRITY-SHA256=... | | | | ||||
]]></artwork> | ]]></artwork> | |||
</figure> | ||||
<postamble></postamble> | ||||
</figure></t> | ||||
<t>The channel binding lasts for 10 minutes unless refreshed. The TURN | <t>The channel binding lasts for 10 minutes unless refreshed. The TURN | |||
client refreshes the binding by sending ChannelBind request rebinding | client refreshes the binding by sending a ChannelBind request rebinding | |||
the channel to the same peer (Peer B's IP address). The server processes | the channel to the same peer (Peer B's IP address). The server processes | |||
the ChannelBind request, rebinds the channel to the same peer and resets | the ChannelBind request, rebinds the channel to the same peer, and resets | |||
the time-to-expiry timer back to 10 minutes.</t> | the time-to-expiry timer back to 10 minutes.</t> | |||
<figure> | <figure> | |||
<artwork><![CDATA[TURN TURN Pe | <artwork name="" type="" align="left" alt=""><![CDATA[ | |||
er Peer | TURN TURN Peer Peer | |||
client server A B | client server A B | |||
|--- Refresh request --------------->| | | | |--- Refresh request --------------->| | | | |||
| Transaction-Id=0x0864B3C27ADE9354B4312414 | | | | Transaction-Id=0x0864B3C27ADE9354B4312414 | | | |||
| SOFTWARE="Example client 1.03" | | | | | SOFTWARE="Example client 1.03" | | | | |||
| USERNAME="George" | | | | | USERNAME="George" | | | | |||
| REALM="example.com" | | | | | REALM="example.com" | | | | |||
| NONCE="oobMatJos2gAAAadl7W7PeDU4hKE72jda" | | | | NONCE="oobMatJos2gAAAadl7W7PeDU4hKE72jda" | | | |||
| PASSWORD-ALGORITHMS=MD5 and SHA256 | | | | PASSWORD-ALGORITHMS=MD5 and SHA256 | | | |||
| PASSWORD-ALGORITHM=SHA256 | | | | | PASSWORD-ALGORITHM=SHA256 | | | | |||
| MESSAGE-INTEGRITY-SHA256=... | | | | | MESSAGE-INTEGRITY-SHA256=... | | | | |||
| | | | | | | | | | |||
|<-- Refresh error response ---------| | | | |<-- Refresh error response ---------| | | | |||
| Transaction-Id=0x0864B3C27ADE9354B4312414 | | | | Transaction-Id=0x0864B3C27ADE9354B4312414 | | | |||
| SOFTWARE="Example server, version 1.17" | | | | SOFTWARE="Example server, version 1.17" | | | |||
| ERROR-CODE=438 (Stale Nonce) | | | | | ERROR-CODE=438 (Stale Nonce) | | | | |||
| REALM="example.com" | | | | | REALM="example.com" | | | | |||
| NONCE="obMatJos2gAAAadl7W7PeDU4hKE72jda" | | | | NONCE="obMatJos2gAAAadl7W7PeDU4hKE72jda" | | | |||
| PASSWORD-ALGORITHMS=MD5 and SHA256 | | | | PASSWORD-ALGORITHMS=MD5 and SHA256 | | | |||
| | | | | | | | | | |||
|--- Refresh request --------------->| | | | |--- Refresh request --------------->| | | | |||
| Transaction-Id=0x427BD3E625A85FC731DC4191 | | | | Transaction-Id=0x427BD3E625A85FC731DC4191 | | | |||
| SOFTWARE="Example client 1.03" | | | | | SOFTWARE="Example client 1.03" | | | | |||
| USERNAME="George" | | | | | USERNAME="George" | | | | |||
| REALM="example.com" | | | | | REALM="example.com" | | | | |||
| NONCE="obMatJos2gAAAadl7W7PeDU4hKE72jda" | | | | NONCE="obMatJos2gAAAadl7W7PeDU4hKE72jda" | | | |||
| PASSWORD-ALGORITHMS=MD5 and SHA256 | | | | PASSWORD-ALGORITHMS=MD5 and SHA256 | | | |||
| PASSWORD-ALGORITHM=SHA256 | | | | | PASSWORD-ALGORITHM=SHA256 | | | | |||
| MESSAGE-INTEGRITY-SHA256=... | | | | | MESSAGE-INTEGRITY-SHA256=... | | | | |||
| | | | | | | | | | |||
|<-- Refresh success response -------| | | | |<-- Refresh success response -------| | | | |||
| Transaction-Id=0x427BD3E625A85FC731DC4191 | | | | Transaction-Id=0x427BD3E625A85FC731DC4191 | | | |||
| SOFTWARE="Example server, version 1.17" | | | | SOFTWARE="Example server, version 1.17" | | | |||
| LIFETIME=600 (10 minutes) | | | | | LIFETIME=600 (10 minutes) | | | | |||
| MESSAGE-INTEGRITY=... | | | | ||||
]]></artwork> | ]]></artwork> | |||
</figure> | ||||
<postamble></postamble> | <t>Sometime before the 20-minute lifetime is up, the client refreshes | |||
</figure> | ||||
<t>Sometime before the 20 minute lifetime is up, the client refreshes | ||||
the allocation. This is done using a Refresh request. As before, the | the allocation. This is done using a Refresh request. As before, the | |||
client includes the latest username, realm, and nonce values in the | client includes the latest username, realm, and nonce values in the | |||
request. The client also includes the SOFTWARE attribute, following the | request. The client also includes the SOFTWARE attribute, following the | |||
recommended practice of always including this attribute in Allocate and | recommended practice of always including this attribute in Allocate and | |||
Refresh messages. When the server receives the Refresh request, it | Refresh messages. When the server receives the Refresh request, it | |||
notices that the nonce value has expired, and so replies with 438 (Stale | notices that the nonce value has expired and so replies with a 438 (Stale | |||
Nonce) error given a new nonce value. The client then reattempts the | Nonce) error given a new nonce value. The client then reattempts the | |||
request, this time with the new nonce value. This second attempt is | request, this time with the new nonce value. This second attempt is | |||
accepted, and the server replies with a success response. Note that the | accepted, and the server replies with a success response. Note that the | |||
client did not include a LIFETIME attribute in the request, so the | client did not include a LIFETIME attribute in the request, so the | |||
server refreshes the allocation for the default lifetime of 10 minutes | server refreshes the allocation for the default lifetime of 10 minutes | |||
(as can be seen by the LIFETIME attribute in the success response).</t> | (as can be seen by the LIFETIME attribute in the success response).</t> | |||
<t></t> | ||||
</section> | </section> | |||
<section anchor="sec-security" title="Security Considerations"> | <section anchor="sec-security" numbered="true" toc="default"> | |||
<name>Security Considerations</name> | ||||
<t>This section considers attacks that are possible in a TURN | <t>This section considers attacks that are possible in a TURN | |||
deployment, and discusses how they are mitigated by mechanisms in the | deployment and discusses how they are mitigated by mechanisms in the | |||
protocol or recommended practices in the implementation.</t> | protocol or recommended practices in the implementation.</t> | |||
<t>Most of the attacks on TURN are mitigated by the server requiring | <t>Most of the attacks on TURN are mitigated by the server requiring | |||
requests be authenticated. Thus, this specification requires the use of | requests be authenticated. Thus, this specification requires the use of | |||
authentication. The mandatory-to-implement mechanism is the long- term | authentication. The mandatory-to-implement mechanism is the long- term | |||
credential mechanism of STUN. Other authentication mechanisms of equal | credential mechanism of STUN. Other authentication mechanisms of equal | |||
or stronger security properties may be used. However, it is important to | or stronger security properties may be used. However, it is important to | |||
ensure that they can be invoked in an inter-operable way.</t> | ensure that they can be invoked in an interoperable way.</t> | |||
<section numbered="true" toc="default"> | ||||
<section title="Outsider Attacks"> | <name>Outsider Attacks</name> | |||
<t>Outsider attacks are ones where the attacker has no credentials in | <t>Outsider attacks are ones where the attacker has no credentials in | |||
the system, and is attempting to disrupt the service seen by the | the system and is attempting to disrupt the service seen by the | |||
client or the server.</t> | client or the server.</t> | |||
<section numbered="true" toc="default"> | ||||
<section title="Obtaining Unauthorized Allocations"> | <name>Obtaining Unauthorized Allocations</name> | |||
<t>An attacker might wish to obtain allocations on a TURN server for | <t>An attacker might wish to obtain allocations on a TURN server for | |||
any number of nefarious purposes. A TURN server provides a mechanism | any number of nefarious purposes. A TURN server provides a mechanism | |||
for sending and receiving packets while cloaking the actual IP | for sending and receiving packets while cloaking the actual IP | |||
address of the client. This makes TURN servers an attractive target | address of the client. This makes TURN servers an attractive target | |||
for attackers who wish to use it to mask their true identity.</t> | for attackers who wish to use it to mask their true identity.</t> | |||
<t>An attacker might also wish to simply utilize the services of a | <t>An attacker might also wish to simply utilize the services of a | |||
TURN server without paying for them. Since TURN services require | TURN server without paying for them. Since TURN services require | |||
resources from the provider, it is anticipated that their usage will | resources from the provider, it is anticipated that their usage will | |||
come with a cost.</t> | come with a cost.</t> | |||
<t>These attacks are prevented using the long-term credential | <t>These attacks are prevented using the long-term credential | |||
mechanism, which allows the TURN server to determine the identity of | mechanism, which allows the TURN server to determine the identity of | |||
the requestor and whether the requestor is allowed to obtain the | the requestor and whether the requestor is allowed to obtain the | |||
allocation.</t> | allocation.</t> | |||
</section> | </section> | |||
<section numbered="true" toc="default"> | ||||
<section title="Offline Dictionary Attacks"> | <name>Offline Dictionary Attacks</name> | |||
<t>The long-term credential mechanism used by TURN is subject to | <t>The long-term credential mechanism used by TURN is subject to | |||
offline dictionary attacks. An attacker that is capable of | offline dictionary attacks. An attacker that is capable of | |||
eavesdropping on a message exchange between a client and server can | eavesdropping on a message exchange between a client and server can | |||
determine the password by trying a number of candidate passwords and | determine the password by trying a number of candidate passwords and | |||
seeing if one of them is correct. This attack works when the | seeing if one of them is correct. This attack works when the | |||
passwords are low entropy, such as a word from the dictionary. This | passwords are low entropy such as a word from the dictionary. This | |||
attack can be mitigated by using strong passwords with large | attack can be mitigated by using strong passwords with large | |||
entropy. In situations where even stronger mitigation is required, | entropy. In situations where even stronger mitigation is required, | |||
(D)TLS transport between the client and the server can be used.</t> | (D)TLS transport between the client and the server can be used.</t> | |||
</section> | </section> | |||
<section numbered="true" toc="default"> | ||||
<section title="Faked Refreshes and Permissions"> | <name>Faked Refreshes and Permissions</name> | |||
<t>An attacker might wish to attack an active allocation by sending | <t>An attacker might wish to attack an active allocation by sending | |||
it a Refresh request with an immediate expiration, in order to | it a Refresh request with an immediate expiration in order to | |||
delete it and disrupt service to the client. This is prevented by | delete it and disrupt service to the client. This is prevented by | |||
authentication of refreshes. Similarly, an attacker wishing to send | authentication of refreshes. Similarly, an attacker wishing to send | |||
CreatePermission requests to create permissions to undesirable | CreatePermission requests to create permissions to undesirable | |||
destinations is prevented from doing so through authentication. The | destinations is prevented from doing so through authentication. The | |||
motivations for such an attack are described in <xref | motivations for such an attack are described in <xref target="sec-fire | |||
target="sec-firewall"></xref>.</t> | wall" format="default"/>.</t> | |||
</section> | </section> | |||
<section anchor="fate-data" numbered="true" toc="default"> | ||||
<section anchor="fate-data" title="Fake Data"> | <name>Fake Data</name> | |||
<t>An attacker might wish to send data to the client or the peer, as | <t>An attacker might wish to send data to the client or the peer as | |||
if they came from the peer or client, respectively. To do that, the | if they came from the peer or client, respectively. To do that, the | |||
attacker can send the client a faked Data Indication or ChannelData | attacker can send the client a faked Data indication or ChannelData | |||
message, or send the TURN server a faked Send Indication or | message, or send the TURN server a faked Send indication or | |||
ChannelData message.</t> | ChannelData message.</t> | |||
<t>Since indications and ChannelData messages are not authenticated, | <t>Since indications and ChannelData messages are not authenticated, | |||
this attack is not prevented by TURN. However, this attack is | this attack is not prevented by TURN. However, this attack is | |||
generally present in IP-based communications and is not | generally present in IP-based communications and is not | |||
substantially worsened by TURN. Consider a normal, non-TURN IP | substantially worsened by TURN. Consider a normal, non-TURN IP | |||
session between hosts A and B. An attacker can send packets to B as | session between hosts A and B. An attacker can send packets to B as | |||
if they came from A by sending packets towards B with a spoofed IP | if they came from A by sending packets towards B with a spoofed IP | |||
address of A. This attack requires the attacker to know the IP | address of A. This attack requires the attacker to know the IP | |||
addresses of A and B. With TURN, an attacker wishing to send packets | addresses of A and B. With TURN, an attacker wishing to send packets | |||
towards a client using a Data indication needs to know its IP | towards a client using a Data indication needs to know its IP | |||
address (and port), the IP address and port of the TURN server, and | address (and port), the IP address and port of the TURN server, and | |||
skipping to change at line 3742 ¶ | skipping to change at line 3467 ¶ | |||
address of A. This attack requires the attacker to know the IP | address of A. This attack requires the attacker to know the IP | |||
addresses of A and B. With TURN, an attacker wishing to send packets | addresses of A and B. With TURN, an attacker wishing to send packets | |||
towards a client using a Data indication needs to know its IP | towards a client using a Data indication needs to know its IP | |||
address (and port), the IP address and port of the TURN server, and | address (and port), the IP address and port of the TURN server, and | |||
the IP address and port of the peer (for inclusion in the | the IP address and port of the peer (for inclusion in the | |||
XOR-PEER-ADDRESS attribute). To send a fake ChannelData message to a | XOR-PEER-ADDRESS attribute). To send a fake ChannelData message to a | |||
client, an attacker needs to know the IP address and port of the | client, an attacker needs to know the IP address and port of the | |||
client, the IP address and port of the TURN server, and the channel | client, the IP address and port of the TURN server, and the channel | |||
number. This particular combination is mildly more guessable than in | number. This particular combination is mildly more guessable than in | |||
the non-TURN case.</t> | the non-TURN case.</t> | |||
<t>These attacks are more properly mitigated by application-layer | <t>These attacks are more properly mitigated by application-layer | |||
authentication techniques. In the case of real-time traffic, usage | authentication techniques. In the case of real-time traffic, usage | |||
of SRTP <xref target="RFC3711"></xref> prevents these attacks.</t> | of SRTP <xref target="RFC3711" format="default"/> prevents these attac | |||
ks.</t> | ||||
<t>In some situations, the TURN server may be situated in the | <t>In some situations, the TURN server may be situated in the | |||
network such that it is able to send to hosts to which the client | network such that it is able to send to hosts to which the client | |||
cannot directly send. This can happen, for example, if the server is | cannot directly send. This can happen, for example, if the server is | |||
located behind a firewall that allows packets from outside the | located behind a firewall that allows packets from outside the | |||
firewall to be delivered to the server, but not to other hosts | firewall to be delivered to the server, but not to other hosts | |||
behind the firewall. In these situations, an attacker could send the | behind the firewall. In these situations, an attacker could send the | |||
server a Send indication with an XOR-PEER-ADDRESS attribute | server a Send indication with an XOR-PEER-ADDRESS attribute | |||
containing the transport address of one of the other hosts behind | containing the transport address of one of the other hosts behind | |||
the firewall. If the server was to allow relaying of traffic to | the firewall. If the server was to allow relaying of traffic to | |||
arbitrary peers, then this would provide a way for the attacker to | arbitrary peers, then this would provide a way for the attacker to | |||
skipping to change at line 3758 ¶ | skipping to change at line 3481 ¶ | |||
network such that it is able to send to hosts to which the client | network such that it is able to send to hosts to which the client | |||
cannot directly send. This can happen, for example, if the server is | cannot directly send. This can happen, for example, if the server is | |||
located behind a firewall that allows packets from outside the | located behind a firewall that allows packets from outside the | |||
firewall to be delivered to the server, but not to other hosts | firewall to be delivered to the server, but not to other hosts | |||
behind the firewall. In these situations, an attacker could send the | behind the firewall. In these situations, an attacker could send the | |||
server a Send indication with an XOR-PEER-ADDRESS attribute | server a Send indication with an XOR-PEER-ADDRESS attribute | |||
containing the transport address of one of the other hosts behind | containing the transport address of one of the other hosts behind | |||
the firewall. If the server was to allow relaying of traffic to | the firewall. If the server was to allow relaying of traffic to | |||
arbitrary peers, then this would provide a way for the attacker to | arbitrary peers, then this would provide a way for the attacker to | |||
attack arbitrary hosts behind the firewall.</t> | attack arbitrary hosts behind the firewall.</t> | |||
<t>To mitigate this attack, TURN requires that the client establish | <t>To mitigate this attack, TURN requires that the client establish | |||
a permission to a host before sending it data. Thus, an attacker can | a permission to a host before sending it data. Thus, an attacker can | |||
only attack hosts with which the client is already communicating, | only attack hosts with which the client is already communicating | |||
unless the attacker is able to create authenticated requests. | unless the attacker is able to create authenticated requests. | |||
Furthermore, the server administrator may configure the server to | Furthermore, the server administrator may configure the server to | |||
restrict the range of IP addresses and ports to which it will relay | restrict the range of IP addresses and ports to which it will relay | |||
data. To provide even greater security, the server administrator can | data. To provide even greater security, the server administrator can | |||
require that the client use (D)TLS for all communication between the | require that the client use (D)TLS for all communication between the | |||
client and the server.</t> | client and the server.</t> | |||
</section> | </section> | |||
<section numbered="true" toc="default"> | ||||
<section title="Impersonating a Server"> | <name>Impersonating a Server</name> | |||
<t>When a client learns a relayed address from a TURN server, it | <t>When a client learns a relayed address from a TURN server, it | |||
uses that relayed address in application protocols to receive | uses that relayed address in application protocols to receive | |||
traffic. Therefore, an attacker wishing to intercept or redirect | traffic. Therefore, an attacker wishing to intercept or redirect | |||
that traffic might try to impersonate a TURN server and provide the | that traffic might try to impersonate a TURN server and provide the | |||
client with a faked relayed address.</t> | client with a faked relayed address.</t> | |||
<t>This attack is prevented through the long-term credential | <t>This attack is prevented through the long-term credential | |||
mechanism, which provides message integrity for responses in | mechanism, which provides message integrity for responses in | |||
addition to verifying that they came from the server. Furthermore, | addition to verifying that they came from the server. Furthermore, | |||
an attacker cannot replay old server responses as the transaction id | an attacker cannot replay old server responses as the transaction id | |||
in the STUN header prevents this. Replay attacks are further | in the STUN header prevents this. Replay attacks are further | |||
thwarted through frequent changes to the nonce value.</t> | thwarted through frequent changes to the nonce value.</t> | |||
</section> | </section> | |||
<section numbered="true" toc="default"> | ||||
<section title="Eavesdropping Traffic"> | <name>Eavesdropping Traffic</name> | |||
<t>If the TURN client and server use the STUN Extension for | <t>If the TURN client and server use the STUN Extension for | |||
Third-Party Authorization <xref target="RFC7635"></xref> (for | Third-Party Authorization <xref target="RFC7635" format="default"/> (f | |||
example it is used in WebRTC), the username does not reveal the real | or | |||
user's identity, the USERNAME attribute carries an ephemeral and | example, it is used in WebRTC), the username does not reveal the real | |||
user's identity; the USERNAME attribute carries an ephemeral and | ||||
unique key identifier. If the TURN client and server use the STUN | unique key identifier. If the TURN client and server use the STUN | |||
long-term credential mechanism and the username reveals the real | long-term credential mechanism and the username reveals the real | |||
user's identity, the client MUST either use the USERHASH attribute | user's identity, the client <bcp14>MUST</bcp14> either use the USERHAS | |||
instead of the USERNAME attribute to anonynmize the username or use | H attribute | |||
instead of the USERNAME attribute to anonymize the username or use | ||||
(D)TLS transport between the client and the server.</t> | (D)TLS transport between the client and the server.</t> | |||
<t>If the TURN client and server use the STUN long-term credential | <t>If the TURN client and server use the STUN long-term credential | |||
mechanism and realm information is privacy sensitive, TURN can be | mechanism, and realm information is privacy sensitive, TURN can be | |||
run over (D)TLS. As a reminder, STUN Extension for Third-Party | run over (D)TLS. As a reminder, STUN Extension for Third-Party | |||
Authorization does not use realm.</t> | Authorization does not use realm.</t> | |||
<t>The SOFTWARE attribute can reveal the specific software version | <t>The SOFTWARE attribute can reveal the specific software version | |||
of the TURN client and server to eavesdropper and it might possibly | of the TURN client and server to the eavesdropper, and it might possib ly | |||
allow attacks against vulnerable software that is known to contain | allow attacks against vulnerable software that is known to contain | |||
security vulnerabilities. If the software version is known to | security vulnerabilities. If the software version is known to | |||
contain security vulnerabilities, TURN SHOULD be run over (D)TLS to | contain security vulnerabilities, TURN <bcp14>SHOULD</bcp14> be run ov er (D)TLS to | |||
prevent leaking the SOFTWARE attribute in clear text. If zero-day | prevent leaking the SOFTWARE attribute in clear text. If zero-day | |||
vulnerabilities are detected in the software version, the endpoint | vulnerabilities are detected in the software version, the endpoint | |||
policy can be modified to mandate the use of (D)TLS until the patch | policy can be modified to mandate the use of (D)TLS until the patch | |||
is in place to fix the flaw.</t> | is in place to fix the flaw.</t> | |||
<t>TURN concerns itself primarily with authentication and message | <t>TURN concerns itself primarily with authentication and message | |||
integrity. Confidentiality is only a secondary concern, as TURN | integrity. Confidentiality is only a secondary concern as TURN | |||
control messages do not include information that is particularly | control messages do not include information that is particularly | |||
sensitive, with the exception of USERNAME, REALM and SOFTWARE. The | sensitive with the exception of USERNAME, REALM, and SOFTWARE. The | |||
primary protocol content of the messages is the IP address of the | primary protocol content of the messages is the IP address of the | |||
peer. If it is important to prevent an eavesdropper on a TURN | peer. If it is important to prevent an eavesdropper on a TURN | |||
connection from learning this, TURN can be run over (D)TLS.</t> | connection from learning this, TURN can be run over (D)TLS.</t> | |||
<t>Confidentiality for the application data relayed by TURN is best | <t>Confidentiality for the application data relayed by TURN is best | |||
provided by the application protocol itself, since running TURN over | provided by the application protocol itself since running TURN over | |||
(D)TLS does not protect application data between the server and the | (D)TLS does not protect application data between the server and the | |||
peer. If confidentiality of application data is important, then the | peer. If confidentiality of application data is important, then the | |||
application should encrypt or otherwise protect its data. For | application should encrypt or otherwise protect its data. For | |||
example, for real-time media, confidentiality can be provided by | example, for real-time media, confidentiality can be provided by | |||
using SRTP.</t> | using SRTP.</t> | |||
</section> | </section> | |||
<section title="TURN Loop Attack"> | <section numbered="true" toc="default"> | |||
<name>TURN Loop Attack</name> | ||||
<t>An attacker might attempt to cause data packets to loop | <t>An attacker might attempt to cause data packets to loop | |||
indefinitely between two TURN servers. The attack goes as follows. | indefinitely between two TURN servers. The attack goes as follows: | |||
First, the attacker sends an Allocate request to server A, using the | first, the attacker sends an Allocate request to server A using the | |||
source address of server B. Server A will send its response to | source address of server B. Server A will send its response to | |||
server B, and for the attack to succeed, the attacker must have the | server B, and for the attack to succeed, the attacker must have the | |||
ability to either view or guess the contents of this response, so | ability to either view or guess the contents of this response so | |||
that the attacker can learn the allocated relayed transport address. | that the attacker can learn the allocated relayed transport address. | |||
The attacker then sends an Allocate request to server B, using the | The attacker then sends an Allocate request to server B using the | |||
source address of server A. Again, the attacker must be able to view | source address of server A. Again, the attacker must be able to view | |||
or guess the contents of the response, so it can send learn the | or guess the contents of the response so it can learn the | |||
allocated relayed transport address. Using the same spoofed source | allocated relayed transport address. Using the same spoofed source | |||
address technique, the attacker then binds a channel number on | address technique, the attacker then binds a channel number on | |||
server A to the relayed transport address on server B, and similarly | server A to the relayed transport address on server B and similarly | |||
binds the same channel number on server B to the relayed transport | binds the same channel number on server B to the relayed transport | |||
address on server A. Finally, the attacker sends a ChannelData | address on server A. Finally, the attacker sends a ChannelData | |||
message to server A.</t> | message to server A.</t> | |||
<t>The result is a data packet that loops from the relayed transport | <t>The result is a data packet that loops from the relayed transport | |||
address on server A to the relayed transport address on server B, | address on server A to the relayed transport address on server B, | |||
then from server B's transport address to server A's transport | then from server B's transport address to server A's transport | |||
address, and then around the loop again.</t> | address, and then around the loop again.</t> | |||
<t>This attack is mitigated as follows: by requiring all requests to | ||||
<t>This attack is mitigated as follows. By requiring all requests to | ||||
be authenticated and/or by randomizing the port number allocated for | be authenticated and/or by randomizing the port number allocated for | |||
the relayed transport address, the server forces the attacker to | the relayed transport address, the server forces the attacker to | |||
either intercept or view responses sent to a third party (in this | either intercept or view responses sent to a third party (in this | |||
case, the other server) so that the attacker can authenticate the | case, the other server) so that the attacker can authenticate the | |||
requests and learn the relayed transport address. Without one of | requests and learn the relayed transport address. Without one of | |||
these two measures, an attacker can guess the contents of the | these two measures, an attacker can guess the contents of the | |||
responses without needing to see them, which makes the attack much | responses without needing to see them, which makes the attack much | |||
easier to perform. Furthermore, by requiring authenticated requests, | easier to perform. Furthermore, by requiring authenticated requests, | |||
the server forces the attacker to have credentials acceptable to the | the server forces the attacker to have credentials acceptable to the | |||
server, which turns this from an outsider attack into an insider | server, which turns this from an outsider attack into an insider | |||
skipping to change at line 3864 ¶ | skipping to change at line 3581 ¶ | |||
either intercept or view responses sent to a third party (in this | either intercept or view responses sent to a third party (in this | |||
case, the other server) so that the attacker can authenticate the | case, the other server) so that the attacker can authenticate the | |||
requests and learn the relayed transport address. Without one of | requests and learn the relayed transport address. Without one of | |||
these two measures, an attacker can guess the contents of the | these two measures, an attacker can guess the contents of the | |||
responses without needing to see them, which makes the attack much | responses without needing to see them, which makes the attack much | |||
easier to perform. Furthermore, by requiring authenticated requests, | easier to perform. Furthermore, by requiring authenticated requests, | |||
the server forces the attacker to have credentials acceptable to the | the server forces the attacker to have credentials acceptable to the | |||
server, which turns this from an outsider attack into an insider | server, which turns this from an outsider attack into an insider | |||
attack and allows the attack to be traced back to the client | attack and allows the attack to be traced back to the client | |||
initiating it.</t> | initiating it.</t> | |||
<t>The attack can be further mitigated by imposing a per-username | <t>The attack can be further mitigated by imposing a per-username | |||
limit on the bandwidth used to relay data by allocations owned by | limit on the bandwidth used to relay data by allocations owned by | |||
that username, to limit the impact of this attack on other | that username to limit the impact of this attack on other | |||
allocations. More mitigation can be achieved by decrementing the TTL | allocations. More mitigation can be achieved by decrementing the TTL | |||
when relaying data packets (if the underlying OS allows this).</t> | when relaying data packets (if the underlying OS allows this).</t> | |||
</section> | </section> | |||
</section> | </section> | |||
<section anchor="sec-firewall" numbered="true" toc="default"> | ||||
<section anchor="sec-firewall" title="Firewall Considerations"> | <name>Firewall Considerations</name> | |||
<t>A key security consideration of TURN is that TURN should not weaken | <t>A key security consideration of TURN is that TURN should not weaken | |||
the protections afforded by firewalls deployed between a client and a | the protections afforded by firewalls deployed between a client and a | |||
TURN server. It is anticipated that TURN servers will often be present | TURN server. It is anticipated that TURN servers will often be present | |||
on the public Internet, and clients may often be inside enterprise | on the public Internet, and clients may often be inside enterprise | |||
networks with corporate firewalls. If TURN servers provide a | networks with corporate firewalls. If TURN servers provide a | |||
'backdoor' for reaching into the enterprise, TURN will be blocked by | "backdoor" for reaching into the enterprise, TURN will be blocked by | |||
these firewalls.</t> | these firewalls.</t> | |||
<t>TURN servers therefore emulate the behavior of NAT devices that | <t>TURN servers therefore emulate the behavior of NAT devices that | |||
implement address-dependent filtering <xref target="RFC4787"></xref>, | implement address-dependent filtering <xref target="RFC4787" format="def ault"/>, | |||
a property common in many firewalls as well. When a NAT or firewall | a property common in many firewalls as well. When a NAT or firewall | |||
implements this behavior, packets from an outside IP address are only | implements this behavior, packets from an outside IP address are only | |||
allowed to be sent to an internal IP address and port if the internal | allowed to be sent to an internal IP address and port if the internal | |||
IP address and port had recently sent a packet to that outside IP | IP address and port had recently sent a packet to that outside IP | |||
address. TURN servers introduce the concept of permissions, which | address. TURN servers introduce the concept of permissions, which | |||
provide exactly this same behavior on the TURN server. An attacker | provide exactly this same behavior on the TURN server. An attacker | |||
cannot send a packet to a TURN server and expect it to be relayed | cannot send a packet to a TURN server and expect it to be relayed | |||
towards the client, unless the client has tried to contact the | towards the client, unless the client has tried to contact the | |||
attacker first.</t> | attacker first.</t> | |||
<t>It is important to note that some firewalls have policies that are | <t>It is important to note that some firewalls have policies that are | |||
even more restrictive than address-dependent filtering. Firewalls can | even more restrictive than address-dependent filtering. Firewalls can | |||
also be configured with address- and port-dependent filtering, or can | also be configured with address- and port-dependent filtering, or they | |||
be configured to disallow inbound traffic entirely. In these cases, if | can be configured to disallow inbound traffic entirely. In these | |||
a client is allowed to connect the TURN server, communications to the | cases, if a client is allowed to connect the TURN server, | |||
client will be less restrictive than what the firewall would normally | communications to the client will be less restrictive than what the | |||
allow.</t> | firewall would normally allow.</t> | |||
<section numbered="true" toc="default"> | ||||
<section title="Faked Permissions"> | <name>Faked Permissions</name> | |||
<t>In firewalls and NAT devices, permissions are granted implicitly | <t>In firewalls and NAT devices, permissions are granted implicitly | |||
through the traversal of a packet from the inside of the network | through the traversal of a packet from the inside of the network | |||
towards the outside peer. Thus, a permission cannot, by definition, | towards the outside peer. Thus, a permission cannot, by definition, | |||
be created by any entity except one inside the firewall or NAT. With | be created by any entity except one inside the firewall or NAT. With | |||
TURN, this restriction no longer holds. Since the TURN server sits | TURN, this restriction no longer holds. Since the TURN server sits | |||
outside the firewall, at attacker outside the firewall can now send | outside the firewall, an attacker outside the firewall can now send | |||
a message to the TURN server and try to create a permission for | a message to the TURN server and try to create a permission for | |||
itself.</t> | itself.</t> | |||
<t>This attack is prevented because all messages that create | <t>This attack is prevented because all messages that create | |||
permissions (i.e., ChannelBind and CreatePermission) are | permissions (i.e., ChannelBind and CreatePermission) are | |||
authenticated.</t> | authenticated.</t> | |||
</section> | </section> | |||
<section numbered="true" toc="default"> | ||||
<section title="Blacklisted IP Addresses"> | <name>Blacklisted IP Addresses</name> | |||
<t>Many firewalls can be configured with blacklists that prevent a | <t>Many firewalls can be configured with blacklists that prevent a | |||
client behind the firewall from sending packets to, or receiving | client behind the firewall from sending packets to, or receiving | |||
packets from, ranges of blacklisted IP addresses. This is | packets from, ranges of blacklisted IP addresses. This is | |||
accomplished by inspecting the source and destination addresses of | accomplished by inspecting the source and destination addresses of | |||
packets entering and exiting the firewall, respectively.</t> | packets entering and exiting the firewall, respectively.</t> | |||
<t>This feature is also present in TURN since TURN servers are | ||||
<t>This feature is also present in TURN, since TURN servers are | ||||
allowed to arbitrarily restrict the range of addresses of peers that | allowed to arbitrarily restrict the range of addresses of peers that | |||
they will relay to.</t> | they will relay to.</t> | |||
</section> | </section> | |||
<section numbered="true" toc="default"> | ||||
<section title="Running Servers on Well-Known Ports"> | <name>Running Servers on Well-Known Ports</name> | |||
<t>A malicious client behind a firewall might try to connect to a | <t>A malicious client behind a firewall might try to connect to a | |||
TURN server and obtain an allocation which it then uses to run a | TURN server and obtain an allocation that it then uses to run a | |||
server. For example, a client might try to run a DNS server or FTP | server. For example, a client might try to run a DNS server or FTP | |||
server.</t> | server.</t> | |||
<t>This is not possible in TURN. A TURN server will never accept | <t>This is not possible in TURN. A TURN server will never accept | |||
traffic from a peer for which the client has not installed a | traffic from a peer for which the client has not installed a | |||
permission. Thus, peers cannot just connect to the allocated port in | permission. Thus, peers cannot just connect to the allocated port in | |||
order to obtain the service.</t> | order to obtain the service.</t> | |||
</section> | </section> | |||
</section> | </section> | |||
<section title="Insider Attacks"> | <section numbered="true" toc="default"> | |||
<name>Insider Attacks</name> | ||||
<t>In insider attacks, a client has legitimate credentials but defies | <t>In insider attacks, a client has legitimate credentials but defies | |||
the trust relationship that goes with those credentials. These attacks | the trust relationship that goes with those credentials. These attacks | |||
cannot be prevented by cryptographic means but need to be considered | cannot be prevented by cryptographic means but need to be considered | |||
in the design of the protocol.</t> | in the design of the protocol.</t> | |||
<section numbered="true" toc="default"> | ||||
<section title="DoS against TURN Server"> | <name>DoS against TURN Server</name> | |||
<t>A client wishing to disrupt service to other clients might obtain | <t>A client wishing to disrupt service to other clients might obtain | |||
an allocation and then flood it with traffic, in an attempt to swamp | an allocation and then flood it with traffic in an attempt to swamp | |||
the server and prevent it from servicing other legitimate clients. | the server and prevent it from servicing other legitimate clients. | |||
This is mitigated by the recommendation that the server limit the | This is mitigated by the recommendation that the server limit the | |||
amount of bandwidth it will relay for a given username. This won't | amount of bandwidth it will relay for a given username. This won't | |||
prevent a client from sending a large amount of traffic, but it | prevent a client from sending a large amount of traffic, but it | |||
allows the server to immediately discard traffic in excess.</t> | allows the server to immediately discard traffic in excess.</t> | |||
<t>Since each allocation uses a port number on the IP address of the | <t>Since each allocation uses a port number on the IP address of the | |||
TURN server, the number of allocations on a server is finite. An | TURN server, the number of allocations on a server is finite. An | |||
attacker might attempt to consume all of them by requesting a large | attacker might attempt to consume all of them by requesting a large | |||
number of allocations. This is prevented by the recommendation that | number of allocations. This is prevented by the recommendation that | |||
the server impose a limit of the number of allocations active at a | the server impose a limit on the number of allocations active at a | |||
time for a given username.</t> | time for a given username.</t> | |||
</section> | </section> | |||
<section numbered="true" toc="default"> | ||||
<section title="Anonymous Relaying of Malicious Traffic"> | <name>Anonymous Relaying of Malicious Traffic</name> | |||
<t>TURN servers provide a degree of anonymization. A client can send | <t>TURN servers provide a degree of anonymization. A client can send | |||
data to peers without revealing its own IP address. TURN servers may | data to peers without revealing its own IP address. TURN servers may | |||
therefore become attractive vehicles for attackers to launch attacks | therefore become attractive vehicles for attackers to launch attacks | |||
against targets without fear of detection. Indeed, it is possible | against targets without fear of detection. Indeed, it is possible | |||
for a client to chain together multiple TURN servers, such that any | for a client to chain together multiple TURN servers such that any | |||
number of relays can be used before a target receives a packet.</t> | number of relays can be used before a target receives a packet.</t> | |||
<t>Administrators who are worried about this attack can maintain | <t>Administrators who are worried about this attack can maintain | |||
logs that capture the actual source IP and port of the client, and | logs that capture the actual source IP and port of the client and | |||
perhaps even every permission that client installs. This will allow | perhaps even every permission that client installs. This will allow | |||
for forensic tracing to determine the original source, should it be | for forensic tracing to determine the original source should it be | |||
discovered that an attack is being relayed through a TURN | discovered that an attack is being relayed through a TURN | |||
server.</t> | server.</t> | |||
</section> | </section> | |||
<section numbered="true" toc="default"> | ||||
<section title="Manipulating Other Allocations"> | <name>Manipulating Other Allocations</name> | |||
<t>An attacker might attempt to disrupt service to other users of | <t>An attacker might attempt to disrupt service to other users of | |||
the TURN server by sending Refresh requests or CreatePermission | the TURN server by sending Refresh requests or CreatePermission | |||
requests that (through source address spoofing) appear to be coming | requests that (through source address spoofing) appear to be coming | |||
from another user of the TURN server. TURN prevents this by | from another user of the TURN server. TURN prevents this by | |||
requiring that the credentials used in CreatePermission, Refresh, | requiring that the credentials used in CreatePermission, Refresh, | |||
and ChannelBind messages match those used to create the initial | and ChannelBind messages match those used to create the initial | |||
allocation. Thus, the fake requests from the attacker will be | allocation. Thus, the fake requests from the attacker will be | |||
rejected.</t> | rejected.</t> | |||
</section> | </section> | |||
</section> | </section> | |||
<section numbered="true" toc="default"> | ||||
<section title="Tunnel Amplification Attack"> | <name>Tunnel Amplification Attack</name> | |||
<t>An attacker might attempt to cause data packets to loop numerous | <t>An attacker might attempt to cause data packets to loop numerous | |||
times between a TURN server and a tunnel between IPv4 and IPv6. The | times between a TURN server and a tunnel between IPv4 and IPv6. The | |||
attack goes as follows.</t> | attack goes as follows:</t> | |||
<t>Suppose an attacker knows that a tunnel endpoint will forward | <t>Suppose an attacker knows that a tunnel endpoint will forward | |||
encapsulated packets from a given IPv6 address (this doesn't | encapsulated packets from a given IPv6 address (this doesn't | |||
necessarily need to be the tunnel endpoint's address). Suppose he then | necessarily need to be the tunnel endpoint's address). Suppose he then | |||
spoofs two packets from this address: <list style="numbers"> | spoofs two packets from this address: </t> | |||
<t>An Allocate request asking for a v4 address, and</t> | <ol spacing="normal" type="1"> | |||
<li>An Allocate request asking for a v4 address, and</li> | ||||
<t>A ChannelBind request establishing a channel to the IPv4 | <li>A ChannelBind request establishing a channel to the IPv4 | |||
address of the tunnel endpoint</t> | address of the tunnel endpoint.</li> | |||
</list></t> | </ol> | |||
<t>Then, he has set up an amplification attack: </t> | ||||
<t>Then he has set up an amplification attack: <list style="symbols"> | <ul spacing="normal"> | |||
<t>The TURN server will re-encapsulate IPv6 UDP data in v4 and | <li>The TURN server will re-encapsulate IPv6 UDP data in v4 and | |||
send it to the tunnel endpoint</t> | send it to the tunnel endpoint.</li> | |||
<li>The tunnel endpoint will de-encapsulate packets from the v4 | ||||
<t>The tunnel endpoint will de-encapsulate packets from the v4 | interface and send them to v6.</li> | |||
interface and send them to v6</t> | </ul> | |||
</list></t> | <t>So, if the attacker sends a packet of the following form:</t> | |||
<figure> | ||||
<t>So if the attacker sends a packet of the following form... <figure> | <artwork name="" type="" align="left" alt=""><![CDATA[ | |||
<artwork><![CDATA[ | ||||
IPv6: src=2001:DB8:1::1 dst=2001:DB8::2 | IPv6: src=2001:DB8:1::1 dst=2001:DB8::2 | |||
UDP: <ports> | UDP: <ports> | |||
TURN: <channel id> | TURN: <channel id> | |||
IPv6: src=2001:DB8:1::1 dst=2001:DB8::2 | IPv6: src=2001:DB8:1::1 dst=2001:DB8::2 | |||
UDP: <ports> | UDP: <ports> | |||
TURN: <channel id> | TURN: <channel id> | |||
IPv6: src=2001:DB8:1::1 dst=2001:DB8::2 | IPv6: src=2001:DB8:1::1 dst=2001:DB8::2 | |||
UDP: <ports> | UDP: <ports> | |||
TURN: <channel id> | TURN: <channel id> | |||
... | ... ]]></artwork> | |||
]]></artwork> | </figure> | |||
</figure> Then the TURN server and the tunnel endpoint will send it | <t>then the TURN server and the tunnel endpoint will send it | |||
back and forth until the last TURN header is consumed, at which point | back and forth until the last TURN header is consumed, at which point | |||
the TURN server will send an empty packet, which the tunnel endpoint | the TURN server will send an empty packet that the tunnel endpoint | |||
will drop.</t> | will drop.</t> | |||
<t>The amplification potential here is limited by the MTU, so it's not | <t>The amplification potential here is limited by the MTU, so it's not | |||
huge: IPv6+UDP+TURN takes 334 bytes, so a four-to-one amplification | huge: IPv6+UDP+TURN takes 334 bytes, so a four-to-one amplification | |||
out of a 1500-byte packet is possible. But the attacker could still | out of a 1500-byte packet is possible. But, the attacker could still | |||
increase traffic volume by sending multiple packets or by establishing | increase traffic volume by sending multiple packets or by establishing | |||
multiple channels spoofed from different addresses behind the same | multiple channels spoofed from different addresses behind the same | |||
tunnel endpoint.</t> | tunnel endpoint.</t> | |||
<t>The attack is mitigated as follows. It is <bcp14>RECOMMENDED</bcp14> | ||||
<t>The attack is mitigated as follows. It is RECOMMENDED that TURN | that TURN | |||
servers not accept allocation or channel binding requests from | servers not accept allocation or channel-binding requests from | |||
addresses known to be tunneled, and that they not forward data to such | addresses known to be tunneled, and that they not forward data to such | |||
addresses. In particular, a TURN server MUST NOT accept Teredo or 6to4 | addresses. In particular, a TURN server <bcp14>MUST NOT</bcp14> accept T eredo or 6to4 | |||
addresses in these requests.</t> | addresses in these requests.</t> | |||
</section> | </section> | |||
<section numbered="true" toc="default"> | ||||
<section title="Other Considerations"> | <name>Other Considerations</name> | |||
<t>Any relay addresses learned through an Allocate request will not | <t>Any relay addresses learned through an Allocate request will not | |||
operate properly with IPsec Authentication Header (AH) <xref | operate properly with IPsec Authentication Header (AH) <xref | |||
target="RFC4302"></xref> in transport or tunnel mode. However, | target="RFC4302" format="default"/> in transport or tunnel | |||
tunnel-mode IPsec Encapsulating Security Payload (ESP) <xref | mode. However, tunnel-mode IPsec Encapsulating Security Payload (ESP) | |||
target="RFC4303"></xref> should still operate.</t> | <xref target="RFC4303" format="default"/> should still operate.</t> | |||
</section> | </section> | |||
</section> | </section> | |||
<section numbered="true" toc="default"> | ||||
<name>IANA Considerations</name> | ||||
<section title="IANA Considerations"> | <t>The code points for the STUN methods defined in this specification are | |||
<t>[Paragraphs in braces should be removed by the RFC Editor upon | listed in <xref target="sec-stun-methods" format="default"/>. IANA has | |||
publication]</t> | updated the references from <xref target="RFC5766" format="default"/> to | |||
this document (for the STUN methods listed in <xref target="sec-stun-metho | ||||
<t>The codepoints for the STUN methods defined in this specification are | ds" format="default"/>).</t> | |||
listed in <xref target="sec-stun-methods"></xref>. [IANA is requested to | <t>The code points for the STUN attributes defined in this specification | |||
update the reference from <xref target="RFC5766"></xref> to RFC-to-be | are listed in <xref target="sec-stun-attributes" format="default"/>. IANA | |||
for the STUN methods listed in <xref | has | |||
target="sec-stun-methods"></xref>.]</t> | updated the references from <xref target="RFC5766" format="default"/> to | |||
this document (for the STUN attributes CHANNEL-NUMBER, LIFETIME, Reserved | ||||
<t>The codepoints for the STUN attributes defined in this specification | ||||
are listed in <xref target="sec-stun-attributes"></xref>. [IANA is | ||||
requested to update the reference from <xref target="RFC5766"></xref> to | ||||
RFC-to-be for the STUN attributes CHANNEL-NUMBER, LIFETIME, Reserved | ||||
(was BANDWIDTH), XOR-PEER-ADDRESS, DATA, XOR-RELAYED-ADDRESS, | (was BANDWIDTH), XOR-PEER-ADDRESS, DATA, XOR-RELAYED-ADDRESS, | |||
REQUESTED-ADDRESS-FAMILY, EVEN-PORT, REQUESTED-TRANSPORT, DONT-FRAGMENT, | REQUESTED-ADDRESS-FAMILY, EVEN-PORT, REQUESTED-TRANSPORT, DONT-FRAGMENT, | |||
Reserved (was TIMER-VAL) and RESERVATION-TOKEN listed in <xref | Reserved (was TIMER-VAL), and RESERVATION-TOKEN listed in <xref target="se | |||
target="sec-stun-attributes"></xref>.]</t> | c-stun-attributes" format="default"/>).</t> | |||
<t>[The ADDITIONAL-ADDRESS-FAMILY, ADDRESS-ERROR-CODE and ICMP | <t>The code points for the STUN error codes defined in this specification | |||
attributes requires that IANA allocate a value in the "STUN attributes | are listed in <xref target="sec-stun-errors" format="default"/>. IANA has | |||
Registry" from the comprehension-optional range (0x8000-0xFFFF), to be | updated the references from <xref target="RFC5766" format="default"/> | |||
replaced for TBD-CA throughout this document]</t> | and <xref target="RFC6156" format="default"/> to this document (for the ST | |||
UN error codes listed in | ||||
<xref target="sec-stun-errors" format="default"/>).</t> | ||||
<t>The codepoints for the STUN error codes defined in this specification | <t>IANA has updated the references to <xref target="RFC5766" | |||
are listed in <xref target="sec-stun-errors"></xref>. [IANA is requested | format="default"/> to this document for the SRV service name of "turn" for | |||
to update the reference from <xref target="RFC5766"></xref> and <xref | TURN over UDP | |||
target="RFC6156"></xref> to RFC-to-be for the STUN error codes listed in | or TCP and the service name of "turns" for TURN over (D)TLS.</t> | |||
<xref target="sec-stun-errors"></xref>.]</t> | ||||
<t>IANA has allocated the SRV service name of "turn" for TURN over UDP | <t>IANA has created a registry for TURN channel numbers (the "Traversal | |||
or TCP, and the service name of "turns" for TURN over (D)TLS.</t> | Using Relays around NAT (TURN) Channel Numbers" registry), initially | |||
populated as follows:</t> | ||||
<t>IANA has created a registry for TURN channel numbers, initially | <table anchor="turn-channel-numbers"> | |||
populated as follows:<list style="symbols"> | <tbody> | |||
<t>0x0000 through 0x3FFF: Reserved and not available for use, since | <tr> | |||
they conflict with the STUN header.</t> | <td>0x0000 through 0x3FFF:</td> | |||
<td>Reserved and not available for use since they conflict with the STUN | ||||
header.</td> | ||||
</tr> | ||||
<tr> | ||||
<td>0x4000 through 0x4FFF:</td> | ||||
<td>A TURN implementation is free to use channel numbers in this range.</t | ||||
d> | ||||
</tr> | ||||
<t>0x4000 through 0x4FFF: A TURN implementation is free to use | <tr> | |||
channel numbers in this range.</t> | <td>0x5000 through 0xFFFF:</td> | |||
<td>Reserved (For DTLS-SRTP multiplexing collision avoidance, see <xref ta | ||||
rget="RFC7983"/>)</td> | ||||
</tr> | ||||
</tbody> | ||||
</table> | ||||
<t>0x5000 through 0xFFFF: Unassigned.</t> | <t>Any change to this registry must be made through an IETF | |||
</list>Any change to this registry must be made through an IETF | ||||
Standards Action.</t> | Standards Action.</t> | |||
</section> | </section> | |||
<section title="IAB Considerations"> | <section numbered="true" toc="default"> | |||
<name>IAB Considerations</name> | ||||
<t>The IAB has studied the problem of "Unilateral Self Address Fixing" | <t>The IAB has studied the problem of "Unilateral Self Address Fixing" | |||
(UNSAF), which is the general process by which a client attempts to | (UNSAF), which is the general process by which a client attempts to | |||
determine its address in another realm on the other side of a NAT | determine its address in another realm on the other side of a NAT | |||
through a collaborative protocol-reflection mechanism <xref | through a collaborative protocol-reflection mechanism <xref | |||
target="RFC3424"></xref>. The TURN extension is an example of a protocol | target="RFC3424" format="default"/>. The TURN extension is an example of | |||
that performs this type of function. The IAB has mandated that any | a protocol that performs this type of function. The IAB has mandated | |||
protocols developed for this purpose document a specific set of | that any protocols developed for this purpose document a specific set of | |||
considerations. These considerations and the responses for TURN are | considerations. These considerations and the responses for TURN are | |||
documented in this section.</t> | documented in this section.</t> | |||
<t>Consideration 1: Precise definition of a specific, limited-scope | <t>Consideration 1: Precise definition of a specific, limited-scope | |||
problem that is to be solved with the UNSAF proposal. A short-term fix | problem that is to be solved with the UNSAF proposal. A short-term fix | |||
should not be generalized to solve other problems. Such generalizations | should not be generalized to solve other problems. Such generalizations | |||
lead to the prolonged dependence on and usage of the supposed short-term | lead to the prolonged dependence on and usage of the supposed short-term | |||
fix -- meaning that it is no longer accurate to call it | fix, meaning that it is no longer accurate to call it | |||
"short-term".</t> | "short-term".</t> | |||
<t>Response: TURN is a protocol for communication between a relay (= | <t>Response: TURN is a protocol for communication between a relay (= | |||
TURN server) and its client. The protocol allows a client that is behind | TURN server) and its client. The protocol allows a client that is behind | |||
a NAT to obtain and use a public IP address on the relay. As a | a NAT to obtain and use a public IP address on the relay. As a | |||
convenience to the client, TURN also allows the client to determine its | convenience to the client, TURN also allows the client to determine its | |||
server-reflexive transport address.</t> | server-reflexive transport address.</t> | |||
<t>Consideration 2: Description of an exit strategy/transition plan. The | <t>Consideration 2: Description of an exit strategy/transition plan. The | |||
better short-term fixes are the ones that will naturally see less and | better short-term fixes are the ones that will naturally see less and | |||
less use as the appropriate technology is deployed.</t> | less use as the appropriate technology is deployed.</t> | |||
<t>Response: TURN will no longer be needed once there are no longer any | <t>Response: TURN will no longer be needed once there are no longer any | |||
NATs. Unfortunately, as of the date of publication of this document, it | NATs. Unfortunately, as of the date of publication of this document, it | |||
no longer seems very likely that NATs will go away any time soon. | no longer seems very likely that NATs will go away any time soon. | |||
However, the need for TURN will also decrease as the number of NATs with | However, the need for TURN will also decrease as the number of NATs with | |||
the mapping property of Endpoint-Independent Mapping <xref | the mapping property of Endpoint-Independent Mapping <xref target="RFC4787 | |||
target="RFC4787"></xref> increases.</t> | " format="default"/> increases.</t> | |||
<t>Consideration 3: Discussion of specific issues that may render | <t>Consideration 3: Discussion of specific issues that may render | |||
systems more "brittle". For example, approaches that involve using data | systems more "brittle". For example, approaches that involve using data | |||
at multiple network layers create more dependencies, increase debugging | at multiple network layers create more dependencies, increase debugging | |||
challenges, and make it harder to transition.</t> | challenges, and make it harder to transition.</t> | |||
<t>Response: TURN is "brittle" in that it requires the NAT bindings | <t>Response: TURN is "brittle" in that it requires the NAT bindings | |||
between the client and the server to be maintained unchanged for the | between the client and the server to be maintained unchanged for the | |||
lifetime of the allocation. This is typically done using keep-alives. If | lifetime of the allocation. This is typically done using keep-alives. If | |||
this is not done, then the client will lose its allocation and can no | this is not done, then the client will lose its allocation and can no | |||
longer exchange data with its peers.</t> | longer exchange data with its peers.</t> | |||
<t>Consideration 4: Identify requirements for longer-term, sound | <t>Consideration 4: Identify requirements for longer-term, sound | |||
technical solutions; contribute to the process of finding the right | technical solutions; contribute to the process of finding the right | |||
longer-term solution.</t> | longer-term solution.</t> | |||
<t>Response: The need for TURN will be reduced once NATs implement the | <t>Response: The need for TURN will be reduced once NATs implement the | |||
recommendations for NAT UDP behavior documented in <xref | recommendations for NAT UDP behavior documented in <xref | |||
target="RFC4787"></xref>. Applications are also strongly urged to use | target="RFC4787" format="default"/>. Applications are also strongly | |||
ICE <xref target="RFC8445"></xref> to communicate with peers; though ICE | urged to use ICE <xref target="RFC8445" format="default"/> to | |||
uses TURN, it does so only as a last resort, and uses it in a controlled | communicate with peers; though ICE uses TURN, it does so only as a last | |||
manner.</t> | resort, and it uses it in a controlled manner.</t> | |||
<t>Consideration 5: Discussion of the impact of the noted practical | <t>Consideration 5: Discussion of the impact of the noted practical | |||
issues with existing deployed NATs and experience reports.</t> | issues with existing deployed NATs and experience reports.</t> | |||
<t>Response: Some NATs deployed today exhibit a mapping behavior other | <t>Response: Some NATs deployed today exhibit a mapping behavior other | |||
than Endpoint-Independent mapping. These NATs are difficult to work | than Endpoint-Independent mapping. These NATs are difficult to work | |||
with, as they make it difficult or impossible for protocols like ICE to | with, as they make it difficult or impossible for protocols like ICE to | |||
use server-reflexive transport addresses on those NATs. A client behind | use server-reflexive transport addresses on those NATs. A client behind | |||
such a NAT is often forced to use a relay protocol like TURN because | such a NAT is often forced to use a relay protocol like TURN because | |||
"UDP hole punching" techniques <xref target="RFC5128"></xref> do not | "UDP hole punching" techniques <xref target="RFC5128" format="default"/> d o not | |||
work.</t> | work.</t> | |||
</section> | </section> | |||
<section numbered="true" toc="default"> | ||||
<section title="Changes since RFC 5766 "> | <name>Changes since RFC 5766</name> | |||
<t>This section lists the major changes in the TURN protocol from the | <t>This section lists the major changes in the TURN protocol from the | |||
original <xref target="RFC5766"></xref> specification.</t> | original <xref target="RFC5766" format="default"/> specification.</t> | |||
<ul spacing="normal"> | ||||
<t><list style="symbols"> | <li>IPv6 support.</li> | |||
<t>IPv6 support.</t> | <li>REQUESTED-ADDRESS-FAMILY attribute.</li> | |||
<li>Description of the tunnel amplification attack.</li> | ||||
<t>REQUESTED-ADDRESS-FAMILY attribute.</t> | <li>DTLS support.</li> | |||
<li>Add support for receiving ICMP packets.</li> | ||||
<t>Description of the tunnel amplification attack.</t> | <li>Updates PMTUD.</li> | |||
<li>Discovery of TURN server.</li> | ||||
<t>DTLS support.</t> | <li>TURN URI Scheme Semantics.</li> | |||
<li>Happy Eyeballs for TURN.</li> | ||||
<t>Add support for receiving ICMP packets.</t> | <li>Align with the changes in STUN <xref target="RFC8489"/>.</li> | |||
</ul> | ||||
<t>Updates PMTUD.</t> | ||||
<t>Discovery of TURN server.</t> | ||||
<t>TURN URI Scheme Semantics.</t> | ||||
<t>Happy Eyeballs for TURN.</t> | ||||
<t>Align with the changes in STUNbis.</t> | ||||
</list></t> | ||||
</section> | </section> | |||
<section title="Updates to RFC 6156 "> | <section numbered="true" toc="default"> | |||
<t>This section lists the major updates to <xref | <name>Updates to RFC 6156</name> | |||
target="RFC6156"></xref> in this specification.</t> | <t>This section lists the major updates to <xref target="RFC6156" format=" | |||
default"/> in this specification.</t> | ||||
<t><list style="symbols"> | <ul spacing="normal"> | |||
<t>ADDITIONAL-ADDRESS-FAMILY, AND ADDRESS-ERR-CODE attributes.</t> | <li>ADDITIONAL-ADDRESS-FAMILY and ADDRESS-ERROR-CODE attributes.</li> | |||
<li>440 (Address Family not Supported) and 443 (Peer Address Family | ||||
<t>440 (Address Family not Supported) and 443 (Peer Address Family | Mismatch) responses.</li> | |||
Mismatch) responses.</t> | <li>More details on packet translation.</li> | |||
<li>TCP-to-UDP and UDP-to-TCP relaying.</li> | ||||
<t>More details on packet translation.</t> | </ul> | |||
<t>TCP-to-UDP and UDP-to-TCP relaying.</t> | ||||
</list></t> | ||||
</section> | </section> | |||
<section title="Acknowledgements"> | ||||
<t>Most of the text in this note comes from the original TURN | ||||
specification, <xref target="RFC5766"></xref>. The authors would like to | ||||
thank Rohan Mahy co-author of original TURN specification and everyone | ||||
who had contributed to that document. The authors would also like to | ||||
acknowledge that this document inherits material from <xref | ||||
target="RFC6156"></xref>.</t> | ||||
<t>Thanks to Justin Uberti, Pal Martinsen, Oleg Moskalenko, Aijun Wang | ||||
and Simon Perreault for their help on the ADDITIONAL-ADDRESS-FAMILY | ||||
mechanism. Authors would like to thank Gonzalo Salgueiro, Simon | ||||
Perreault, Jonathan Lennox, Brandon Williams, Karl Stahl, Noriyuki | ||||
Torii, Nils Ohlmeier, Dan Wing, Vijay Gurbani, Joseph Touch, Justin | ||||
Uberti, Christopher Wood, Roman Danyliw, Éric Vyncke, Adam Roach, | ||||
Suresh Krishnan, Mirja Kühlewind, Benjamin Kaduk and Oleg | ||||
Moskalenko for comments and review. The authors would like to thank Marc | ||||
for his contributions to the text.</t> | ||||
<t>Special thanks to Magnus Westerlund for the detailed AD review.</t> | ||||
</section> | ||||
</middle> | </middle> | |||
<back> | <back> | |||
<references title="Normative References"> | ||||
<?rfc include="reference.RFC.2119"?> | ||||
<?rfc include='reference.RFC.8174'?> | ||||
<?rfc include='reference.RFC.2474'?> | <displayreference target="I-D.ietf-tram-stun-pmtud" to="MTU-STUN"/> | |||
<displayreference target="I-D.ietf-mmusic-ice-sip-sdp" to="SDP-ICE"/> | ||||
<?rfc include='reference.RFC.3168'?> | <displayreference target="I-D.ietf-tsvwg-udp-options" to="UDP-OPT"/> | |||
<displayreference target="I-D.ietf-intarea-frag-fragile" to="FRAG-FRAGILE"/> | ||||
<?rfc include='reference.RFC.1122'?> | <displayreference target="I-D.ietf-rtcweb-security" to="SEC-WEBRTC"/> | |||
<displayreference target="I-D.ietf-tsvwg-datagram-plpmtud" to="MTU-DATAGRAM"/> | ||||
<?rfc include='reference.RFC.7915'?> | <displayreference target="I-D.ietf-mptcp-rfc6824bis" to="TCP-EXT"/> | |||
<?rfc include='reference.RFC.6437'?> | ||||
<?rfc include='reference.RFC.7065'?> | ||||
<?rfc include='reference.RFC.0792'?> | <references> | |||
<name>References</name> | ||||
<?rfc include='reference.RFC.4443'?> | <references> | |||
<?rfc include="reference.I-D.ietf-tram-stunbis"?> | <name>Normative References</name> | |||
<?rfc include='reference.RFC.8305'?> | <xi:include href="https://xml2rfc.ietf.org/public/rfc/bibxml/reference.RFC.2119. xml"/> | |||
<?rfc include='reference.RFC.6347'?> | <xi:include href="https://xml2rfc.ietf.org/public/rfc/bibxml/reference.RFC.8174. xml"/> | |||
<?rfc include='reference.RFC.8446'?> | <xi:include href="https://xml2rfc.ietf.org/public/rfc/bibxml/reference.RFC.2474. xml"/> | |||
<?rfc include='reference.RFC.7525'?> | <xi:include href="https://xml2rfc.ietf.org/public/rfc/bibxml/reference.RFC.3168. xml"/> | |||
<?rfc include='reference.RFC.8200'?> | <xi:include href="https://xml2rfc.ietf.org/public/rfc/bibxml/reference.RFC.1122. xml"/> | |||
<?rfc include='reference.RFC.7350'?> | <xi:include href="https://xml2rfc.ietf.org/public/rfc/bibxml/reference.RFC.7915. xml"/> | |||
<?rfc include='reference.RFC.3629'?> | <xi:include href="https://xml2rfc.ietf.org/public/rfc/bibxml/reference.RFC.6437. xml"/> | |||
<?rfc include='reference.RFC.7982'?> | <xi:include href="https://xml2rfc.ietf.org/public/rfc/bibxml/reference.RFC.7065. xml"/> | |||
<reference anchor="Protocol-Numbers" | <xi:include href="https://xml2rfc.ietf.org/public/rfc/bibxml/reference.RFC.0792. | |||
target="http://www.iana.org/assignments/protocol-numbers"> | xml"/> | |||
<front> | ||||
<title>IANA Protocol Numbers Registry</title> | ||||
<author> | <xi:include href="https://xml2rfc.ietf.org/public/rfc/bibxml/reference.RFC.4443. | |||
<organization></organization> | xml"/> | |||
</author> | ||||
<date year="2005" /> | <xi:include href="https://xml2rfc.ietf.org/public/rfc/bibxml/reference.RFC.8305. | |||
</front> | xml"/> | |||
</reference> | ||||
</references> | ||||
<references title="Informative References"> | <xi:include href="https://xml2rfc.ietf.org/public/rfc/bibxml/reference.RFC.6347. | |||
<?rfc include='reference.RFC.1191'?> | xml"/> | |||
<?rfc include='reference.RFC.0791'?> | <xi:include href="https://xml2rfc.ietf.org/public/rfc/bibxml/reference.RFC.8446. xml"/> | |||
<?rfc include='reference.RFC.1918'?> | <xi:include href="https://xml2rfc.ietf.org/public/rfc/bibxml/reference.RFC.7525. xml"/> | |||
<?rfc include="reference.RFC.3424"?> | <xi:include href="https://xml2rfc.ietf.org/public/rfc/bibxml/reference.RFC.8200. xml"/> | |||
<?rfc include='reference.RFC.4787'?> | <xi:include href="https://xml2rfc.ietf.org/public/rfc/bibxml/reference.RFC.7350. xml"/> | |||
<?rfc include="reference.RFC.8445"?> | <xi:include href="https://xml2rfc.ietf.org/public/rfc/bibxml/reference.RFC.3629. xml"/> | |||
<?rfc include="reference.RFC.6062"?> | <xi:include href="https://xml2rfc.ietf.org/public/rfc/bibxml/reference.RFC.7982. xml"/> | |||
<?rfc include="reference.RFC.6156"?> | <!-- <?rfc include="reference.I-D.ietf-tram-stunbis"?>; companion docume | |||
nt RFC 8489 --> | ||||
<reference anchor="RFC8489"> | ||||
<front> | ||||
<title>Session Traversal Utilities for NAT (STUN)</title> | ||||
<seriesInfo name="DOI" value="10.17487/RFC8489"/> | ||||
<seriesInfo name="RFC" value="8489"/> | ||||
<author initials="M" surname="Petit-Huguenin" fullname="Marc Petit-H | ||||
uguenin"> | ||||
<organization/> | ||||
</author> | ||||
<author initials="G" surname="Salgueiro" fullname="Gonzalo Salgueiro | ||||
"> | ||||
<organization/> | ||||
</author> | ||||
<author initials="J" surname="Rosenberg" fullname="Jonathan Rosenber | ||||
g"> | ||||
<organization/> | ||||
</author> | ||||
<author initials="D" surname="Wing" fullname="Dan Wing"> | ||||
<organization/> | ||||
</author> | ||||
<author initials="R" surname="Mahy" fullname="Rohan Mahy"> | ||||
<organization/> | ||||
</author> | ||||
<author initials="P" surname="Matthews" fullname="Philip Matthews"> | ||||
<organization/> | ||||
</author> | ||||
<date month="February" year="2020"/> | ||||
</front> | ||||
</reference> | ||||
<?rfc include='reference.RFC.6056'?> | <reference anchor="PROTOCOL-NUMBERS" target="https://www.iana.org/assign | |||
ments/protocol-numbers"> | ||||
<front> | ||||
<title>Protocol Numbers</title> | ||||
<author> | ||||
<organization>IANA</organization> | ||||
</author> | ||||
<date/> | ||||
</front> | ||||
</reference> | ||||
<?rfc include='reference.RFC.5128'?> | </references> | |||
<?rfc include='reference.RFC.1928'?> | <references> | |||
<name>Informative References</name> | ||||
<?rfc include='reference.RFC.3550'?> | <xi:include href="https://xml2rfc.ietf.org/public/rfc/bibxml/reference.RFC.1191. xml"/> | |||
<?rfc include='reference.RFC.3711'?> | <xi:include href="https://xml2rfc.ietf.org/public/rfc/bibxml/reference.RFC.0791. xml"/> | |||
<?rfc include='reference.RFC.4302'?> | <xi:include href="https://xml2rfc.ietf.org/public/rfc/bibxml/reference.RFC.1918. xml"/> | |||
<?rfc include='reference.RFC.4303'?> | <xi:include href="https://xml2rfc.ietf.org/public/rfc/bibxml/reference.RFC.3424. xml"/> | |||
<?rfc include='reference.RFC.4821'?> | <xi:include href="https://xml2rfc.ietf.org/public/rfc/bibxml/reference.RFC.4787. xml"/> | |||
<?rfc include='reference.RFC.3261'?> | <xi:include href="https://xml2rfc.ietf.org/public/rfc/bibxml/reference.RFC.8445. xml"/> | |||
<?rfc include='reference.I-D.ietf-mmusic-ice-sip-sdp'?> | <xi:include href="https://xml2rfc.ietf.org/public/rfc/bibxml/reference.RFC.6062. xml"/> | |||
<?rfc include='reference.I-D.ietf-tram-stun-pmtud'?> | <xi:include href="https://xml2rfc.ietf.org/public/rfc/bibxml/reference.RFC.6056. xml"/> | |||
<?rfc include='reference.I-D.ietf-tsvwg-udp-options'?> | <xi:include href="https://xml2rfc.ietf.org/public/rfc/bibxml/reference.RFC.6156. xml"/> | |||
<?rfc include='reference.I-D.ietf-intarea-frag-fragile'?> | <xi:include href="https://xml2rfc.ietf.org/public/rfc/bibxml/reference.RFC.5128. xml"/> | |||
<?rfc include='reference.I-D.ietf-rtcweb-security'?> | <xi:include href="https://xml2rfc.ietf.org/public/rfc/bibxml/reference.RFC.1928. xml"/> | |||
<?rfc include="reference.RFC.8155"?> | <xi:include href="https://xml2rfc.ietf.org/public/rfc/bibxml/reference.RFC.3550. xml"/> | |||
<?rfc include='reference.RFC.4086'?> | <xi:include href="https://xml2rfc.ietf.org/public/rfc/bibxml/reference.RFC.3711. xml"/> | |||
<?rfc include='reference.RFC.5928'?> | <xi:include href="https://xml2rfc.ietf.org/public/rfc/bibxml/reference.RFC.4302. xml"/> | |||
<?rfc include='reference.RFC.5766'?> | <xi:include href="https://xml2rfc.ietf.org/public/rfc/bibxml/reference.RFC.4303. xml"/> | |||
<?rfc include='reference.RFC.7635'?> | <xi:include href="https://xml2rfc.ietf.org/public/rfc/bibxml/reference.RFC.4821. xml"/> | |||
<?rfc include='reference.RFC.7983'?> | <xi:include href="https://xml2rfc.ietf.org/public/rfc/bibxml/reference.RFC.3261. xml"/> | |||
<?rfc include='reference.RFC.8311'?> | <xi:include href="https://xml2rfc.ietf.org/public/rfc/bibxml/reference.RFC.8155. xml"/> | |||
<?rfc include='reference.RFC.7657'?> | <xi:include href="https://xml2rfc.ietf.org/public/rfc/bibxml/reference.RFC.4086. xml"/> | |||
<?rfc include='reference.I-D.ietf-mptcp-rfc6824bis'?> | <xi:include href="https://xml2rfc.ietf.org/public/rfc/bibxml/reference.RFC.5928. xml"/> | |||
<?rfc include='reference.RFC.7478'?> | <xi:include href="https://xml2rfc.ietf.org/public/rfc/bibxml/reference.RFC.5766. xml"/> | |||
<?rfc include='reference.RFC.5925'?> | <xi:include href="https://xml2rfc.ietf.org/public/rfc/bibxml/reference.RFC.7635. xml"/> | |||
<?rfc include='reference.RFC.7413'?> | <xi:include href="https://xml2rfc.ietf.org/public/rfc/bibxml/reference.RFC.7983. xml"/> | |||
<?rfc include='reference.RFC.5482'?> | <xi:include href="https://xml2rfc.ietf.org/public/rfc/bibxml/reference.RFC.8311. xml"/> | |||
<?rfc include='reference.RFC.6263'?> | <xi:include href="https://xml2rfc.ietf.org/public/rfc/bibxml/reference.RFC.7657. xml"/> | |||
<reference anchor="Port-Numbers" | <xi:include href="https://xml2rfc.ietf.org/public/rfc/bibxml/reference.RFC.7478. | |||
target="http://www.iana.org/assignments/port-numbers"> | xml"/> | |||
<front> | ||||
<title>IANA Port Numbers Registry</title> | ||||
<author> | <xi:include href="https://xml2rfc.ietf.org/public/rfc/bibxml/reference.RFC.5925. | |||
<organization></organization> | xml"/> | |||
</author> | ||||
<date year="2005" /> | <xi:include href="https://xml2rfc.ietf.org/public/rfc/bibxml/reference.RFC.7413. | |||
</front> | xml"/> | |||
</reference> | ||||
<reference anchor="Frag-Harmful" | <xi:include href="https://xml2rfc.ietf.org/public/rfc/bibxml/reference.RFC.5482. | |||
target="http://www.hpl.hp.com/techreports/Compaq-DEC/WRL-87-3.p | xml"/> | |||
df"> | ||||
<front> | ||||
<title>"Fragmentation Considered Harmful", In Proc. SIGCOMM '87 | ||||
Workshop on Frontiers in Computer Communications Technology, DOI | ||||
10.1145/55483.55524</title> | ||||
<author fullname="Kent" initials="C. " surname="Kent"> | <xi:include href="https://xml2rfc.ietf.org/public/rfc/bibxml/reference.RFC.6263. | |||
<organization></organization> | xml"/> | |||
</author> | ||||
<author fullname="Mogul" initials="J." surname="Mogul"> | <!-- <?rfc include='reference.I-D.ietf-mmusic-ice-sip-sdp'?>; IESG Evalu | |||
<organization></organization> | ation::AD Followup --> | |||
<xi:include href="https://www.rfc-editor.org/refs/bibxml3/reference.I-D.ietf- | ||||
mmusic-ice-sip-sdp.xml"/> | ||||
<address> | <!-- <?rfc include='reference.I-D.ietf-tram-stun-pmtud'?>; IESG Evaluati | |||
<postal> | on::AD Followup --> | |||
<street></street> | <xi:include href="https://www.rfc-editor.org/refs/bibxml3/reference.I-D.ietf- | |||
tram-stun-pmtud.xml"/> | ||||
<city></city> | <!-- <?rfc include='reference.I-D.ietf-tsvwg-udp-options'?>; I-D Exists | |||
--> | ||||
<xi:include href="https://www.rfc-editor.org/refs/bibxml3/reference.I-D.ietf- | ||||
tsvwg-udp-options.xml"/> | ||||
<region></region> | <!-- <?rfc include='reference.I-D.ietf-intarea-frag-fragile'?>; IESG Eva | |||
luation::Revised I-D Needed --> | ||||
<xi:include href="https://www.rfc-editor.org/refs/bibxml3/reference.I-D.ietf- | ||||
intarea-frag-fragile.xml"/> | ||||
<code></code> | <!-- <?rfc include='reference.I-D.ietf-rtcweb-security' ?>; in MISSREF | |||
state as of 08/12/19 --> | ||||
<xi:include href="https://www.rfc-editor.org/refs/bibxml3/reference.I-D.ietf- | ||||
rtcweb-security.xml"/> | ||||
<country></country> | <!-- <?rfc include='reference.I-D.ietf-tsvwg-datagram-plpmtud'?>; I-D Ex | |||
</postal> | ists --> | |||
<xi:include href="https://www.rfc-editor.org/refs/bibxml3/reference.I-D.ietf- | ||||
tsvwg-datagram-plpmtud.xml"/> | ||||
<phone></phone> | <!-- <?rfc include='reference.I-D.ietf-mptcp-rfc6824bis'?>; in EDIT stat | |||
e as of 08/12/19 --> | ||||
<xi:include href="https://www.rfc-editor.org/refs/bibxml3/reference.I-D.ietf- | ||||
mptcp-rfc6824bis.xml"/> | ||||
<facsimile></facsimile> | <reference anchor="PORT-NUMBERS" target="https://www.iana.org/assignment | |||
s/port-numbers"> | ||||
<front> | ||||
<title>Service Name and Transport Protocol Port Number Registry</tit | ||||
le> | ||||
<author> | ||||
<organization>IANA | ||||
</organization> | ||||
</author> | ||||
<date/> | ||||
</front> | ||||
</reference> | ||||
<email></email> | <reference anchor="FRAG-HARMFUL" target="https://www.hpl.hp.com/techrepo | |||
rts/Compaq-DEC/WRL-87-3.pdf"> | ||||
<front> | ||||
<title>Fragmentation Considered Harmful | ||||
</title> | ||||
<author fullname="Kent" initials="C. " surname="Kent"> | ||||
<organization/> | ||||
</author> | ||||
<author fullname="Mogul" initials="J." surname="Mogul"> | ||||
<organization/> | ||||
</author> | ||||
<date month="December" year="1987"/> | ||||
</front> | ||||
</reference> | ||||
<uri></uri> | </references> | |||
</address> | ||||
</author> | ||||
<date month="August" year="1987" /> | ||||
</front> | ||||
</reference> | ||||
</references> | </references> | |||
<section numbered="false" toc="default"> | ||||
<name>Acknowledgements</name> | ||||
<t>Most of the text in this note comes from the original TURN | ||||
specification, <xref target="RFC5766" format="default"/>. The authors woul | ||||
d like to | ||||
thank <contact fullname="Rohan Mahy"/>, coauthor of the original TURN spec | ||||
ification, and everyone | ||||
who had contributed to that document. The authors would also like to | ||||
acknowledge that this document inherits material from <xref target="RFC615 | ||||
6" format="default"/>.</t> | ||||
<t>Thanks to <contact fullname="Justin Uberti"/>, <contact fullname="Pal | ||||
Martinsen"/>, <contact fullname="Oleg Moskalenko"/>, <contact | ||||
fullname="Aijun Wang"/>, and <contact fullname="Simon Perreault"/> for | ||||
their help on the ADDITIONAL-ADDRESS-FAMILY mechanism. The authors would | ||||
like to thank <contact fullname="Gonzalo Salgueiro"/>, <contact | ||||
fullname="Simon Perreault"/>, <contact fullname="Jonathan Lennox"/>, | ||||
<contact fullname="Brandon Williams"/>, <contact fullname="Karl | ||||
Stahl"/>, <contact fullname="Noriyuki Torii"/>, <contact fullname="Nils | ||||
Ohlmeier"/>, <contact fullname="Dan Wing"/>, <contact fullname="Vijay | ||||
Gurbani"/>, <contact fullname="Joseph Touch"/>, <contact | ||||
fullname="Justin Uberti"/>, <contact fullname="Christopher Wood"/>, | ||||
<contact fullname="Roman Danyliw"/>, <contact fullname="Eric Vyncke"/>, | ||||
<contact fullname="Adam Roach"/>, <contact fullname="Suresh Krishnan"/>, | ||||
<contact fullname="Mirja Kuehlewind"/>, <contact fullname="Benjamin | ||||
Kaduk"/>, and <contact fullname="Oleg Moskalenko"/> for comments and | ||||
review. The authors would like to thank <contact fullname="Marc Petit-Hugu | ||||
enin"/> for his | ||||
contributions to the text.</t> | ||||
<t>Special thanks to <contact fullname="Magnus Westerlund"/> for the detai | ||||
led AD review.</t> | ||||
</section> | ||||
</back> | </back> | |||
</rfc> | </rfc> | |||
End of changes. 820 change blocks. | ||||
2480 lines changed or deleted | 2432 lines changed or added | |||
This html diff was produced by rfcdiff 1.45. The latest version is available from http://tools.ietf.org/tools/rfcdiff/ |