-
Notifications
You must be signed in to change notification settings - Fork 6
/
rfc5389.txt
executable file
·2859 lines (1992 loc) · 123 KB
/
rfc5389.txt
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
Network Working Group J. Rosenberg
Request for Comments: 5389 Cisco
Obsoletes: 3489 R. Mahy
Category: Standards Track P. Matthews
Unaffiliated
D. Wing
Cisco
October 2008
Session Traversal Utilities for NAT (STUN)
Status of This Memo
This document specifies an Internet standards track protocol for the
Internet community, and requests discussion and suggestions for
improvements. Please refer to the current edition of the "Internet
Official Protocol Standards" (STD 1) for the standardization state
and status of this protocol. Distribution of this memo is unlimited.
Abstract
Session Traversal Utilities for NAT (STUN) is a protocol that serves
as a tool for other protocols in dealing with Network Address
Translator (NAT) traversal. It can be used by an endpoint to
determine the IP address and port allocated to it by a NAT. It can
also be used to check connectivity between two endpoints, and as a
keep-alive protocol to maintain NAT bindings. STUN works with many
existing NATs, and does not require any special behavior from them.
STUN is not a NAT traversal solution by itself. Rather, it is a tool
to be used in the context of a NAT traversal solution. This is an
important change from the previous version of this specification (RFC
3489), which presented STUN as a complete solution.
This document obsoletes RFC 3489.
Table of Contents
1. Introduction ....................................................4
2. Evolution from RFC 3489 .........................................4
3. Overview of Operation ...........................................5
4. Terminology .....................................................8
5. Definitions .....................................................8
6. STUN Message Structure .........................................10
7. Base Protocol Procedures .......................................12
7.1. Forming a Request or an Indication ........................12
7.2. Sending the Request or Indication .........................13
Rosenberg, et al. Standards Track [Page 1]
RFC 5389 STUN October 2008
7.2.1. Sending over UDP ...................................13
7.2.2. Sending over TCP or TLS-over-TCP ...................14
7.3. Receiving a STUN Message ..................................16
7.3.1. Processing a Request ...............................17
7.3.1.1. Forming a Success or Error Response .......18
7.3.1.2. Sending the Success or Error Response .....19
7.3.2. Processing an Indication ...........................19
7.3.3. Processing a Success Response ......................19
7.3.4. Processing an Error Response .......................20
8. FINGERPRINT Mechanism ..........................................20
9. DNS Discovery of a Server ......................................21
10. Authentication and Message-Integrity Mechanisms ...............22
10.1. Short-Term Credential Mechanism ..........................22
10.1.1. Forming a Request or Indication ...................23
10.1.2. Receiving a Request or Indication .................23
10.1.3. Receiving a Response ..............................24
10.2. Long-Term Credential Mechanism ...........................24
10.2.1. Forming a Request .................................25
10.2.1.1. First Request ............................25
10.2.1.2. Subsequent Requests ......................26
10.2.2. Receiving a Request ...............................26
10.2.3. Receiving a Response ..............................27
11. ALTERNATE-SERVER Mechanism ....................................28
12. Backwards Compatibility with RFC 3489 .........................28
12.1. Changes to Client Processing .............................29
12.2. Changes to Server Processing .............................29
13. Basic Server Behavior .........................................30
14. STUN Usages ...................................................30
15. STUN Attributes ...............................................31
15.1. MAPPED-ADDRESS ...........................................32
15.2. XOR-MAPPED-ADDRESS .......................................33
15.3. USERNAME .................................................34
15.4. MESSAGE-INTEGRITY ........................................34
15.5. FINGERPRINT ..............................................36
15.6. ERROR-CODE ...............................................36
15.7. REALM ....................................................38
15.8. NONCE ....................................................38
15.9. UNKNOWN-ATTRIBUTES .......................................38
15.10. SOFTWARE ................................................39
15.11. ALTERNATE-SERVER ........................................39
16. Security Considerations .......................................39
16.1. Attacks against the Protocol .............................39
16.1.1. Outside Attacks ...................................39
16.1.2. Inside Attacks ....................................40
16.2. Attacks Affecting the Usage ..............................40
16.2.1. Attack I: Distributed DoS (DDoS) against a
Target ............................................41
16.2.2. Attack II: Silencing a Client .....................41
Rosenberg, et al. Standards Track [Page 2]
RFC 5389 STUN October 2008
16.2.3. Attack III: Assuming the Identity of a Client .....42
16.2.4. Attack IV: Eavesdropping ..........................42
16.3. Hash Agility Plan ........................................42
17. IAB Considerations ............................................42
18. IANA Considerations ...........................................43
18.1. STUN Methods Registry ....................................43
18.2. STUN Attribute Registry ..................................43
18.3. STUN Error Code Registry .................................44
18.4. STUN UDP and TCP Port Numbers ............................45
19. Changes since RFC 3489 ........................................45
20. Contributors ..................................................47
21. Acknowledgements ..............................................47
22. References ....................................................47
22.1. Normative References .....................................47
22.2. Informative References ...................................48
Appendix A. C Snippet to Determine STUN Message Types .............50
Rosenberg, et al. Standards Track [Page 3]
RFC 5389 STUN October 2008
1. Introduction
The protocol defined in this specification, Session Traversal
Utilities for NAT, provides a tool for dealing with NATs. It
provides a means for an endpoint to determine the IP address and port
allocated by a NAT that corresponds to its private IP address and
port. It also provides a way for an endpoint to keep a NAT binding
alive. With some extensions, the protocol can be used to do
connectivity checks between two endpoints [MMUSIC-ICE], or to relay
packets between two endpoints [BEHAVE-TURN].
In keeping with its tool nature, this specification defines an
extensible packet format, defines operation over several transport
protocols, and provides for two forms of authentication.
STUN is intended to be used in context of one or more NAT traversal
solutions. These solutions are known as STUN usages. Each usage
describes how STUN is utilized to achieve the NAT traversal solution.
Typically, a usage indicates when STUN messages get sent, which
optional attributes to include, what server is used, and what
authentication mechanism is to be used. Interactive Connectivity
Establishment (ICE) [MMUSIC-ICE] is one usage of STUN. SIP Outbound
[SIP-OUTBOUND] is another usage of STUN. In some cases, a usage will
require extensions to STUN. A STUN extension can be in the form of
new methods, attributes, or error response codes. More information
on STUN usages can be found in Section 14.
2. Evolution from RFC 3489
STUN was originally defined in RFC 3489 [RFC3489]. That
specification, sometimes referred to as "classic STUN", represented
itself as a complete solution to the NAT traversal problem. In that
solution, a client would discover whether it was behind a NAT,
determine its NAT type, discover its IP address and port on the
public side of the outermost NAT, and then utilize that IP address
and port within the body of protocols, such as the Session Initiation
Protocol (SIP) [RFC3261]. However, experience since the publication
of RFC 3489 has found that classic STUN simply does not work
sufficiently well to be a deployable solution. The address and port
learned through classic STUN are sometimes usable for communications
with a peer, and sometimes not. Classic STUN provided no way to
discover whether it would, in fact, work or not, and it provided no
remedy in cases where it did not. Furthermore, classic STUN's
algorithm for classification of NAT types was found to be faulty, as
many NATs did not fit cleanly into the types defined there.
Rosenberg, et al. Standards Track [Page 4]
RFC 5389 STUN October 2008
Classic STUN also had a security vulnerability -- attackers could
provide the client with incorrect mapped addresses under certain
topologies and constraints, and this was fundamentally not solvable
through any cryptographic means. Though this problem remains with
this specification, those attacks are now mitigated through the use
of more complete solutions that make use of STUN.
For these reasons, this specification obsoletes RFC 3489, and instead
describes STUN as a tool that is utilized as part of a complete NAT
traversal solution. ICE [MMUSIC-ICE] is a complete NAT traversal
solution for protocols based on the offer/answer [RFC3264]
methodology, such as SIP. SIP Outbound [SIP-OUTBOUND] is a complete
solution for traversal of SIP signaling, and it uses STUN in a very
different way. Though it is possible that a protocol may be able to
use STUN by itself (classic STUN) as a traversal solution, such usage
is not described here and is strongly discouraged for the reasons
described above.
The on-the-wire protocol described here is changed only slightly from
classic STUN. The protocol now runs over TCP in addition to UDP.
Extensibility was added to the protocol in a more structured way. A
magic cookie mechanism for demultiplexing STUN with application
protocols was added by stealing 32 bits from the 128-bit transaction
ID defined in RFC 3489, allowing the change to be backwards
compatible. Mapped addresses are encoded using a new exclusive-or
format. There are other, more minor changes. See Section 19 for a
more complete listing.
Due to the change in scope, STUN has also been renamed from "Simple
Traversal of UDP through NAT" to "Session Traversal Utilities for
NAT". The acronym remains STUN, which is all anyone ever remembers
anyway.
3. Overview of Operation
This section is descriptive only.
Rosenberg, et al. Standards Track [Page 5]
RFC 5389 STUN October 2008
/-----\
// STUN \\
| Server |
\\ //
\-----/
+--------------+ Public Internet
................| NAT 2 |.......................
+--------------+
+--------------+ Private NET 2
................| NAT 1 |.......................
+--------------+
/-----\
// STUN \\
| Client |
\\ // Private NET 1
\-----/
Figure 1: One Possible STUN Configuration
One possible STUN configuration is shown in Figure 1. In this
configuration, there are two entities (called STUN agents) that
implement the STUN protocol. The lower agent in the figure is the
client, and is connected to private network 1. This network connects
to private network 2 through NAT 1. Private network 2 connects to
the public Internet through NAT 2. The upper agent in the figure is
the server, and resides on the public Internet.
STUN is a client-server protocol. It supports two types of
transactions. One is a request/response transaction in which a
client sends a request to a server, and the server returns a
response. The second is an indication transaction in which either
agent -- client or server -- sends an indication that generates no
response. Both types of transactions include a transaction ID, which
is a randomly selected 96-bit number. For request/response
Rosenberg, et al. Standards Track [Page 6]
RFC 5389 STUN October 2008
transactions, this transaction ID allows the client to associate the
response with the request that generated it; for indications, the
transaction ID serves as a debugging aid.
All STUN messages start with a fixed header that includes a method, a
class, and the transaction ID. The method indicates which of the
various requests or indications this is; this specification defines
just one method, Binding, but other methods are expected to be
defined in other documents. The class indicates whether this is a
request, a success response, an error response, or an indication.
Following the fixed header comes zero or more attributes, which are
Type-Length-Value extensions that convey additional information for
the specific message.
This document defines a single method called Binding. The Binding
method can be used either in request/response transactions or in
indication transactions. When used in request/response transactions,
the Binding method can be used to determine the particular "binding"
a NAT has allocated to a STUN client. When used in either request/
response or in indication transactions, the Binding method can also
be used to keep these "bindings" alive.
In the Binding request/response transaction, a Binding request is
sent from a STUN client to a STUN server. When the Binding request
arrives at the STUN server, it may have passed through one or more
NATs between the STUN client and the STUN server (in Figure 1, there
were two such NATs). As the Binding request message passes through a
NAT, the NAT will modify the source transport address (that is, the
source IP address and the source port) of the packet. As a result,
the source transport address of the request received by the server
will be the public IP address and port created by the NAT closest to
the server. This is called a reflexive transport address. The STUN
server copies that source transport address into an XOR-MAPPED-
ADDRESS attribute in the STUN Binding response and sends the Binding
response back to the STUN client. As this packet passes back through
a NAT, the NAT will modify the destination transport address in the
IP header, but the transport address in the XOR-MAPPED-ADDRESS
attribute within the body of the STUN response will remain untouched.
In this way, the client can learn its reflexive transport address
allocated by the outermost NAT with respect to the STUN server.
In some usages, STUN must be multiplexed with other protocols (e.g.,
[MMUSIC-ICE], [SIP-OUTBOUND]). In these usages, there must be a way
to inspect a packet and determine if it is a STUN packet or not.
STUN provides three fields in the STUN header with fixed values that
can be used for this purpose. If this is not sufficient, then STUN
packets can also contain a FINGERPRINT value, which can further be
used to distinguish the packets.
Rosenberg, et al. Standards Track [Page 7]
RFC 5389 STUN October 2008
STUN defines a set of optional procedures that a usage can decide to
use, called mechanisms. These mechanisms include DNS discovery, a
redirection technique to an alternate server, a fingerprint attribute
for demultiplexing, and two authentication and message-integrity
exchanges. The authentication mechanisms revolve around the use of a
username, password, and message-integrity value. Two authentication
mechanisms, the long-term credential mechanism and the short-term
credential mechanism, are defined in this specification. Each usage
specifies the mechanisms allowed with that usage.
In the long-term credential mechanism, the client and server share a
pre-provisioned username and password and perform a digest challenge/
response exchange inspired by (but differing in details) to the one
defined for HTTP [RFC2617]. In the short-term credential mechanism,
the client and the server exchange a username and password through
some out-of-band method prior to the STUN exchange. For example, in
the ICE usage [MMUSIC-ICE] the two endpoints use out-of-band
signaling to exchange a username and password. These are used to
integrity protect and authenticate the request and response. There
is no challenge or nonce used.
4. Terminology
In this document, the key words "MUST", "MUST NOT", "REQUIRED",
"SHALL", "SHALL NOT", "SHOULD", "SHOULD NOT", "RECOMMENDED", "MAY",
and "OPTIONAL" are to be interpreted as described in BCP 14, RFC 2119
[RFC2119] and indicate requirement levels for compliant STUN
implementations.
5. Definitions
STUN Agent: A STUN agent is an entity that implements the STUN
protocol. The entity can be either a STUN client or a STUN
server.
STUN Client: A STUN client is an entity that sends STUN requests and
receives STUN responses. A STUN client can also send indications.
In this specification, the terms STUN client and client are
synonymous.
STUN Server: A STUN server is an entity that receives STUN requests
and sends STUN responses. A STUN server can also send
indications. In this specification, the terms STUN server and
server are synonymous.
Transport Address: The combination of an IP address and port number
(such as a UDP or TCP port number).
Rosenberg, et al. Standards Track [Page 8]
RFC 5389 STUN October 2008
Reflexive Transport Address: A transport address learned by a client
that identifies that client as seen by another host on an IP
network, typically a STUN server. When there is an intervening
NAT between the client and the other host, the reflexive transport
address represents the mapped address allocated to the client on
the public side of the NAT. Reflexive transport addresses are
learned from the mapped address attribute (MAPPED-ADDRESS or XOR-
MAPPED-ADDRESS) in STUN responses.
Mapped Address: Same meaning as reflexive address. This term is
retained only for historic reasons and due to the naming of the
MAPPED-ADDRESS and XOR-MAPPED-ADDRESS attributes.
Long-Term Credential: A username and associated password that
represent a shared secret between client and server. Long-term
credentials are generally granted to the client when a subscriber
enrolls in a service and persist until the subscriber leaves the
service or explicitly changes the credential.
Long-Term Password: The password from a long-term credential.
Short-Term Credential: A temporary username and associated password
that represent a shared secret between client and server. Short-
term credentials are obtained through some kind of protocol
mechanism between the client and server, preceding the STUN
exchange. A short-term credential has an explicit temporal scope,
which may be based on a specific amount of time (such as 5
minutes) or on an event (such as termination of a SIP dialog).
The specific scope of a short-term credential is defined by the
application usage.
Short-Term Password: The password component of a short-term
credential.
STUN Indication: A STUN message that does not receive a response.
Attribute: The STUN term for a Type-Length-Value (TLV) object that
can be added to a STUN message. Attributes are divided into two
types: comprehension-required and comprehension-optional. STUN
agents can safely ignore comprehension-optional attributes they
don't understand, but cannot successfully process a message if it
contains comprehension-required attributes that are not
understood.
RTO: Retransmission TimeOut, which defines the initial period of
time between transmission of a request and the first retransmit of
that request.
Rosenberg, et al. Standards Track [Page 9]
RFC 5389 STUN October 2008
6. STUN Message Structure
STUN messages are encoded in binary using network-oriented format
(most significant byte or octet first, also commonly known as big-
endian). The transmission order is described in detail in Appendix B
of RFC 791 [RFC0791]. Unless otherwise noted, numeric constants are
in decimal (base 10).
All STUN messages MUST start with a 20-byte header followed by zero
or more Attributes. The STUN header contains a STUN message type,
magic cookie, transaction ID, and message length.
0 1 2 3
0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|0 0| STUN Message Type | Message Length |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| Magic Cookie |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| |
| Transaction ID (96 bits) |
| |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
Figure 2: Format of STUN Message Header
The most significant 2 bits of every STUN message MUST be zeroes.
This can be used to differentiate STUN packets from other protocols
when STUN is multiplexed with other protocols on the same port.
The message type defines the message class (request, success
response, failure response, or indication) and the message method
(the primary function) of the STUN message. Although there are four
message classes, there are only two types of transactions in STUN:
request/response transactions (which consist of a request message and
a response message) and indication transactions (which consist of a
single indication message). Response classes are split into error
and success responses to aid in quickly processing the STUN message.
Rosenberg, et al. Standards Track [Page 10]
RFC 5389 STUN October 2008
The message type field is decomposed further into the following
structure:
0 1
2 3 4 5 6 7 8 9 0 1 2 3 4 5
+--+--+-+-+-+-+-+-+-+-+-+-+-+-+
|M |M |M|M|M|C|M|M|M|C|M|M|M|M|
|11|10|9|8|7|1|6|5|4|0|3|2|1|0|
+--+--+-+-+-+-+-+-+-+-+-+-+-+-+
Figure 3: Format of STUN Message Type Field
Here the bits in the message type field are shown as most significant
(M11) through least significant (M0). M11 through M0 represent a 12-
bit encoding of the method. C1 and C0 represent a 2-bit encoding of
the class. A class of 0b00 is a request, a class of 0b01 is an
indication, a class of 0b10 is a success response, and a class of
0b11 is an error response. This specification defines a single
method, Binding. The method and class are orthogonal, so that for
each method, a request, success response, error response, and
indication are possible for that method. Extensions defining new
methods MUST indicate which classes are permitted for that method.
For example, a Binding request has class=0b00 (request) and
method=0b000000000001 (Binding) and is encoded into the first 16 bits
as 0x0001. A Binding response has class=0b10 (success response) and
method=0b000000000001, and is encoded into the first 16 bits as
0x0101.
Note: This unfortunate encoding is due to assignment of values in
[RFC3489] that did not consider encoding Indications, Success, and
Errors using bit fields.
The magic cookie field MUST contain the fixed value 0x2112A442 in
network byte order. In RFC 3489 [RFC3489], this field was part of
the transaction ID; placing the magic cookie in this location allows
a server to detect if the client will understand certain attributes
that were added in this revised specification. In addition, it aids
in distinguishing STUN packets from packets of other protocols when
STUN is multiplexed with those other protocols on the same port.
The transaction ID is a 96-bit identifier, used to uniquely identify
STUN transactions. For request/response transactions, the
transaction ID is chosen by the STUN client for the request and
echoed by the server in the response. For indications, it is chosen
by the agent sending the indication. It primarily serves to
correlate requests with responses, though it also plays a small role
Rosenberg, et al. Standards Track [Page 11]
RFC 5389 STUN October 2008
in helping to prevent certain types of attacks. The server also uses
the transaction ID as a key to identify each transaction uniquely
across all clients. As such, the transaction ID MUST be uniformly
and randomly chosen from the interval 0 .. 2**96-1, and SHOULD be
cryptographically random. Resends of the same request reuse the same
transaction ID, but the client MUST choose a new transaction ID for
new transactions unless the new request is bit-wise identical to the
previous request and sent from the same transport address to the same
IP address. Success and error responses MUST carry the same
transaction ID as their corresponding request. When an agent is
acting as a STUN server and STUN client on the same port, the
transaction IDs in requests sent by the agent have no relationship to
the transaction IDs in requests received by the agent.
The message length MUST contain the size, in bytes, of the message
not including the 20-byte STUN header. Since all STUN attributes are
padded to a multiple of 4 bytes, the last 2 bits of this field are
always zero. This provides another way to distinguish STUN packets
from packets of other protocols.
Following the STUN fixed portion of the header are zero or more
attributes. Each attribute is TLV (Type-Length-Value) encoded. The
details of the encoding, and of the attributes themselves are given
in Section 15.
7. Base Protocol Procedures
This section defines the base procedures of the STUN protocol. It
describes how messages are formed, how they are sent, and how they
are processed when they are received. It also defines the detailed
processing of the Binding method. Other sections in this document
describe optional procedures that a usage may elect to use in certain
situations. Other documents may define other extensions to STUN, by
adding new methods, new attributes, or new error response codes.
7.1. Forming a Request or an Indication
When formulating a request or indication message, the agent MUST
follow the rules in Section 6 when creating the header. In addition,
the message class MUST be either "Request" or "Indication" (as
appropriate), and the method must be either Binding or some method
defined in another document.
The agent then adds any attributes specified by the method or the
usage. For example, some usages may specify that the agent use an
authentication method (Section 10) or the FINGERPRINT attribute
(Section 8).
Rosenberg, et al. Standards Track [Page 12]
RFC 5389 STUN October 2008
If the agent is sending a request, it SHOULD add a SOFTWARE attribute
to the request. Agents MAY include a SOFTWARE attribute in
indications, depending on the method. Extensions to STUN should
discuss whether SOFTWARE is useful in new indications.
For the Binding method with no authentication, no attributes are
required unless the usage specifies otherwise.
All STUN messages sent over UDP SHOULD be less than the path MTU, if
known. If the path MTU is unknown, messages SHOULD be the smaller of
576 bytes and the first-hop MTU for IPv4 [RFC1122] and 1280 bytes for
IPv6 [RFC2460]. This value corresponds to the overall size of the IP
packet. Consequently, for IPv4, the actual STUN message would need
to be less than 548 bytes (576 minus 20-byte IP header, minus 8-byte
UDP header, assuming no IP options are used). STUN provides no
ability to handle the case where the request is under the MTU but the
response would be larger than the MTU. It is not envisioned that
this limitation will be an issue for STUN. The MTU limitation is a
SHOULD, and not a MUST, to account for cases where STUN itself is
being used to probe for MTU characteristics [BEHAVE-NAT]. Outside of
this or similar applications, the MTU constraint MUST be followed.
7.2. Sending the Request or Indication
The agent then sends the request or indication. This document
specifies how to send STUN messages over UDP, TCP, or TLS-over-TCP;
other transport protocols may be added in the future. The STUN usage
must specify which transport protocol is used, and how the agent
determines the IP address and port of the recipient. Section 9
describes a DNS-based method of determining the IP address and port
of a server that a usage may elect to use. STUN may be used with
anycast addresses, but only with UDP and in usages where
authentication is not used.
At any time, a client MAY have multiple outstanding STUN requests
with the same STUN server (that is, multiple transactions in
progress, with different transaction IDs). Absent other limits to
the rate of new transactions (such as those specified by ICE for
connectivity checks or when STUN is run over TCP), a client SHOULD
space new transactions to a server by RTO and SHOULD limit itself to
ten outstanding transactions to the same server.
7.2.1. Sending over UDP
When running STUN over UDP, it is possible that the STUN message
might be dropped by the network. Reliability of STUN request/
response transactions is accomplished through retransmissions of the
Rosenberg, et al. Standards Track [Page 13]
RFC 5389 STUN October 2008
request message by the client application itself. STUN indications
are not retransmitted; thus, indication transactions over UDP are not
reliable.
A client SHOULD retransmit a STUN request message starting with an
interval of RTO ("Retransmission TimeOut"), doubling after each
retransmission. The RTO is an estimate of the round-trip time (RTT),
and is computed as described in RFC 2988 [RFC2988], with two
exceptions. First, the initial value for RTO SHOULD be configurable
(rather than the 3 s recommended in RFC 2988) and SHOULD be greater
than 500 ms. The exception cases for this "SHOULD" are when other
mechanisms are used to derive congestion thresholds (such as the ones
defined in ICE for fixed rate streams), or when STUN is used in non-
Internet environments with known network capacities. In fixed-line
access links, a value of 500 ms is RECOMMENDED. Second, the value of
RTO SHOULD NOT be rounded up to the nearest second. Rather, a 1 ms
accuracy SHOULD be maintained. As with TCP, the usage of Karn's
algorithm is RECOMMENDED [KARN87]. When applied to STUN, it means
that RTT estimates SHOULD NOT be computed from STUN transactions that
result in the retransmission of a request.
The value for RTO SHOULD be cached by a client after the completion
of the transaction, and used as the starting value for RTO for the
next transaction to the same server (based on equality of IP
address). The value SHOULD be considered stale and discarded after
10 minutes.
Retransmissions continue until a response is received, or until a
total of Rc requests have been sent. Rc SHOULD be configurable and
SHOULD have a default of 7. If, after the last request, a duration
equal to Rm times the RTO has passed without a response (providing
ample time to get a response if only this final request actually
succeeds), the client SHOULD consider the transaction to have failed.
Rm SHOULD be configurable and SHOULD have a default of 16. A STUN
transaction over UDP is also considered failed if there has been a
hard ICMP error [RFC1122]. For example, assuming an RTO of 500 ms,
requests would be sent at times 0 ms, 500 ms, 1500 ms, 3500 ms, 7500
ms, 15500 ms, and 31500 ms. If the client has not received a
response after 39500 ms, the client will consider the transaction to
have timed out.
7.2.2. Sending over TCP or TLS-over-TCP
For TCP and TLS-over-TCP, the client opens a TCP connection to the
server.
Rosenberg, et al. Standards Track [Page 14]
RFC 5389 STUN October 2008
In some usages of STUN, STUN is sent as the only protocol over the
TCP connection. In this case, it can be sent without the aid of any
additional framing or demultiplexing. In other usages, or with other
extensions, it may be multiplexed with other data over a TCP
connection. In that case, STUN MUST be run on top of some kind of
framing protocol, specified by the usage or extension, which allows
for the agent to extract complete STUN messages and complete
application layer messages. The STUN service running on the well-
known port or ports discovered through the DNS procedures in
Section 9 is for STUN alone, and not for STUN multiplexed with other
data. Consequently, no framing protocols are used in connections to
those servers. When additional framing is utilized, the usage will
specify how the client knows to apply it and what port to connect to.
For example, in the case of ICE connectivity checks, this information
is learned through out-of-band negotiation between client and server.
When STUN is run by itself over TLS-over-TCP, the
TLS_RSA_WITH_AES_128_CBC_SHA ciphersuite MUST be implemented at a
minimum. Implementations MAY also support any other ciphersuite.
When it receives the TLS Certificate message, the client SHOULD
verify the certificate and inspect the site identified by the
certificate. If the certificate is invalid or revoked, or if it does
not identify the appropriate party, the client MUST NOT send the STUN
message or otherwise proceed with the STUN transaction. The client
MUST verify the identity of the server. To do that, it follows the
identification procedures defined in Section 3.1 of RFC 2818
[RFC2818]. Those procedures assume the client is dereferencing a
URI. For purposes of usage with this specification, the client
treats the domain name or IP address used in Section 8.1 as the host
portion of the URI that has been dereferenced. Alternatively, a
client MAY be configured with a set of domains or IP addresses that
are trusted; if a certificate is received that identifies one of
those domains or IP addresses, the client considers the identity of
the server to be verified.
When STUN is run multiplexed with other protocols over a TLS-over-TCP
connection, the mandatory ciphersuites and TLS handling procedures
operate as defined by those protocols.
Reliability of STUN over TCP and TLS-over-TCP is handled by TCP
itself, and there are no retransmissions at the STUN protocol level.
However, for a request/response transaction, if the client has not
received a response by Ti seconds after it sent the SYN to establish
the connection, it considers the transaction to have timed out. Ti
SHOULD be configurable and SHOULD have a default of 39.5s. This
value has been chosen to equalize the TCP and UDP timeouts for the
default initial RTO.
Rosenberg, et al. Standards Track [Page 15]
RFC 5389 STUN October 2008
In addition, if the client is unable to establish the TCP connection,
or the TCP connection is reset or fails before a response is
received, any request/response transaction in progress is considered
to have failed.
The client MAY send multiple transactions over a single TCP (or TLS-
over-TCP) connection, and it MAY send another request before
receiving a response to the previous. The client SHOULD keep the
connection open until it:
o has no further STUN requests or indications to send over that
connection, and
o has no plans to use any resources (such as a mapped address
(MAPPED-ADDRESS or XOR-MAPPED-ADDRESS) or relayed address
[BEHAVE-TURN]) that were learned though STUN requests sent over
that connection, and
o if multiplexing other application protocols over that port, has
finished using that other application, and
o if using that learned port with a remote peer, has established
communications with that remote peer, as is required by some TCP
NAT traversal techniques (e.g., [MMUSIC-ICE-TCP]).
At the server end, the server SHOULD keep the connection open, and
let the client close it, unless the server has determined that the
connection has timed out (for example, due to the client
disconnecting from the network). Bindings learned by the client will
remain valid in intervening NATs only while the connection remains
open. Only the client knows how long it needs the binding. The
server SHOULD NOT close a connection if a request was received over
that connection for which a response was not sent. A server MUST NOT
ever open a connection back towards the client in order to send a
response. Servers SHOULD follow best practices regarding connection
management in cases of overload.
7.3. Receiving a STUN Message
This section specifies the processing of a STUN message. The
processing specified here is for STUN messages as defined in this
specification; additional rules for backwards compatibility are
defined in Section 12. Those additional procedures are optional, and
usages can elect to utilize them. First, a set of processing
operations is applied that is independent of the class. This is
followed by class-specific processing, described in the subsections
that follow.
Rosenberg, et al. Standards Track [Page 16]
RFC 5389 STUN October 2008
When a STUN agent receives a STUN message, it first checks that the
message obeys the rules of Section 6. It checks that the first two
bits are 0, that the magic cookie field has the correct value, that
the message length is sensible, and that the method value is a
supported method. It checks that the message class is allowed for
the particular method. If the message class is "Success Response" or
"Error Response", the agent checks that the transaction ID matches a
transaction that is still in progress. If the FINGERPRINT extension
is being used, the agent checks that the FINGERPRINT attribute is
present and contains the correct value. If any errors are detected,
the message is silently discarded. In the case when STUN is being
multiplexed with another protocol, an error may indicate that this is
not really a STUN message; in this case, the agent should try to
parse the message as a different protocol.
The STUN agent then does any checks that are required by a
authentication mechanism that the usage has specified (see
Section 10).
Once the authentication checks are done, the STUN agent checks for
unknown attributes and known-but-unexpected attributes in the
message. Unknown comprehension-optional attributes MUST be ignored
by the agent. Known-but-unexpected attributes SHOULD be ignored by
the agent. Unknown comprehension-required attributes cause
processing that depends on the message class and is described below.
At this point, further processing depends on the message class of the
request.
7.3.1. Processing a Request
If the request contains one or more unknown comprehension-required
attributes, the server replies with an error response with an error
code of 420 (Unknown Attribute), and includes an UNKNOWN-ATTRIBUTES
attribute in the response that lists the unknown comprehension-
required attributes.
The server then does any additional checking that the method or the
specific usage requires. If all the checks succeed, the server
formulates a success response as described below.
When run over UDP, a request received by the server could be the
first request of a transaction, or a retransmission. The server MUST
respond to retransmissions such that the following property is
preserved: if the client receives the response to the retransmission
and not the response that was sent to the original request, the
overall state on the client and server is identical to the case where
only the response to the original retransmission is received, or
Rosenberg, et al. Standards Track [Page 17]
RFC 5389 STUN October 2008
where both responses are received (in which case the client will use
the first). The easiest way to meet this requirement is for the
server to remember all transaction IDs received over UDP and their
corresponding responses in the last 40 seconds. However, this
requires the server to hold state, and will be inappropriate for any
requests which are not authenticated. Another way is to reprocess
the request and recompute the response. The latter technique MUST
only be applied to requests that are idempotent (a request is
considered idempotent when the same request can be safely repeated
without impacting the overall state of the system) and result in the
same success response for the same request. The Binding method is
considered to be idempotent. Note that there are certain rare
network events that could cause the reflexive transport address value
to change, resulting in a different mapped address in different
success responses. Extensions to STUN MUST discuss the implications
of request retransmissions on servers that do not store transaction
state.
7.3.1.1. Forming a Success or Error Response
When forming the response (success or error), the server follows the
rules of Section 6. The method of the response is the same as that
of the request, and the message class is either "Success Response" or
"Error Response".
For an error response, the server MUST add an ERROR-CODE attribute
containing the error code specified in the processing above. The
reason phrase is not fixed, but SHOULD be something suitable for the
error code. For certain errors, additional attributes are added to
the message. These attributes are spelled out in the description
where the error code is specified. For example, for an error code of
420 (Unknown Attribute), the server MUST include an UNKNOWN-
ATTRIBUTES attribute. Certain authentication errors also cause
attributes to be added (see Section 10). Extensions may define other
errors and/or additional attributes to add in error cases.
If the server authenticated the request using an authentication
mechanism, then the server SHOULD add the appropriate authentication
attributes to the response (see Section 10).
The server also adds any attributes required by the specific method
or usage. In addition, the server SHOULD add a SOFTWARE attribute to