--- 1/draft-ietf-behave-rfc3489bis-11.txt 2007-11-14 06:12:07.000000000 +0100 +++ 2/draft-ietf-behave-rfc3489bis-12.txt 2007-11-14 06:12:07.000000000 +0100 @@ -1,25 +1,23 @@ BEHAVE Working Group J. Rosenberg Internet-Draft Cisco -Obsoletes: 3489 (if approved) C. Huitema -Intended status: Standards Track Microsoft -Expires: April 13, 2008 R. Mahy - Plantronics - P. Matthews +Obsoletes: 3489 (if approved) R. Mahy +Intended status: Standards Track Plantronics +Expires: May 16, 2008 P. Matthews Avaya D. Wing Cisco - October 11, 2007 + November 13, 2007 Session Traversal Utilities for (NAT) (STUN) - draft-ietf-behave-rfc3489bis-11 + draft-ietf-behave-rfc3489bis-12 Status of this Memo By submitting this Internet-Draft, each author represents that any applicable patent or other IPR claims of which he or she is aware have been or will be disclosed, and any of which he or she becomes aware will be disclosed, in accordance with Section 6 of BCP 79. Internet-Drafts are working documents of the Internet Engineering Task Force (IETF), its areas, and its working groups. Note that @@ -30,21 +28,21 @@ and may be updated, replaced, or obsoleted by other documents at any time. It is inappropriate to use Internet-Drafts as reference material or to cite them other than as "work in progress." The list of current Internet-Drafts can be accessed at http://www.ietf.org/ietf/1id-abstracts.txt. The list of Internet-Draft Shadow Directories can be accessed at http://www.ietf.org/shadow.html. - This Internet-Draft will expire on April 13, 2008. + This Internet-Draft will expire on May 16, 2008. Copyright Notice Copyright (C) The IETF Trust (2007). Abstract Session Traversal Utilities for NAT (STUN) is a protocol that serves as a tool for other protocols in dealing with NAT traversal. It can be used by an endpoint to determine the IP address and port allocated @@ -60,86 +58,88 @@ 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 . . . . . . . . . . . . . . . . . . . . 9 + 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 . . . . . . . . . . . . 12 + 7.2. Sending the Request or Indication . . . . . . . . . . . . 13 7.2.1. Sending over UDP . . . . . . . . . . . . . . . . . . . 13 - 7.2.2. Sending over TCP or TLS-over-TCP . . . . . . . . . . . 13 + 7.2.2. Sending over TCP or TLS-over-TCP . . . . . . . . . . . 14 7.3. Receiving a STUN Message . . . . . . . . . . . . . . . . 15 7.3.1. Processing a Request . . . . . . . . . . . . . . . . . 16 - 7.3.1.1. Forming a Success or Error Response . . . . . . . 16 + 7.3.1.1. Forming a Success or Error Response . . . . . . . 17 7.3.1.2. Sending the Success or Error Response . . . . . . 17 - 7.3.2. Processing an Indication . . . . . . . . . . . . . . . 17 + 7.3.2. Processing an Indication . . . . . . . . . . . . . . . 18 7.3.3. Processing a Success Response . . . . . . . . . . . . 18 7.3.4. Processing an Error Response . . . . . . . . . . . . . 18 8. FINGERPRINT Mechanism . . . . . . . . . . . . . . . . . . . . 19 - 9. DNS Discovery of a Server . . . . . . . . . . . . . . . . . . 19 - 10. Authentication and Message-Integrity Mechanisms . . . . . . . 20 + 9. DNS Discovery of a Server . . . . . . . . . . . . . . . . . . 20 + 10. Authentication and Message-Integrity Mechanisms . . . . . . . 21 10.1. Short-Term Credential Mechanism . . . . . . . . . . . . . 21 - 10.1.1. Forming a Request or Indication . . . . . . . . . . . 21 - 10.1.2. Receiving a Request or Indication . . . . . . . . . . 21 - 10.1.3. Receiving a Response . . . . . . . . . . . . . . . . . 22 - 10.2. Long-term Credential Mechanism . . . . . . . . . . . . . 22 - 10.2.1. Forming a Request . . . . . . . . . . . . . . . . . . 23 - 10.2.1.1. First Request . . . . . . . . . . . . . . . . . . 23 + 10.1.1. Forming a Request or Indication . . . . . . . . . . . 22 + 10.1.2. Receiving a Request or Indication . . . . . . . . . . 22 + 10.1.3. Receiving a Response . . . . . . . . . . . . . . . . . 23 + 10.2. Long-term Credential Mechanism . . . . . . . . . . . . . 23 + 10.2.1. Forming a Request . . . . . . . . . . . . . . . . . . 24 + 10.2.1.1. First Request . . . . . . . . . . . . . . . . . . 24 10.2.1.2. Subsequent Requests . . . . . . . . . . . . . . . 24 - 10.2.2. Receiving a Request . . . . . . . . . . . . . . . . . 24 - 10.2.3. Receiving a Response . . . . . . . . . . . . . . . . . 25 + 10.2.2. Receiving a Request . . . . . . . . . . . . . . . . . 25 + 10.2.3. Receiving a Response . . . . . . . . . . . . . . . . . 26 11. ALTERNATE-SERVER Mechanism . . . . . . . . . . . . . . . . . . 26 - 12. Backwards Compatibility with RFC 3489 . . . . . . . . . . . . 26 + 12. Backwards Compatibility with RFC 3489 . . . . . . . . . . . . 27 12.1. Changes to Client Processing . . . . . . . . . . . . . . 27 - 12.2. Changes to Server Processing . . . . . . . . . . . . . . 27 - 13. STUN Usages . . . . . . . . . . . . . . . . . . . . . . . . . 27 + 12.2. Changes to Server Processing . . . . . . . . . . . . . . 28 + 13. STUN Usages . . . . . . . . . . . . . . . . . . . . . . . . . 28 14. STUN Attributes . . . . . . . . . . . . . . . . . . . . . . . 29 14.1. MAPPED-ADDRESS . . . . . . . . . . . . . . . . . . . . . 30 14.2. XOR-MAPPED-ADDRESS . . . . . . . . . . . . . . . . . . . 31 14.3. USERNAME . . . . . . . . . . . . . . . . . . . . . . . . 32 14.4. MESSAGE-INTEGRITY . . . . . . . . . . . . . . . . . . . . 32 14.5. FINGERPRINT . . . . . . . . . . . . . . . . . . . . . . . 33 - 14.6. ERROR-CODE . . . . . . . . . . . . . . . . . . . . . . . 33 + 14.6. ERROR-CODE . . . . . . . . . . . . . . . . . . . . . . . 34 14.7. REALM . . . . . . . . . . . . . . . . . . . . . . . . . . 35 14.8. NONCE . . . . . . . . . . . . . . . . . . . . . . . . . . 35 - 14.9. UNKNOWN-ATTRIBUTES . . . . . . . . . . . . . . . . . . . 35 + 14.9. UNKNOWN-ATTRIBUTES . . . . . . . . . . . . . . . . . . . 36 14.10. SERVER . . . . . . . . . . . . . . . . . . . . . . . . . 36 14.11. ALTERNATE-SERVER . . . . . . . . . . . . . . . . . . . . 36 - 15. Security Considerations . . . . . . . . . . . . . . . . . . . 36 - 15.1. Attacks against the Protocol . . . . . . . . . . . . . . 36 - 15.1.1. Outside Attacks . . . . . . . . . . . . . . . . . . . 36 + 15. Security Considerations . . . . . . . . . . . . . . . . . . . 37 + 15.1. Attacks against the Protocol . . . . . . . . . . . . . . 37 + 15.1.1. Outside Attacks . . . . . . . . . . . . . . . . . . . 37 15.1.2. Inside Attacks . . . . . . . . . . . . . . . . . . . . 37 - 15.2. Attacks Affecting the Usage . . . . . . . . . . . . . . . 37 + 15.2. Attacks Affecting the Usage . . . . . . . . . . . . . . . 38 15.2.1. Attack I: DDoS Against a Target . . . . . . . . . . . 38 15.2.2. Attack II: Silencing a Client . . . . . . . . . . . . 38 - 15.2.3. Attack III: Assuming the Identity of a Client . . . . 38 - 15.2.4. Attack IV: Eavesdropping . . . . . . . . . . . . . . . 38 + 15.2.3. Attack III: Assuming the Identity of a Client . . . . 39 + 15.2.4. Attack IV: Eavesdropping . . . . . . . . . . . . . . . 39 15.3. Hash Agility Plan . . . . . . . . . . . . . . . . . . . . 39 16. IAB Considerations . . . . . . . . . . . . . . . . . . . . . . 39 - 17. IANA Considerations . . . . . . . . . . . . . . . . . . . . . 39 - 17.1. STUN Methods Registry . . . . . . . . . . . . . . . . . . 39 + 17. IANA Considerations . . . . . . . . . . . . . . . . . . . . . 40 + 17.1. STUN Methods Registry . . . . . . . . . . . . . . . . . . 40 17.2. STUN Attribute Registry . . . . . . . . . . . . . . . . . 40 17.3. STUN Error Code Registry . . . . . . . . . . . . . . . . 41 - 18. Changes Since RFC 3489 . . . . . . . . . . . . . . . . . . . . 41 - 19. Acknowledgements . . . . . . . . . . . . . . . . . . . . . . . 42 - 20. References . . . . . . . . . . . . . . . . . . . . . . . . . . 43 - 20.1. Normative References . . . . . . . . . . . . . . . . . . 43 - 20.2. Informational References . . . . . . . . . . . . . . . . 43 - Appendix A. C Snippet to Determine STUN Message Types . . . . . . 45 - Authors' Addresses . . . . . . . . . . . . . . . . . . . . . . . . 45 - Intellectual Property and Copyright Statements . . . . . . . . . . 47 + 17.4. STUN UDP and TCP Port Numbers . . . . . . . . . . . . . . 42 + 18. Changes Since RFC 3489 . . . . . . . . . . . . . . . . . . . . 42 + 19. Contributors . . . . . . . . . . . . . . . . . . . . . . . . . 43 + 20. Acknowledgements . . . . . . . . . . . . . . . . . . . . . . . 43 + 21. References . . . . . . . . . . . . . . . . . . . . . . . . . . 44 + 21.1. Normative References . . . . . . . . . . . . . . . . . . 44 + 21.2. Informational References . . . . . . . . . . . . . . . . 45 + Appendix A. C Snippet to Determine STUN Message Types . . . . . . 46 + Authors' Addresses . . . . . . . . . . . . . . . . . . . . . . . . 46 + Intellectual Property and Copyright Statements . . . . . . . . . . 48 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 [I-D.ietf-mmusic-ice], or @@ -178,87 +178,88 @@ 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. Classic STUN also had security vulnerabilities which required an extremely complicated mechanism to address, and despite the complexity of the mechanism, were not fully remedied. 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 is a complete NAT traversal solution for - protocols based on the offer/answer [RFC3264] methodology, such as - SIP. 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. + traversal solution. ICE [I-D.ietf-mmusic-ice] is a complete NAT + traversal solution for protocols based on the offer/answer [RFC3264] + methodology, such as SIP. SIP Outbound [I-D.ietf-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 18 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. - /--------\ + /-----\ // STUN \\ - | Agent | - \\ (server) // - \--------/ + | Server | + \\ // + \-----/ - +----------------+ Public Internet + +--------------+ Public Internet ................| NAT 2 |....................... - +----------------+ + +--------------+ - +----------------+ Private NET 2 + +--------------+ Private NET 2 ................| NAT 1 |....................... - +----------------+ + +--------------+ - /--------\ + /-----\ // STUN \\ - | Agent | - \\ (client) // Private NET 1 - \--------/ + | 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 - 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 resides on the - public Internet. + 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 a client - sends an indication to the server and the server does not respond. - Both types of transactions include a transaction ID, which is a - randomly selected 96-bit number. For request/response transactions, - this transaction ID allows the client to associate the response with - the request that generated it; for indications, this simply serves as - a debugging aid. + response. The second is an indication transaction in which either + agent - client or server - sends an indication which generates no + response. Both types of transactions include a transaction ID, which + is a randomly selected 96-bit number. For request/response + transactions, this transaction ID allows the client to associate the + response with the request that generated it; for indications, this + simply 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. @@ -322,33 +323,32 @@ 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: An entity that implements the STUN protocol. Agents can - act as STUN clients for some transactions and as STUN servers for - other transactions. + STUN Agent: An entity that implements the STUN protocol. The entity + can either be a STUN client or a STUN server. - STUN Client: A logical role in the STUN protocol. A STUN client - sends STUN requests or STUN indications, and receives STUN - responses. The term "STUN client" is also used colloquially to - refer to a STUN agent that only acts as a STUN client. + STUN Client: A STUN client is an entity that sends STUN requests, + and receives STUN responses. STUN clients can also send + indications. In this specification, the terms STUN client and + client are synonymous. - STUN Server: A logical role in the STUN protocol. A STUN server - receives STUN requests or STUN indications and sends STUN - responses. The term "STUN server" is also used colloquially to - refer to a STUN agent that only acts as a STUN server. + 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). 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 @@ -363,40 +363,43 @@ 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 which represent a shared secret between client and server. Short term credentials are obtained through some kind of protocol - mechanism between the client 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. + 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 + RTO: Retransmission TimeOut, which defines the initial period of + time between transmission of a request and the first retransmit of + that request. 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 RFC791 [RFC0791]. Unless otherwise noted, numeric constants are in decimal (base 10). All STUN messages MUST start with a 20-byte header followed by zero @@ -426,34 +429,37 @@ (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 consists a single indication message). Response classes are split into error and success responses to aid in quickly processing the STUN message. 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 four + method, Binding. The method and class are orthogonal, so that for each method, a request, success response, error response and indication are defined 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 @@ -462,34 +468,36 @@ 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. The transaction ID is chosen by the STUN client. - It primarily serves to correlate requests with responses, though it - also plays a small role in helping to prevent certain types of - attacks. As such, the transaction ID MUST be uniformly and randomly - chosen from the interval 0 .. 2**96-1. 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. + 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 + in helping to prevent certain types of attacks. As such, the + transaction ID MUST be uniformly and randomly chosen from the + interval 0 .. 2**96-1. 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 four bytes, the last two 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 is given in @@ -500,44 +508,47 @@ 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 client MUST + When formulating a request or indication message, the agehtn 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 client then adds any attributes specified by the method or the - usage. For example, some usages may specify that the client use an + 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). For the Binding method with no authentication, no attributes are required unless the usage specifies otherwise. All STUN requests (and responses) sent over UDP MUST be less than the - path MTU, or 1500 bytes if the MTU is not known. + path MTU, or 1500 bytes if the MTU is not known. 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. 7.2. Sending the Request or Indication - The client then sends the request to the server. This document + 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 client - determines the IP address and port of the server. Section 9 + 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 which 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). 7.2.1. Sending over UDP @@ -551,25 +562,25 @@ 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, and is computed as described in RFC 2988 [RFC2988], with two exceptions. First, the initial value for RTO SHOULD be configurable (rather than the 3s recommended in RFC 2988) and SHOULD be greater than 100ms. In fixed- line access links, a value of 100ms is RECOMMENDED. Secondly, the value of RTO MUST NOT be rounded up to the nearest second. Rather, a 1ms accuracy MUST be maintained. As with TCP, the usage of - Karn's algorithm is RECOMMENDED. When applied to STUN, it means that - RTT estimates SHOULD NOT be computed from STUN transactions which - result in the retransmission of a request. + Karn's algorithm is RECOMMENDED [KARN87]. When applied to STUN, it + means that RTT estimates SHOULD NOT be computed from STUN + transactions which result in the retransmission of a request. - The value for RTO SHOULD be cached by an client after the completion + 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 7 requests have been sent. If, after the last request, a duration equal to 16 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 @@ -702,21 +714,23 @@ specific usage requires. If all the checks succeed, the server formulates a success response as described below. If the request uses UDP transport and is a retransmission of a request for which the server has already generated a success response within the last 10 seconds, the server MUST retransmit the same success response. One way for a server to do this is to remember all transaction IDs received over UDP and their corresponding responses in the last 10 seconds. Another way is to reprocess the request and recompute the response. The latter technique MUST only be applied to - requests which are idempotent and result in the same success response + requests which 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 idempotent in this way (even though certain rare network events could cause the reflexive transport address value to change). Extensions to STUN SHOULD state whether their request types have this property or not. 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 @@ -759,33 +773,33 @@ address and port of the response is equal to the destination IP address and port of the received request message. If the request was received over TCP or TLS-over-TCP, the response is sent back on the same TCP connection as the request was received on. 7.3.2. Processing an Indication If the indication contains unknown comprehension-required attributes, the indication is discarded and processing ceases. - The server then does any additional checking that the method or the - specific usage requires. If all the checks succeed, the server then + The agent then does any additional checking that the method or the + specific usage requires. If all the checks succeed, the agent then processes the indication. No response is generated for an indication. For the Binding method, no additional checking or processing is required, unless the usage specifies otherwise. The mere receipt of - the message by the server has refreshed the "bindings" in the + the message by the agent has refreshed the "bindings" in the intervening NATs. Since indications are not re-transmitted over UDP (unlike requests), there is no need to handle re-transmissions of indications at the - server. + sending agent. 7.3.3. Processing a Success Response If the success response contains unknown comprehension-required attributes, the response is discarded and the transaction is considered to have failed. The client then does any additional checking that the method or the specific usage requires. If all the checks succeed, the client then processes the success response. @@ -841,64 +855,69 @@ fixed fields in the STUN header that can be used for this purpose. However, in some cases, these three fixed fields may not be sufficient. When the FINGERPRINT extension is used, an agent includes the FINGERPRINT attribute in messages it sends to another agent. Section 14.5 describes the placement and value of this attribute. When the agent receives what it believes is a STUN message, then, in addition to other basic checks, the agent also checks that the message contains a FINGERPRINT attribute and that the attribute - contains the correct value (see Section 7.3. This additional check - helps the agent detect messages of other protocols that might - otherwise seem to be STUN messages. + contains the correct value. Section 7.3 describes when in the + overall processing of a STUN message the FINGERPRINT check is + performed. This additional check helps the agent detect messages of + other protocols that might otherwise seem to be STUN messages. 9. DNS Discovery of a Server This section describes an optional procedure for STUN that allows a client to use DNS to determine the IP address and port of a server. A STUN usage must describe if and when this extension is used. To - use this procedure, the client must have a domain name and a service - name; the usage must also describe how the client obtains these. + use this procedure, the client must know a server's domain name and a + service name; the usage must also describe how the client obtains + these. Hard-coding the domain-name of the server into software is + NOT RECOMMENDED in case the domain name is lost or needs to change + for legal or other reasons. When a client wishes to locate a STUN server in the public Internet that accepts Binding Request/Response transactions, the SRV service - name is "stun". STUN usages MAY define additional DNS SRV service - names. + name is "stun". When it wishes to locate a STUN server which accepts + Binding Request/Response transactions over a TLS session, the SRV + service name is "stuns". STUN usages MAY define additional DNS SRV + service names. The domain name is resolved to a transport address using the SRV procedures specified in [RFC2782]. The DNS SRV service name is the service name provided as input to this procedure. The protocol in the SRV lookup is the transport protocol the client will run STUN - over: "udp" for UDP, "tcp" for TCP, and "tls" for TLS-over-TCP. If, - in the future, additional SRV records are defined for TLS over other - transport protocols, those will need to utilize an SRV transport - token of the form "tls-foo" for transport protocol "foo". + over: "udp" for UDP and "tcp" for TCP. Note that only "tcp" is + defined with "stuns" at this time. The procedures of RFC 2782 are followed to determine the server to contact. RFC 2782 spells out the details of how a set of SRV records are sorted and then tried. However, RFC2782 only states that the client should "try to connect to the (protocol, address, service)" without giving any details on what happens in the event of failure. When following these procedures, if the STUN transaction times out without receipt of a response, the client SHOULD retry the request to - the next server in the list of servers from the DNS SRV response. - Such a retry is only possible for request/response transmissions, - since indication transactions generate no response or timeout. + the next server in the ordered defined by RFC 2782. Such a retry is + only possible for request/response transmissions, since indication + transactions generate no response or timeout. The default port for STUN requests is 3478, for both TCP and UDP. - Administrators SHOULD use this port in their SRV records for UDP and - TCP, but MAY use others. There is no default port for STUN over TLS, - however a STUN server SHOULD use a port number for TLS different from - 3478 so that the server can determine whether the first message it - will receive after the TCP connection is set up, is a STUN message or - a TLS message. + Administrators of STUN servers SHOULD use this port in their SRV + records for UDP and TCP, but MAY use others. In all cases, the port + in DNS MUST reflect the one the server is listening on. There is no + default port for STUN over TLS, however a STUN server SHOULD use a + port number for TLS different from 3478 so that the server can + determine whether the first message it will receive after the TCP + connection is set up, is a STUN message or a TLS message. If no SRV records were found, the client performs an A or AAAA record lookup of the domain name. The result will be a list of IP addresses, each of which can be contacted at the default port using UDP or TCP, independent of the STUN usage. For usages that require TLS, lack of SRV records is equivalent to a failure of the transaction, since the request or indication MUST NOT be sent unless SRV records provided a transport address specifically for TLS. 10. Authentication and Message-Integrity Mechanisms @@ -952,52 +971,52 @@ After the agent has done the basic processing of a message, the agent performs the checks listed below in order specified: o If the message does not contain both a MESSAGE-INTEGRITY and a USERNAME attribute: * If the message is a request, the server MUST reject the request with an error response. This response MUST use an error code of 400 (Bad Request). - * If the message is an indication, the server MUST silently + * If the message is an indication, the agent MUST silently discard the indication. o If the USERNAME does not contain a username value currently valid within the server: * If the message is a request, the server MUST reject the request with an error response. This response MUST use an error code of 401 (Unauthorized). - * If the message is an indication, the server MUST silently + * If the message is an indication, the agent MUST silently discard the indication. o Using the password associated with the username, compute the value for the message-integrity as described in Section 14.4. If the resulting value does not match the contents of the MESSAGE- INTEGRITY attribute: * If the message is a request, the server MUST reject the request with an error response. This response MUST use an error code of 401 (Unauthorized). - * If the message is an indication, the server MUST silently + * If the message is an indication, the agent MUST silently discard the indication. - If these checks pass, the server continues to process the request or - indication. Any response generated by the server MUST include the + If these checks pass, the agent continues to process the request or + indication. Any response generated by a server MUST include the MESSAGE-INTEGRITY attribute, computed using the password utilized to authenticate the request. The response MUST NOT contain the USERNAME attribute. - If any of the checks fail, the server MUST NOT include a MESSAGE- + If any of the checks fail, a server MUST NOT include a MESSAGE- INTEGRITY or USERNAME attribute in the error response. This is because, in these failure cases, the server cannot determine the shared secret necessary to compute MESSAGE-INTEGRITY. 10.1.3. Receiving a Response The client looks for the MESSAGE-INTEGRITY attribute in the response. If present, the client computes the message integrity over the response as defined in Section 14.4, using the same password it utilized for the request. If the resulting value matches the @@ -1075,21 +1093,21 @@ 10.2.1.2. Subsequent Requests Once a request/response transaction has completed successfully, the client will have been been presented a realm and nonce by the server, and selected a username and password with which it authenticated. The client SHOULD cache the username, password, realm, and nonce for subsequent communications with the server. When the client sends a subsequent request, it SHOULD include the USERNAME, REALM, and NONCE attributes with these cached values. It SHOULD include a MESSAGE- - INTEGRITY attributed, computed as described in Section 14.4 using the + INTEGRITY attribute, computed as described in Section 14.4 using the cached password. 10.2.2. Receiving a Request After the server has done the basic processing of a request, it performs the checks listed below in the order specified: o If the message does not contain a MESSAGE-INTEGRITY attribute, the server MUST generate an error response with an error code of 401 (Unauthorized). This response MUST include a REALM value. It is @@ -1200,26 +1218,27 @@ purposes of this extension, the important changes are the following. In RFC 3489: o UDP was the only supported transport; o The field that is now the Magic Cookie field was a part of the transaction id field, and transaction ids were 128 bits long; o The XOR-MAPPED-ADDRESS attribute did not exist, and the Binding method used the MAPPED-ADDRESS attribute instead; - o There were two comprehension-required attributes, RESPONSE-ADDRESS - and CHANGE-REQUEST, that have been removed from this - specification; + + o There were three comprehension-required attributes, RESPONSE- + ADDRESS, CHANGE-REQUEST, and CHANGED-ADDRESSthat have been removed + from this specification; * These attributes are now part of the NAT Behavior Discovery - usage. + usage. [I-D.ietf-behave-nat-behavior-discovery] 12.1. Changes to Client Processing A client that wants to interoperate with a [RFC3489] server SHOULD send a request message that uses the Binding method, contains no attributes, and uses UDP as the transport protocol to the server. If successful, the success response received from the server will contain a MAPPED-ADDRESS attribute rather than an XOR-MAPPED-ADDRESS attribute; other than this change, the processing of the response is identical to the procedures described above. @@ -1285,20 +1303,21 @@ In addition, any STUN usage must consider the security implications of using STUN in that usage. A number of attacks against STUN are known (see the Security Considerations section in this document) and any usage must consider how these attacks can be thwarted or mitigated. Finally, a usage must consider whether its usage of STUN is an example of the Unilateral Self-Address Fixing approach to NAT traversal, and if so, address the questions raised in RFC 3424. + [RFC3424] 14. STUN Attributes After the STUN header are zero or more attributes. Each attribute MUST be TLV encoded, with a 16 bit type, 16 bit length, and value. Each STUN attribute MUST end on a 32 bit boundary. As mentioned above, all fields in an attribute are transmitted most significant bit first. 0 1 2 3 @@ -1409,22 +1429,23 @@ The Family represents the IP address family, and is encoded identically to the Family in MAPPED-ADDRESS. X-Port is computed by taking the mapped port in host byte order, XOR'ing it with the most significant 16 bits of the magic cookie, and then the converting the result to network byte order. If the IP address family is IPv4, X-Address is computed by taking the mapped IP address in host byte order, XOR'ing it with the magic cookie, and converting the result to network byte order. If the IP address family is IPv6, X-Address is computed by taking the mapped IP address - in host byte order, XOR'ing it with the magic cookie and the 96-bit - transaction ID, and converting the result to network byte order. + in host byte order, XOR'ing it with the concatenation of the magic + cookie and the 96-bit transaction ID, and converting the result to + network byte order. The rules for encoding and processing the first 8 bits of the attribute's value, the rules for handling multiple occurrences of the attribute, and the rules for processing addresses families are the same as for MAPPED-ADDRESS. NOTE: XOR-MAPPED-ADDRESS and MAPPED-ADDRESS differ only in their encoding of the transport address. The former encodes the transport address by exclusive-or'ing it with the magic cookie. The latter encodes it directly in binary. RFC 3489 originally specified only @@ -1435,21 +1456,21 @@ behavior interferes with the operation of STUN and also causes failure of STUN's message integrity checking. 14.3. USERNAME The USERNAME attribute is used for message integrity. It identifies the username and password combination used in the message integrity check. The value of USERNAME is a variable length value. It MUST contain a - UTF-8 encoded sequence of less than 513 bytes. + UTF-8 [RFC3629] encoded sequence of less than 513 bytes. 14.4. MESSAGE-INTEGRITY The MESSAGE-INTEGRITY attribute contains an HMAC-SHA1 [RFC2104] of the STUN message. The MESSAGE-INTEGRITY attribute can be present in any STUN message type. Since it uses the SHA1 hash, the HMAC will be 20 bytes. The text used as input to HMAC is the STUN message, including the header, up to and including the attribute preceding the MESSAGE-INTEGRITY attribute. With the exception of the FINGERPRINT attribute, which appears after MESSAGE-INTEGRITY, agents MUST ignore @@ -1457,20 +1478,22 @@ The key for the HMAC depends on whether long term or short term credentials are in use. For long term credentials: key = MD5(username ":" realm ":" password) For short term credentials: key = password + Where MD5 is defined in RFC 1321 [RFC1321]. + The structure of the key when used with long term credentials facilitates deployment in systems that also utilize SIP. Typically, SIP systems utilizing SIP's digest authentication mechanism do not actually store the password in the database. Rather, they store a value called H(A1), which is equal to the key defined above. Based on the rules above, the hash includes the length field from the STUN message header. This length indicates the length of the entire message, including the MESSAGE-INTEGRITY attribute itself. Consequently, the MESSAGE-INTEGRITY attribute MUST be inserted into @@ -1478,26 +1501,26 @@ integrity check. Once the computation is performed, the value of the attribute can be filled in. This ensures the length has the correct value when the hash is performed. Similarly, when validating the MESSAGE-INTEGRITY, the length field should be adjusted to point to the end of the MESSAGE-INTEGRITY attribute prior to calculating the HMAC. Such adjustment is necessary when attributes, such as FINGERPRINT, appear after MESSAGE-INTEGRITY. 14.5. FINGERPRINT - The FINGERPRINT attribute may be present in all STUN messages. The + The FINGERPRINT attribute MAY be present in all STUN messages. The value of the attribute is computed as the CRC-32 of the STUN message up to (but excluding) the FINGERPRINT attribute itself, xor-d with the 32 bit value 0x5354554e (the XOR helps in cases where an application packet is also using CRC-32 in it). The 32 bit CRC is - the one defined in ITU V.42 [ITU.V42.1994], which has a generator + the one defined in ITU V.42 [ITU.V42.2002], which has a generator polynomial of x32+x26+x23+x22+x16+x12+x11+x10+x8+x7+x5+x4+x2+x+1. When present, the FINGERPRINT attribute MUST be the last attribute in the message, and thus will appear after MESSAGE-INTEGRITY. The FINGERPRINT attribute can aid in distinguishing STUN packets from packets of other protocols. See Section 8. As with MESSAGE-INTEGRITY, the CRC used in the FINGERPRINT attribute covers the length field from the STUN message header. Therefore, this value must be correct, and include the CRC attribute as part of @@ -1506,47 +1529,50 @@ into the message with a dummy value, then the CRC is computed, and then the value of the attribute is updated. If the MESSAGE-INTEGRITY attribute is also present, then it must be present with the correct message-integrity value before the CRC is computed, since the CRC is done over the value of the MESSAGE-INTEGRITY attribute as well. 14.6. ERROR-CODE The ERROR-CODE attribute is used in Error Response messages. It contains a numeric error code value in the range of 300 to 699 plus a - textual reason phrase encoded in UTF-8, and is consistent in its code - assignments and semantics with SIP [RFC3261] and HTTP [RFC2616]. The - reason phrase is meant for user consumption, and can be anything - appropriate for the error code. Recommended reason phrases for the - defined error codes are presented below. The reason phrase MUST be a - UTF-8 encoded sequence of less than 128 characters (which can be as - long as 763 bytes). - - To facilitate processing, the class of the error code (the hundreds - digit) is encoded separately from the rest of the code. + textual reason phrase encoded in UTF-8 [RFC3629], and is consistent + in its code assignments and semantics with SIP [RFC3261] and HTTP + [RFC2616]. The reason phrase is meant for user consumption, and can + be anything appropriate for the error code. Recommended reason + phrases for the defined error codes are presented below. The reason + phrase MUST be a UTF-8 [RFC3629] encoded sequence of less than 128 + characters (which can be as long as 763 bytes). 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 +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | Reserved, should be 0 |Class| Number | +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | Reason Phrase (variable) .. +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ + Figure 11: ERROR-CODE Attribute + + To facilitate processing, the class of the error code (the hundreds + digit) is encoded separately from the rest of the code, as shown in + Figure 11. + The Reserved bits SHOULD be 0, and are for alignment on 32-bit boundaries. Receivers MUST ignore these bits. The Class represents the hundreds digit of the error code. The value MUST be between 3 and 6. The number represents the error code modulo 100, and its value MUST be between 0 and 99. The following error codes, along with their recommended reason - phrases (in brackets) are defined: + phrases are defined: 300 Try Alternate: The client should contact an alternate server for this request. This error response MUST only be sent if the request included a USERNAME attribute and a valid MESSAGE- INTEGRITY attribute; otherwise it MUST NOT be sent and error code 400 (Bad Request) is suggested. This error response MUST be protected with the MESSAGE-INTEGRITY attribute, and receivers MUST validate the MESSAGE-INTEGRITY of this response before redirecting themselves to an alternate server. @@ -1554,57 +1580,60 @@ for a 300 response allows an on-path attacker to falsify a 300 response thus causing subsequent STUN messages to be sent to a victim. 400 Bad Request: The request was malformed. The client SHOULD NOT retry the request without modification from the previous attempt. The server may not be able to generate a valid MESSAGE-INTEGRITY for this error, so the client MUST NOT expect a valid MESSAGE-INTEGRITY attribute on this response. - 401 Unauthorized: The request did not contain the expected MESSAGE- - INTEGRITY attribute. The server MAY include the MESSAGE- - INTEGRITY attribute in its error response. + 401 Unauthorized: The request did not contain the correct + credentials to proceed. The client should retry the request + with proper credentials. 420 Unknown Attribute: The server received STUN packet containing a comprehension-required attribute which it did not understand. The server MUST put this unknown attribute in the UNKNOWN- ATTRIBUTE attribute of its error response. 438 Stale Nonce: The NONCE used by the client was no longer valid. The client should retry, using the NONCE provided in the response. 500 Server Error: The server has suffered a temporary error. The client should try again. 14.7. REALM The REALM attribute may be present in requests and responses. It contains text which meets the grammar for "realm-value" as described in RFC 3261 [RFC3261] but without the double quotes and their - surrounding whitespace. That is, it is an unquoted realm-value. It - MUST be a UTF-8 encoded sequence of less than 128 characters (which + surrounding whitespace. That is, it is an unquoted realm-value (and + is therefore a sequence of qdtext or quoted-pair). It MUST be a + UTF-8 [RFC3629] encoded sequence of less than 128 characters (which can be as long as 763 bytes). Presence of the REALM attribute in a request indicates that long-term credentials are being used for authentication. Presence in certain error responses indicates that the server wishes the client to use a long-term credential for authentication. 14.8. NONCE The NONCE attribute may be present in requests and responses. It contains a sequence of qdtext or quoted-pair, which are defined in - RFC 3261 [RFC3261]. See RFC 2617 [RFC2617], Section 4.3, for - guidance on selection of nonce values in a server. It MUST be less - than 128 characters (which can be as long as 763 bytes). + RFC 3261 [RFC3261]. Note that this means that the NONCE attribute + will not contain actual quote characters. See RFC 2617 [RFC2617], + Section 4.3, for guidance on selection of nonce values in a server. + It MUST be less than 128 characters (which can be as long as 763 + bytes). 14.9. UNKNOWN-ATTRIBUTES The UNKNOWN-ATTRIBUTES attribute is present only in an error response when the response code in the ERROR-CODE attribute is 420. The attribute contains a list of 16 bit values, each of which represents an attribute type that was not understood by the server. 0 1 2 3 @@ -1619,22 +1649,23 @@ Note: In [RFC3489], this field was padded to 32 by duplicating the last attribute. In this version of the specification, the normal padding rules for attributes are used instead. 14.10. SERVER The server attribute contains a textual description of the software being used by the server, including manufacturer and version number. The attribute has no impact on operation of the protocol, and serves only as a tool for diagnostic and debugging purposes. The value of - SERVER is variable length. It MUST be a UTF-8 encoded sequence of - less than 128 characters (which can be as long as 763 bytes). + SERVER is variable length. It MUST be a UTF-8 [RFC3629] encoded + sequence of less than 128 characters (which can be as long as 763 + bytes). 14.11. ALTERNATE-SERVER The alternate server represents an alternate transport address identifying a different STUN server which the STUN client should try. It is encoded in the same way as MAPPED-ADDRESS, and thus refers to a single server by IP address. The IP address family MUST be identical to that of the source IP address of the request. @@ -1788,21 +1819,22 @@ document a specific set of considerations. Because some STUN usages provide UNSAF functions (such as ICE [I-D.ietf-mmusic-ice] ), and others do not (such as SIP Outbound [I-D.ietf-sip-outbound]), answers to these considerations need to be addressed by the usages themselves. 17. IANA Considerations IANA is hereby requested to create three new registries: a STUN methods registry, a STUN Attributes registry, and a STUN Error Codes - registry. + registry. IANA is also requested to change the name of the assigned + IANA port for STUN from "nat-stun-port" to "stun". 17.1. STUN Methods Registry A STUN method is a hex number in the range 0x000 - 0x3FF. The encoding of STUN method into a STUN message is described in Section 6. The initial STUN methods are: 0x000: (Reserved) @@ -1820,20 +1852,21 @@ comprehension-required; STUN attribute types in the range 0x8000 - 0xFFFF are considered comprehension-optional. A STUN agent handles unknown comprehension-required and comprehension-optional attributes differently. The initial STUN Attributes types are: Comprehension-required range (0x0000-0x7FFF): 0x0000: (Reserved) 0x0001: MAPPED-ADDRESS + 0x0002: (Reserved; was RESPONSE-ADDRESS) 0x0006: USERNAME 0x0007: (Reserved; was PASSWORD) 0x0008: MESSAGE-INTEGRITY 0x0009: ERROR-CODE 0x000A: UNKNOWN-ATTRIBUTES 0x0014: REALM 0x0015: NONCE 0x0020: XOR-MAPPED-ADDRESS Comprehension-optional range (0x8000-0xFFFF) @@ -1845,34 +1878,47 @@ range (0x0000 - 0x3FFF) and in the first half of the comprehension- optional range (0x8000 - 0xBFFF) are assigned by IETF Consensus [RFC2434]. STUN Attribute types in the second half of the comprehension-required range (0x4000 - 0x7FFF) and in the second half of the comprehension-optional range (0xC000 - 0xFFFF) are assigned on a First Come First Served basis [RFC2434]. 17.3. STUN Error Code Registry A STUN Error code is a number in the range 0 - 699. STUN error codes - are accompanied by a textual reason phrase in UTF-8 which is intended - only for human consumption and can be anything appropriate; this - document proposes only suggested values. + are accompanied by a textual reason phrase in UTF-8 [RFC3629] which + is intended only for human consumption and can be anything + appropriate; this document proposes only suggested values. STUN error codes are consistent in codepoint assignments and semantics with SIP [RFC3261] and HTTP [RFC2616]. The initial values in this registry are given in Section 14.6. New STUN error codes are assigned on a Specification-Required basis [RFC2434]. The specification must carefully consider how clients that do not understand this error code will process it before granting the request. See the rules in Section 7.3.4. +17.4. STUN UDP and TCP Port Numbers + + IANA has previously assigned port 3478 for STUN. This port appears + in the IANA registry under the moniker "nat-stun-port". In order to + align the DNS SRV procedures with the registered protocol service, + IANA is requested to change the name of protocol assigned to port + 3478 from "nat-stun-port" to "stun", and the textual name from + "Simple Traversal of UDP Through NAT (STUN)" to "Session Traversal + Utilities for NAT", so that the IANA port registry would read: + + stun 3478/tcp Session Traversal Utilities for NAT (STUN) port + stun 3478/udp Session Traversal Utilities for NAT (STUN) port + 18. Changes Since RFC 3489 This specification obsoletes RFC3489 [RFC3489]. This specification differs from RFC3489 in the following ways: o Removed the notion that STUN is a complete NAT traversal solution. STUN is now a tool that can be used to produce a NAT traversal solution. As a consequence, changed the name of the protocol to Session Traversal Utilities for NAT. @@ -1931,32 +1977,37 @@ o Defined a generic padding mechanism that changes the interpretation of the length attribute. This would, in theory, break backwards compatibility. However, the mechanism in RFC 3489 never worked for the few attributes that weren't aligned naturally on 32 bit boundaries. o REALM, SERVER, reason phrases and NONCE limited to 127 characters. USERNAME to 513 bytes. -19. Acknowledgements +19. Contributors + + Christian Huitema and Joel Weinberger were original co-authors of RFC + 3489. + +20. Acknowledgements The authors would like to thank Cedric Aoun, Pete Cordell, Cullen - Jennings, Bob Penfield, Xavier Marjou, Bruce Lowekamp and Chris - Sullivan for their comments, and Baruch Sterman and Alan Hawrylyshen - for initial implementations. Thanks for Leslie Daigle, Allison - Mankin, Eric Rescorla, and Henning Schulzrinne for IESG and IAB input - on this work. + Jennings, Bob Penfield, Xavier Marjou, Magnus Westerlund, Miguel + Garcia, Bruce Lowekamp and Chris Sullivan for their comments, and + Baruch Sterman and Alan Hawrylyshen for initial implementations. + Thanks for Leslie Daigle, Allison Mankin, Eric Rescorla, and Henning + Schulzrinne for IESG and IAB input on this work. -20. References +21. References -20.1. Normative References +21.1. Normative References [RFC2119] Bradner, S., "Key words for use in RFCs to Indicate Requirement Levels", BCP 14, RFC 2119, March 1997. [RFC0791] Postel, J., "Internet Protocol", STD 5, RFC 791, September 1981. [RFC2782] Gulbrandsen, A., Vixie, P., and L. Esibov, "A DNS RR for specifying the location of services (DNS SRV)", RFC 2782, February 2000. @@ -1968,26 +2019,32 @@ Authentication: Basic and Digest Access Authentication", RFC 2617, June 1999. [RFC2988] Paxson, V. and M. Allman, "Computing TCP's Retransmission Timer", RFC 2988, November 2000. [RFC2104] Krawczyk, H., Bellare, M., and R. Canetti, "HMAC: Keyed- Hashing for Message Authentication", RFC 2104, February 1997. - [ITU.V42.1994] + [ITU.V42.2002] International Telecommunications Union, "Error-correcting Procedures for DCEs Using Asynchronous-to-Synchronous - Conversion", ITU-T Recommendation V.42, 1994. + Conversion", ITU-T Recommendation V.42, March 2002. -20.2. Informational References + [RFC3629] Yergeau, F., "UTF-8, a transformation format of ISO + 10646", STD 63, RFC 3629, November 2003. + + [RFC1321] Rivest, R., "The MD5 Message-Digest Algorithm", RFC 1321, + April 1992. + +21.2. Informational References [RFC3261] Rosenberg, J., Schulzrinne, H., Camarillo, G., Johnston, A., Peterson, J., Sparks, R., Handley, M., and E. Schooler, "SIP: Session Initiation Protocol", RFC 3261, June 2002. [RFC2616] Fielding, R., Gettys, J., Mogul, J., Frystyk, H., Masinter, L., Leach, P., and T. Berners-Lee, "Hypertext Transfer Protocol -- HTTP/1.1", RFC 2616, June 1999. @@ -2029,20 +2086,24 @@ June 2002. [RFC3424] Daigle, L. and IAB, "IAB Considerations for UNilateral Self-Address Fixing (UNSAF) Across Network Address Translation", RFC 3424, November 2002. [RFC2434] Narten, T. and H. Alvestrand, "Guidelines for Writing an IANA Considerations Section in RFCs", BCP 26, RFC 2434, October 1998. + [KARN87] Karn, P. and C. Partridge, "Improving Round-Trip Time + Estimates in Reliable Transport Protocols", SIGCOMM 1987, + August 1987. + Appendix A. C Snippet to Determine STUN Message Types Given an 16-bit STUN message type value in host byte order in msg_type parameter, below are C macros to determine the STUN message types: #define IS_REQUEST(msg_type) (((msg_type) & 0x0110) == 0x0000) #define IS_INDICATION(msg_type) (((msg_type) & 0x0110) == 0x0010) #define IS_SUCCESS_RESP(msg_type) (((msg_type) & 0x0110) == 0x0100) #define IS_ERR_RESP(msg_type) (((msg_type) & 0x0110) == 0x0110) @@ -2050,28 +2111,20 @@ Authors' Addresses Jonathan Rosenberg Cisco Edison, NJ US Email: jdrosen@cisco.com URI: http://www.jdrosen.net - Christian Huitema - Microsoft - One Microsoft Way - Redmond, WA 98052 - US - - Email: huitema@microsoft.com - Rohan Mahy Plantronics 345 Encinal Street Santa Cruz, CA 95060 US Email: rohan@ekabal.com Philip Matthews Avaya 1135 Innovation Drive