summaryrefslogtreecommitdiff
path: root/doc/rfc/rfc8656.txt
diff options
context:
space:
mode:
authorThomas Voss <mail@thomasvoss.com> 2024-11-27 20:54:24 +0100
committerThomas Voss <mail@thomasvoss.com> 2024-11-27 20:54:24 +0100
commit4bfd864f10b68b71482b35c818559068ef8d5797 (patch)
treee3989f47a7994642eb325063d46e8f08ffa681dc /doc/rfc/rfc8656.txt
parentea76e11061bda059ae9f9ad130a9895cc85607db (diff)
doc: Add RFC documents
Diffstat (limited to 'doc/rfc/rfc8656.txt')
-rw-r--r--doc/rfc/rfc8656.txt4445
1 files changed, 4445 insertions, 0 deletions
diff --git a/doc/rfc/rfc8656.txt b/doc/rfc/rfc8656.txt
new file mode 100644
index 0000000..19ea044
--- /dev/null
+++ b/doc/rfc/rfc8656.txt
@@ -0,0 +1,4445 @@
+
+
+
+
+Internet Engineering Task Force (IETF) T. Reddy, Ed.
+Request for Comments: 8656 McAfee
+Obsoletes: 5766, 6156 A. Johnston, Ed.
+Category: Standards Track Villanova University
+ISSN: 2070-1721 P. Matthews
+ Alcatel-Lucent
+ J. Rosenberg
+ jdrosen.net
+ February 2020
+
+
+ Traversal Using Relays around NAT (TURN): Relay Extensions to Session
+ Traversal Utilities for NAT (STUN)
+
+Abstract
+
+ If a host is located behind a NAT, it can be impossible for that host
+ to communicate directly with other hosts (peers) in certain
+ situations. In these situations, it is necessary for the host to use
+ the services of an intermediate node that acts as a communication
+ relay. This specification defines a protocol, called "Traversal
+ Using Relays 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 differs from other relay control protocols in that
+ it allows a client to communicate with multiple peers using a single
+ relay address.
+
+ The TURN protocol was designed to be used as part of the Interactive
+ Connectivity Establishment (ICE) approach to NAT traversal, though it
+ can also be used without ICE.
+
+ This document obsoletes RFCs 5766 and 6156.
+
+Status of This Memo
+
+ This is an Internet Standards Track document.
+
+ This document is a product of the Internet Engineering Task Force
+ (IETF). It represents the consensus of the IETF community. It has
+ received public review and has been approved for publication by the
+ Internet Engineering Steering Group (IESG). Further information on
+ Internet Standards is available in Section 2 of RFC 7841.
+
+ Information about the current status of this document, any errata,
+ and how to provide feedback on it may be obtained at
+ https://www.rfc-editor.org/info/rfc8656.
+
+Copyright Notice
+
+ Copyright (c) 2020 IETF Trust and the persons identified as the
+ document authors. All rights reserved.
+
+ This document is subject to BCP 78 and the IETF Trust's Legal
+ Provisions Relating to IETF Documents
+ (https://trustee.ietf.org/license-info) in effect on the date of
+ publication of this document. Please review these documents
+ carefully, as they describe your rights and restrictions with respect
+ to this document. Code Components extracted from this document must
+ include Simplified BSD License text as described in Section 4.e of
+ the Trust Legal Provisions and are provided without warranty as
+ described in the Simplified BSD License.
+
+Table of Contents
+
+ 1. Introduction
+ 2. Terminology
+ 3. Overview of Operation
+ 3.1. Transports
+ 3.2. Allocations
+ 3.3. Permissions
+ 3.4. Send Mechanism
+ 3.5. Channels
+ 3.6. Unprivileged TURN Servers
+ 3.7. Avoiding IP Fragmentation
+ 3.8. RTP Support
+ 3.9. Happy Eyeballs for TURN
+ 4. Discovery of TURN Server
+ 4.1. TURN URI Scheme Semantics
+ 5. General Behavior
+ 6. Allocations
+ 7. Creating an Allocation
+ 7.1. Sending an Allocate Request
+ 7.2. Receiving an Allocate Request
+ 7.3. Receiving an Allocate Success Response
+ 7.4. Receiving an Allocate Error Response
+ 8. Refreshing an Allocation
+ 8.1. Sending a Refresh Request
+ 8.2. Receiving a Refresh Request
+ 8.3. Receiving a Refresh Response
+ 9. Permissions
+ 10. CreatePermission
+ 10.1. Forming a CreatePermission Request
+ 10.2. Receiving a CreatePermission Request
+ 10.3. Receiving a CreatePermission Response
+ 11. Send and Data Methods
+ 11.1. Forming a Send Indication
+ 11.2. Receiving a Send Indication
+ 11.3. Receiving a UDP Datagram
+ 11.4. Receiving a Data Indication
+ 11.5. Receiving an ICMP Packet
+ 11.6. Receiving a Data Indication with an ICMP Attribute
+ 12. Channels
+ 12.1. Sending a ChannelBind Request
+ 12.2. Receiving a ChannelBind Request
+ 12.3. Receiving a ChannelBind Response
+ 12.4. The ChannelData Message
+ 12.5. Sending a ChannelData Message
+ 12.6. Receiving a ChannelData Message
+ 12.7. Relaying Data from the Peer
+ 13. Packet Translations
+ 13.1. IPv4-to-IPv6 Translations
+ 13.2. IPv6-to-IPv6 Translations
+ 13.3. IPv6-to-IPv4 Translations
+ 14. UDP-to-UDP Relay
+ 15. TCP-to-UDP Relay
+ 16. UDP-to-TCP Relay
+ 17. STUN Methods
+ 18. STUN Attributes
+ 18.1. CHANNEL-NUMBER
+ 18.2. LIFETIME
+ 18.3. XOR-PEER-ADDRESS
+ 18.4. DATA
+ 18.5. XOR-RELAYED-ADDRESS
+ 18.6. REQUESTED-ADDRESS-FAMILY
+ 18.7. EVEN-PORT
+ 18.8. REQUESTED-TRANSPORT
+ 18.9. DONT-FRAGMENT
+ 18.10. RESERVATION-TOKEN
+ 18.11. ADDITIONAL-ADDRESS-FAMILY
+ 18.12. ADDRESS-ERROR-CODE
+ 18.13. ICMP
+ 19. STUN Error Response Codes
+ 20. Detailed Example
+ 21. Security Considerations
+ 21.1. Outsider Attacks
+ 21.1.1. Obtaining Unauthorized Allocations
+ 21.1.2. Offline Dictionary Attacks
+ 21.1.3. Faked Refreshes and Permissions
+ 21.1.4. Fake Data
+ 21.1.5. Impersonating a Server
+ 21.1.6. Eavesdropping Traffic
+ 21.1.7. TURN Loop Attack
+ 21.2. Firewall Considerations
+ 21.2.1. Faked Permissions
+ 21.2.2. Blacklisted IP Addresses
+ 21.2.3. Running Servers on Well-Known Ports
+ 21.3. Insider Attacks
+ 21.3.1. DoS against TURN Server
+ 21.3.2. Anonymous Relaying of Malicious Traffic
+ 21.3.3. Manipulating Other Allocations
+ 21.4. Tunnel Amplification Attack
+ 21.5. Other Considerations
+ 22. IANA Considerations
+ 23. IAB Considerations
+ 24. Changes since RFC 5766
+ 25. Updates to RFC 6156
+ 26. References
+ 26.1. Normative References
+ 26.2. Informative References
+ Acknowledgements
+ Authors' Addresses
+
+1. Introduction
+
+ 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 can use "hole punching" techniques (see [RFC5128]) in an
+ attempt to discover a direct communication path; that is, a
+ communication path that goes from one host to another through
+ intervening NATs and routers but does not traverse any relays.
+
+ As described in [RFC5128] and [RFC4787], hole punching techniques
+ will fail if both hosts are behind NATs that are not well behaved.
+ For example, if both hosts are behind NATs that have a mapping
+ behavior of "address-dependent mapping" or "address- and port-
+ dependent mapping" (see Section 4.1 of [RFC4787]), then hole punching
+ techniques generally fail.
+
+ 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
+ packets. This relay typically sits in the public Internet and relays
+ packets between two hosts that both sit behind NATs.
+
+ In many enterprise networks, direct UDP transmissions are not
+ permitted between clients on the internal networks and external IP
+ addresses. To permit media sessions in such a situation to use UDP
+ and avoid forcing them through TCP, an Enterprise Firewall can be
+ configured to allow UDP traffic relayed through an Enterprise relay
+ server. WebRTC requires support for this scenario (see
+ Section 2.3.5.1 of [RFC7478]). Some users of SIP or WebRTC want IP
+ location privacy from the remote peer. In this scenario, the client
+ can select a relay server offering IP location privacy and only
+ convey the relayed candidates to the peer for ICE connectivity checks
+ (see Section 4.2.4 of [SEC-WEBRTC]).
+
+ 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. The client can
+ arrange for the server to relay packets to and from certain other
+ hosts (called "peers"), and the client can control aspects of how the
+ relaying is done. The client does this by obtaining an IP address
+ and port on the server, called the "relayed transport address". When
+ a peer sends a packet to the relayed transport address, the server
+ relays the transport protocol data from the packet to the client.
+ The data encapsulated within a message header 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 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.
+
+ 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 port (more precisely, each peer's server-reflexive transport
+ address; see Section 3). How this is done is out of the 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
+ its peers to use a special-purpose "introduction" or "rendezvous"
+ protocol (see [RFC5128] for more details).
+
+ If TURN is used with ICE [RFC8445], then the relayed transport
+ address and the IP addresses and ports of the 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 multimedia
+ solution using SIP [RFC3261], then SIP serves the role of the
+ rendezvous protocol, carrying the ICE candidate information inside
+ the body of SIP messages [SDP-ICE]. If TURN and ICE are used with
+ some other rendezvous protocol, then ICE provides guidance on the
+ services the rendezvous protocol must perform.
+
+ 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 provider of the TURN server since the server typically needs a
+ 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 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 first and only use a TURN server when a direct path
+ cannot be found.
+
+ TURN was originally invented to support multimedia sessions signaled
+ using SIP. Since SIP supports forking, TURN supports multiple peers
+ per relayed transport address; a feature not supported by other
+ approaches (e.g., SOCKS [RFC1928]). However, care has been taken to
+ make sure that TURN is suitable for other types of applications.
+
+ TURN was designed as one piece in the larger ICE approach to NAT
+ traversal. Implementors of TURN are urged to investigate ICE and
+ seriously consider using it for their application. However, it is
+ possible to use TURN without ICE.
+
+ TURN is an extension to the Session Traversal Utilities for NAT
+ (STUN) protocol [RFC8489]. Most, though not all, TURN messages are
+ STUN-formatted messages. A reader of this document should be
+ familiar with STUN.
+
+ The TURN specification was originally published as [RFC5766], which
+ was updated by [RFC6156] to add IPv6 support. This document
+ supersedes and obsoletes both [RFC5766] and [RFC6156].
+
+2. Terminology
+
+ The key words "MUST", "MUST NOT", "REQUIRED", "SHALL", "SHALL NOT",
+ "SHOULD", "SHOULD NOT", "RECOMMENDED", "NOT RECOMMENDED", "MAY", and
+ "OPTIONAL" in this document are to be interpreted as described in
+ BCP 14 [RFC2119] [RFC8174] when, and only when, they appear in all
+ capitals, as shown here.
+
+ Readers are expected to be familiar with [RFC8489] and the terms
+ defined there.
+
+ The following terms are used in this document:
+
+ TURN:
+ The protocol spoken between a TURN client and a TURN server. It
+ is an extension to the STUN protocol [RFC8489]. The protocol
+ allows a client to allocate and use a relayed transport address.
+
+ TURN client:
+ A STUN client that implements this specification.
+
+ TURN server:
+ A STUN server that implements this specification. It relays data
+ between a TURN client and its peer(s).
+
+ Peer:
+ A host with which the TURN client wishes to communicate. The TURN
+ server relays traffic between the TURN client and its peer(s).
+ The peer does not interact with the TURN server using the protocol
+ defined in this document; rather, the peer receives data sent by
+ the TURN server, and the peer sends data towards the TURN server.
+
+ Transport Address:
+ The combination of an IP address and a port.
+
+ Host Transport Address:
+ A transport address on a client or a peer.
+
+ Server-Reflexive Transport Address:
+ A transport address on the "external side" of a NAT. This address
+ is allocated by the NAT to correspond to a specific host transport
+ address.
+
+ Relayed Transport Address:
+ A transport address on the 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 packet is then relayed to the
+ client.
+
+ TURN Server Transport Address:
+ A transport address on the TURN server that is used for sending
+ TURN messages to the server. This is the transport address that
+ the client uses to communicate with the server.
+
+ Peer Transport Address:
+ The transport address of the peer as seen by the server. When the
+ peer is behind a NAT, this is the peer's server-reflexive
+ transport address.
+
+ Allocation:
+ The relayed transport address granted to a client through an
+ Allocate request, along with related state, such as permissions
+ and expiration timers.
+
+ 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.
+
+ Transport Protocol:
+ 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.
+
+ Channel:
+ A channel number and associated peer transport address. Once a
+ channel number is bound to a peer's transport address, the client
+ and server can use the more bandwidth-efficient ChannelData
+ message to exchange data.
+
+ Permission:
+ The IP address and transport protocol (but 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 will only
+ forward traffic to its client from peers that match an existing
+ permission.
+
+ Realm:
+ A string used to describe the server or a context within the
+ server. The realm tells the client which username and password
+ combination to use to authenticate requests.
+
+ Nonce:
+ A string chosen at random by the server and included in the server
+ response. To prevent replay attacks, the server should change the
+ nonce regularly.
+
+ (D)TLS:
+ This term is used for statements that apply to both Transport
+ Layer Security [RFC8446] and Datagram Transport Layer Security
+ [RFC6347].
+
+3. Overview of Operation
+
+ This section gives an overview of the operation of TURN. It is non-
+ normative.
+
+ In a typical configuration, a TURN client is connected to a private
+ network [RFC1918] and, through one or more NATs, to the public
+ Internet. On the public Internet is a TURN server. Elsewhere in the
+ Internet are one or more peers with which the TURN client wishes to
+ communicate. These peers may or may not be behind one or more NATs.
+ The client uses the server as a relay to send packets to these peers
+ and to receive packets from these peers.
+
+ Peer A
+ Server-Reflexive +---------+
+ Transport Address | |
+ 192.0.2.150:32102 | |
+ | /| |
+ TURN | / ^| Peer A |
+ Client's Server | / || |
+ Host Transport Transport | // || |
+ Address Address | // |+---------+
+ 198.51.100.2:49721 192.0.2.15:3478 |+-+ // Peer A
+ | | ||N| / Host Transport
+ | +-+ | ||A|/ Address
+ | | | | v|T| 203.0.113.2:49582
+ | | | | /+-+
+ +---------+| | | |+---------+ / +---------+
+ | || |N| || | // | |
+ | TURN |v | | v| TURN |/ | |
+ | Client |----|A|-------| Server |------------------| Peer B |
+ | | | |^ | |^ ^| |
+ | | |T|| | || || |
+ +---------+ | || +---------+| |+---------+
+ | || | |
+ | || | |
+ +-+| | |
+ | | |
+ | | |
+ Client's | Peer B
+ Server-Reflexive Relayed Transport
+ Transport Address Transport Address Address
+ 192.0.2.1:7000 192.0.2.15:50000 192.0.2.210:49191
+
+ Figure 1
+
+ Figure 1 shows a typical deployment. In 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 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" (see [RFC4787]).
+
+ The client talks to the server from a (IP address, port) combination
+ called the client's "host transport address". (The combination of an
+ IP address and port is called a "transport address".)
+
+ 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". The client learns the TURN server
+ transport address through some unspecified means (e.g.,
+ configuration), and this address is typically used by many clients
+ simultaneously.
+
+ 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
+ address is known as the client's "server-reflexive transport
+ address"; packets sent by the server to the client's server-reflexive
+ transport address will be forwarded by the NAT to the client's host
+ transport address.
+
+ The client uses TURN commands to create and manipulate an ALLOCATION
+ on the server. An allocation is a data structure on the server.
+ This data structure contains, amongst other things, the relayed
+ transport address for the allocation. The relayed transport address
+ is the 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 relayed transport address.
+
+ 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 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; 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 application data in a UDP datagram to the relayed
+ transport address for 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 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 allocation to
+ communicate with multiple peers.
+
+ When the peer is behind a NAT, the client must identify the peer
+ using its server-reflexive transport address rather than its host
+ 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 server-reflexive transport address) rather than 203.0.113.2:49582
+ (Peer A's host transport address).
+
+ 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 allocation. Thus, when a packet arrives at a relayed transport
+ address on the server, the server knows for which client the data is
+ intended.
+
+ The client may have multiple allocations on a server at the same
+ time.
+
+3.1. Transports
+
+ TURN, as defined in this specification, always uses UDP between the
+ server and the peer. However, this specification allows the use of
+ any one of UDP, TCP, Transport Layer Security (TLS) over TCP, or
+ Datagram Transport Layer Security (DTLS) over UDP to carry the TURN
+ messages between the client and the server.
+
+ +----------------------------+---------------------+
+ | TURN client to TURN server | TURN server to peer |
+ +============================+=====================+
+ | UDP | UDP |
+ +----------------------------+---------------------+
+ | TCP | UDP |
+ +----------------------------+---------------------+
+ | TLS-over-TCP | UDP |
+ +----------------------------+---------------------+
+ | DTLS-over-UDP | UDP |
+ +----------------------------+---------------------+
+
+ Table 1
+
+ If TCP or TLS-over-TCP is used between the client and the server,
+ then the server will convert between these transports and UDP
+ transport when relaying data to/from the peer.
+
+ 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
+ between the client and the server as well. That being the case, some
+ readers may wonder: Why also support TCP and TLS-over-TCP?
+
+ TURN supports TCP transport between the client and the server because
+ some firewalls are configured to block UDP entirely. These firewalls
+ block UDP but not TCP, in part because TCP has properties that make
+ the intention of the nodes being protected by the firewall more
+ obvious to the firewall. For example, TCP has a three-way handshake
+ that makes it clearer that the protected node really wishes to have
+ that particular connection established, while for UDP, the best the
+ firewall can do is guess which flows are desired by using filtering
+ rules. Also, TCP has explicit connection teardown; while for UDP,
+ the firewall has to use timers to guess when the flow is finished.
+
+ TURN supports TLS-over-TCP transport and DTLS-over-UDP transport
+ between the client and the server because (D)TLS provides additional
+ security properties not provided by TURN's default digest
+ authentication, properties that some clients may wish to take
+ 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
+ confidentiality of TURN control messages. If (D)TLS transport is
+ used between the TURN client and the TURN server, refer to
+ Section 6.2.3 of [RFC8489] for more information about cipher suites,
+ server certificate validation, and authentication of TURN servers.
+ The guidance given in [RFC7525] 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).
+
+ There is an extension to TURN for TCP transport between the server
+ and the peers [RFC6062]. 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.
+
+ In some applications for TURN, the client may send and receive
+ packets other than TURN packets on the host transport address it uses
+ to communicate with the server. This can happen, for example, when
+ using TURN with ICE. In these cases, the client can distinguish TURN
+ packets from other packets by examining the source address of the
+ arriving packet; those arriving from the TURN server will be TURN
+ packets. The algorithm of demultiplexing packets received from
+ multiple protocols on the host transport address is discussed in
+ [RFC7983].
+
+3.2. Allocations
+
+ To create an allocation on the server, the client uses an Allocate
+ transaction. The client sends an Allocate request to the server, and
+ the server replies with an Allocate success response containing the
+ allocated relayed transport address. The client can include
+ attributes in the Allocate request that describe the type of
+ allocation it desires (e.g., the lifetime of the allocation). Since
+ relaying data has security implications, the server requires that the
+ client authenticate itself, typically using STUN's long-term
+ credential mechanism or the STUN Extension for Third-Party
+ Authorization [RFC7635], to show that it is authorized to use the
+ server.
+
+ Once a relayed transport address is allocated, a client must keep the
+ allocation alive. To do this, the client periodically sends a
+ Refresh request to the server. TURN deliberately uses a different
+ method (Refresh rather than Allocate) for refreshes to ensure that
+ the client is informed if the allocation vanishes for some reason.
+
+ The frequency of the Refresh transaction is determined by the
+ lifetime of the allocation. The default lifetime of an allocation is
+ 10 minutes; this value was chosen to be long enough so that
+ refreshing is not typically a burden on the client while expiring
+ allocations where the client has unexpectedly quit in a timely
+ manner. However, the client can request a longer lifetime in the
+ Allocate request and may modify its request in a Refresh request, and
+ the server always indicates the actual lifetime in the response. The
+ client must issue a new Refresh transaction within "lifetime" seconds
+ of the previous Allocate or Refresh transaction. Once a client no
+ longer wishes to use an allocation, it should delete the allocation
+ using a Refresh request with a requested lifetime of zero.
+
+ 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
+ transport address, the server transport address, and the transport
+ 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
+ transport address is replaced by the client's server-reflexive
+ address since that is the client's address as seen by the server.
+
+ Both the client and the server remember the 5-tuple used in the
+ Allocate request. Subsequent messages between the client and the
+ 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
+ allocate a second relayed transport address, it must create a second
+ allocation using a different 5-tuple (e.g., by using a different
+ client host address or port).
+
+ | NOTE: While the terminology used in this document refers to
+ | 5-tuples, the TURN server can store whatever identifier it
+ | likes that yields identical results. Specifically, an
+ | implementation may use a file descriptor in place of a 5-tuple
+ | to represent a TCP connection.
+
+ TURN TURN Peer Peer
+ client server A B
+ |-- Allocate request --------------->| | |
+ | (invalid or missing credentials) | | |
+ | | | |
+ |<--------------- Allocate failure --| | |
+ | (401 Unauthenticated) | | |
+ | | | |
+ |-- Allocate request --------------->| | |
+ | (valid credentials) | | |
+ | | | |
+ |<---------- Allocate success resp --| | |
+ | (192.0.2.15:50000) | | |
+ // // // //
+ | | | |
+ |-- Refresh request ---------------->| | |
+ | | | |
+ |<----------- Refresh success resp --| | |
+ | | | |
+
+ Figure 2
+
+ In Figure 2, the client sends an Allocate request to the server with
+ invalid or missing credentials. Since the server requires that all
+ requests be authenticated using STUN's long-term credential
+ mechanism, the server rejects the request with a 401 (Unauthorized)
+ error code. The client then tries again, this time including
+ credentials. This time, the server accepts the Allocate request and
+ returns an Allocate success response containing (amongst other
+ things) the relayed transport address assigned to the allocation.
+ Sometime later, the client decides to refresh the allocation; thus,
+ it sends a Refresh request to the server. The refresh is accepted
+ and the server replies with a Refresh success response.
+
+3.3. Permissions
+
+ To ease concerns amongst enterprise IT administrators that TURN could
+ be used to bypass corporate firewall security, TURN includes the
+ notion of permissions. TURN permissions mimic the address-restricted
+ filtering mechanism of NATs that comply with [RFC4787].
+
+ An allocation can have zero or more permissions. Each permission
+ consists of an IP address and a lifetime. When the server receives a
+ UDP datagram on the allocation's relayed transport address, it first
+ checks the list of permissions. If the source IP address of the
+ datagram matches a permission, the application data is relayed to the
+ client; otherwise, the UDP datagram is silently discarded.
+
+ A permission expires after 5 minutes if it is not refreshed, and
+ there is no way to explicitly delete a permission. This behavior was
+ selected to match the behavior of a NAT that complies with [RFC4787].
+
+ The client can install or refresh a permission using either a
+ CreatePermission request or a ChannelBind request. Using the
+ CreatePermission request, multiple permissions can be installed or
+ refreshed with a single request; this is important for applications
+ that use ICE. For security reasons, permissions can only be
+ installed or refreshed by transactions that can be authenticated;
+ thus, Send indications and ChannelData messages (which are used to
+ send data to peers) do not install or refresh any permissions.
+
+ Note that permissions are within the context of an allocation, so
+ adding or expiring a permission in one allocation does not affect
+ other allocations.
+
+3.4. Send Mechanism
+
+ There are two mechanisms for the client and peers to exchange
+ application data using the TURN server. The first mechanism uses the
+ Send and Data methods, the second mechanism uses channels. Common to
+ both mechanisms is the ability of the client to communicate with
+ multiple peers using a single allocated relayed transport address;
+ 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
+ indicate to the client which peer sent the data.
+
+ The Send mechanism uses Send and Data indications. Send indications
+ 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 the client.
+
+ When using the Send mechanism, the client sends a Send indication to
+ the TURN server containing (a) an XOR-PEER-ADDRESS attribute
+ specifying the (server-reflexive) transport address of the peer and
+ (b) a DATA attribute holding the application data. When the TURN
+ server receives the Send indication, it extracts the application data
+ 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
+ there is no need to specify the relayed transport address since it is
+ implied by the 5-tuple used for the Send indication.
+
+ In the reverse direction, UDP datagrams arriving at the relayed
+ transport address on the TURN server are converted into Data
+ indications and sent to the client, with the server-reflexive
+ transport address of the peer included in an XOR-PEER-ADDRESS
+ attribute and the data itself in a DATA attribute. Since the relayed
+ transport address uniquely identified the allocation, the server
+ knows which client should receive the data.
+
+ Some ICMP (Internet Control Message Protocol) packets arriving at the
+ relayed transport address on the TURN server may be converted into
+ 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 and code in an ICMP attribute. ICMP attribute forwarding always
+ uses Data indications containing the XOR-PEER-ADDRESS and ICMP
+ attributes, even when using the channel mechanism to forward UDP
+ data.
+
+ Send and Data indications cannot be authenticated since the long-term
+ credential mechanism of STUN does not support authenticating
+ 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
+ peer. Applications that want end-to-end security should encrypt the
+ data sent between the client and a peer.
+
+ Because Send indications are not authenticated, it is possible for an
+ attacker to send bogus Send indications to the server, which will
+ then relay these to a peer. To partly mitigate this attack, TURN
+ requires that the client install a permission towards a peer before
+ sending data to it using a Send indication. The technique to fully
+ mitigate the attack is discussed in Section 21.1.4.
+
+ TURN TURN Peer Peer
+ client server A B
+ | | | |
+ |-- CreatePermission req (Peer A) ->| | |
+ |<- CreatePermission success resp --| | |
+ | | | |
+ |--- Send ind (Peer A)------------->| | |
+ | |=== data ===>| |
+ | | | |
+ | |<== data ====| |
+ |<------------- Data ind (Peer A) --| | |
+ | | | |
+ | | | |
+ |--- Send ind (Peer B)------------->| | |
+ | | dropped | |
+ | | | |
+ | |<== data ==================|
+ | dropped | | |
+ | | | |
+
+ Figure 3
+
+ In Figure 3, the client has already created an allocation and now
+ wishes to send data to its peers. The client first creates a
+ permission by sending the server a CreatePermission request
+ specifying Peer A's (server-reflexive) IP 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 client then sends data
+ to Peer A using a Send indication; at the server, the application
+ data is extracted and forwarded in a UDP 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 relayed transport
+ address, the contents are placed into a Data indication and forwarded
+ to the client. Later, the client attempts to exchange data with Peer
+ B; however, no permission has been installed for Peer B, so the Send
+ indication from the client and the UDP datagram from the peer are
+ both dropped by the server.
+
+3.5. Channels
+
+ For some applications (e.g., Voice over IP (VoIP)), the 36 bytes of
+ overhead that a Send indication or Data indication adds to the
+ application data can substantially increase the bandwidth required
+ 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 peer.
+
+ This second way uses an alternate packet format known as the
+ "ChannelData message". The ChannelData message does not use the STUN
+ 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 in use is bound to a specific peer; thus, it serves as a
+ shorthand for the peer's host transport address.
+
+ To bind a channel to a peer, the client sends a ChannelBind request
+ to the server and includes an unbound channel number and the
+ 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 peer. Similarly, the server can relay data from that peer
+ towards the client using a ChannelData message.
+
+ Channel bindings last for 10 minutes unless refreshed; this lifetime
+ was chosen to be longer than the permission lifetime. Channel
+ bindings are refreshed by sending another ChannelBind request
+ rebinding the channel to the peer. Like permissions (but unlike
+ allocations), there is no way to explicitly delete a channel binding;
+ the client must simply wait for it to time out.
+
+ TURN TURN Peer Peer
+ client server A B
+ | | | |
+ |-- ChannelBind req --------------->| | |
+ | (Peer A to 0x4001) | | |
+ | | | |
+ |<---------- ChannelBind succ resp -| | |
+ | | | |
+ |-- (0x4001) data ----------------->| | |
+ | |=== data ===>| |
+ | | | |
+ | |<== data ====| |
+ |<------------------ (0x4001) data -| | |
+ | | | |
+ |--- Send ind (Peer A)------------->| | |
+ | |=== data ===>| |
+ | | | |
+ | |<== data ====| |
+ |<------------------ (0x4001) data -| | |
+ | | | |
+
+ Figure 4
+
+ Figure 4 shows the channel mechanism in 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 request to the server,
+ specifying the transport address of Peer A and a channel number
+ (0x4001). After that, the client can send application data
+ encapsulated inside ChannelData messages to Peer A: this is shown as
+ "(0x4001) data" where 0x4001 is the channel number. When 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 to channel number 0x4001).
+
+ In the reverse direction, when Peer A sends a UDP datagram to the
+ relayed transport address, this UDP datagram arrives at the server on
+ the relayed transport address assigned to the allocation. Since the
+ UDP datagram was received from Peer A, which has a channel number
+ assigned to it, the server encapsulates the data into a ChannelData
+ message when sending the data to the client.
+
+ Once a channel has been bound, the client is free to intermix
+ ChannelData messages and Send indications. In the figure, the client
+ later decides to use a Send indication rather than a ChannelData
+ 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 the next section). However, once a channel is bound, the server
+ will always use a ChannelData message, as shown in the call flow.
+
+ 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 bound to a channel, but Peer B has not, so application data to
+ and from Peer B would use the Send mechanism.
+
+3.6. Unprivileged TURN Servers
+
+ This version of TURN is designed so that the server can be
+ implemented as an application that runs in user space under commonly
+ available operating systems without requiring special privileges.
+ This 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 application so that one peer can offer NAT traversal
+ services to another peer and to use (D)TLS to secure the TURN
+ connection.
+
+ This design decision has the following implications for data relayed
+ by a TURN server:
+
+ * The value of the Diffserv field may not be preserved across the
+ server;
+
+ * The Time to Live (TTL) field may be reset, rather than
+ decremented, across the server;
+
+ * The Explicit Congestion Notification (ECN) field may be reset by
+ the server;
+
+ * There is no end-to-end fragmentation since the packet is
+ reassembled at the server.
+
+ Future work may specify alternate TURN semantics that address these
+ limitations.
+
+3.7. Avoiding IP Fragmentation
+
+ For reasons described in [FRAG-HARMFUL], applications, especially
+ those sending large volumes of data, should avoid having their
+ packets fragmented. [FRAG-FRAGILE] discusses issues 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, but
+ applications using UDP (and, thus, any application using this version
+ of TURN) need to avoid IP fragmentation by sending sufficiently small
+ messages or by using UDP fragmentation [UDP-OPT]. Note that the UDP
+ fragmentation option needs to be supported by both endpoints, and at
+ the time of writing of this document, UDP fragmentation support is
+ under discussion and is not deployed.
+
+ The application running on the client and the peer can take one of
+ two approaches to avoid IP fragmentation until UDP fragmentation
+ support is available. The first uses messages that are limited to a
+ predetermined fixed maximum, and the second relies on network
+ feedback to adapt that maximum.
+
+ The first approach is to avoid sending large amounts of application
+ data in the TURN messages/UDP datagrams exchanged between the client
+ and the peer. This is the approach taken by most VoIP applications.
+ In this approach, the application MUST assume a Path MTU (PMTU) of
+ 1280 bytes because IPv6 requires that every link in the Internet has
+ an MTU of 1280 octets or greater as specified in [RFC8200]. If IPv4
+ support on legacy or otherwise unusual networks is a consideration,
+ the application MAY assume an effective MTU of 576 bytes for IPv4
+ datagrams, as every IPv4 host must be capable of receiving a packet
+ with a length equal to 576 bytes as discussed in [RFC0791] and
+ [RFC1122].
+
+ The exact amount of application data that can be included while
+ avoiding fragmentation depends on the details of the TURN session
+ between the client and the server: whether UDP, TCP, or (D)TLS
+ transport is used; whether ChannelData messages or Send/Data
+ indications are used; and whether any additional attributes (such as
+ the DONT-FRAGMENT attribute) are included. Another factor, which is
+ 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.
+
+ 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) or
+ a UDP datagram (by the peer on the peer-to-server leg) will generally
+ avoid IP fragmentation. To further reduce the chance of
+ fragmentation, it is recommended that the client use ChannelData
+ messages when transferring significant volumes of data since the
+ overhead of the ChannelData message is less than Send and Data
+ indications.
+
+ The second approach the client and peer can take to avoid
+ fragmentation is to use a path MTU discovery algorithm to determine
+ the maximum amount of application data that can be sent without
+ fragmentation. The classic path MTU discovery algorithm defined in
+ [RFC1191] may not be able to discover the MTU of the transmission
+ path between the client and the peer since:
+
+ * A probe packet with a Don't Fragment (DF) bit in the IPv4 header
+ set to test a path for a larger MTU can be dropped by routers, or
+
+ * ICMP error messages can be dropped by middleboxes.
+
+ 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 Discovery algorithm defined in [RFC4821] is one such algorithm,
+ and a set of algorithms is defined in [MTU-DATAGRAM].
+
+ [MTU-STUN] is an implementation of [RFC4821] that uses STUN 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
+ attribute. When the client includes the DONT-FRAGMENT attribute in a
+ 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
+ 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
+ the DONT-FRAGMENT attribute will indicate this by rejecting the
+ Allocate request. If the TURN server carrying out packet translation
+ from IPv4-to-IPv6 is unable to access the state of the Don't Fragment
+ (DF) bit in the IPv4 header, it MUST reject the Allocate request with
+ the DONT-FRAGMENT attribute.
+
+3.8. RTP Support
+
+ 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
+ RTP. To facilitate the use of TURN for this purpose, TURN includes
+ some special support for older versions of RTP.
+
+ Old versions of RTP [RFC3550] required that the RTP stream be on an
+ even port number and the associated RTP Control Protocol (RTCP)
+ stream, if present, be on the next highest port. To allow clients to
+ work with peers that still require this, TURN allows the client to
+ request that the server allocate a relayed transport address with an
+ even port number and optionally request the server reserve the next-
+ highest port number for a subsequent allocation.
+
+3.9. Happy Eyeballs for TURN
+
+ 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
+ experience a significant connection delay compared to an IPv4-only
+ TURN client. To overcome these connection setup problems, the TURN
+ 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
+ using both IPv6 and IPv4 addresses in a fashion similar to the Happy
+ Eyeballs mechanism defined in [RFC8305]. The TURN client performs
+ the following steps based on the transport protocol being used to
+ connect to the TURN server.
+
+ * For TCP or TLS-over-TCP, the results of the Happy Eyeballs
+ procedure [RFC8305] are used by the TURN client for sending its
+ TURN messages to the server.
+
+ * For clear text UDP, send TURN Allocate requests to both IP address
+ families as discussed in [RFC8305] without authentication
+ information. If the TURN server requires authentication, it will
+ send back a 401 unauthenticated response; the TURN client will use
+ the first UDP connection on which a 401 error response is
+ received. If a 401 error response is received from both IP
+ address families, then the TURN client can silently abandon the
+ UDP connection on the IP address family with lower precedence. If
+ the TURN server does not require authentication (as described in
+ Section 9 of [RFC8155]), it is possible for both Allocate requests
+ to succeed. In this case, the TURN client sends a Refresh with a
+ LIFETIME value of zero on the allocation using the IP address
+ family with lower precedence to delete the allocation.
+
+ * For DTLS over UDP, initiate a DTLS handshake to both IP address
+ families as discussed in [RFC8305], and use the first DTLS session
+ that is established. If the DTLS session is established on both
+ IP address families, then the client sends a DTLS close_notify
+ alert to terminate the DTLS session using the IP address family
+ with lower precedence. If the TURN over DTLS server has been
+ configured to require a cookie exchange (Section 4.2 of [RFC6347])
+ and a HelloVerifyRequest is received from the TURN servers on both
+ IP address families, then the client can silently abandon the
+ connection on the IP address family with lower precedence.
+
+4. Discovery of TURN Server
+
+ Methods of TURN server discovery, including using anycast, are
+ described in [RFC8155]. If a host with multiple interfaces discovers
+ a TURN server in each interface, the mechanism described in [RFC7982]
+ can be used by the TURN client to influence the TURN server
+ selection. The syntax of the "turn" and "turns" URIs are defined in
+ Section 3.1 of [RFC7065]. DTLS as a transport protocol for TURN is
+ defined in [RFC7350].
+
+4.1. TURN URI Scheme Semantics
+
+ The "turn" and "turns" URI schemes are used to designate a TURN
+ server (also known as a "relay") on Internet hosts accessible using
+ the TURN protocol. The TURN protocol supports sending messages over
+ UDP, TCP, TLS-over-TCP, or DTLS-over-UDP. The "turns" URI scheme
+ MUST be 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 of the "turn" URI denotes the TURN server host. The <port>
+ part, if present, denotes the port on which the TURN server is
+ awaiting 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 DTLS is 5349.
+
+5. General Behavior
+
+ This section contains general TURN processing rules that apply to all
+ TURN messages.
+
+ TURN is an extension to STUN. All TURN messages, with the exception
+ of the ChannelData message, are STUN-formatted messages. All the
+ base processing rules described in [RFC8489] apply to STUN-formatted
+ messages. This means that all the message-forming and message-
+ processing descriptions in this document are implicitly prefixed with
+ the rules of [RFC8489].
+
+ [RFC8489] specifies an authentication mechanism called the "long-term
+ credential mechanism". TURN servers and clients MUST implement this
+ mechanism, and the authentication options are discussed in
+ Section 7.2.
+
+ Note that the long-term credential mechanism applies only to requests
+ and cannot be used to authenticate indications; thus, indications in
+ TURN are never authenticated. If the server requires requests to be
+ authenticated, then the server's administrator MUST choose a realm
+ value that will uniquely identify the username and password
+ combination that the client must use, even if the client uses
+ multiple servers under different administrations. The server's
+ administrator MAY choose to allocate a unique username to each
+ client, or it MAY choose to allocate the same username to more than
+ one client (for example, to all clients from the same department or
+ company). For each Allocate request, the server SHOULD generate a
+ new random nonce when the allocation is first attempted following the
+ randomness recommendations in [RFC4086] and SHOULD expire the nonce
+ at least once every hour during the lifetime of the allocation. The
+ server uses the mechanism described in Section 9.2 of [RFC8489] to
+ indicate that it supports [RFC8489].
+
+ All requests after the initial Allocate must use the same username as
+ that used to create the allocation to prevent attackers from
+ hijacking the client's allocation.
+
+ Specifically, if:
+
+ * the server requires the use of the long-term credential mechanism,
+ and;
+
+ * a non-Allocate request passes authentication under this mechanism,
+ and;
+
+ * the 5-tuple identifies an existing allocation, but;
+
+ * the request does not use the same username as used to create the
+ allocation,
+
+ then the request MUST be rejected with a 441 (Wrong Credentials)
+ error.
+
+ 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. For all TURN messages (including ChannelData) EXCEPT an
+ Allocate request, if the 5-tuple does not identify an existing
+ allocation, then the message MUST either be rejected with a 437
+ Allocation Mismatch 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 request other than Allocate MUST
+ assume the allocation no longer exists.
+
+ [RFC8489] defines a number of attributes, including the SOFTWARE and
+ FINGERPRINT attributes. The client SHOULD include the SOFTWARE
+ attribute in all Allocate and Refresh requests and MAY include it in
+ any other requests or indications. The server SHOULD include the
+ SOFTWARE attribute in all Allocate and Refresh responses (either
+ success or failure) and MAY include it in other responses or
+ indications. The client and the server MAY include the FINGERPRINT
+ attribute in any STUN-formatted messages defined in this document.
+
+ TURN does not use the backwards-compatibility mechanism described in
+ [RFC8489].
+
+ TURN, as defined in this specification, supports both IPv4 and IPv6.
+ 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
+ REQUESTED-ADDRESS-FAMILY attribute is used to explicitly request the
+ 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 IPv6 are desired, the single ADDITIONAL-ADDRESS-FAMILY
+ attribute 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 the client and reduces the number of messages sent
+ between the client and the TURN server.
+
+ 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 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 procedures, both described in Section 7, can be used
+ to run TURN on a different port.
+
+ To ensure interoperability, a TURN server MUST support the use of UDP
+ transport between the client and the server, and it SHOULD support
+ the use of TCP, TLS-over-TCP, and DTLS-over-UDP transports.
+
+ 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 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 transaction id. STUN requires that the server recognize
+ this case and treat the request as idempotent (see [RFC8489]). Some
+ implementations may choose to meet this requirement by remembering
+ all received requests and the corresponding responses for 40 seconds
+ (Section 6.3.1 of [RFC8489]). Other implementations may choose to
+ reprocess the request and arrange that such reprocessing returns
+ essentially the same response. To aid implementors who choose the
+ latter approach (the so-called "stateless stack approach"), this
+ specification includes some implementation notes on how this might be
+ done. Implementations are free to choose either approach or some
+ other approach that gives the same results.
+
+ To mitigate either intentional or unintentional denial-of-service
+ attacks against the server by clients with valid usernames and
+ passwords, it is RECOMMENDED that the server impose limits on both
+ 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 new allocations that would exceed the limit on the
+ allowed number of allocations active at one time with a 486
+ (Allocation Quota Exceeded) (see Section 7.2), and since UDP does not
+ include a congestion control mechanism, it should discard application
+ data traffic that exceeds the bandwidth quota.
+
+6. Allocations
+
+ All TURN operations revolve around allocations, and all TURN messages
+ are associated with either a single or dual allocation. An
+ allocation conceptually consists of the following state data:
+
+ * the relayed transport address or addresses;
+
+ * the 5-tuple: (client's IP address, client's port, server IP
+ address, server port, and transport protocol);
+
+ * the authentication information;
+
+ * the time-to-expiry for each relayed transport address;
+
+ * a list of permissions for each relayed transport address;
+
+ * a list of channel-to-peer bindings for each relayed transport
+ address.
+
+ The relayed transport address is the transport address allocated by
+ the server for communicating with peers, while the 5-tuple 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
+ server, the 5-tuple uses the client's server-reflexive transport
+ address. The relayed transport address MUST be unique across all
+ allocations so it can be used to uniquely identify the allocation,
+ and an allocation in this context can be either a single or dual
+ allocation.
+
+ The authentication information (e.g., username, password, realm, and
+ nonce) is used to both verify subsequent requests and to compute the
+ message integrity of responses. The username, realm, and nonce
+ values are initially those used in the authenticated Allocate request
+ that creates the allocation, though the server can change the nonce
+ value during the lifetime of the allocation using a 438 (Stale Nonce)
+ reply. For security reasons, the server MUST NOT store the password
+ explicitly and MUST store the key value, which is a cryptographic
+ hash over the username, realm, and password (see Section 16.1.3 of
+ [RFC8489]).
+
+ Note that if the response contains a PASSWORD-ALGORITHMS attribute
+ and this attribute contains both MD5 and SHA-256 algorithms, and the
+ client also supports both the algorithms, the request MUST contain a
+ PASSWORD-ALGORITHM attribute with the SHA-256 algorithm.
+
+ The time-to-expiry is the time in seconds left until the allocation
+ expires. Each Allocate or Refresh transaction sets this timer, which
+ then ticks down towards zero. By default, each Allocate or Refresh
+ transaction resets this timer to the default lifetime value of 600
+ seconds (10 minutes), but the client can request a different value in
+ the Allocate and Refresh request. Allocations can only be refreshed
+ using the Refresh request; sending data to a peer does not refresh an
+ allocation. When an allocation expires, the state data associated
+ with the allocation can be freed.
+
+ The list of permissions is described in Section 9 and the list of
+ channels is described in Section 12.
+
+7. Creating an Allocation
+
+ An allocation on the server is created using an Allocate transaction.
+
+7.1. Sending an Allocate Request
+
+ The client forms an Allocate request as follows.
+
+ The client first picks a host transport address. It is RECOMMENDED
+ that the client pick a currently unused transport address, typically
+ by allowing the underlying OS to pick a currently unused port.
+
+ The client then picks a transport protocol that the client supports
+ to use between the client and the server based on the transport
+ protocols supported by the server. Since this specification only
+ allows UDP between the server and the peers, it is RECOMMENDED that
+ 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 client believes, either through configuration or discovery or by
+ experiment, that it is unable to contact any TURN server using UDP.
+ See Section 3.1 for more discussion.
+
+ The client also picks a server transport address, which SHOULD be
+ done as follows. The client uses one or more procedures described in
+ [RFC8155] to discover a TURN server and uses the TURN server
+ resolution mechanism defined in [RFC5928] and [RFC7350] to get a list
+ of server transport addresses that can be tried to create a TURN
+ allocation.
+
+ The client MUST include a REQUESTED-TRANSPORT attribute in the
+ request. This attribute specifies the transport protocol between the
+ server and the peers (note that this is *not* the transport protocol
+ that appears in the 5-tuple). In this specification, the REQUESTED-
+ TRANSPORT type is always UDP. This attribute is included to allow
+ future extensions to specify other protocols.
+
+ If the client wishes to obtain a relayed transport address of a
+ specific address type, then it includes a REQUESTED-ADDRESS-FAMILY
+ attribute in the request. This attribute indicates the specific
+ address type the client wishes the TURN server to allocate. Clients
+ MUST NOT include more than one REQUESTED-ADDRESS-FAMILY attribute in
+ an Allocate request. Clients MUST NOT include a REQUESTED-ADDRESS-
+ FAMILY attribute in an Allocate request that contains a RESERVATION-
+ TOKEN attribute, for the reason that the server uses the previously
+ reserved transport address corresponding to the included token and
+ the client cannot obtain a relayed transport address of a specific
+ address type.
+
+ If the client wishes to obtain one IPv6 and one IPv4 relayed
+ transport address, then it includes an ADDITIONAL-ADDRESS-FAMILY
+ attribute in the request. This attribute specifies that the server
+ must allocate both address types. The attribute value in the
+ ADDITIONAL-ADDRESS-FAMILY MUST be set to 0x02 (IPv6 address family).
+ Clients MUST NOT include REQUESTED-ADDRESS-FAMILY and ADDITIONAL-
+ ADDRESS-FAMILY attributes in the same request. Clients MUST NOT
+ include the ADDITIONAL-ADDRESS-FAMILY attribute in an Allocate
+ request that contains a RESERVATION-TOKEN attribute. Clients MUST
+ NOT 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 with the R bit set to 1 is allowed with the
+ ADDITIONAL-ADDRESS-FAMILY attribute, two tokens will have to be
+ returned in the success response and changes will be required to the
+ way the RESERVATION-TOKEN attribute is handled.
+
+ If the client wishes the server to initialize the time-to-expiry
+ field of the allocation to some value other than the default
+ lifetime, then it MAY include a LIFETIME attribute specifying its
+ desired value. 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 field to less than the default value.
+
+ If the client wishes to later use the DONT-FRAGMENT attribute in one
+ or more Send indications on this allocation, then the client SHOULD
+ include the DONT-FRAGMENT attribute in the Allocate request. This
+ allows the client to test whether this attribute is supported by the
+ server.
+
+ If the client requires the port number of the relayed transport
+ 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
+ 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
+ same IP address) for a subsequent allocation. If the R bit is 0, no
+ such request is made.
+
+ The client MAY also include a RESERVATION-TOKEN attribute in the
+ request to ask the server to use a previously reserved port for the
+ allocation. If the RESERVATION-TOKEN attribute is included, then the
+ client MUST omit the EVEN-PORT attribute.
+
+ Once constructed, the client sends the Allocate request on the
+ 5-tuple.
+
+7.2. Receiving an Allocate Request
+
+ When the server receives an Allocate request, it performs the
+ following checks:
+
+ 1. The TURN server provided by the local or access network MAY
+ allow an unauthenticated request in order to accept Allocation
+ requests from new and/or guest users in the network who do not
+ necessarily possess long-term credentials for STUN
+ authentication. The security implications of STUN and making
+ STUN authentication optional are discussed in [RFC8155].
+ Otherwise, the server MUST require that the request be
+ authenticated. If the request is authenticated, the
+ authentication MUST be done either using the long-term
+ credential mechanism of [RFC8489] or using the STUN Extension
+ for Third-Party Authorization [RFC7635] unless the client and
+ server agree to use another mechanism through some procedure
+ outside the scope of this document.
+
+ 2. The server checks if the 5-tuple is currently in use by an
+ existing allocation. If yes, the server rejects the request
+ with a 437 (Allocation Mismatch) error.
+
+ 3. The server checks if the request contains a REQUESTED-TRANSPORT
+ attribute. If the REQUESTED-TRANSPORT attribute is not included
+ or is malformed, the server rejects the request with a 400 (Bad
+ Request) error. Otherwise, if the attribute is included but
+ specifies a protocol that is not supported by the server, the
+ server rejects the request with a 442 (Unsupported Transport
+ Protocol) error.
+
+ 4. The request may contain a DONT-FRAGMENT attribute. If it does,
+ but the server does not support sending UDP datagrams with the
+ DF bit set to 1 (see Sections 14 and 15), then the server treats
+ the DONT-FRAGMENT attribute in the Allocate request as an
+ unknown comprehension-required attribute.
+
+ 5. The server checks if the request contains a RESERVATION-TOKEN
+ attribute. If yes, and the request also contains an EVEN-PORT
+ or REQUESTED-ADDRESS-FAMILY or ADDITIONAL-ADDRESS-FAMILY
+ attribute, 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 is in range and has not expired, and the
+ corresponding relayed transport address is still available). If
+ the token is not valid for some reason, the server rejects the
+ request with a 508 (Insufficient Capacity) error.
+
+ 6. The server checks if the request contains both REQUESTED-
+ ADDRESS-FAMILY and ADDITIONAL-ADDRESS-FAMILY attributes. If
+ yes, then the server rejects the request with a 400 (Bad
+ Request) error.
+
+ 7. If the server does not support the address family requested by
+ the client in REQUESTED-ADDRESS-FAMILY, or if the allocation of
+ the requested address family is disabled by local policy, it
+ MUST generate an Allocate error response, and it MUST include an
+ ERROR-CODE attribute with the 440 (Address Family not Supported)
+ response code. If the REQUESTED-ADDRESS-FAMILY attribute is
+ absent and the server does not support the IPv4 address family,
+ the server MUST include an ERROR-CODE attribute with the 440
+ (Address Family not Supported) response code. If the REQUESTED-
+ ADDRESS-FAMILY attribute is absent and the server supports the
+ IPv4 address family, the server MUST allocate an IPv4 relayed
+ transport address for the TURN client.
+
+ 8. The server checks if the request contains an EVEN-PORT attribute
+ with the R bit set to 1. If yes, and the request also contains
+ an ADDITIONAL-ADDRESS-FAMILY attribute, the server rejects the
+ request with a 400 (Bad Request) error. Otherwise, the server
+ checks if it can satisfy the request (i.e., can allocate a
+ relayed transport address as described below). If the server
+ cannot satisfy the request, then the server rejects the request
+ with a 508 (Insufficient Capacity) error.
+
+ 9. The server checks if the request contains an ADDITIONAL-ADDRESS-
+ FAMILY attribute. If yes, and the attribute value is 0x01 (IPv4
+ address family), then the server rejects the request with a 400
+ (Bad Request) error. Otherwise, the server checks if it can
+ allocate relayed transport addresses of both address types. If
+ the server cannot satisfy the request, then the server rejects
+ the request with a 508 (Insufficient Capacity) error. If the
+ server can partially meet the request, i.e., if it can only
+ allocate one relayed transport address of a specific address
+ type, then it includes ADDRESS-ERROR-CODE attribute in the
+ success response to inform the client the reason for partial
+ failure of the request. The error code value signaled in the
+ ADDRESS-ERROR-CODE attribute could be 440 (Address Family not
+ Supported) or 508 (Insufficient Capacity). If the server can
+ fully meet the request, then the server allocates one IPv4 and
+ one IPv6 relay address and returns an Allocate success response
+ containing the relayed transport addresses assigned to the dual
+ allocation in two XOR-RELAYED-ADDRESS attributes.
+
+ 10. At any point, the server MAY choose to reject the request with a
+ 486 (Allocation Quota Reached) error if it feels the client is
+ trying to exceed some locally defined allocation quota. The
+ server is free to define this allocation quota any way it
+ wishes, but it SHOULD define it based on the username used to
+ authenticate the request and not on the client's transport
+ address.
+
+ 11. Also, at any point, the server MAY choose to reject the request
+ with a 300 (Try Alternate) error if it wishes to redirect the
+ client to a different server. The use of this error code and
+ attribute follows the specification in [RFC8489].
+
+ 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
+ list of permissions and the list of channels are initially empty.
+
+ The server chooses a relayed transport address for the allocation as
+ follows:
+
+ * If the request contains a RESERVATION-TOKEN attribute, the server
+ uses the previously reserved transport address corresponding to
+ the included token (if it is still available). Note that the
+ reservation is a server-wide reservation and is not specific to a
+ particular allocation since the Allocate request containing the
+ RESERVATION-TOKEN uses a different 5-tuple than the Allocate
+ request that made the reservation. The 5-tuple for the Allocate
+ request containing the RESERVATION-TOKEN attribute can be any
+ allowed 5-tuple; it can use a different client IP address and
+ port, a different transport protocol, and even a different server
+ IP address and port (provided, of course, that the server IP
+ address and port are ones on which the server is listening for
+ TURN requests).
+
+ * If the request contains an EVEN-PORT attribute with the R bit set
+ to 0, then the server allocates a relayed transport address with
+ an even port number.
+
+ * 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 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
+ 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
+ choose to hold longer (e.g., until the allocation with port N
+ expires). The server then includes the token in a RESERVATION-
+ TOKEN attribute in the success response.
+
+ * Otherwise, the server allocates any available relayed transport
+ address.
+
+ In all cases, the server SHOULD only allocate ports from the range
+ 49152 - 65535 (the Dynamic and/or Private Port range [PORT-NUMBERS]),
+ unless the TURN server application knows, through some means not
+ specified here, that other applications running on the same host as
+ the TURN server application will not be impacted by allocating ports
+ outside this range. This condition can often be satisfied by running
+ the TURN server application on a dedicated machine and/or by
+ arranging that any other applications on the machine allocate ports
+ before the TURN server application starts. In any case, the TURN
+ server SHOULD NOT allocate ports in the range 0 - 1023 (the Well-
+ Known Port range) to discourage clients from using TURN to run
+ standard services.
+
+ | NOTE: The use of randomized port assignments to avoid certain
+ | types of attacks is described in [RFC6056]. It is RECOMMENDED
+ | that a TURN server implement a randomized port assignment
+ | algorithm from [RFC6056]. This is especially applicable to
+ | servers that choose to pre-allocate a number of ports from the
+ | underlying OS and then later assign them to allocations; for
+ | example, a server may choose this technique to implement the
+ | EVEN-PORT attribute.
+
+ The server determines the initial value of the time-to-expiry field
+ as follows. If the request contains a LIFETIME attribute, then the
+ server computes the minimum of the client's proposed lifetime and the
+ server's maximum allowed lifetime. If this computed value is greater
+ than the default lifetime, then the server uses the computed lifetime
+ as the initial value of the time-to-expiry field. Otherwise, the
+ server uses the default lifetime. It is RECOMMENDED that the server
+ use a maximum allowed lifetime value of no more than 3600 seconds (1
+ hour). Servers that implement allocation quotas or charge users for
+ allocations in some way may wish to use a smaller maximum allowed
+ lifetime (perhaps as small as the default lifetime) to more quickly
+ remove orphaned allocations (that is, allocations where the
+ corresponding client has crashed or terminated, or the client
+ connection has been lost for some reason). Also, note that the time-
+ to-expiry is recomputed with each successful Refresh request, and
+ thus, the value computed here applies only until the first refresh.
+
+ Once the allocation is created, the server replies with a success
+ response. The success response contains:
+
+ * An XOR-RELAYED-ADDRESS attribute containing the relayed transport
+ address or two XOR-RELAYED-ADDRESS attributes containing the
+ relayed transport addresses.
+
+ * A LIFETIME attribute containing the current value of the time-to-
+ expiry timer.
+
+ * A RESERVATION-TOKEN attribute (if a second relayed transport
+ address was reserved).
+
+ * An XOR-MAPPED-ADDRESS attribute containing the client's IP address
+ and port (from the 5-tuple).
+
+ | NOTE: The XOR-MAPPED-ADDRESS attribute is included in the
+ | response as a convenience to the client. TURN itself does not
+ | make use of this value, but clients running ICE can often need
+ | this value and can thus avoid having to do an extra Binding
+ | transaction with some STUN server to learn it.
+
+ The response (either success or error) is sent back to the client on
+ the 5-tuple.
+
+ | NOTE: When the Allocate request is sent over UDP, [RFC8489]
+ | requires that the server handle the possible retransmissions of
+ | the request so that retransmissions do not cause multiple
+ | allocations to be created. Implementations may achieve this
+ | using the so-called "stateless stack approach" as follows. To
+ | detect retransmissions when the original request was successful
+ | in creating an allocation, the server can store the transaction
+ | id that created the request with the allocation data and
+ | compare it with incoming Allocate requests on the same 5-tuple.
+ | Once such a request is detected, the server can stop parsing
+ | the request and immediately generate a success response. When
+ | building this response, the value of the LIFETIME attribute can
+ | be taken from the time-to-expiry field in the allocate state
+ | data, even though this value may differ slightly from the
+ | LIFETIME value originally returned. In addition, the server
+ | may need to store an indication of any reservation token
+ | returned in the original response so that this may be returned
+ | in any retransmitted responses.
+ |
+ | For the case where the original request was unsuccessful in
+ | creating an allocation, the server may choose to do nothing
+ | special. Note, however, that there is a rare case where the
+ | server rejects the original request but accepts the
+ | retransmitted request (because conditions have changed in the
+ | brief intervening time period). If the client receives the
+ | first failure response, it will ignore the second (success)
+ | response and believe that an allocation was not created. 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 a different
+ | transaction id, it will receive a 437 (Allocation Mismatch)
+ | error response, which will cause it to retry with a different
+ | 5-tuple. The server may use a smaller maximum lifetime value
+ | to minimize the lifetime of allocations "orphaned" in this
+ | manner.
+
+7.3. Receiving an Allocate Success Response
+
+ If the client receives an Allocate success response, then it MUST
+ check that the mapped address and the relayed transport address or
+ addresses are part of an address family or families that the client
+ understands and is prepared to handle. If these addresses are not
+ part of an address family or families that the client is prepared to
+ handle, then the client MUST delete the allocation (Section 8) and
+ MUST NOT attempt to create another allocation on that server until it
+ believes the mismatch has been fixed.
+
+ Otherwise, the client creates its own copy of the allocation data
+ structure to track what is happening on the server. In particular,
+ 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 client must also remember the 5-tuple used for the request and
+ the username and password it used to authenticate the request to
+ ensure that it reuses them for subsequent messages. The client also
+ needs to track the channels and permissions it establishes on the
+ server.
+
+ If the client receives an Allocate success response but with an
+ ADDRESS-ERROR-CODE attribute in the response and the error code value
+ signaled in the ADDRESS-ERROR-CODE attribute is 440 (Address Family
+ not Supported), the client MUST NOT retry its request for the
+ rejected address type. If the client receives an ADDRESS-ERROR-CODE
+ attribute in the response and the error code value signaled in the
+ ADDRESS-ERROR-CODE attribute is 508 (Insufficient Capacity), the
+ client SHOULD wait at least 1 minute before trying to request any
+ more allocations on this server for the rejected address type.
+
+ The client will probably wish to send the relayed transport address
+ to peers (using some method not specified here) so the peers can
+ communicate with it. The client may also wish to use the server-
+ reflexive address it receives in the XOR-MAPPED-ADDRESS attribute in
+ its ICE processing.
+
+7.4. Receiving an Allocate Error Response
+
+ If the client receives an Allocate error response, then the
+ processing depends on the actual error code returned:
+
+ 408 (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).
+
+ 300 (Try Alternate):
+ The server would like the client to use the server specified in
+ the ALTERNATE-SERVER attribute instead. The client considers the
+ current transaction as having failed, but it SHOULD try the
+ Allocate request with the alternate server before trying any other
+ servers (e.g., other servers discovered using the DNS resolution
+ procedures). When trying the Allocate request with the alternate
+ server, the client follows the ALTERNATE-SERVER procedures
+ specified in [RFC8489].
+
+ 400 (Bad Request):
+ The server believes the client's request is malformed for some
+ reason. The client considers the current transaction as having
+ failed. The client MAY notify the user or operator and SHOULD NOT
+ retry the request with this server until it believes the problem
+ has been fixed.
+
+ 401 (Unauthorized):
+ If the client has followed the procedures of the long-term
+ credential mechanism and still gets this error, then the server is
+ not accepting the client's credentials. In this case, the client
+ considers the current transaction as having failed and SHOULD
+ notify the user or operator. The client SHOULD NOT send any
+ further requests to this server until it believes the problem has
+ been fixed.
+
+ 403 (Forbidden):
+ The request is valid, but the server is refusing to perform it,
+ likely due to administrative restrictions. The client considers
+ the current transaction as having failed. The client MAY notify
+ the user or operator and SHOULD NOT retry the same request with
+ this server until it believes the problem has been fixed.
+
+ 420 (Unknown Attribute):
+ If the client included a DONT-FRAGMENT attribute in the request
+ and the server rejected the request with a 420 error code and
+ listed the DONT-FRAGMENT attribute in the UNKNOWN-ATTRIBUTES
+ attribute in the error response, then the client now knows that
+ the server does not support the DONT-FRAGMENT attribute. The
+ client considers the current transaction as having failed but MAY
+ choose to retry the Allocate request without the DONT-FRAGMENT
+ attribute.
+
+ 437 (Allocation Mismatch):
+ This indicates that the client has 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 transport address that was used
+ by another client that recently crashed. The client considers the
+ current transaction as having failed. The client SHOULD pick
+ another client transport address and retry the Allocate request
+ (using a different transaction id). The client SHOULD try three
+ different client transport addresses 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 for 2 minutes.
+
+ 438 (Stale Nonce):
+ See the procedures for the long-term credential mechanism
+ [RFC8489].
+
+ 440 (Address Family not Supported):
+ The server does not support the address family requested by the
+ client. If the client receives an Allocate error response with
+ the 440 (Address Family not Supported) error code, the client MUST
+ NOT retry the request.
+
+ 441 (Wrong Credentials):
+ The client should not receive this error in response to an
+ Allocate request. The client MAY notify the user or operator and
+ SHOULD NOT retry the same request with this server until it
+ believes the problem has been fixed.
+
+ 442 (Unsupported Transport Address):
+ The client should not receive this error in response to a request
+ for a UDP allocation. The client MAY notify the user or operator
+ and SHOULD NOT reattempt the request with this server until it
+ believes the problem has been fixed.
+
+ 486 (Allocation Quota Reached):
+ The server is currently unable to create any more allocations with
+ this username. The client considers the current transaction as
+ having failed. The client SHOULD wait at least 1 minute before
+ trying to create any more allocations on the server.
+
+ 508 (Insufficient Capacity):
+ 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 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.
+
+ Note that the error code values 486 and 508 indicate to a
+ eavesdropper that several other users are using the server at this
+ 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.
+
+ An unknown error response MUST be handled as described in [RFC8489].
+
+8. Refreshing an Allocation
+
+ 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.
+
+ If a client wishes to continue using an allocation, then the client
+ MUST refresh it before it expires. It is suggested that the 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 the allocation. A client MAY refresh an allocation
+ at any time for other reasons.
+
+8.1. Sending a Refresh Request
+
+ If the client wishes to immediately delete an existing allocation, it
+ includes a LIFETIME attribute with a value of zero. All other forms
+ of the request refresh the allocation.
+
+ When refreshing a dual allocation, the client includes a REQUESTED-
+ ADDRESS-FAMILY attribute indicating the address family type that
+ should be refreshed. If no REQUESTED-ADDRESS-FAMILY attribute is
+ included, then the request should be treated as applying to all
+ current allocations. The client MUST only include a family type it
+ previously allocated and has not yet deleted. This process can also
+ be used to delete an allocation of a specific address type by setting
+ the lifetime of that Refresh request to zero. Deleting a single
+ allocation destroys any permissions or channels associated with that
+ particular allocation; it MUST NOT affect any permissions or channels
+ associated with allocations for the other address family.
+
+ The Refresh transaction updates the time-to-expiry timer of an
+ allocation. If the client wishes the server to set the time-to-
+ expiry timer to something other than the default lifetime, it
+ includes a 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 transaction, with the exception that a requested
+ lifetime of zero causes the server to immediately delete the
+ allocation.
+
+8.2. Receiving a Refresh Request
+
+ When the server receives a Refresh request, it processes the request
+ as per Section 5 plus the specific rules mentioned here.
+
+ If the server receives a Refresh Request with a REQUESTED-ADDRESS-
+ FAMILY attribute and the attribute value does not match the address
+ family of the allocation, the server MUST reply with a 443 (Peer
+ Address Family Mismatch) Refresh error response.
+
+ The server computes a value called the "desired lifetime" as follows:
+ if the request contains a LIFETIME attribute and the attribute value
+ is zero, then the "desired lifetime" is zero. Otherwise, if the
+ request contains a LIFETIME attribute, then the server computes the
+ minimum of the client's requested lifetime and the server's maximum
+ allowed lifetime. If this computed value is greater than the default
+ lifetime, then the "desired lifetime" is the computed value.
+ Otherwise, the "desired lifetime" is the default lifetime.
+
+ Subsequent processing depends on the "desired lifetime" value:
+
+ * If the "desired lifetime" is zero, then the request succeeds and
+ the allocation is deleted.
+
+ * If the "desired lifetime" is non-zero, then the request succeeds
+ and the allocation's time-to-expiry is set to the "desired
+ lifetime".
+
+ If the request succeeds, then the server sends a success response
+ containing:
+
+ * A LIFETIME attribute containing the current value of the time-to-
+ expiry timer.
+
+ | NOTE: A server need not do anything special to implement
+ | idempotency of Refresh requests over UDP using the "stateless
+ | stack approach". Retransmitted Refresh requests with a non-
+ | zero "desired lifetime" will simply refresh the allocation. A
+ | retransmitted Refresh request with a zero "desired lifetime"
+ | will cause a 437 (Allocation Mismatch) response if the
+ | allocation has already been deleted, but the client will treat
+ | this as equivalent to a success response (see below).
+
+8.3. Receiving a Refresh Response
+
+ If the client receives a success response to its Refresh request 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 the client receives a 437 (Allocation Mismatch) error response to
+ its request to refresh the allocation, it should consider the
+ allocation no longer exists. If the client receives a 438 (Stale
+ Nonce) error to its request to refresh the allocation, it should
+ reattempt the request with the new nonce value.
+
+ If the client receives a 437 (Allocation Mismatch) error response to
+ a request to delete the allocation, then the allocation no longer
+ exists and it should consider its request as having effectively
+ succeeded.
+
+9. Permissions
+
+ For each allocation, the server keeps a list of zero or more
+ permissions. Each permission consists of an IP address and an
+ associated 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 time-to-expiry is the number of seconds until the
+ permission expires. Within the context of an allocation, a
+ permission is uniquely identified by its associated IP address.
+
+ By sending either CreatePermission requests or ChannelBind requests,
+ 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:
+
+ * 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
+ Permission Lifetime.
+
+ * If a permission for that IP address already exists, then the time-
+ to-expiry for that permission is reset to Permission Lifetime.
+
+ The Permission Lifetime MUST be 300 seconds (= 5 minutes).
+
+ Each permission's time-to-expiry decreases down once per second until
+ it reaches zero, at which point, the permission expires and is
+ deleted.
+
+ CreatePermission and ChannelBind requests may be freely intermixed on
+ a permission. A given permission may be initially installed and/or
+ refreshed with a CreatePermission request and then later refreshed
+ with a ChannelBind request, or vice versa.
+
+ When a UDP datagram arrives at the relayed transport address for the
+ allocation, the server extracts the source IP address from the IP
+ header. The server then compares this address with the IP address
+ associated with each permission in the list of permissions for the
+ allocation. Note that only addresses are compared and port numbers
+ are 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, the permission check is considered to have succeeded and
+ the server continues to process the UDP datagram as specified
+ elsewhere (Section 11.3).
+
+ The permissions for one allocation are totally unrelated to the
+ permissions for a different allocation. If an allocation expires,
+ all its permissions expire with it.
+
+ | NOTE: Though TURN permissions expire after 5 minutes, many NATs
+ | deployed at the time of publication expire their UDP bindings
+ | considerably faster. Thus, an application using TURN will
+ | probably wish to send some sort of keep-alive traffic at a much
+ | faster rate. Applications using ICE should follow the keep-
+ | alive guidelines of ICE [RFC8445], and applications not using
+ | ICE are advised to do something similar.
+
+10. CreatePermission
+
+ TURN supports two ways for the client to install or refresh
+ permissions on the server. This section describes one way: the
+ CreatePermission request.
+
+ A CreatePermission request may be used in conjunction with either the
+ Send mechanism in Section 11 or the Channel mechanism in Section 12.
+
+10.1. Forming a CreatePermission Request
+
+ The client who wishes to install or refresh one or more permissions
+ can send a CreatePermission request to the server.
+
+ When forming a CreatePermission request, the client MUST include at
+ least one XOR-PEER-ADDRESS attribute and MAY include more than one
+ such attribute. The IP address portion of each XOR-PEER-ADDRESS
+ attribute contains the IP address for which a permission should be
+ installed or refreshed. The port portion of each XOR-PEER-ADDRESS
+ attribute will be ignored and can be any arbitrary value. The
+ various XOR-PEER-ADDRESS attributes MAY appear in any order. The
+ client MUST only include XOR-PEER-ADDRESS attributes with addresses
+ of the same address family as that of the relayed transport address
+ for the allocation. For dual allocations obtained using the
+ ADDITIONAL-ADDRESS-FAMILY attribute, the client MAY include XOR-PEER-
+ ADDRESS attributes with addresses of IPv4 and IPv6 address families.
+
+10.2. Receiving a CreatePermission Request
+
+ When the server receives the CreatePermission request, it processes
+ as per Section 5 plus the specific rules mentioned here.
+
+ The message is checked for validity. The CreatePermission request
+ MUST contain at least one XOR-PEER-ADDRESS attribute and MAY contain
+ multiple such attributes. If no such attribute exists, or if any of
+ these attributes are invalid, then a 400 (Bad Request) error is
+ 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
+ (Insufficient Capacity) error is returned.
+
+ 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 the allocation, the server MUST generate an error response with
+ the 443 (Peer Address Family Mismatch) response code.
+
+ The server MAY impose restrictions on the IP address allowed in the
+ XOR-PEER-ADDRESS attribute; if a value is not allowed, the server
+ rejects the request with a 403 (Forbidden) error.
+
+ 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
+ IP address contained in each XOR-PEER-ADDRESS attribute as described
+ in Section 9. The port portion of each attribute is ignored and may
+ be any arbitrary value.
+
+ The server then responds with a CreatePermission success response.
+ There are no mandatory attributes in the success response.
+
+ | NOTE: A server need not do anything special to implement
+ | idempotency of CreatePermission requests over UDP using the
+ | "stateless stack approach". Retransmitted CreatePermission
+ | requests will simply refresh the permissions.
+
+10.3. Receiving a CreatePermission Response
+
+ If the client receives a valid CreatePermission success response,
+ then the client updates its data structures to indicate that the
+ permissions have been installed or refreshed.
+
+11. Send and Data Methods
+
+ TURN supports two mechanisms for sending and receiving data from
+ peers. This section describes the use of the Send and Data
+ mechanisms, while Section 12 describes the use of the Channel
+ mechanism.
+
+11.1. Forming a Send Indication
+
+ 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
+ channel is bound to that peer. However, the client MUST ensure that
+ 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
+ from using a TURN server to send data to arbitrary destinations.
+
+ When forming a Send indication, the client MUST include an XOR-PEER-
+ ADDRESS attribute and a DATA attribute. The XOR-PEER-ADDRESS
+ attribute contains the transport address of the peer to which the
+ data is to be sent, and the DATA attribute contains the actual
+ application data to be sent to the peer.
+
+ The client MAY include a DONT-FRAGMENT attribute in the Send
+ indication if it wishes the server to set the DF bit on the UDP
+ datagram sent to the peer.
+
+11.2. Receiving a Send Indication
+
+ When the server receives a Send indication, it processes as per
+ Section 5 plus the specific rules mentioned here.
+
+ The message is first checked for validity. The Send indication MUST
+ contain both an XOR-PEER-ADDRESS attribute and a DATA attribute. If
+ one of these attributes is missing or invalid, then the message is
+ discarded. Note that the DATA attribute is allowed to contain zero
+ bytes of data.
+
+ The Send indication may also contain the DONT-FRAGMENT attribute. 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 DONT-
+ FRAGMENT attribute is an unknown comprehension-required attribute
+ (and thus the Send indication is discarded).
+
+ The server also checks that there is a permission installed for the
+ IP address contained in the XOR-PEER-ADDRESS attribute. If no such
+ permission exists, the message is discarded. Note that a Send
+ indication never causes the server to refresh the permission.
+
+ The server MAY impose restrictions on the IP address and port values
+ allowed in the XOR-PEER-ADDRESS attribute; if a value is not allowed,
+ the server silently discards the Send indication.
+
+ If everything is OK, then the server forms a UDP datagram as follows:
+
+ * the source transport address is the relayed transport address of
+ the allocation, where the allocation is determined by the 5-tuple
+ on which the Send indication arrived;
+
+ * the destination transport address is taken from the XOR-PEER-
+ ADDRESS attribute;
+
+ * the data following the UDP header is the contents of the value
+ field of the DATA attribute.
+
+ The handling of the DONT-FRAGMENT attribute (if present), is
+ described in Sections 14 and 15.
+
+ The resulting UDP datagram is then sent to the peer.
+
+11.3. Receiving a UDP Datagram
+
+ When the server receives a UDP datagram at a currently allocated
+ relayed transport address, the server looks up the allocation
+ associated with the relayed transport address. The server then
+ checks to see whether the set of permissions for the allocation allow
+ the relaying of the UDP datagram as described in Section 9.
+
+ If relaying is permitted, then the server checks if there is a
+ channel bound to the peer that sent the UDP datagram (see
+ Section 12). If a channel is bound, then processing proceeds as
+ described in Section 12.7.
+
+ 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 contain both an XOR-PEER-ADDRESS and a DATA attribute. The DATA
+ attribute is set to the value of the "data octets" field from the
+ datagram, and the XOR-PEER-ADDRESS attribute is set to the source
+ transport address of the received UDP datagram. The Data indication
+ is then sent on the 5-tuple associated with the allocation.
+
+11.4. Receiving a Data Indication
+
+ When the client receives a Data indication, it checks that the Data
+ indication contains an XOR-PEER-ADDRESS attribute and discards the
+ indication if it does not. The client SHOULD also check that the
+ XOR-PEER-ADDRESS attribute value contains an IP address with which
+ the client believes there is an active permission and discard the
+ Data indication otherwise.
+
+ | NOTE: The latter check protects the client against an attacker
+ | who somehow manages to trick the server into installing
+ | permissions not desired by the client.
+
+ If the XOR-PEER-ADDRESS is present and valid, the client checks 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 is allowed to contain zero bytes of data. Processing
+ of Data indications with an ICMP attribute is described in
+ Section 11.6.
+
+ If the Data indication passes the above checks, the client delivers
+ the data octets inside the DATA attribute to the application, along
+ with an indication that they were received from the peer whose
+ transport address is given by the XOR-PEER-ADDRESS attribute.
+
+11.5. Receiving an ICMP Packet
+
+ When the server receives an ICMP packet, the server verifies that the
+ type is either 3 or 11 for an ICMPv4 [RFC0792] packet or either 1, 2,
+ or 3 for an ICMPv6 [RFC4443] packet. It also verifies that the IP
+ 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 UDP header is present, the server extracts the source and
+ destination IP address and UDP port information.
+
+ The server looks up the allocation whose relayed transport address
+ corresponds to the encapsulated packet's source IP address and UDP
+ port. If no such allocation exists, the packet is silently dropped.
+ The server then checks to see whether the set of permissions for the
+ allocation allows the relaying of the ICMP packet. For ICMP packets,
+ the source IP address MUST NOT be checked against the permissions
+ list as it would be for UDP packets. Instead, the server extracts
+ the destination IP address from the encapsulated IP header. The
+ server then compares this address with the IP address associated with
+ each permission in the list of permissions for the allocation. If no
+ match is found, relaying is not permitted and the server silently
+ discards the ICMP packet. Note that only addresses are compared and
+ port numbers are not considered.
+
+ If relaying is permitted, then the server forms and sends a Data
+ indication. The Data indication MUST contain both an XOR-PEER-
+ ADDRESS 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 XOR-PEER-ADDRESS attribute is set to the
+ destination IP address in the encapsulated IP header. At the time of
+ writing of this specification, Socket APIs on some operating systems
+ do not deliver the destination port in the encapsulated UDP header to
+ applications without superuser privileges. If destination port in
+ the encapsulated UDP header is 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 set to zero. The Data
+ indication is then sent on the 5-tuple associated with the
+ allocation.
+
+ | Implementation Note: New ICMP types or codes can be defined in
+ | 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 ICMP error notification and generate feedback
+ | to the application layer, the server sends the Data indication
+ | with an ICMP attribute conveying the new ICMP type or code.
+
+11.6. Receiving a Data Indication with an ICMP Attribute
+
+ When the client receives a Data indication with an ICMP attribute, it
+ checks that the Data indication contains an XOR-PEER-ADDRESS
+ attribute and discards the indication if it does not. The client
+ SHOULD also check that the XOR-PEER-ADDRESS attribute value contains
+ an IP address with an active permission and discard the Data
+ indication otherwise.
+
+ If the Data indication passes the above checks, the client signals
+ the application of the error condition along with an indication that
+ it was received from the peer whose transport address is given by 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 family field in the XOR-PEER-ADDRESS attribute.
+
+12. Channels
+
+ Channels provide a way for the client and server to send application
+ data using ChannelData messages, which have less overhead than Send
+ and Data indications.
+
+ The ChannelData message (see Section 12.4) starts with a two-byte
+ field that carries the channel number. The values of this field are
+ allocated as follows:
+
+ +------------------------+--------------------------------------+
+ | 0x0000 through 0x3FFF: | These values can never be used for |
+ | | channel numbers. |
+ +------------------------+--------------------------------------+
+ | 0x4000 through 0x4FFF: | These values are the allowed channel |
+ | | numbers (4096 possible values). |
+ +------------------------+--------------------------------------+
+ | 0x5000 through 0xFFFF: | Reserved (For DTLS-SRTP multiplexing |
+ | | collision avoidance, see [RFC7983]). |
+ +------------------------+--------------------------------------+
+
+ Table 2
+
+ Note that the channel number range is not backwards compatible with
+ [RFC5766], which could prevent a client compliant with RFC 5766 from
+ establishing channel bindings with a TURN server that complies with
+ this specification.
+
+ According to [RFC7983], ChannelData messages can be distinguished
+ from other multiplexed protocols by examining the first byte of the
+ message:
+
+ +------------+------------------------------------------------------+
+ | [0..3] | STUN |
+ +------------+------------------------------------------------------+
+ | [16..19] | ZRTP |
+ +------------+------------------------------------------------------+
+ | [20..63] | DTLS |
+ +------------+------------------------------------------------------+
+ | [64..79] | TURN Channel |
+ +------------+------------------------------------------------------+
+ | [128..191] | RTP/RTCP |
+ +------------+------------------------------------------------------+
+ | Others | Reserved; MUST be dropped |
+ | | and an alert MAY be logged |
+ +------------+------------------------------------------------------+
+
+ Table 3
+
+ Reserved values may be used in the future by other protocols. When
+ the client uses channel binding, it MUST comply with the
+ demultiplexing scheme discussed above.
+
+ 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
+ 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 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 channels to other peers.
+
+ 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
+ allocation has no impact on their use in a different allocation. If
+ an allocation expires, all its channel bindings expire with it.
+
+ A channel binding consists of:
+
+ * a channel number;
+
+ * a transport address (of the peer); and
+
+ * A time-to-expiry timer.
+
+ Within the context of an allocation, a channel binding is uniquely
+ identified either by the channel number or by the peer's transport
+ address. Thus, the same channel cannot be bound to two different
+ transport addresses, nor can the same transport address be bound to
+ two different channels.
+
+ A channel binding lasts for 10 minutes unless refreshed. Refreshing
+ 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 minutes.
+
+ When the channel binding expires, the channel becomes unbound. Once
+ unbound, the channel number can be bound to a different transport
+ address, and the transport address can be bound to a different
+ channel number. To prevent race conditions, the client MUST wait 5
+ minutes after the channel binding expires before attempting to bind
+ the channel number to a different transport address or the transport
+ address to a different channel number.
+
+ When binding a channel to a peer, the client SHOULD be prepared to
+ 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 client to receive ChannelData messages from the server before it
+ receives a ChannelBind success response.
+
+ In the other direction, the client MAY elect to send ChannelData
+ messages before receiving the ChannelBind success response. Doing
+ so, however, runs the risk of having the ChannelData messages dropped
+ by the 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 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 is confirmed.
+
+12.1. Sending a ChannelBind Request
+
+ A channel binding is created or refreshed using a ChannelBind
+ transaction. A ChannelBind transaction also creates or refreshes a
+ permission towards the peer (see Section 9).
+
+ To initiate the ChannelBind transaction, the client forms a
+ ChannelBind request. The channel to be bound is specified in a
+ CHANNEL-NUMBER attribute, and the peer's transport address is
+ specified in an XOR-PEER-ADDRESS attribute. Section 12.2 describes
+ the restrictions on these attributes. The client MUST only include
+ an XOR-PEER-ADDRESS attribute with an address of the same address
+ family as that of a relayed transport address for the allocation.
+
+ Rebinding a channel to the same transport address that it is already
+ bound to provides a way to refresh a channel binding and the
+ corresponding permission without sending data to the peer. Note,
+ however, that permissions need to be refreshed more frequently than
+ channels.
+
+12.2. Receiving a ChannelBind Request
+
+ When the server receives a ChannelBind request, it processes as per
+ Section 5 plus the specific rules mentioned here.
+
+ The server checks the following:
+
+ * The request contains both a CHANNEL-NUMBER and an XOR-PEER-ADDRESS
+ attribute;
+
+ * The channel number is in the range 0x4000 through 0x4FFF
+ (inclusive);
+
+ * The channel number is not currently bound to a different transport
+ address (same transport address is OK);
+
+ * The transport address is not currently bound to a different
+ channel number.
+
+ If any of these tests fail, the server replies with a 400 (Bad
+ 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 transport address for the allocation, the server MUST
+ generate an error response with the 443 (Peer Address Family
+ Mismatch) response code.
+
+ The server MAY impose restrictions on the IP address and port values
+ allowed in the XOR-PEER-ADDRESS attribute; if a value is not allowed,
+ the server rejects the request with a 403 (Forbidden) error.
+
+ 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 a 508 (Insufficient Capacity) error.
+
+ Otherwise, the server replies with a ChannelBind success response.
+ There are no required attributes in a successful ChannelBind
+ response.
+
+ If the server can satisfy the request, then the server creates or
+ refreshes the channel binding using the channel number in the
+ CHANNEL-NUMBER attribute and the transport address in the XOR-PEER-
+ ADDRESS attribute. The server also installs or refreshes a
+ permission for the IP address in the XOR-PEER-ADDRESS attribute as
+ described in Section 9.
+
+ | NOTE: A server need not do anything special to implement
+ | idempotency of ChannelBind requests over UDP using the
+ | "stateless stack approach". Retransmitted ChannelBind requests
+ | will simply refresh the channel binding and the corresponding
+ | permission. Furthermore, the client must wait 5 minutes before
+ | binding a previously bound channel number or peer address to a
+ | different channel, eliminating the possibility that the
+ | transaction would initially fail but succeed on a
+ | retransmission.
+
+12.3. Receiving a ChannelBind Response
+
+ When the client receives a ChannelBind success response, it updates
+ its data structures to record that the channel binding is now active.
+ It also updates its data structures to record that the corresponding
+ permission has been installed or refreshed.
+
+ If the client receives a ChannelBind failure response that indicates
+ that the channel information is out of sync between the client and
+ the server (e.g., an unexpected 400 "Bad Request" response), then it
+ is RECOMMENDED that the client immediately delete the allocation and
+ start afresh with a new allocation.
+
+12.4. The ChannelData Message
+
+ The ChannelData message is used to carry application data between the
+ client and the server. It has the following format:
+
+ 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
+ +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
+ | Channel Number | Length |
+ +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
+ | |
+ / Application Data /
+ / /
+ | |
+ | +-------------------------------+
+ | |
+ +-------------------------------+
+
+ Figure 5
+
+ 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
+ sending or is to receive the data.
+
+ The Length field specifies the length in bytes of the application
+ data field (i.e., it does not include the size of the ChannelData
+ header). Note that 0 is a valid length.
+
+ 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.
+
+12.5. Sending a ChannelData Message
+
+ 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 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
+ when sending data to the peer. The server, on the other hand, MUST
+ use 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 attributes to the client even if a channel has been bound to the
+ peer.
+
+ The fields of the ChannelData message are filled in as described in
+ Section 12.4.
+
+ Over TCP and TLS-over-TCP, the ChannelData message MUST be padded to
+ a multiple of four bytes in order to ensure the alignment of
+ subsequent messages. The padding is not reflected in the length
+ field of the ChannelData message, so the actual size of a ChannelData
+ message (including padding) is (4 + Length) rounded up to the nearest
+ multiple of 4 (see Section 14 of [RFC8489]). Over UDP, the padding
+ is not required but MAY be included.
+
+ The ChannelData message is then sent on the 5-tuple associated with
+ the allocation.
+
+12.6. Receiving a ChannelData Message
+
+ The receiver of the ChannelData message uses the first byte to
+ distinguish it from other multiplexed protocols as described in
+ Table 3. If the message uses a value in the reserved range (0x5000
+ through 0xFFFF), then the message is silently discarded.
+
+ 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
+ ChannelData message (i.e., the UDP header length field value is less
+ than the ChannelData header length field value + 4 + 8), then the
+ message is silently discarded.
+
+ If the ChannelData message is received over TCP or over TLS-over-TCP,
+ then the actual length of the ChannelData message is as described in
+ Section 12.5.
+
+ If the ChannelData message is received on a channel that is not bound
+ to any peer, then the message is silently discarded.
+
+ On the client, it is RECOMMENDED that the client discard the
+ ChannelData message if the client believes there is no active
+ permission towards the peer. On the server, the receipt of a
+ ChannelData message MUST NOT refresh either the channel binding or
+ the permission towards the peer.
+
+ On the server, if no errors are detected, the server relays the
+ application data to the peer by forming a UDP datagram as follows:
+
+ * the source transport address is the relayed transport address of
+ the allocation, where the allocation is determined by the 5-tuple
+ on which the ChannelData message arrived;
+
+ * the destination transport address is the transport address to
+ which the channel is bound;
+
+ * the data following the UDP header is the contents of the data
+ field of the ChannelData message.
+
+ The resulting UDP datagram is then sent to the peer. Note 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 formed and
+ sent (Section 4.1 of [RFC6263]).
+
+12.7. Relaying Data from the Peer
+
+ When the server receives a UDP datagram on the relayed transport
+ address associated with an allocation, the server processes it as
+ described in Section 11.3. If that section indicates that a
+ ChannelData message should be sent (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 described in Section 12.5.
+
+ When the server receives an ICMP packet, the server processes it as
+ described in Section 11.5.
+
+13. Packet Translations
+
+ This section addresses IPv4-to-IPv6, IPv6-to-IPv4, and IPv6-to-IPv6
+ translations. Requirements for translation of the IP addresses and
+ port numbers of the packets are described above. The following
+ sections specify how to translate other header fields.
+
+ As discussed in Section 3.6, translations in TURN 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 does
+ not require special privileges. The translations specified in the
+ following sections follow this principle.
+
+ The descriptions below have two parts: a preferred behavior and an
+ alternate behavior. The server SHOULD implement the preferred
+ behavior, but if that is not possible for a particular field, the
+ server MUST implement the alternate behavior and MUST NOT do anything
+ else for the reasons detailed in [RFC7915]. The TURN server 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 [RFC7915] and does not rely on the DONT-FRAGMENT attribute;
+ ignoring the DONT-FRAGMENT attribute is only applicable for UDP-to-
+ UDP relay and not for TCP-to-UDP relay.
+
+13.1. IPv4-to-IPv6 Translations
+
+ Time to Live (TTL) field
+
+ Preferred Behavior: As specified in Section 4 of [RFC7915].
+
+ Alternate Behavior: Set the outgoing value to the default for
+ outgoing packets.
+
+ Traffic Class
+
+ Preferred behavior: As specified in Section 4 of [RFC7915].
+
+ Alternate behavior: The TURN server sets the Traffic Class to the
+ default value for outgoing packets.
+
+ Flow Label
+
+ 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 Section 3 of [RFC6437]. 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.
+
+ Alternate behavior: The alternate behavior is the same as the
+ preferred behavior for a TURN server that does not support flow
+ labels.
+
+ Hop Limit
+
+ Preferred behavior: As specified in Section 4 of [RFC7915].
+
+ Alternate behavior: The TURN server sets the Hop Limit to the
+ default value for outgoing packets.
+
+ Fragmentation
+
+ Preferred behavior: As specified in Section 4 of [RFC7915].
+
+ Alternate behavior: The TURN server assembles incoming fragments.
+ The TURN server follows its default behavior to send outgoing
+ packets.
+
+ For both preferred and alternate behavior, the DONT-FRAGMENT
+ attribute MUST be ignored by the server.
+
+ Extension Headers
+
+ Preferred behavior: The outgoing packet uses the system defaults
+ for IPv6 extension headers, with the exception of the Fragment
+ header as described above.
+
+ Alternate behavior: Same as preferred.
+
+13.2. IPv6-to-IPv6 Translations
+
+ Flow Label
+
+ NOTE: The TURN server should consider that it is handling two
+ different IPv6 flows. Therefore, the Flow label [RFC6437] SHOULD NOT
+ be copied as part of the translation.
+
+ 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 Section 3 of [RFC6437]. 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.
+
+ Alternate behavior: The alternate behavior is the same as the
+ preferred behavior for a TURN server that does not support flow
+ labels.
+
+ Hop Limit
+
+ Preferred behavior: The TURN server acts as a regular router with
+ respect to decrementing the Hop Limit and generating an ICMPv6
+ error if it reaches zero.
+
+ Alternate behavior: The TURN server sets the Hop Limit to the
+ default value for outgoing packets.
+
+ Fragmentation
+
+ Preferred behavior: If the incoming packet did not include a
+ Fragment header and the outgoing packet size does not exceed the
+ outgoing link's MTU, the TURN server sends the outgoing packet
+ without a Fragment header.
+
+ If the incoming packet did not include a Fragment header and the
+ outgoing packet size exceeds the outgoing link's MTU, the TURN
+ 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.
+ 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
+ by 48 bytes to allow room for the overhead of a Data indication.
+
+ If the incoming packet included a Fragment header and the outgoing
+ packet size (with a Fragment header included) does not exceed the
+ outgoing link's MTU, the TURN server sends the outgoing packet
+ with a Fragment header. The TURN server sets the fields of the
+ Fragment header as appropriate for a packet originating from the
+ server.
+
+ If the incoming packet included a Fragment header and the outgoing
+ packet size exceeds the outgoing link's MTU, the TURN server MUST
+ fragment the outgoing packet into fragments of no more than 1280
+ bytes. The TURN server sets the fields of the Fragment header as
+ appropriate for a packet originating from the server.
+
+ Alternate behavior: The TURN server assembles incoming fragments.
+ The TURN server follows its default behavior to send outgoing
+ packets.
+
+ For both preferred and alternate behavior, the DONT-FRAGMENT
+ attribute MUST be ignored by the server.
+
+ Extension Headers
+
+ Preferred behavior: The outgoing packet uses the system defaults
+ for IPv6 extension headers, with the exception of the Fragment
+ header as described above.
+
+ Alternate behavior: Same as preferred.
+
+13.3. IPv6-to-IPv4 Translations
+
+ Type of Service and Precedence
+
+ Preferred behavior: As specified in Section 5 of [RFC7915].
+
+ Alternate behavior: The TURN server sets the Type of Service and
+ Precedence to the default value for outgoing packets.
+
+ Time to Live
+
+ Preferred behavior: As specified in Section 5 of [RFC7915].
+
+ Alternate behavior: The TURN server sets the Time to Live to the
+ default value for outgoing packets.
+
+ Fragmentation
+
+ Preferred behavior: As specified in Section 5 of [RFC7915].
+ Additionally, when the outgoing packet's size exceeds the outgoing
+ link's MTU, the TURN server needs to generate an ICMP error
+ (ICMPv6 "Packet too big") reporting the MTU size. If the ICMPv4
+ packet (Destination Unreachable (Type 3) with Code 4) is being
+ sent to the peer, the TURN server SHOULD reduce the MTU reported
+ in the ICMP message by 48 bytes to allow room for the overhead of
+ a Data indication.
+
+ Alternate behavior: The TURN server assembles incoming fragments.
+ The TURN server follows its default behavior to send outgoing
+ packets.
+
+ For both preferred and alternate behavior, the DONT-FRAGMENT
+ attribute MUST be ignored by the server.
+
+14. UDP-to-UDP Relay
+
+ 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. 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 ChannelData message to the client over UDP transport.
+ The descriptions in this section do not apply to TURN messages sent
+ over TCP or TLS transport from the server to the client.
+
+ The descriptions below have two parts: a preferred behavior and an
+ alternate behavior. The server SHOULD implement the preferred
+ behavior, but if that is not possible for a particular field, then it
+ SHOULD implement the alternative behavior.
+
+ Differentiated Services Code Point (DSCP) field [RFC2474]
+
+ Preferred Behavior: Set the outgoing value to the incoming value
+ unless the server includes a differentiated services classifier
+ and marker [RFC2474].
+
+ Alternate Behavior: Set the outgoing value to a fixed value, which
+ by default is Best Effort unless configured otherwise.
+
+ In both cases, if the server is immediately adjacent to a
+ differentiated services classifier and marker, then DSCP MAY be
+ set to any arbitrary value in the direction towards the
+ classifier.
+
+ Explicit Congestion Notification (ECN) field [RFC3168]
+
+ Preferred Behavior: Set the outgoing value to the incoming value.
+ The server may perform Active Queue Management, in which case it
+ SHOULD behave as an ECN-aware router [RFC3168] and can mark
+ traffic with Congestion Experienced (CE) instead of dropping the
+ packet. The use of ECT(1) is subject to experimental usage
+ [RFC8311].
+
+ Alternate Behavior: Set the outgoing value to Not-ECT (=0b00).
+
+ IPv4 Fragmentation fields (applicable only for IPv4-to-IPv4 relay)
+
+ Preferred Behavior: When the server sends a packet to a peer in
+ response to a Send indication containing the DONT-FRAGMENT
+ attribute, then set the outgoing UDP packet to not fragment. In
+ all other cases, when sending an outgoing packet containing
+ application data (e.g., Data indication, a ChannelData message, or
+ the DONT-FRAGMENT attribute not included in the Send indication),
+ copy the DF bit from the DF bit of the incoming packet that
+ contained the application data.
+
+ Set the other fragmentation fields (Identification, More
+ Fragments, Fragment Offset) as appropriate for a packet
+ originating from the server.
+
+ Alternate Behavior: As described in the Preferred Behavior, except
+ always assume the incoming DF bit is 0.
+
+ In both the Preferred and Alternate Behaviors, the resulting
+ packet may be too large for the outgoing link. If this is the
+ case, then the normal fragmentation rules apply [RFC1122].
+
+ IPv4 Options
+
+ Preferred Behavior: The outgoing packet uses the system defaults
+ for IPv4 options.
+
+ Alternate Behavior: Same as preferred.
+
+15. TCP-to-UDP Relay
+
+ 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
+ descriptions in this section apply when the server sends a UDP
+ datagram to the peer. Note that the server does not perform per-
+ packet translation for TCP-to-UDP relaying.
+
+ Multipath TCP [TCP-EXT] is not supported by this version of TURN
+ because TCP multipath is not used by either SIP or WebRTC protocols
+ [RFC7478] for media and non-media data. TCP connection between the
+ TURN client and server can use the TCP Authentication Option (TCP-AO)
+ [RFC5925], but UDP does not provide a similar type of authentication,
+ though it might be added in the future [UDP-OPT]. Even if both TCP-
+ AO and UDP authentication would be used between TURN client and
+ server, it would not change the end-to-end security properties of the
+ application payload being relayed. Therefore, applications using
+ TURN 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.
+
+ Unlike UDP, TCP without the TCP Fast Open extension [RFC7413] does
+ not support 0-RTT session resumption. The TCP user timeout [RFC5482]
+ equivalent for application data relayed by the TURN is the use of RTP
+ control protocol (RTCP). As a reminder, RTCP is a fundamental and
+ integral part of RTP.
+
+ The descriptions below have two parts: a preferred behavior and an
+ alternate behavior. The server SHOULD implement the preferred
+ behavior, but if that is not possible for a particular field, then it
+ SHOULD implement the alternative behavior.
+
+ For the UDP datagram sent to the peer based on a Send Indication or
+ ChannelData message arriving at the TURN server over a TCP Transport,
+ the server sets various fields in the IP header as follows:
+
+ Differentiated Services Code Point (DSCP) field [RFC2474]
+
+ Preferred Behavior: The TCP connection can only use a single DSCP,
+ so inter-flow differentiation is not possible; see Section 5.1 of
+ [RFC7657]. The server sets the outgoing value to the DSCP used by
+ the TCP connection, unless the server includes a differentiated
+ services classifier and marker [RFC2474].
+
+ Alternate Behavior: Set the outgoing value to a fixed value, which
+ by default is Best Effort unless configured otherwise.
+
+ In both cases, if the server is immediately adjacent to a
+ differentiated services classifier and marker, then DSCP MAY be
+ set to any arbitrary value in the direction towards the
+ classifier.
+
+ Explicit Congestion Notification (ECN) field [RFC3168]
+
+ Preferred Behavior: No mechanism is defined to indicate what ECN
+ value should be used for the outgoing UDP datagrams of an
+ allocation; therefore, set the outgoing value to Not-ECT (=0b00).
+
+ Alternate Behavior: Same as preferred.
+
+ IPv4 Fragmentation fields (applicable only for IPv4-to-IPv4 relay)
+
+ Preferred Behavior: When the server sends a packet to a peer in
+ response to a Send indication containing the DONT-FRAGMENT
+ attribute, set the outgoing UDP packet to not fragment. In all
+ other cases, when sending an outgoing UDP packet containing
+ application data (e.g., Data indication, ChannelData message, or
+ DONT-FRAGMENT attribute not included in the Send indication), set
+ the DF bit in the outgoing IP header to 0.
+
+ Alternate Behavior: Same as preferred.
+
+ IPv6 Fragmentation fields
+
+ Preferred Behavior: If the TCP traffic arrives over IPv6, the
+ server relies on the presence of the DONT-FRAGMENT attribute in
+ the send indication to set the outgoing UDP packet to not
+ fragment.
+
+ Alternate Behavior: Same as preferred.
+
+ IPv4 Options
+
+ Preferred Behavior: The outgoing packet uses the system defaults
+ for IPv4 options.
+
+ Alternate Behavior: Same as preferred.
+
+16. UDP-to-TCP Relay
+
+ 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
+ descriptions in this section apply when the server sends a Data
+ indication or ChannelData message to the client over TCP or TLS
+ transport. Note that the server does not perform per-packet
+ translation for UDP-to-TCP relaying.
+
+ The descriptions below have two parts: a preferred behavior and an
+ alternate behavior. The server SHOULD implement the preferred
+ behavior, but if that is not possible for a particular field, then it
+ SHOULD implement the alternative behavior.
+
+ The TURN server sets IP header fields in the TCP packets on a per-
+ connection basis for the TCP connection as follows:
+
+ Differentiated Services Code Point (DSCP) field [RFC2474]
+
+ Preferred Behavior: Ignore the incoming DSCP value. When TCP is
+ 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 application data is exchanged.
+
+ Alternate Behavior: Same as preferred.
+
+ Explicit Congestion Notification (ECN) field [RFC3168]
+
+ Preferred Behavior: Ignore; ECN signals are dropped in the TURN
+ server for the incoming UDP datagrams from the peer.
+
+ Alternate Behavior: Same as preferred.
+
+ Fragmentation
+
+ Preferred Behavior: Any fragmented packets are reassembled in the
+ server and then forwarded to the client over the TCP connection.
+ ICMP messages resulting from the UDP datagrams sent to the peer
+ are processed by the server as described in Section 11.5 and
+ forwarded to the client using TURN's mechanism for relevant ICMP
+ types and codes.
+
+ Alternate Behavior: Same as preferred.
+
+ Extension Headers
+
+ Preferred behavior: The outgoing packet uses the system defaults
+ for IPv6 extension headers.
+
+ Alternate behavior: Same as preferred.
+
+ IPv4 Options
+
+ Preferred Behavior: The outgoing packet uses the system defaults
+ for IPv4 options.
+
+ Alternate Behavior: Same as preferred.
+
+17. STUN Methods
+
+ This section lists the code points for the STUN methods defined in
+ this specification. See elsewhere in this document for the semantics
+ of these methods.
+
+ +-------+------------------+------------------------+
+ | 0x003 | Allocate | (only request/response |
+ | | | semantics defined) |
+ +-------+------------------+------------------------+
+ | 0x004 | Refresh | (only request/response |
+ | | | semantics defined) |
+ +-------+------------------+------------------------+
+ | 0x006 | Send | (only indication |
+ | | | semantics defined) |
+ +-------+------------------+------------------------+
+ | 0x007 | Data | (only indication |
+ | | | semantics defined) |
+ +-------+------------------+------------------------+
+ | 0x008 | CreatePermission | (only request/response |
+ | | | semantics defined) |
+ +-------+------------------+------------------------+
+ | 0x009 | ChannelBind | (only request/response |
+ | | | semantics defined) |
+ +-------+------------------+------------------------+
+
+ Table 4
+
+18. STUN Attributes
+
+ This STUN extension defines the following attributes:
+
+ +--------+---------------------------+
+ | 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 |
+ +--------+---------------------------+
+ | 0x8000 | ADDITIONAL-ADDRESS-FAMILY |
+ +--------+---------------------------+
+ | 0x8001 | ADDRESS-ERROR-CODE |
+ +--------+---------------------------+
+ | 0x8004 | ICMP |
+ +--------+---------------------------+
+
+ Table 5
+
+ 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 bytes MUST be immediately followed by 1 to 3 padding bytes to
+ ensure the next attribute (if any) would start on a 4-byte boundary
+ (see [RFC8489]).
+
+18.1. CHANNEL-NUMBER
+
+ The CHANNEL-NUMBER attribute contains the number of the channel. 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
+ Future Use) field, which MUST be set to 0 on transmission and MUST be
+ ignored on reception.
+
+ 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
+ +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
+ | Channel Number | RFFU = 0 |
+ +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
+
+ Figure 6
+
+18.2. LIFETIME
+
+ The LIFETIME attribute represents the duration for which the server
+ will maintain an allocation in the absence of a refresh. The TURN
+ client can include the LIFETIME attribute with the desired lifetime
+ in Allocate and Refresh requests. The value portion of this
+ attribute is 4 bytes long and consists of a 32-bit unsigned integral
+ value representing the number of seconds remaining until expiration.
+
+18.3. XOR-PEER-ADDRESS
+
+ 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 transport address if the peer is behind a NAT.) It is
+ encoded in the same way as the XOR-MAPPED-ADDRESS attribute
+ [RFC8489].
+
+18.4. DATA
+
+ 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. The value portion of this attribute is variable length
+ and consists of the application data (that is, the data that would
+ immediately follow the UDP header if the data was sent directly
+ between the client and the peer). The application data is equivalent
+ to the "UDP user data" and does not include the "surplus area"
+ defined in Section 4 of [UDP-OPT]. If the length of this attribute
+ is not a multiple of 4, then padding must be added after this
+ attribute.
+
+18.5. XOR-RELAYED-ADDRESS
+
+ The XOR-RELAYED-ADDRESS attribute is present in Allocate responses.
+ It specifies the address and port that the server allocated to the
+ client. It is encoded in the same way as the XOR-MAPPED-ADDRESS
+ attribute [RFC8489].
+
+18.6. REQUESTED-ADDRESS-FAMILY
+
+ This attribute is used in Allocate and Refresh requests to specify
+ the address type requested by the client. The value of this
+ attribute is 4 bytes with the following format:
+
+ 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
+ +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
+ | Family | Reserved |
+ +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
+
+ Figure 7
+
+ Family: There are two values defined for this field and specified in
+ Section 14.1 of [RFC8489]: 0x01 for IPv4 addresses and 0x02 for
+ IPv6 addresses.
+
+ Reserved: At this point, the 24 bits in the Reserved field MUST be
+ set to zero by the client and MUST be ignored by the server.
+
+18.7. EVEN-PORT
+
+ This attribute allows the client to request that the port in the
+ relayed transport address be even and (optionally) that the server
+ reserve the next-higher port number. The value portion of this
+ attribute is 1 byte long. Its format is:
+
+ 0
+ 0 1 2 3 4 5 6 7
+ +-+-+-+-+-+-+-+-+
+ |R| RFFU |
+ +-+-+-+-+-+-+-+-+
+
+ Figure 8
+
+ The value contains a single 1-bit flag:
+
+ R: If 1, the server is requested to reserve the next-higher port
+ number (on the same IP address) for a subsequent allocation. If
+ 0, no such reservation is requested.
+
+ RFFU: Reserved For Future Use.
+
+ The RFFU field must be set to zero on transmission and ignored on
+ reception.
+
+ Since the length of this attribute is not a multiple of 4, padding
+ must immediately follow this attribute.
+
+18.8. REQUESTED-TRANSPORT
+
+ This attribute is used by the client to request a specific transport
+ protocol for the allocated transport address. The value of this
+ attribute is 4 bytes with the following format:
+
+ 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
+ +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
+ | Protocol | RFFU |
+ +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
+
+ Figure 9
+
+ The Protocol field specifies the desired protocol. The code points
+ 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
+ [PROTOCOL-NUMBERS]. This specification only allows the use of code
+ point 17 (User Datagram Protocol).
+
+ The RFFU field MUST be set to zero on transmission and MUST be
+ ignored on reception. It is reserved for future uses.
+
+18.9. DONT-FRAGMENT
+
+ 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
+ application data onward to the peer and for determining the server
+ capability in Allocate requests. This attribute has no value part,
+ and thus, the attribute length field is 0.
+
+18.10. RESERVATION-TOKEN
+
+ The RESERVATION-TOKEN attribute contains a token that uniquely
+ identifies a relayed transport address being held in reserve by the
+ server. The server includes this attribute in a success response to
+ tell the client about the token, and the client includes this
+ attribute in a subsequent Allocate request to request the server use
+ that relayed transport address for the allocation.
+
+ The attribute value is 8 bytes and contains the token value.
+
+18.11. ADDITIONAL-ADDRESS-FAMILY
+
+ 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
+ way as the REQUESTED-ADDRESS-FAMILY attribute; see Section 18.6. The
+ ADDITIONAL-ADDRESS-FAMILY attribute MAY be present in the Allocate
+ request. The attribute value of 0x02 (IPv6 address) is the only
+ valid value in Allocate request.
+
+18.12. ADDRESS-ERROR-CODE
+
+ This attribute is used by servers to signal the reason for not
+ allocating the requested address family. The value portion of this
+ attribute is variable length with the following format:
+
+ 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
+ +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
+ | Family | Reserved |Class| Number |
+ +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
+ | Reason Phrase (variable) ..
+ +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
+
+ Figure 10
+
+ Family: There are two values defined for this field and specified in
+ Section 14.1 of [RFC8489]: 0x01 for IPv4 addresses and 0x02 for
+ IPv6 addresses.
+
+ Reserved: At this point, the 13 bits in the Reserved field MUST be
+ set to zero by the server and MUST be ignored by the client.
+
+ Class: The Class represents the hundreds digit of the error code and
+ is defined in Section 14.8 of [RFC8489].
+
+ Number: This 8-bit field contains the reason the server cannot
+ allocate one of the requested address types. The error code
+ values could be either 440 (Address Family not Supported) or 508
+ (Insufficient Capacity). The number representation is defined in
+ Section 14.8 of [RFC8489].
+
+ Reason Phrase: The recommended reason phrases for error codes 440
+ and 508 are explained in Section 19. The reason phrase MUST be a
+ UTF-8 [RFC3629] encoded sequence of less than 128 characters
+ (which can be as long as 509 bytes when encoding them or 763 bytes
+ when decoding them).
+
+18.13. ICMP
+
+ This attribute is used by servers to signal the reason a UDP packet
+ was dropped. The following is the format of the ICMP attribute.
+
+ 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 |
+ +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
+ | Error Data |
+ +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
+
+ Figure 11
+
+ Reserved: This field MUST be set to 0 when sent and MUST be ignored
+ when received.
+
+ ICMP Type: The field contains the value of the ICMP type. Its
+ interpretation depends on whether the ICMP was received over IPv4
+ or IPv6.
+
+ ICMP Code: The field contains the value of the ICMP code. Its
+ interpretation depends on whether the ICMP was received over IPv4
+ or IPv6.
+
+ Error Data: 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 (Section 3.2 of [RFC4443] and Section 4 of
+ [RFC1191]). For other ICMPv6 types and ICMPv4 types and codes,
+ the Error Data field MUST be set to zero.
+
+19. STUN Error Response Codes
+
+ This document defines the following error response codes:
+
+ 403 (Forbidden):
+ The request was valid but cannot be performed due to
+ administrative or similar restrictions.
+
+ 437 (Allocation Mismatch):
+ A request was received by the server that requires an allocation
+ to be in place, but no allocation exists, or a request was
+ received that requires no allocation, but an allocation exists.
+
+ 440 (Address Family not Supported):
+ The server does not support the address family requested by the
+ client.
+
+ 441 (Wrong Credentials):
+ (Wrong Credentials): The credentials in the (non-Allocate) request
+ do not match those used to create the allocation.
+
+ 442 (Unsupported Transport Protocol):
+ The Allocate request asked the server to use a transport protocol
+ between the server and the peer that the server does not support.
+ NOTE: This does NOT refer to the transport protocol used in the
+ 5-tuple.
+
+ 443 (Peer Address Family Mismatch):
+ A peer address is part of a different address family than that of
+ the relayed transport address of the allocation.
+
+ 486 (Allocation Quota Reached):
+ No more allocations using this username can be created at the
+ present time.
+
+ 508 (Insufficient Capacity):
+ The server is unable to 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 relayed transport addresses available
+ at that time, having none with the requested properties, or the
+ one that corresponds to the specified reservation token is not
+ available.
+
+20. Detailed Example
+
+ This section gives an example of the use of TURN, showing in detail
+ the contents of the messages exchanged. The example uses the network
+ diagram shown in the Overview (Figure 1).
+
+ For each message, the attributes included in the message and their
+ values are shown. For convenience, values are shown in a human-
+ readable format rather than showing the actual octets; for example,
+ "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; here, the address and port are shown before the xor-ing
+ is done. For attributes with string-like values (e.g.,
+ SOFTWARE="Example client, version 1.03" and
+ NONCE="obMatJos2gAAAadl7W7PeDU4hKE72jda"), the value of the attribute
+ is shown in quotes for readability, but these quotes do not appear in
+ the actual value.
+
+ TURN TURN Peer Peer
+ client server A B
+ | | | |
+ |--- Allocate request -------------->| | |
+ | Transaction-Id=0xA56250D3F17ABE679422DE85 | |
+ | SOFTWARE="Example client, version 1.03" | |
+ | LIFETIME=3600 (1 hour) | | |
+ | REQUESTED-TRANSPORT=17 (UDP) | | |
+ | DONT-FRAGMENT | | |
+ | | | |
+ |<-- Allocate error response --------| | |
+ | Transaction-Id=0xA56250D3F17ABE679422DE85 | |
+ | SOFTWARE="Example server, version 1.17" | |
+ | ERROR-CODE=401 (Unauthorized) | | |
+ | REALM="example.com" | | |
+ | NONCE="obMatJos2gAAAadl7W7PeDU4hKE72jda" | |
+ | PASSWORD-ALGORITHMS=MD5 and SHA256 | |
+ | | | |
+ |--- Allocate request -------------->| | |
+ | Transaction-Id=0xC271E932AD7446A32C234492 | |
+ | SOFTWARE="Example client 1.03" | | |
+ | LIFETIME=3600 (1 hour) | | |
+ | REQUESTED-TRANSPORT=17 (UDP) | | |
+ | DONT-FRAGMENT | | |
+ | USERNAME="George" | | |
+ | REALM="example.com" | | |
+ | NONCE="obMatJos2gAAAadl7W7PeDU4hKE72jda" | |
+ | PASSWORD-ALGORITHMS=MD5 and SHA256 | |
+ | PASSWORD-ALGORITHM=SHA256 | | |
+ | MESSAGE-INTEGRITY=... | | |
+ | MESSAGE-INTEGRITY-SHA256=... | | |
+ | | | |
+ |<-- Allocate success response ------| | |
+ | Transaction-Id=0xC271E932AD7446A32C234492 | |
+ | SOFTWARE="Example server, version 1.17" | |
+ | LIFETIME=1200 (20 minutes) | | |
+ | XOR-RELAYED-ADDRESS=192.0.2.15:50000 | |
+ | XOR-MAPPED-ADDRESS=192.0.2.1:7000 | |
+ | MESSAGE-INTEGRITY-SHA256=... | | |
+
+ Figure 12
+
+ The client begins by selecting a host transport address to use for
+ the TURN session; in this example, the client has selected
+ 198.51.100.2:49721 as shown in Figure 1. The client then sends an
+ Allocate request to the server at the server transport address. The
+ client randomly selects a 96-bit transaction id of
+ 0xA56250D3F17ABE679422DE85 for this transaction; this is encoded in
+ the transaction id field in the fixed header. The client includes a
+ SOFTWARE attribute that gives information about the client's
+ software; 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 includes the LIFETIME attribute because it
+ wishes the allocation to have 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 always include a REQUESTED-
+ TRANSPORT attribute in an Allocate request, and the only value
+ allowed by this specification is 17, which indicates UDP transport
+ between the server and the peers. The client also includes the DONT-
+ FRAGMENT attribute because it wishes to use the DONT-FRAGMENT
+ attribute later in Send indications; this attribute consists of only
+ an attribute header; there is no value part. We assume the client
+ has not recently interacted with the server; thus, the client does
+ not include the USERNAME, USERHASH, REALM, NONCE, PASSWORD-
+ ALGORITHMS, PASSWORD-ALGORITHM, MESSAGE-INTEGRITY, or MESSAGE-
+ INTEGRITY-SHA256 attribute. Finally, note that the order of
+ attributes in a message is arbitrary (except for the MESSAGE-
+ INTEGRITY, MESSAGE-INTEGRITY-SHA256 and FINGERPRINT attributes), and
+ the client could have used a different order.
+
+ Servers require any request to be authenticated. Thus, when the
+ server receives the initial Allocate request, it rejects the request
+ because the request does not contain the authentication attributes.
+ Following the procedures of the long-term credential mechanism of
+ STUN [RFC8489], the server includes an ERROR-CODE attribute with a
+ value of 401 (Unauthorized), a REALM 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 NONCE attribute. The
+ NONCE attribute starts with the "nonce cookie" with the STUN Security
+ Feature "Password algorithm" bit set to 1. The server includes a
+ PASSWORD-ALGORITHMS attribute that specifies the list of 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,
+ then the client uses the USERHASH attribute instead of the USERNAME
+ attribute in the Allocate request to anonymize the username. The
+ server also includes a SOFTWARE attribute that gives information
+ about the server's software.
+
+ The client, upon receipt of the 401 error, reattempts the Allocate
+ request, this time including the authentication attributes. The
+ client selects a new transaction id and then populates the new
+ Allocate request with the same attributes as before. The client
+ includes a 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 use the username "George" for the realm
+ "example.com". The client includes the PASSWORD-ALGORITHM attribute
+ indicating the algorithm that the server must use to derive the long-
+ term password. The client also includes the REALM, PASSWORD-
+ ALGORITHMS, and NONCE attributes, which are just copied from the 401
+ error response. Finally, the client includes MESSAGE-INTEGRITY-
+ SHA256 attribute as the last attributes in the message whose value is
+ Hashed Message Authentication Code - Secure Hash Algorithm 2 (HMAC-
+ SHA2) hash over the contents of the message (shown as just "..."
+ above); this HMAC-SHA2 computation includes a password value. Thus,
+ an attacker cannot compute the message integrity value without
+ somehow knowing the secret password.
+
+ The server, upon receipt of the authenticated Allocate request,
+ checks that everything is OK, then creates an allocation. The server
+ replies with an Allocate success response. The server includes a
+ LIFETIME attribute giving the lifetime of the allocation; here, the
+ server has reduced the client's requested 1-hour lifetime to just 20
+ minutes because this particular server doesn't allow lifetimes longer
+ than 20 minutes. The server includes an XOR-RELAYED-ADDRESS
+ attribute whose value is the relayed transport address of the
+ allocation. The server includes an XOR-MAPPED-ADDRESS attribute
+ whose value is the 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 includes a MESSAGE-INTEGRITY-SHA256 attribute to
+ authenticate the response and to ensure its integrity; note that the
+ response does not contain the USERNAME, REALM, and NONCE attributes.
+ The server also includes a SOFTWARE attribute.
+
+ TURN TURN Peer Peer
+ client server A B
+ |--- CreatePermission request ------>| | |
+ | Transaction-Id=0xE5913A8F460956CA277D3319 | |
+ | XOR-PEER-ADDRESS=192.0.2.150:0 | | |
+ | USERNAME="George" | | |
+ | REALM="example.com" | | |
+ | NONCE="obMatJos2gAAAadl7W7PeDU4hKE72jda" | |
+ | PASSWORD-ALGORITHMS=MD5 and SHA256 | |
+ | PASSWORD-ALGORITHM=SHA256 | | |
+ | MESSAGE-INTEGRITY-SHA256=... | | |
+ | | | |
+ |<-- CreatePermission success resp.--| | |
+ | Transaction-Id=0xE5913A8F460956CA277D3319 | |
+ | MESSAGE-INTEGRITY-SHA256=... | | |
+
+ Figure 13
+
+ The client then creates a permission towards Peer A in preparation
+ for sending it some application data. This is done through a
+ CreatePermission request. The XOR-PEER-ADDRESS attribute contains
+ the IP 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 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 (private) host address. The client uses the same
+ username, realm, and 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 attribute in this request.
+
+ The server receives the CreatePermission request, creates the
+ corresponding permission, and then replies with a CreatePermission
+ success response. Like the client, the server chooses not to include
+ the SOFTWARE attribute in its reply. Again, note how success
+ responses contain a MESSAGE-INTEGRITY-SHA256 attribute (assuming the
+ server uses the long-term credential mechanism) but no USERNAME,
+ REALM, and NONCE attributes.
+
+ TURN TURN Peer Peer
+ client server A B
+ |--- Send indication --------------->| | |
+ | Transaction-Id=0x1278E9ACA2711637EF7D3328 | |
+ | XOR-PEER-ADDRESS=192.0.2.150:32102 | |
+ | DONT-FRAGMENT | | |
+ | DATA=... | | |
+ | |- UDP dgm ->| |
+ | | data=... | |
+ | | | |
+ | |<- UDP dgm -| |
+ | | data=... | |
+ |<-- Data indication ----------------| | |
+ | Transaction-Id=0x8231AE8F9242DA9FF287FEFF | |
+ | XOR-PEER-ADDRESS=192.0.2.150:32102 | |
+ | DATA=... | | |
+
+ Figure 14
+
+ The client now sends application data to Peer A using a Send
+ indication. Peer A's server-reflexive transport address is specified
+ in the XOR-PEER-ADDRESS attribute, and the application data (shown
+ here as just "...") is specified in the DATA attribute. The client
+ is doing a form of path MTU discovery at the application layer and,
+ thus, specifies (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 be authenticated using the long-term credential
+ mechanism of STUN, so no MESSAGE-INTEGRITY or MESSAGE-INTEGRITY-
+ SHA256 attribute is included in the message. An application wishing
+ to ensure that its data is not altered or forged must integrity-
+ protect its data at the application level.
+
+ Upon receipt of the Send indication, the server extracts 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
+ datagram and with the DF bit set as requested. Note that had the
+ client not previously established a permission for Peer A's server-
+ reflexive IP address, the server would have silently discarded the
+ Send indication instead.
+
+ Peer A then replies with its own UDP datagram containing application
+ data. The datagram is sent to the relayed transport address on the
+ server. When this arrives, the server creates a Data indication
+ 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 resulting Data indication is then sent to the client.
+
+ TURN TURN Peer Peer
+ client server A B
+ |--- ChannelBind request ----------->| | |
+ | Transaction-Id=0x6490D3BC175AFF3D84513212 | |
+ | CHANNEL-NUMBER=0x4000 | | |
+ | XOR-PEER-ADDRESS=192.0.2.210:49191 | |
+ | USERNAME="George" | | |
+ | REALM="example.com" | | |
+ | NONCE="obMatJos2gAAAadl7W7PeDU4hKE72jda" | |
+ | PASSWORD-ALGORITHMS=MD5 and SHA256 | |
+ | PASSWORD-ALGORITHM=SHA256 | | |
+ | MESSAGE-INTEGRITY-SHA256=... | | |
+ | | | |
+ |<-- ChannelBind success response ---| | |
+ | Transaction-Id=0x6490D3BC175AFF3D84513212 | |
+ | MESSAGE-INTEGRITY-SHA256=... | | |
+
+ Figure 15
+
+ 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 address in the XOR-PEER-ADDRESS attribute. As before, the
+ client reuses the username, realm, and nonce from its last request in
+ the message.
+
+ 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
+ replies with a ChannelBind success response.
+
+ TURN TURN Peer Peer
+ client server A B
+ |--- ChannelData ------------------>| | |
+ | Channel-number=0x4000 |--- UDP datagram --------->|
+ | Data=... | Data=... |
+ | | | |
+ | |<-- UDP datagram ----------|
+ | | Data=... | |
+ |<-- ChannelData -------------------| | |
+ | Channel-number=0x4000 | | |
+ | Data=... | | |
+
+ Figure 16
+
+ The client now sends a ChannelData message to the server with data
+ destined for Peer B. The ChannelData message is not a STUN message;
+ thus, it has no transaction id. Instead, it has only three fields: a
+ channel 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 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 datagram, using the relayed transport address as the
+ source transport address, and 192.0.2.210:49191 (the value of the
+ XOR-PEER-ADDRESS attribute in the ChannelBind request) as the
+ destination transport address.
+
+ Later, Peer B sends a UDP datagram back to the relayed transport
+ address. This causes the server to send a ChannelData message to the
+ client containing the data from the UDP datagram. The server knows
+ to which client to send the ChannelData message because of the
+ relayed 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. Note that if there had not been any channel
+ number bound to that address, the server would have used a Data
+ indication instead.
+
+ TURN TURN Peer Peer
+ client server A B
+ |--- ChannelBind request ----------->| | |
+ | Transaction-Id=0xE5913A8F46091637EF7D3328 | |
+ | CHANNEL-NUMBER=0x4000 | | |
+ | XOR-PEER-ADDRESS=192.0.2.210:49191 | |
+ | USERNAME="George" | | |
+ | REALM="example.com" | | |
+ | NONCE="obMatJos2gAAAadl7W7PeDU4hKE72jda" | |
+ | PASSWORD-ALGORITHMS=MD5 and SHA256 | |
+ | PASSWORD-ALGORITHM=SHA256 | | |
+ | MESSAGE-INTEGRITY-SHA256=... | | |
+ | | | |
+ |<-- ChannelBind success response ---| | |
+ | Transaction-Id=0xE5913A8F46091637EF7D3328 | |
+ | MESSAGE-INTEGRITY-SHA256=... | | |
+
+ Figure 17
+
+ The channel binding lasts for 10 minutes unless refreshed. The TURN
+ 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 ChannelBind request, rebinds the channel to the
+ same peer, and resets the time-to-expiry timer back to 10 minutes.
+
+ TURN TURN Peer Peer
+ client server A B
+ |--- Refresh request --------------->| | |
+ | Transaction-Id=0x0864B3C27ADE9354B4312414 | |
+ | SOFTWARE="Example client 1.03" | | |
+ | USERNAME="George" | | |
+ | REALM="example.com" | | |
+ | NONCE="oobMatJos2gAAAadl7W7PeDU4hKE72jda" | |
+ | PASSWORD-ALGORITHMS=MD5 and SHA256 | |
+ | PASSWORD-ALGORITHM=SHA256 | | |
+ | MESSAGE-INTEGRITY-SHA256=... | | |
+ | | | |
+ |<-- Refresh error response ---------| | |
+ | Transaction-Id=0x0864B3C27ADE9354B4312414 | |
+ | SOFTWARE="Example server, version 1.17" | |
+ | ERROR-CODE=438 (Stale Nonce) | | |
+ | REALM="example.com" | | |
+ | NONCE="obMatJos2gAAAadl7W7PeDU4hKE72jda" | |
+ | PASSWORD-ALGORITHMS=MD5 and SHA256 | |
+ | | | |
+ |--- Refresh request --------------->| | |
+ | Transaction-Id=0x427BD3E625A85FC731DC4191 | |
+ | SOFTWARE="Example client 1.03" | | |
+ | USERNAME="George" | | |
+ | REALM="example.com" | | |
+ | NONCE="obMatJos2gAAAadl7W7PeDU4hKE72jda" | |
+ | PASSWORD-ALGORITHMS=MD5 and SHA256 | |
+ | PASSWORD-ALGORITHM=SHA256 | | |
+ | MESSAGE-INTEGRITY-SHA256=... | | |
+ | | | |
+ |<-- Refresh success response -------| | |
+ | Transaction-Id=0x427BD3E625A85FC731DC4191 | |
+ | SOFTWARE="Example server, version 1.17" | |
+ | LIFETIME=600 (10 minutes) | | |
+ | MESSAGE-INTEGRITY=... | | |
+
+ Figure 18
+
+ Sometime before the 20-minute lifetime is up, the client refreshes
+ the allocation. This is done using a Refresh request. As before,
+ the client includes the latest username, realm, and nonce values in
+ the request. The client also includes the SOFTWARE attribute,
+ following the recommended practice of always including this attribute
+ in Allocate and Refresh messages. When the server receives the
+ Refresh request, it 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 request, this time with the new nonce
+ value. This second attempt is accepted, and the server replies with
+ a success response. Note that the client did not include a LIFETIME
+ attribute in the request, so the server refreshes the allocation for
+ the default lifetime of 10 minutes (as can be seen by the LIFETIME
+ attribute in the success response).
+
+21. Security Considerations
+
+ This section considers attacks that are possible in a TURN deployment
+ and discusses how they are mitigated by mechanisms in the protocol or
+ recommended practices in the implementation.
+
+ Most of the attacks on TURN are mitigated by the server requiring
+ requests be authenticated. Thus, this specification requires the use
+ of authentication. The mandatory-to-implement mechanism is the long-
+ term credential mechanism of STUN. Other authentication mechanisms
+ of equal or stronger security properties may be used. However, it is
+ important to ensure that they can be invoked in an interoperable way.
+
+21.1. Outsider Attacks
+
+ Outsider attacks are ones where the attacker has no credentials in
+ the system and is attempting to disrupt the service seen by the
+ client or the server.
+
+21.1.1. Obtaining Unauthorized Allocations
+
+ An attacker might wish to obtain allocations on a TURN server for any
+ number of nefarious purposes. A TURN server provides a mechanism for
+ sending and receiving packets while cloaking the actual IP address of
+ the client. This makes TURN servers an attractive target for
+ attackers who wish to use it to mask their true identity.
+
+ An attacker might also wish to simply utilize the services of a TURN
+ server without paying for them. Since TURN services require
+ resources from the provider, it is anticipated that their usage will
+ come with a cost.
+
+ These attacks are prevented using the long-term credential mechanism,
+ which allows the TURN server to determine the identity of the
+ requestor and whether the requestor is allowed to obtain the
+ allocation.
+
+21.1.2. Offline Dictionary Attacks
+
+ The long-term credential mechanism used by TURN is subject to offline
+ dictionary attacks. An attacker that is capable of eavesdropping on
+ a message exchange between a client and server can determine the
+ password by trying a number of candidate passwords and seeing if one
+ of them is correct. This attack works when the passwords are low
+ entropy such as a word from the dictionary. This attack can be
+ mitigated by using strong passwords with large entropy. In
+ situations where even stronger mitigation is required, (D)TLS
+ transport between the client and the server can be used.
+
+21.1.3. Faked Refreshes and Permissions
+
+ An attacker might wish to attack an active allocation by sending it a
+ Refresh request with an immediate expiration in order to delete it
+ and disrupt service to the client. This is prevented by
+ authentication of refreshes. Similarly, an attacker wishing to send
+ CreatePermission requests to create permissions to undesirable
+ destinations is prevented from doing so through authentication. The
+ motivations for such an attack are described in Section 21.2.
+
+21.1.4. Fake Data
+
+ 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
+ attacker can send the client a faked Data indication or ChannelData
+ message, or send the TURN server a faked Send indication or
+ ChannelData message.
+
+ Since indications and ChannelData messages are not authenticated,
+ this attack is not prevented by TURN. However, this attack is
+ generally present in IP-based communications and is not substantially
+ worsened by TURN. Consider a normal, non-TURN IP 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 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 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 the IP address and port
+ of the peer (for inclusion in the 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, the IP address and port
+ of the TURN server, and the channel number. This particular
+ combination is mildly more guessable than in the non-TURN case.
+
+ These attacks are more properly mitigated by application-layer
+ authentication techniques. In the case of real-time traffic, usage
+ of SRTP [RFC3711] prevents these attacks.
+
+ 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 cannot
+ directly send. This can happen, for example, if the server is
+ located behind a firewall that allows packets from outside the
+ firewall to be delivered to the server, but not to other hosts behind
+ the firewall. In these situations, an attacker could send the server
+ a Send indication with an XOR-PEER-ADDRESS attribute containing the
+ transport address of one of the other hosts behind the firewall. If
+ the server was to allow relaying of traffic to arbitrary peers, then
+ this would provide a way for the attacker to attack arbitrary hosts
+ behind the firewall.
+
+ To mitigate this attack, TURN requires that the client establish a
+ permission to a host before sending it data. Thus, an attacker can
+ only attack hosts with which the client is already communicating
+ unless the attacker is able to create authenticated requests.
+ Furthermore, the server administrator may configure the server to
+ restrict the range of IP addresses and ports to which it will relay
+ data. To provide even greater security, the server administrator can
+ require that the client use (D)TLS for all communication between the
+ client and the server.
+
+21.1.5. Impersonating a Server
+
+ When a client learns a relayed address from a TURN server, it uses
+ that relayed address in application protocols to receive traffic.
+ Therefore, an attacker wishing to intercept or redirect that traffic
+ might try to impersonate a TURN server and provide the client with a
+ faked relayed address.
+
+ This attack is prevented through the long-term credential mechanism,
+ which provides message integrity for responses in addition to
+ verifying that they came from the server. Furthermore, an attacker
+ cannot replay old server responses as the transaction id in the STUN
+ header prevents this. Replay attacks are further thwarted through
+ frequent changes to the nonce value.
+
+21.1.6. Eavesdropping Traffic
+
+ If the TURN client and server use the STUN Extension for Third-Party
+ Authorization [RFC7635] (for 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 long-term credential mechanism
+ and the username reveals the real user's identity, the client MUST
+ either use the USERHASH attribute instead of the USERNAME attribute
+ to anonymize the username or use (D)TLS transport between the client
+ and the server.
+
+ If the TURN client and server use the STUN long-term credential
+ mechanism, and realm information is privacy sensitive, TURN can be
+ run over (D)TLS. As a reminder, STUN Extension for Third-Party
+ Authorization does not use realm.
+
+ The SOFTWARE attribute can reveal the specific software version of
+ the TURN client and server to the eavesdropper, and it might possibly
+ allow attacks against vulnerable software that is known to contain
+ security vulnerabilities. If the software version is known to
+ contain security vulnerabilities, TURN SHOULD be run over (D)TLS to
+ prevent leaking the SOFTWARE attribute in clear text. If zero-day
+ vulnerabilities are detected in the software version, the endpoint
+ policy can be modified to mandate the use of (D)TLS until the patch
+ is in place to fix the flaw.
+
+ TURN concerns itself primarily with authentication and message
+ integrity. Confidentiality is only a secondary concern as TURN
+ control messages do not include information that is particularly
+ sensitive with the exception of USERNAME, REALM, and SOFTWARE. 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
+ connection from learning this, TURN can be run over (D)TLS.
+
+ Confidentiality for the application data relayed by TURN is best
+ provided by the application protocol itself since running TURN over
+ (D)TLS does not protect application data between the server and the
+ peer. If confidentiality of application data is important, then the
+ application should encrypt or otherwise protect its data. For
+ example, for real-time media, confidentiality can be provided by
+ using SRTP.
+
+21.1.7. TURN Loop Attack
+
+ An attacker might attempt to cause data packets to loop indefinitely
+ between two TURN servers. The attack goes as follows: first, the
+ attacker sends an Allocate request to server A using the 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 ability to
+ either view or guess the contents of this response so that the
+ attacker can learn the allocated relayed transport address. 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 or
+ guess the contents of the response so it can learn the allocated
+ relayed transport address. Using the same spoofed source address
+ technique, the attacker then binds a channel number on server A to
+ the relayed transport address on server B and similarly binds the
+ same channel number on server B to the relayed transport address on
+ server A. Finally, the attacker sends a ChannelData message to
+ server A.
+
+ The result is a data packet that loops from the relayed transport
+ address on server A to the relayed transport address on server B,
+ then from server B's transport address to server A's transport
+ address, and then around the loop again.
+
+ This attack is mitigated as follows: by requiring all requests to be
+ authenticated and/or by randomizing the port number allocated for the
+ relayed transport address, the server forces the attacker to either
+ intercept or view responses sent to a third party (in this case, the
+ other server) so that the attacker can authenticate the requests and
+ learn the relayed transport address. Without one of these two
+ measures, an attacker can guess the contents of the responses without
+ needing to see them, which makes the attack much easier to perform.
+ Furthermore, by requiring authenticated requests, the server forces
+ the attacker to have credentials acceptable to the server, which
+ turns this from an outsider attack into an insider attack and allows
+ the attack to be traced back to the client initiating it.
+
+ The attack can be further mitigated by imposing a per-username limit
+ on the bandwidth used to relay data by allocations owned by that
+ username to limit the impact of this attack on other allocations.
+ More mitigation can be achieved by decrementing the TTL when relaying
+ data packets (if the underlying OS allows this).
+
+21.2. Firewall Considerations
+
+ A key security consideration of TURN is that TURN should not weaken
+ the protections afforded by firewalls deployed between a client and a
+ TURN server. It is anticipated that TURN servers will often be
+ present on the public Internet, and clients may often be inside
+ enterprise networks with corporate firewalls. If TURN servers
+ provide a "backdoor" for reaching into the enterprise, TURN will be
+ blocked by these firewalls.
+
+ TURN servers therefore emulate the behavior of NAT devices that
+ implement address-dependent filtering [RFC4787], a property common in
+ many firewalls as well. When a NAT or firewall 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 IP address
+ and port had recently sent a packet to that outside IP address. TURN
+ servers introduce the concept of permissions, which 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 towards the
+ client, unless the client has tried to contact the attacker first.
+
+ It is important to note that some firewalls have policies that are
+ even more restrictive than address-dependent filtering. Firewalls
+ can also be configured with address- and port-dependent filtering, or
+ they can be configured to disallow inbound traffic entirely. In
+ these cases, if a client is allowed to connect the TURN server,
+ communications to the client will be less restrictive than what the
+ firewall would normally allow.
+
+21.2.1. Faked Permissions
+
+ In firewalls and NAT devices, permissions are granted implicitly
+ through the traversal of a packet from the inside of the network
+ towards the outside peer. Thus, a permission cannot, by definition,
+ be created by any entity except one inside the firewall or NAT. With
+ TURN, this restriction no longer holds. Since the TURN server sits
+ outside the firewall, an attacker outside the firewall can now send a
+ message to the TURN server and try to create a permission for itself.
+
+ This attack is prevented because all messages that create permissions
+ (i.e., ChannelBind and CreatePermission) are authenticated.
+
+21.2.2. Blacklisted IP Addresses
+
+ Many firewalls can be configured with blacklists that prevent a
+ client behind the firewall from sending packets to, or receiving
+ packets from, ranges of blacklisted IP addresses. This is
+ accomplished by inspecting the source and destination addresses of
+ packets entering and exiting the firewall, respectively.
+
+ This feature is also present in TURN since TURN servers are allowed
+ to arbitrarily restrict the range of addresses of peers that they
+ will relay to.
+
+21.2.3. Running Servers on Well-Known Ports
+
+ A malicious client behind a firewall might try to connect to 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.
+
+ This is not possible in TURN. A TURN server will never accept
+ traffic from a peer for which the client has not installed a
+ permission. Thus, peers cannot just connect to the allocated port in
+ order to obtain the service.
+
+21.3. Insider Attacks
+
+ In insider attacks, a client has legitimate credentials but defies
+ the trust relationship that goes with those credentials. These
+ attacks cannot be prevented by cryptographic means but need to be
+ considered in the design of the protocol.
+
+21.3.1. DoS against TURN Server
+
+ A client wishing to disrupt service to other clients might obtain an
+ allocation and then flood it with traffic in an attempt to swamp the
+ server and prevent it from servicing other legitimate clients. This
+ is mitigated by the recommendation that the server limit the 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 allows the
+ server to immediately discard traffic in excess.
+
+ 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
+ attacker might attempt to consume all of them by requesting a large
+ number of allocations. This is prevented by the recommendation that
+ the server impose a limit on the number of allocations active at a
+ time for a given username.
+
+21.3.2. Anonymous Relaying of Malicious Traffic
+
+ TURN servers provide a degree of anonymization. A client can send
+ data to peers without revealing its own IP address. TURN servers may
+ therefore become attractive vehicles for attackers to launch attacks
+ against targets without fear of detection. Indeed, it is possible
+ for a client to chain together multiple TURN servers such that any
+ number of relays can be used before a target receives a packet.
+
+ Administrators who are worried about this attack can maintain logs
+ that capture the actual source IP and port of the client and perhaps
+ even every permission that client installs. This will allow for
+ forensic tracing to determine the original source should it be
+ discovered that an attack is being relayed through a TURN server.
+
+21.3.3. Manipulating Other Allocations
+
+ An attacker might attempt to disrupt service to other users of the
+ TURN server by sending Refresh requests or CreatePermission requests
+ that (through source address spoofing) appear to be coming from
+ another user of the TURN server. TURN prevents this by requiring
+ that the credentials used in CreatePermission, Refresh, and
+ ChannelBind messages match those used to create the initial
+ allocation. Thus, the fake requests from the attacker will be
+ rejected.
+
+21.4. Tunnel Amplification Attack
+
+ An attacker might attempt to cause data packets to loop numerous
+ times between a TURN server and a tunnel between IPv4 and IPv6. The
+ attack goes as follows:
+
+ Suppose an attacker knows that a tunnel endpoint will forward
+ encapsulated packets from a given IPv6 address (this doesn't
+ necessarily need to be the tunnel endpoint's address). Suppose he
+ then spoofs two packets from this address:
+
+ 1. An Allocate request asking for a v4 address, and
+
+ 2. A ChannelBind request establishing a channel to the IPv4 address
+ of the tunnel endpoint.
+
+ Then, he has set up an amplification attack:
+
+ * The TURN server will re-encapsulate IPv6 UDP data in v4 and send
+ it to the tunnel endpoint.
+
+ * The tunnel endpoint will de-encapsulate packets from the v4
+ interface and send them to v6.
+
+ So, if the attacker sends a packet of the following form:
+
+ IPv6: src=2001:DB8:1::1 dst=2001:DB8::2
+ UDP: <ports>
+ TURN: <channel id>
+ IPv6: src=2001:DB8:1::1 dst=2001:DB8::2
+ UDP: <ports>
+ TURN: <channel id>
+ IPv6: src=2001:DB8:1::1 dst=2001:DB8::2
+ UDP: <ports>
+ TURN: <channel id>
+ ...
+
+ Figure 19
+
+ then the TURN server and the tunnel endpoint will send it back and
+ forth until the last TURN header is consumed, at which point the TURN
+ server will send an empty packet that the tunnel endpoint will drop.
+
+ 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
+ out of a 1500-byte packet is possible. But, the attacker could still
+ increase traffic volume by sending multiple packets or by
+ establishing multiple channels spoofed from different addresses
+ behind the same tunnel endpoint.
+
+ The attack is mitigated as follows. It is RECOMMENDED that TURN
+ servers not accept allocation or channel-binding requests from
+ 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 these requests.
+
+21.5. Other Considerations
+
+ Any relay addresses learned through an Allocate request will not
+ operate properly with IPsec Authentication Header (AH) [RFC4302] in
+ transport or tunnel mode. However, tunnel-mode IPsec Encapsulating
+ Security Payload (ESP) [RFC4303] should still operate.
+
+22. IANA Considerations
+
+ The code points for the STUN methods defined in this specification
+ are listed in Section 17. IANA has updated the references from
+ [RFC5766] to this document (for the STUN methods listed in
+ Section 17).
+
+ The code points for the STUN attributes defined in this specification
+ are listed in Section 18. IANA has updated the references from
+ [RFC5766] to this document (for the STUN attributes CHANNEL-NUMBER,
+ LIFETIME, Reserved (was BANDWIDTH), XOR-PEER-ADDRESS, DATA, XOR-
+ RELAYED-ADDRESS, REQUESTED-ADDRESS-FAMILY, EVEN-PORT, REQUESTED-
+ TRANSPORT, DONT-FRAGMENT, Reserved (was TIMER-VAL), and RESERVATION-
+ TOKEN listed in Section 18).
+
+ The code points for the STUN error codes defined in this
+ specification are listed in Section 19. IANA has updated the
+ references from [RFC5766] and [RFC6156] to this document (for the
+ STUN error codes listed in Section 19).
+
+ IANA has updated the references to [RFC5766] to this document for the
+ SRV service name of "turn" for TURN over UDP or TCP and the service
+ name of "turns" for TURN over (D)TLS.
+
+ IANA has created a registry for TURN channel numbers (the "Traversal
+ Using Relays around NAT (TURN) Channel Numbers" registry), initially
+ populated as follows:
+
+ +------------------------+------------------------------------------+
+ | 0x0000 through | Reserved and not available for use since |
+ | 0x3FFF: | they conflict with the STUN header. |
+ +------------------------+------------------------------------------+
+ | 0x4000 through | A TURN implementation is free to use |
+ | 0x4FFF: | channel numbers in this range. |
+ +------------------------+------------------------------------------+
+ | 0x5000 through | Reserved (For DTLS-SRTP multiplexing |
+ | 0xFFFF: | collision avoidance, see [RFC7983]) |
+ +------------------------+------------------------------------------+
+
+ Table 6
+
+ Any change to this registry must be made through an IETF Standards
+ Action.
+
+23. IAB Considerations
+
+ The IAB has studied the problem of Unilateral Self-Address Fixing
+ (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
+ through a collaborative protocol reflection mechanism [RFC3424]. The
+ TURN extension is an example of a protocol that performs this type of
+ function. The IAB has mandated that any protocols developed for this
+ purpose document a specific set of considerations. These
+ considerations and the responses for TURN are documented in this
+ section.
+
+ Consideration 1: Precise definition of a specific, limited-scope
+ problem that is to be solved with the UNSAF proposal. A short-term
+ fix should not be generalized to solve other problems. Such
+ generalizations lead to the prolonged dependence on and usage of the
+ supposed short-term fix, meaning that it is no longer accurate to
+ call it "short-term".
+
+ Response: TURN is a protocol for communication between a relay (=
+ 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 convenience to the client, TURN also allows the client to determine
+ its server-reflexive transport address.
+
+ Consideration 2: Description of an exit strategy/transition plan.
+ The better short-term fixes are the ones that will naturally see less
+ and less use as the appropriate technology is deployed.
+
+ 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 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 the mapping property of Endpoint-Independent Mapping [RFC4787]
+ increases.
+
+ Consideration 3: Discussion of specific issues that may render
+ systems more "brittle". For example, approaches that involve using
+ data at multiple network layers create more dependencies, increase
+ debugging challenges, and make it harder to transition.
+
+ Response: TURN is "brittle" in that it requires the NAT bindings
+ between the client and the server to be maintained unchanged for the
+ 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 longer exchange data with its peers.
+
+ Consideration 4: Identify requirements for longer-term, sound
+ technical solutions; contribute to the process of finding the right
+ longer-term solution.
+
+ Response: The need for TURN will be reduced once NATs implement the
+ recommendations for NAT UDP behavior documented in [RFC4787].
+ Applications are also strongly urged to use ICE [RFC8445] to
+ communicate with peers; though ICE uses TURN, it does so only as a
+ last resort, and it uses it in a controlled manner.
+
+ Consideration 5: Discussion of the impact of the noted practical
+ issues with existing deployed NATs and experience reports.
+
+ Response: Some NATs deployed today exhibit a mapping behavior other
+ than Endpoint-Independent mapping. These NATs are difficult to work
+ with, as they make it difficult or impossible for protocols like ICE
+ to 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 "UDP hole punching" techniques [RFC5128] do not work.
+
+24. Changes since RFC 5766
+
+ This section lists the major changes in the TURN protocol from the
+ original [RFC5766] specification.
+
+ * IPv6 support.
+
+ * REQUESTED-ADDRESS-FAMILY attribute.
+
+ * Description of the tunnel amplification attack.
+
+ * DTLS support.
+
+ * Add support for receiving ICMP packets.
+
+ * Updates PMTUD.
+
+ * Discovery of TURN server.
+
+ * TURN URI Scheme Semantics.
+
+ * Happy Eyeballs for TURN.
+
+ * Align with the changes in STUN [RFC8489].
+
+25. Updates to RFC 6156
+
+ This section lists the major updates to [RFC6156] in this
+ specification.
+
+ * ADDITIONAL-ADDRESS-FAMILY and ADDRESS-ERROR-CODE attributes.
+
+ * 440 (Address Family not Supported) and 443 (Peer Address Family
+ Mismatch) responses.
+
+ * More details on packet translation.
+
+ * TCP-to-UDP and UDP-to-TCP relaying.
+
+26. References
+
+26.1. Normative References
+
+ [PROTOCOL-NUMBERS]
+ IANA, "Protocol Numbers",
+ <https://www.iana.org/assignments/protocol-numbers>.
+
+ [RFC0792] Postel, J., "Internet Control Message Protocol", STD 5,
+ RFC 792, DOI 10.17487/RFC0792, September 1981,
+ <https://www.rfc-editor.org/info/rfc792>.
+
+ [RFC1122] Braden, R., Ed., "Requirements for Internet Hosts -
+ Communication Layers", STD 3, RFC 1122,
+ DOI 10.17487/RFC1122, October 1989,
+ <https://www.rfc-editor.org/info/rfc1122>.
+
+ [RFC2119] Bradner, S., "Key words for use in RFCs to Indicate
+ Requirement Levels", BCP 14, RFC 2119,
+ DOI 10.17487/RFC2119, March 1997,
+ <https://www.rfc-editor.org/info/rfc2119>.
+
+ [RFC2474] Nichols, K., Blake, S., Baker, F., and D. Black,
+ "Definition of the Differentiated Services Field (DS
+ Field) in the IPv4 and IPv6 Headers", RFC 2474,
+ DOI 10.17487/RFC2474, December 1998,
+ <https://www.rfc-editor.org/info/rfc2474>.
+
+ [RFC3168] Ramakrishnan, K., Floyd, S., and D. Black, "The Addition
+ of Explicit Congestion Notification (ECN) to IP",
+ RFC 3168, DOI 10.17487/RFC3168, September 2001,
+ <https://www.rfc-editor.org/info/rfc3168>.
+
+ [RFC3629] Yergeau, F., "UTF-8, a transformation format of ISO
+ 10646", STD 63, RFC 3629, DOI 10.17487/RFC3629, November
+ 2003, <https://www.rfc-editor.org/info/rfc3629>.
+
+ [RFC4443] Conta, A., Deering, S., and M. Gupta, Ed., "Internet
+ Control Message Protocol (ICMPv6) for the Internet
+ Protocol Version 6 (IPv6) Specification", STD 89,
+ RFC 4443, DOI 10.17487/RFC4443, March 2006,
+ <https://www.rfc-editor.org/info/rfc4443>.
+
+ [RFC6347] Rescorla, E. and N. Modadugu, "Datagram Transport Layer
+ Security Version 1.2", RFC 6347, DOI 10.17487/RFC6347,
+ January 2012, <https://www.rfc-editor.org/info/rfc6347>.
+
+ [RFC6437] Amante, S., Carpenter, B., Jiang, S., and J. Rajahalme,
+ "IPv6 Flow Label Specification", RFC 6437,
+ DOI 10.17487/RFC6437, November 2011,
+ <https://www.rfc-editor.org/info/rfc6437>.
+
+ [RFC7065] Petit-Huguenin, M., Nandakumar, S., Salgueiro, G., and P.
+ Jones, "Traversal Using Relays around NAT (TURN) Uniform
+ Resource Identifiers", RFC 7065, DOI 10.17487/RFC7065,
+ November 2013, <https://www.rfc-editor.org/info/rfc7065>.
+
+ [RFC7350] Petit-Huguenin, M. and G. Salgueiro, "Datagram Transport
+ Layer Security (DTLS) as Transport for Session Traversal
+ Utilities for NAT (STUN)", RFC 7350, DOI 10.17487/RFC7350,
+ August 2014, <https://www.rfc-editor.org/info/rfc7350>.
+
+ [RFC7525] Sheffer, Y., Holz, R., and P. Saint-Andre,
+ "Recommendations for Secure Use of Transport Layer
+ Security (TLS) and Datagram Transport Layer Security
+ (DTLS)", BCP 195, RFC 7525, DOI 10.17487/RFC7525, May
+ 2015, <https://www.rfc-editor.org/info/rfc7525>.
+
+ [RFC7915] Bao, C., Li, X., Baker, F., Anderson, T., and F. Gont,
+ "IP/ICMP Translation Algorithm", RFC 7915,
+ DOI 10.17487/RFC7915, June 2016,
+ <https://www.rfc-editor.org/info/rfc7915>.
+
+ [RFC7982] Martinsen, P., Reddy, T., Wing, D., and V. Singh,
+ "Measurement of Round-Trip Time and Fractional Loss Using
+ Session Traversal Utilities for NAT (STUN)", RFC 7982,
+ DOI 10.17487/RFC7982, September 2016,
+ <https://www.rfc-editor.org/info/rfc7982>.
+
+ [RFC8174] Leiba, B., "Ambiguity of Uppercase vs Lowercase in RFC
+ 2119 Key Words", BCP 14, RFC 8174, DOI 10.17487/RFC8174,
+ May 2017, <https://www.rfc-editor.org/info/rfc8174>.
+
+ [RFC8200] Deering, S. and R. Hinden, "Internet Protocol, Version 6
+ (IPv6) Specification", STD 86, RFC 8200,
+ DOI 10.17487/RFC8200, July 2017,
+ <https://www.rfc-editor.org/info/rfc8200>.
+
+ [RFC8305] Schinazi, D. and T. Pauly, "Happy Eyeballs Version 2:
+ Better Connectivity Using Concurrency", RFC 8305,
+ DOI 10.17487/RFC8305, December 2017,
+ <https://www.rfc-editor.org/info/rfc8305>.
+
+ [RFC8446] Rescorla, E., "The Transport Layer Security (TLS) Protocol
+ Version 1.3", RFC 8446, DOI 10.17487/RFC8446, August 2018,
+ <https://www.rfc-editor.org/info/rfc8446>.
+
+ [RFC8489] Petit-Huguenin, M., Salgueiro, G., Rosenberg, J., Wing,
+ D., Mahy, R., and P. Matthews, "Session Traversal
+ Utilities for NAT (STUN)", RFC 8489, DOI 10.17487/RFC8489,
+ February 2020, <https://www.rfc-editor.org/info/rfc8489>.
+
+26.2. Informative References
+
+ [FRAG-FRAGILE]
+ Bonica, R., Baker, F., Huston, G., Hinden, R., Troan, O.,
+ and F. Gont, "IP Fragmentation Considered Fragile", Work
+ in Progress, Internet-Draft, draft-ietf-intarea-frag-
+ fragile-17, 30 September 2019,
+ <https://tools.ietf.org/html/draft-ietf-intarea-frag-
+ fragile-17>.
+
+ [FRAG-HARMFUL]
+ Kent, C. and J. Mogul, "Fragmentation Considered Harmful",
+ December 1987, <https://www.hpl.hp.com/techreports/Compaq-
+ DEC/WRL-87-3.pdf>.
+
+ [MTU-DATAGRAM]
+ Fairhurst, G., Jones, T., Tuexen, M., Ruengeler, I., and
+ T. Voelker, "Packetization Layer Path MTU Discovery for
+ Datagram Transports", Work in Progress, Internet-Draft,
+ draft-ietf-tsvwg-datagram-plpmtud-14, 12 February 2020,
+ <https://tools.ietf.org/html/draft-ietf-tsvwg-datagram-
+ plpmtud-14>.
+
+ [MTU-STUN] Petit-Huguenin, M., Salgueiro, G., and F. Garrido,
+ "Packetization Layer Path MTU Discovery (PLMTUD) For UDP
+ Transports Using Session Traversal Utilities for NAT
+ (STUN)", Work in Progress, Internet-Draft, draft-ietf-
+ tram-stun-pmtud-15, 17 December 2019,
+ <https://tools.ietf.org/html/draft-ietf-tram-stun-pmtud-
+ 15>.
+
+ [PORT-NUMBERS]
+ IANA, "Service Name and Transport Protocol Port Number
+ Registry",
+ <https://www.iana.org/assignments/port-numbers>.
+
+ [RFC0791] Postel, J., "Internet Protocol", STD 5, RFC 791,
+ DOI 10.17487/RFC0791, September 1981,
+ <https://www.rfc-editor.org/info/rfc791>.
+
+ [RFC1191] Mogul, J. and S. Deering, "Path MTU discovery", RFC 1191,
+ DOI 10.17487/RFC1191, November 1990,
+ <https://www.rfc-editor.org/info/rfc1191>.
+
+ [RFC1918] Rekhter, Y., Moskowitz, B., Karrenberg, D., de Groot, G.
+ J., and E. Lear, "Address Allocation for Private
+ Internets", BCP 5, RFC 1918, DOI 10.17487/RFC1918,
+ February 1996, <https://www.rfc-editor.org/info/rfc1918>.
+
+ [RFC1928] Leech, M., Ganis, M., Lee, Y., Kuris, R., Koblas, D., and
+ L. Jones, "SOCKS Protocol Version 5", RFC 1928,
+ DOI 10.17487/RFC1928, March 1996,
+ <https://www.rfc-editor.org/info/rfc1928>.
+
+ [RFC3261] Rosenberg, J., Schulzrinne, H., Camarillo, G., Johnston,
+ A., Peterson, J., Sparks, R., Handley, M., and E.
+ Schooler, "SIP: Session Initiation Protocol", RFC 3261,
+ DOI 10.17487/RFC3261, June 2002,
+ <https://www.rfc-editor.org/info/rfc3261>.
+
+ [RFC3424] Daigle, L., Ed. and IAB, "IAB Considerations for
+ UNilateral Self-Address Fixing (UNSAF) Across Network
+ Address Translation", RFC 3424, DOI 10.17487/RFC3424,
+ November 2002, <https://www.rfc-editor.org/info/rfc3424>.
+
+ [RFC3550] Schulzrinne, H., Casner, S., Frederick, R., and V.
+ Jacobson, "RTP: A Transport Protocol for Real-Time
+ Applications", STD 64, RFC 3550, DOI 10.17487/RFC3550,
+ July 2003, <https://www.rfc-editor.org/info/rfc3550>.
+
+ [RFC3711] Baugher, M., McGrew, D., Naslund, M., Carrara, E., and K.
+ Norrman, "The Secure Real-time Transport Protocol (SRTP)",
+ RFC 3711, DOI 10.17487/RFC3711, March 2004,
+ <https://www.rfc-editor.org/info/rfc3711>.
+
+ [RFC4086] Eastlake 3rd, D., Schiller, J., and S. Crocker,
+ "Randomness Requirements for Security", BCP 106, RFC 4086,
+ DOI 10.17487/RFC4086, June 2005,
+ <https://www.rfc-editor.org/info/rfc4086>.
+
+ [RFC4302] Kent, S., "IP Authentication Header", RFC 4302,
+ DOI 10.17487/RFC4302, December 2005,
+ <https://www.rfc-editor.org/info/rfc4302>.
+
+ [RFC4303] Kent, S., "IP Encapsulating Security Payload (ESP)",
+ RFC 4303, DOI 10.17487/RFC4303, December 2005,
+ <https://www.rfc-editor.org/info/rfc4303>.
+
+ [RFC4787] Audet, F., Ed. and C. Jennings, "Network Address
+ Translation (NAT) Behavioral Requirements for Unicast
+ UDP", BCP 127, RFC 4787, DOI 10.17487/RFC4787, January
+ 2007, <https://www.rfc-editor.org/info/rfc4787>.
+
+ [RFC4821] Mathis, M. and J. Heffner, "Packetization Layer Path MTU
+ Discovery", RFC 4821, DOI 10.17487/RFC4821, March 2007,
+ <https://www.rfc-editor.org/info/rfc4821>.
+
+ [RFC5128] Srisuresh, P., Ford, B., and D. Kegel, "State of Peer-to-
+ Peer (P2P) Communication across Network Address
+ Translators (NATs)", RFC 5128, DOI 10.17487/RFC5128, March
+ 2008, <https://www.rfc-editor.org/info/rfc5128>.
+
+ [RFC5482] Eggert, L. and F. Gont, "TCP User Timeout Option",
+ RFC 5482, DOI 10.17487/RFC5482, March 2009,
+ <https://www.rfc-editor.org/info/rfc5482>.
+
+ [RFC5766] Mahy, R., Matthews, P., and J. Rosenberg, "Traversal Using
+ Relays around NAT (TURN): Relay Extensions to Session
+ Traversal Utilities for NAT (STUN)", RFC 5766,
+ DOI 10.17487/RFC5766, April 2010,
+ <https://www.rfc-editor.org/info/rfc5766>.
+
+ [RFC5925] Touch, J., Mankin, A., and R. Bonica, "The TCP
+ Authentication Option", RFC 5925, DOI 10.17487/RFC5925,
+ June 2010, <https://www.rfc-editor.org/info/rfc5925>.
+
+ [RFC5928] Petit-Huguenin, M., "Traversal Using Relays around NAT
+ (TURN) Resolution Mechanism", RFC 5928,
+ DOI 10.17487/RFC5928, August 2010,
+ <https://www.rfc-editor.org/info/rfc5928>.
+
+ [RFC6056] Larsen, M. and F. Gont, "Recommendations for Transport-
+ Protocol Port Randomization", BCP 156, RFC 6056,
+ DOI 10.17487/RFC6056, January 2011,
+ <https://www.rfc-editor.org/info/rfc6056>.
+
+ [RFC6062] Perreault, S., Ed. and J. Rosenberg, "Traversal Using
+ Relays around NAT (TURN) Extensions for TCP Allocations",
+ RFC 6062, DOI 10.17487/RFC6062, November 2010,
+ <https://www.rfc-editor.org/info/rfc6062>.
+
+ [RFC6156] Camarillo, G., Novo, O., and S. Perreault, Ed., "Traversal
+ Using Relays around NAT (TURN) Extension for IPv6",
+ RFC 6156, DOI 10.17487/RFC6156, April 2011,
+ <https://www.rfc-editor.org/info/rfc6156>.
+
+ [RFC6263] Marjou, X. and A. Sollaud, "Application Mechanism for
+ Keeping Alive the NAT Mappings Associated with RTP / RTP
+ Control Protocol (RTCP) Flows", RFC 6263,
+ DOI 10.17487/RFC6263, June 2011,
+ <https://www.rfc-editor.org/info/rfc6263>.
+
+ [RFC7413] Cheng, Y., Chu, J., Radhakrishnan, S., and A. Jain, "TCP
+ Fast Open", RFC 7413, DOI 10.17487/RFC7413, December 2014,
+ <https://www.rfc-editor.org/info/rfc7413>.
+
+ [RFC7478] Holmberg, C., Hakansson, S., and G. Eriksson, "Web Real-
+ Time Communication Use Cases and Requirements", RFC 7478,
+ DOI 10.17487/RFC7478, March 2015,
+ <https://www.rfc-editor.org/info/rfc7478>.
+
+ [RFC7635] Reddy, T., Patil, P., Ravindranath, R., and J. Uberti,
+ "Session Traversal Utilities for NAT (STUN) Extension for
+ Third-Party Authorization", RFC 7635,
+ DOI 10.17487/RFC7635, August 2015,
+ <https://www.rfc-editor.org/info/rfc7635>.
+
+ [RFC7657] Black, D., Ed. and P. Jones, "Differentiated Services
+ (Diffserv) and Real-Time Communication", RFC 7657,
+ DOI 10.17487/RFC7657, November 2015,
+ <https://www.rfc-editor.org/info/rfc7657>.
+
+ [RFC7983] Petit-Huguenin, M. and G. Salgueiro, "Multiplexing Scheme
+ Updates for Secure Real-time Transport Protocol (SRTP)
+ Extension for Datagram Transport Layer Security (DTLS)",
+ RFC 7983, DOI 10.17487/RFC7983, September 2016,
+ <https://www.rfc-editor.org/info/rfc7983>.
+
+ [RFC8155] Patil, P., Reddy, T., and D. Wing, "Traversal Using Relays
+ around NAT (TURN) Server Auto Discovery", RFC 8155,
+ DOI 10.17487/RFC8155, April 2017,
+ <https://www.rfc-editor.org/info/rfc8155>.
+
+ [RFC8311] Black, D., "Relaxing Restrictions on Explicit Congestion
+ Notification (ECN) Experimentation", RFC 8311,
+ DOI 10.17487/RFC8311, January 2018,
+ <https://www.rfc-editor.org/info/rfc8311>.
+
+ [RFC8445] Keranen, A., Holmberg, C., and J. Rosenberg, "Interactive
+ Connectivity Establishment (ICE): A Protocol for Network
+ Address Translator (NAT) Traversal", RFC 8445,
+ DOI 10.17487/RFC8445, July 2018,
+ <https://www.rfc-editor.org/info/rfc8445>.
+
+ [SDP-ICE] Petit-Huguenin, M., Nandakumar, S., Holmberg, C., Keranen,
+ A., and R. Shpount, "Session Description Protocol (SDP)
+ Offer/Answer procedures for Interactive Connectivity
+ Establishment (ICE)", Work in Progress, Internet-Draft,
+ draft-ietf-mmusic-ice-sip-sdp-39, 13 August 2019,
+ <https://tools.ietf.org/html/draft-ietf-mmusic-ice-sip-
+ sdp-39>.
+
+ [SEC-WEBRTC]
+ Rescorla, E., "Security Considerations for WebRTC", Work
+ in Progress, Internet-Draft, draft-ietf-rtcweb-security-
+ 12, 5 July 2019, <https://tools.ietf.org/html/draft-ietf-
+ rtcweb-security-12>.
+
+ [TCP-EXT] Ford, A., Raiciu, C., Handley, M., Bonaventure, O., and C.
+ Paasch, "TCP Extensions for Multipath Operation with
+ Multiple Addresses", Work in Progress, Internet-Draft,
+ draft-ietf-mptcp-rfc6824bis-18, 8 June 2019,
+ <https://tools.ietf.org/html/draft-ietf-mptcp-rfc6824bis-
+ 18>.
+
+ [UDP-OPT] Touch, J., "Transport Options for UDP", Work in Progress,
+ Internet-Draft, draft-ietf-tsvwg-udp-options-08, 12
+ September 2019, <https://tools.ietf.org/html/draft-ietf-
+ tsvwg-udp-options-08>.
+
+Acknowledgements
+
+ Most of the text in this note comes from the original TURN
+ specification, [RFC5766]. The authors would like to thank Rohan
+ Mahy, coauthor of the original TURN specification, and everyone who
+ had contributed to that document. The authors would also like to
+ acknowledge that this document inherits material from [RFC6156].
+
+ Thanks to Justin Uberti, Pal Martinsen, Oleg Moskalenko, Aijun Wang,
+ and Simon Perreault for their help on the ADDITIONAL-ADDRESS-FAMILY
+ mechanism. The 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, Eric Vyncke, Adam Roach,
+ Suresh Krishnan, Mirja Kuehlewind, Benjamin Kaduk, and Oleg
+ Moskalenko for comments and review. The authors would like to thank
+ Marc Petit-Huguenin for his contributions to the text.
+
+ Special thanks to Magnus Westerlund for the detailed AD review.
+
+Authors' Addresses
+
+ Tirumaleswar Reddy (editor)
+ McAfee, Inc.
+ Embassy Golf Link Business Park
+ Bangalore 560071
+ Karnataka
+ India
+
+ Email: kondtir@gmail.com
+
+
+ Alan Johnston (editor)
+ Villanova University
+ Villanova, PA
+ United States of America
+
+ Email: alan.b.johnston@gmail.com
+
+
+ Philip Matthews
+ Alcatel-Lucent
+ 600 March Road
+ Ottawa Ontario
+ Canada
+
+ Email: philip_matthews@magma.ca
+
+
+ Jonathan Rosenberg
+ jdrosen.net
+ Edison, NJ
+ United States of America
+
+ Email: jdrosen@jdrosen.net
+ URI: http://www.jdrosen.net