-
Notifications
You must be signed in to change notification settings - Fork 0
/
draft-ietf-tram-turnbis-28.xml
4412 lines (3704 loc) · 229 KB
/
draft-ietf-tram-turnbis-28.xml
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
490
491
492
493
494
495
496
497
498
499
500
501
502
503
504
505
506
507
508
509
510
511
512
513
514
515
516
517
518
519
520
521
522
523
524
525
526
527
528
529
530
531
532
533
534
535
536
537
538
539
540
541
542
543
544
545
546
547
548
549
550
551
552
553
554
555
556
557
558
559
560
561
562
563
564
565
566
567
568
569
570
571
572
573
574
575
576
577
578
579
580
581
582
583
584
585
586
587
588
589
590
591
592
593
594
595
596
597
598
599
600
601
602
603
604
605
606
607
608
609
610
611
612
613
614
615
616
617
618
619
620
621
622
623
624
625
626
627
628
629
630
631
632
633
634
635
636
637
638
639
640
641
642
643
644
645
646
647
648
649
650
651
652
653
654
655
656
657
658
659
660
661
662
663
664
665
666
667
668
669
670
671
672
673
674
675
676
677
678
679
680
681
682
683
684
685
686
687
688
689
690
691
692
693
694
695
696
697
698
699
700
701
702
703
704
705
706
707
708
709
710
711
712
713
714
715
716
717
718
719
720
721
722
723
724
725
726
727
728
729
730
731
732
733
734
735
736
737
738
739
740
741
742
743
744
745
746
747
748
749
750
751
752
753
754
755
756
757
758
759
760
761
762
763
764
765
766
767
768
769
770
771
772
773
774
775
776
777
778
779
780
781
782
783
784
785
786
787
788
789
790
791
792
793
794
795
796
797
798
799
800
801
802
803
804
805
806
807
808
809
810
811
812
813
814
815
816
817
818
819
820
821
822
823
824
825
826
827
828
829
830
831
832
833
834
835
836
837
838
839
840
841
842
843
844
845
846
847
848
849
850
851
852
853
854
855
856
857
858
859
860
861
862
863
864
865
866
867
868
869
870
871
872
873
874
875
876
877
878
879
880
881
882
883
884
885
886
887
888
889
890
891
892
893
894
895
896
897
898
899
900
901
902
903
904
905
906
907
908
909
910
911
912
913
914
915
916
917
918
919
920
921
922
923
924
925
926
927
928
929
930
931
932
933
934
935
936
937
938
939
940
941
942
943
944
945
946
947
948
949
950
951
952
953
954
955
956
957
958
959
960
961
962
963
964
965
966
967
968
969
970
971
972
973
974
975
976
977
978
979
980
981
982
983
984
985
986
987
988
989
990
991
992
993
994
995
996
997
998
999
1000
<?xml version="1.0" encoding="US-ASCII"?>
<!DOCTYPE rfc SYSTEM "rfc2629.dtd">
<?rfc toc="yes"?>
<?rfc compact='yes'?>
<?rfc subcompact='no'?>
<?rfc symrefs="yes"?>
<rfc category="std" docName="draft-ietf-tram-turnbis-27" ipr="trust200902"
obsoletes="5766, 6156">
<front>
<title abbrev="TURN">Traversal Using Relays around NAT (TURN): Relay
Extensions to Session Traversal Utilities for NAT (STUN)</title>
<author fullname="Tirumaleswar Reddy" initials="T." role="editor"
surname="Reddy">
<organization abbrev="McAfee">McAfee, Inc.</organization>
<address>
<postal>
<street>Embassy Golf Link Business Park</street>
<city>Bangalore</city>
<region>Karnataka</region>
<code>560071</code>
<country>India</country>
</postal>
<email>[email protected]</email>
</address>
</author>
<author fullname="Alan Johnston" initials="A." role="editor"
surname="Johnston">
<organization>Villanova University</organization>
<address>
<postal>
<street></street>
<city>Villanova</city>
<region>PA</region>
<code></code>
<country>USA</country>
</postal>
<email>[email protected]</email>
</address>
</author>
<author fullname="Philip Matthews" initials="P." surname="Matthews">
<organization>Alcatel-Lucent</organization>
<address>
<postal>
<street>600 March Road</street>
<city>Ottawa</city>
<region>Ontario</region>
<code></code>
<country>Canada</country>
</postal>
<email>[email protected]</email>
</address>
</author>
<author fullname="Jonathan Rosenberg" initials="J." surname="Rosenberg">
<organization>jdrosen.net</organization>
<address>
<postal>
<street></street>
<city>Edison</city>
<region>NJ</region>
<country>USA</country>
</postal>
<email>[email protected]</email>
<uri>http://www.jdrosen.net</uri>
</address>
</author>
<date day="20" month="July" year="2019" />
<area>Transport</area>
<workgroup>TRAM WG</workgroup>
<keyword>NAT</keyword>
<keyword>TURN</keyword>
<keyword>STUN</keyword>
<keyword>ICEf</keyword>
<abstract>
<t>If a host is located behind a NAT, then in certain situations it can
be impossible for that host to communicate directly with other hosts
(peers). 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 TURN (Traversal Using
Relays around NAT), 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.</t>
<t>The TURN protocol was designed to be used as part of the ICE
(Interactive Connectivity Establishment) approach to NAT traversal,
though it also can be used without ICE.</t>
<t>This document obsoletes RFC 5766 and RFC 6156.</t>
</abstract>
</front>
<middle>
<section title="Introduction">
<t>A host behind a NAT may wish to exchange packets with other hosts,
some of which may also be behind NATs. To do this, the hosts involved
can use "hole punching" techniques (see <xref target="RFC5128"></xref>)
in an attempt 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.</t>
<t>As described in <xref target="RFC5128"></xref> and <xref
target="RFC4787"></xref>, 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" (Section 4.1 in <xref
target="RFC4787"></xref>), then hole punching techniques generally
fail.</t>
<t>When a direct communication path cannot be found, it is necessary to
use the services of an intermediate host that acts as a relay for the
packets. This relay typically sits in the public Internet and relays
packets between two hosts that both sit behind NATs.</t>
<t>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
to avoid forcing the media sessions through TCP, an Enterprise Firewall
can be configured to allow UDP traffic relayed through an Enterprise
relay server. This scenario is required to be supported by the WebRTC
requirements (Section 2.3.5.1 in <xref target="RFC7478"></xref>). In
addition, in a SIP or WebRTC call, if the user wants IP location privacy
from the peer then 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 in <xref
target="I-D.ietf-rtcweb-security"></xref>).</t>
<t>This specification defines a protocol, called TURN, that allows a
host behind a NAT (called the TURN client) to request that another host
(called the TURN server) act as a relay. The client can arrange for the
server to relay packets to and from certain other hosts (called peers)
and 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 client knows the peer from which the
transport protocol data was relayed by the server. If the server
receives an ICMP error packet, the server also relays certain layer 3/4
header fields from the ICMP header to the client. When the client sends
a packet to the server, the server relays the transport protocol data
from the packet to the intended peer using the relayed transport address
as the source.</t>
<t>A client using TURN must have some way to communicate the relayed
transport address to its peers, and to learn each peer's IP address and
port (more precisely, each peer's server-reflexive transport address,
see <xref target="sec-overview"></xref>). 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 <xref target="RFC5128"></xref> for more details).</t>
<t>If TURN is used with ICE <xref target="RFC8445"></xref>, 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 <xref target="RFC3261"></xref>, then SIP
serves the role of the rendezvous protocol, carrying the ICE candidate
information inside the body of SIP messages <xref
target="I-D.ietf-mmusic-ice-sip-sdp"></xref>. If TURN and ICE are used
with some other rendezvous protocol, then ICE provides guidance on the
services the rendezvous protocol must perform.</t>
<t>Though the use of a TURN server to enable communication between two
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.</t>
<t>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 <xref target="RFC1928"></xref>). However, care has been
taken to make sure that TURN is suitable for other types of
applications.</t>
<t>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.</t>
<t>TURN is an extension to the STUN (Session Traversal Utilities for
NAT) protocol <xref target="I-D.ietf-tram-stunbis"></xref>. Most, though
not all, TURN messages are STUN-formatted messages. A reader of this
document should be familiar with STUN.</t>
<t>The TURN specification was originally published as <xref
target="RFC5766"></xref>, which was updated by <xref
target="RFC6156"></xref> to add IPv6 support. This document supersedes
and obsoletes both <xref target="RFC5766"></xref> and <xref
target="RFC6156"></xref>.</t>
</section>
<section title="Terminology">
<t>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
<xref target="RFC2119"></xref><xref target="RFC8174"></xref> when, and
only when, they appear in all capitals, as shown here.</t>
<t>Readers are expected to be familiar with <xref
target="I-D.ietf-tram-stunbis"></xref> and the terms defined there.</t>
<t>The following terms are used in this document:</t>
<t><list style="hanging">
<t hangText="TURN:">The protocol spoken between a TURN client and a
TURN server. It is an extension to the STUN protocol <xref
target="I-D.ietf-tram-stunbis"></xref>. The protocol allows a client
to allocate and use a relayed transport address.</t>
<t hangText="TURN client:">A STUN client that implements this
specification.</t>
<t hangText="TURN server:">A STUN server that implements this
specification. It relays data between a TURN client and its
peer(s).</t>
<t hangText="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.</t>
<t hangText="Transport Address:">The combination of an IP address
and a port.</t>
<t hangText="Host Transport Address:">A transport address on a
client or a peer.</t>
<t hangText="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.</t>
<t hangText="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.</t>
<t hangText="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.</t>
<t hangText="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.</t>
<t hangText="Allocation:">The relayed transport address granted to a
client through an Allocate request, along with related state, such
as permissions and expiration timers.</t>
<t hangText="5-tuple:">The combination (client IP address and port,
server IP address and port, and transport protocol (currently one of
UDP, TCP, DTLS/UDP or TLS/TCP) used to communicate between the
client and the server. The 5-tuple uniquely identifies this
communication stream. The 5-tuple also uniquely identifies the
Allocation on the server.</t>
<t hangText="Transport Protocol:">The protocols 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, as well as their
combination with a security layer using DTLS and TLS
respectively.</t>
<t hangText="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.</t>
<t hangText="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.</t>
<t hangText="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.</t>
<t hangText="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.</t>
<t hangText="(D)TLS:">This term is used for statements that apply to
both Transport Layer Security <xref target="RFC8446"></xref> and
Datagram Transport Layer Security <xref
target="RFC6347"></xref>.</t>
</list></t>
</section>
<section anchor="sec-overview" title="Overview of Operation">
<t>This section gives an overview of the operation of TURN. It is
non-normative.</t>
<t>In a typical configuration, a TURN client is connected to a <xref
target="RFC1918">private network</xref> 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.</t>
<figure anchor="fig-turn-model">
<artwork><![CDATA[ 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
]]></artwork>
</figure>
<t></t>
<t><xref target="fig-turn-model"></xref> shows a typical deployment. In
this figure, the TURN client and the TURN server are separated by a NAT,
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 <xref target="RFC4787"></xref>).</t>
<t>The client talks to the server from a (IP address, port) combination
called the client's HOST TRANSPORT ADDRESS. (The combination of an IP
address and port is called a TRANSPORT ADDRESS.)</t>
<t>The client sends TURN messages from its host transport address to a
transport address on the TURN server that is known as the TURN SERVER
TRANSPORT ADDRESS. 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.</t>
<t>Since the client is behind a NAT, the server sees packets from the
client as coming from a transport address on the NAT itself. This
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.</t>
<t>The client uses TURN commands to create and manipulate an ALLOCATION
on the server. An allocation is a data structure on the server. This
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.</t>
<t>Once an allocation is created, the client can send application data
to the server along with an indication of to which peer the data is to
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.</t>
<t>When the peer is behind a NAT, then the client must identify the peer
using its server-reflexive transport address rather than its host
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).</t>
<t>Each allocation on the server belongs to a single client and has
exactly one or two relayed transport addresses that is 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.</t>
<t>The client may have multiple allocations on a server at the same
time.</t>
<section anchor="sec-transports" title="Transports">
<t>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.</t>
<texttable>
<ttcol align="center">TURN client to TURN server</ttcol>
<ttcol align="center">TURN server to peer</ttcol>
<c>UDP</c>
<c>UDP</c>
<c>TCP</c>
<c>UDP</c>
<c>TLS-over-TCP</c>
<c>UDP</c>
<c>DTLS-over-UDP</c>
<c>UDP</c>
</texttable>
<t>If TCP or TLS-over-TCP is used between the client and the server,
then the server will convert between these transports and UDP
transport when relaying data to/from the peer.</t>
<t>Since this version of TURN only supports UDP between the server and
the peer, it is expected that most clients will prefer to use UDP
between the client and the server as well. That being the case, some
readers may wonder: Why also support TCP and TLS-over-TCP?</t>
<t>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 in 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.</t>
<t>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, the cipher suites, server
certificate validation and authentication of TURN server are discussed
in Section 6.2.3 of <xref
target="I-D.ietf-tram-stunbis"> </xref>. The guidance given
in <xref target="RFC7525"></xref> MUST be followed to avoid attacks on
(D)TLS. TURN does not require (D)TLS because the overhead of using
(D)TLS is higher than that of digest authentication; for example,
using (D)TLS likely means that most application data will be doubly
encrypted (once by (D)TLS and once to ensure it is still encrypted in
the UDP datagram).</t>
<t>There is an extension to TURN for TCP transport between the server
and the peers <xref target="RFC6062"></xref>. For this reason,
allocations that use UDP between the server and the peers are known as
UDP allocations, while allocations that use TCP between the server and
the peers are known as TCP allocations. This specification describes
only UDP allocations.</t>
<t>In some applications for TURN, the client may send and receive
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 <xref
target="RFC7983"></xref>.</t>
</section>
<section title="Allocations">
<t>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 <xref
target="RFC7635"></xref>, to show that it is authorized to use the
server.</t>
<t>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.</t>
<t>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 0.</t>
<t>Both the server and client keep track of a value known as the
5-TUPLE. At the client, the 5-tuple consists of the client's host
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.</t>
<t>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).</t>
<t><list>
<t>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.</t>
</list></t>
<figure anchor="fig-allocate">
<artwork><![CDATA[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 --| | |
| | | |
]]></artwork>
<postamble></postamble>
</figure>
<t>In <xref target="fig-allocate"></xref>, 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 and thus sends a Refresh request to the server. The refresh
is accepted and the server replies with a Refresh success
response.</t>
</section>
<section anchor="sec-permission-overview" title="Permissions">
<t>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 <xref
target="RFC4787"></xref>.</t>
<t>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.</t>
<t>A permission expires after 5 minutes if it is not refreshed, and
there is no way to explicitly delete a permission. This behavior was
selected to match the behavior of a NAT that complies with <xref
target="RFC4787"></xref>.</t>
<t>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.</t>
<t>Note that permissions are within the context of an allocation, so
adding or expiring a permission in one allocation does not affect
other allocations.</t>
</section>
<section title="Send Mechanism">
<t>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.</t>
<t>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.</t>
<t>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.</t>
<t>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.</t>
<t>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 a 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.</t>
<t>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.</t>
<t>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 <xref
target="fate-data"></xref>.</t>
<figure anchor="fig-send-data">
<artwork><![CDATA[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 | | |
| | | |
]]></artwork>
<postamble></postamble>
</figure>
<t>In <xref target="fig-send-data"></xref>, the client has already
created an allocation and now wishes to send data to its peers. The
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.</t>
</section>
<section title="Channels">
<t>For some applications (e.g., Voice over IP), 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.</t>
<t>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 and thus serves as a shorthand for
the peer's host transport address.</t>
<t>To bind a channel to a peer, the client sends a ChannelBind request
to the server, and includes an unbound channel number and the
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.</t>
<t>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.</t>
<figure anchor="fig-channels">
<artwork><![CDATA[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 --| | |
| | | |
]]></artwork>
</figure>
<t><xref target="fig-channels"></xref> 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).</t>
<t>In the reverse direction, when Peer A sends a UDP datagram to the
relayed transport address, this UDP datagram arrives at the server on
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.</t>
<t>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.</t>
<t>Note that ChannelData messages can only be used for peers to which
the client has bound a channel. In the example above, Peer A has been
bound to a channel, but Peer B has not, so application data to and
from Peer B would use the Send mechanism.</t>
</section>
<section anchor="unpriv" title="Unprivileged TURN Servers">
<t>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.</t>
<t>This design decision has the following implications for data
relayed by a TURN server:<list style="symbols">
<t>The value of the Diffserv field may not be preserved across the
server;</t>
<t>The Time to Live (TTL) field may be reset, rather than
decremented, across the server;</t>
<t>The Explicit Congestion Notification (ECN) field may be reset
by the server;</t>
<t>There is no end-to-end fragmentation, since the packet is
re-assembled at the server.</t>
</list>Future work may specify alternate TURN semantics that address
these limitations.</t>
</section>
<section title="Avoiding IP Fragmentation">
<t>For reasons described in <xref target="Frag-Harmful"></xref>,
applications, especially those sending large volumes of data, should
avoid having their packets fragmented. <xref
target="I-D.ietf-intarea-frag-fragile"></xref> 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 use UDP fragmentation <xref
target="I-D.ietf-tsvwg-udp-options"></xref>. 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.</t>
<t>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.</t>
<t>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 (Voice-over-IP)
applications. In this approach, the application MUST assume a PMTU of
1280 bytes, as IPv6 requires that every link in the Internet have an
MTU of 1280 octets or greater as specified in <xref
target="RFC8200"></xref>. If IPv4 support on legacy or otherwise
unusual networks is a consideration, the application MAY assume on an
effective MTU of 576 bytes for IPv4 datagrams, as every IPv4 host must
be capable of receiving a packet whose length is equal to 576 bytes as
discussed in <xref target="RFC0791"></xref> and <xref
target="RFC1122"></xref>.</t>
<t>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.</t>
<t>As a guideline, sending a maximum of 500 bytes of application data
in a single TURN message (by the client on the client-to-server leg)
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.</t>
<t>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
<xref target="RFC1191"></xref> may not be able to discover the MTU of
the transmission path between the client and the peer since:</t>
<t><list>
<t>- a probe packet with DF bit in the IPv4 header set to test a
path for a larger MTU can be dropped by routers, or</t>
<t>- ICMP error messages can be dropped by middle boxes.</t>
</list></t>
<t>As a result, the client and server need to use a path MTU discovery
algorithm that does not require ICMP messages. The Packetized Path MTU
Discovery algorithm defined in <xref target="RFC4821"></xref> is one
such algorithm.</t>
<t><xref target="I-D.ietf-tram-stun-pmtud"></xref> is an
implementation of <xref target="RFC4821"></xref> that uses STUN to
discover the path MTU, and so 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 Don't Fragment (DF)
bit in the IPv4 header, it MUST reject the Allocate request with
DONT-FRAGMENT attribute.</t>
</section>
<section title="RTP Support">
<t>One of the envisioned uses of TURN is as a relay for clients and
peers wishing to exchange real-time data (e.g., voice or video) using
RTP. To facilitate the use of TURN for this purpose, TURN includes
some special support for older versions of RTP.</t>
<t>Old versions of RTP <xref target="RFC3550"></xref> 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 to optionally request
the server reserve the next-highest port number for a subsequent
allocation.</t>
</section>
<section title="Happy Eyeballs for TURN">
<t>If an IPv4 path to reach a TURN server is found, but the TURN
server's IPv6 path is not working, a dual-stack TURN client can
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 <xref target="RFC8305"></xref>. The TURN
client performs the following steps based on the transport protocol
being used to connect to the TURN server.</t>
<t><list style="symbols">
<t>For TCP or TLS-over-TCP, the results of the Happy Eyeballs
procedure <xref target="RFC8305"></xref> are used by the TURN
client for sending its TURN messages to the server.</t>
<t>For clear text UDP, send TURN Allocate requests to both IP
address families as discussed in <xref target="RFC8305"></xref>,
without authentication information. If the TURN server requires
authentication, it will send back a 401 unauthenticated response
and the TURN client uses the first UDP connection on which a 401
error response is received. If a 401 error response is received
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 <xref target="RFC8155"></xref>), it is
possible for both Allocate requests to succeed. In this case, the
TURN client sends a Refresh with LIFETIME value of 0 on the
allocation using the IP address family with lower precedence to
delete the allocation.</t>
<t>For DTLS over UDP, initiate DTLS handshake to both IP address