tests/auto/qtextstream/rfc3261.txt
changeset 0 1918ee327afb
child 7 3f74d0d4af4c
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/tests/auto/qtextstream/rfc3261.txt	Mon Jan 11 14:00:40 2010 +0000
@@ -0,0 +1,15067 @@
+
+
+
+
+
+
+Network Working Group                                       J. Rosenberg
+Request for Comments: 3261                                   dynamicsoft
+Obsoletes: 2543                                           H. Schulzrinne
+Category: Standards Track                                    Columbia U.
+                                                            G. Camarillo
+                                                                Ericsson
+                                                             A. Johnston
+                                                                WorldCom
+                                                             J. Peterson
+                                                                 Neustar
+                                                               R. Sparks
+                                                             dynamicsoft
+                                                              M. Handley
+                                                                    ICIR
+                                                             E. Schooler
+                                                                    AT&T
+                                                               June 2002
+
+                    SIP: Session Initiation Protocol
+
+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.
+
+Copyright Notice
+
+   Copyright (C) The Internet Society (2002).  All Rights Reserved.
+
+Abstract
+
+   This document describes Session Initiation Protocol (SIP), an
+   application-layer control (signaling) protocol for creating,
+   modifying, and terminating sessions with one or more participants.
+   These sessions include Internet telephone calls, multimedia
+   distribution, and multimedia conferences.
+
+   SIP invitations used to create sessions carry session descriptions
+   that allow participants to agree on a set of compatible media types.
+   SIP makes use of elements called proxy servers to help route requests
+   to the user's current location, authenticate and authorize users for
+   services, implement provider call-routing policies, and provide
+   features to users.  SIP also provides a registration function that
+   allows users to upload their current locations for use by proxy
+   servers.  SIP runs on top of several different transport protocols.
+
+
+
+Rosenberg, et. al.          Standards Track                     [Page 1]
+
+RFC 3261            SIP: Session Initiation Protocol           June 2002
+
+
+Table of Contents
+
+   1          Introduction ........................................    8
+   2          Overview of SIP Functionality .......................    9
+   3          Terminology .........................................   10
+   4          Overview of Operation ...............................   10
+   5          Structure of the Protocol ...........................   18
+   6          Definitions .........................................   20
+   7          SIP Messages ........................................   26
+   7.1        Requests ............................................   27
+   7.2        Responses ...........................................   28
+   7.3        Header Fields .......................................   29
+   7.3.1      Header Field Format .................................   30
+   7.3.2      Header Field Classification .........................   32
+   7.3.3      Compact Form ........................................   32
+   7.4        Bodies ..............................................   33
+   7.4.1      Message Body Type ...................................   33
+   7.4.2      Message Body Length .................................   33
+   7.5        Framing SIP Messages ................................   34
+   8          General User Agent Behavior .........................   34
+   8.1        UAC Behavior ........................................   35
+   8.1.1      Generating the Request ..............................   35
+   8.1.1.1    Request-URI .........................................   35
+   8.1.1.2    To ..................................................   36
+   8.1.1.3    From ................................................   37
+   8.1.1.4    Call-ID .............................................   37
+   8.1.1.5    CSeq ................................................   38
+   8.1.1.6    Max-Forwards ........................................   38
+   8.1.1.7    Via .................................................   39
+   8.1.1.8    Contact .............................................   40
+   8.1.1.9    Supported and Require ...............................   40
+   8.1.1.10   Additional Message Components .......................   41
+   8.1.2      Sending the Request .................................   41
+   8.1.3      Processing Responses ................................   42
+   8.1.3.1    Transaction Layer Errors ............................   42
+   8.1.3.2    Unrecognized Responses ..............................   42
+   8.1.3.3    Vias ................................................   43
+   8.1.3.4    Processing 3xx Responses ............................   43
+   8.1.3.5    Processing 4xx Responses ............................   45
+   8.2        UAS Behavior ........................................   46
+   8.2.1      Method Inspection ...................................   46
+   8.2.2      Header Inspection ...................................   46
+   8.2.2.1    To and Request-URI ..................................   46
+   8.2.2.2    Merged Requests .....................................   47
+   8.2.2.3    Require .............................................   47
+   8.2.3      Content Processing ..................................   48
+   8.2.4      Applying Extensions .................................   49
+   8.2.5      Processing the Request ..............................   49
+
+
+
+Rosenberg, et. al.          Standards Track                     [Page 2]
+
+RFC 3261            SIP: Session Initiation Protocol           June 2002
+
+
+   8.2.6      Generating the Response .............................   49
+   8.2.6.1    Sending a Provisional Response ......................   49
+   8.2.6.2    Headers and Tags ....................................   50
+   8.2.7      Stateless UAS Behavior ..............................   50
+   8.3        Redirect Servers ....................................   51
+   9          Canceling a Request .................................   53
+   9.1        Client Behavior .....................................   53
+   9.2        Server Behavior .....................................   55
+   10         Registrations .......................................   56
+   10.1       Overview ............................................   56
+   10.2       Constructing the REGISTER Request ...................   57
+   10.2.1     Adding Bindings .....................................   59
+   10.2.1.1   Setting the Expiration Interval of Contact Addresses    60
+   10.2.1.2   Preferences among Contact Addresses .................   61
+   10.2.2     Removing Bindings ...................................   61
+   10.2.3     Fetching Bindings ...................................   61
+   10.2.4     Refreshing Bindings .................................   61
+   10.2.5     Setting the Internal Clock ..........................   62
+   10.2.6     Discovering a Registrar .............................   62
+   10.2.7     Transmitting a Request ..............................   62
+   10.2.8     Error Responses .....................................   63
+   10.3       Processing REGISTER Requests ........................   63
+   11         Querying for Capabilities ...........................   66
+   11.1       Construction of OPTIONS Request .....................   67
+   11.2       Processing of OPTIONS Request .......................   68
+   12         Dialogs .............................................   69
+   12.1       Creation of a Dialog ................................   70
+   12.1.1     UAS behavior ........................................   70
+   12.1.2     UAC Behavior ........................................   71
+   12.2       Requests within a Dialog ............................   72
+   12.2.1     UAC Behavior ........................................   73
+   12.2.1.1   Generating the Request ..............................   73
+   12.2.1.2   Processing the Responses ............................   75
+   12.2.2     UAS Behavior ........................................   76
+   12.3       Termination of a Dialog .............................   77
+   13         Initiating a Session ................................   77
+   13.1       Overview ............................................   77
+   13.2       UAC Processing ......................................   78
+   13.2.1     Creating the Initial INVITE .........................   78
+   13.2.2     Processing INVITE Responses .........................   81
+   13.2.2.1   1xx Responses .......................................   81
+   13.2.2.2   3xx Responses .......................................   81
+   13.2.2.3   4xx, 5xx and 6xx Responses ..........................   81
+   13.2.2.4   2xx Responses .......................................   82
+   13.3       UAS Processing ......................................   83
+   13.3.1     Processing of the INVITE ............................   83
+   13.3.1.1   Progress ............................................   84
+   13.3.1.2   The INVITE is Redirected ............................   84
+
+
+
+Rosenberg, et. al.          Standards Track                     [Page 3]
+
+RFC 3261            SIP: Session Initiation Protocol           June 2002
+
+
+   13.3.1.3   The INVITE is Rejected ..............................   85
+   13.3.1.4   The INVITE is Accepted ..............................   85
+   14         Modifying an Existing Session .......................   86
+   14.1       UAC Behavior ........................................   86
+   14.2       UAS Behavior ........................................   88
+   15         Terminating a Session ...............................   89
+   15.1       Terminating a Session with a BYE Request ............   90
+   15.1.1     UAC Behavior ........................................   90
+   15.1.2     UAS Behavior ........................................   91
+   16         Proxy Behavior ......................................   91
+   16.1       Overview ............................................   91
+   16.2       Stateful Proxy ......................................   92
+   16.3       Request Validation ..................................   94
+   16.4       Route Information Preprocessing .....................   96
+   16.5       Determining Request Targets .........................   97
+   16.6       Request Forwarding ..................................   99
+   16.7       Response Processing .................................  107
+   16.8       Processing Timer C ..................................  114
+   16.9       Handling Transport Errors ...........................  115
+   16.10      CANCEL Processing ...................................  115
+   16.11      Stateless Proxy .....................................  116
+   16.12      Summary of Proxy Route Processing ...................  118
+   16.12.1    Examples ............................................  118
+   16.12.1.1  Basic SIP Trapezoid .................................  118
+   16.12.1.2  Traversing a Strict-Routing Proxy ...................  120
+   16.12.1.3  Rewriting Record-Route Header Field Values ..........  121
+   17         Transactions ........................................  122
+   17.1       Client Transaction ..................................  124
+   17.1.1     INVITE Client Transaction ...........................  125
+   17.1.1.1   Overview of INVITE Transaction ......................  125
+   17.1.1.2   Formal Description ..................................  125
+   17.1.1.3   Construction of the ACK Request .....................  129
+   17.1.2     Non-INVITE Client Transaction .......................  130
+   17.1.2.1   Overview of the non-INVITE Transaction ..............  130
+   17.1.2.2   Formal Description ..................................  131
+   17.1.3     Matching Responses to Client Transactions ...........  132
+   17.1.4     Handling Transport Errors ...........................  133
+   17.2       Server Transaction ..................................  134
+   17.2.1     INVITE Server Transaction ...........................  134
+   17.2.2     Non-INVITE Server Transaction .......................  137
+   17.2.3     Matching Requests to Server Transactions ............  138
+   17.2.4     Handling Transport Errors ...........................  141
+   18         Transport ...........................................  141
+   18.1       Clients .............................................  142
+   18.1.1     Sending Requests ....................................  142
+   18.1.2     Receiving Responses .................................  144
+   18.2       Servers .............................................  145
+   18.2.1     Receiving Requests ..................................  145
+
+
+
+Rosenberg, et. al.          Standards Track                     [Page 4]
+
+RFC 3261            SIP: Session Initiation Protocol           June 2002
+
+
+   18.2.2     Sending Responses ...................................  146
+   18.3       Framing .............................................  147
+   18.4       Error Handling ......................................  147
+   19         Common Message Components ...........................  147
+   19.1       SIP and SIPS Uniform Resource Indicators ............  148
+   19.1.1     SIP and SIPS URI Components .........................  148
+   19.1.2     Character Escaping Requirements .....................  152
+   19.1.3     Example SIP and SIPS URIs ...........................  153
+   19.1.4     URI Comparison ......................................  153
+   19.1.5     Forming Requests from a URI .........................  156
+   19.1.6     Relating SIP URIs and tel URLs ......................  157
+   19.2       Option Tags .........................................  158
+   19.3       Tags ................................................  159
+   20         Header Fields .......................................  159
+   20.1       Accept ..............................................  161
+   20.2       Accept-Encoding .....................................  163
+   20.3       Accept-Language .....................................  164
+   20.4       Alert-Info ..........................................  164
+   20.5       Allow ...............................................  165
+   20.6       Authentication-Info .................................  165
+   20.7       Authorization .......................................  165
+   20.8       Call-ID .............................................  166
+   20.9       Call-Info ...........................................  166
+   20.10      Contact .............................................  167
+   20.11      Content-Disposition .................................  168
+   20.12      Content-Encoding ....................................  169
+   20.13      Content-Language ....................................  169
+   20.14      Content-Length ......................................  169
+   20.15      Content-Type ........................................  170
+   20.16      CSeq ................................................  170
+   20.17      Date ................................................  170
+   20.18      Error-Info ..........................................  171
+   20.19      Expires .............................................  171
+   20.20      From ................................................  172
+   20.21      In-Reply-To .........................................  172
+   20.22      Max-Forwards ........................................  173
+   20.23      Min-Expires .........................................  173
+   20.24      MIME-Version ........................................  173
+   20.25      Organization ........................................  174
+   20.26      Priority ............................................  174
+   20.27      Proxy-Authenticate ..................................  174
+   20.28      Proxy-Authorization .................................  175
+   20.29      Proxy-Require .......................................  175
+   20.30      Record-Route ........................................  175
+   20.31      Reply-To ............................................  176
+   20.32      Require .............................................  176
+   20.33      Retry-After .........................................  176
+   20.34      Route ...............................................  177
+
+
+
+Rosenberg, et. al.          Standards Track                     [Page 5]
+
+RFC 3261            SIP: Session Initiation Protocol           June 2002
+
+
+   20.35      Server ..............................................  177
+   20.36      Subject .............................................  177
+   20.37      Supported ...........................................  178
+   20.38      Timestamp ...........................................  178
+   20.39      To ..................................................  178
+   20.40      Unsupported .........................................  179
+   20.41      User-Agent ..........................................  179
+   20.42      Via .................................................  179
+   20.43      Warning .............................................  180
+   20.44      WWW-Authenticate ....................................  182
+   21         Response Codes ......................................  182
+   21.1       Provisional 1xx .....................................  182
+   21.1.1     100 Trying ..........................................  183
+   21.1.2     180 Ringing .........................................  183
+   21.1.3     181 Call Is Being Forwarded .........................  183
+   21.1.4     182 Queued ..........................................  183
+   21.1.5     183 Session Progress ................................  183
+   21.2       Successful 2xx ......................................  183
+   21.2.1     200 OK ..............................................  183
+   21.3       Redirection 3xx .....................................  184
+   21.3.1     300 Multiple Choices ................................  184
+   21.3.2     301 Moved Permanently ...............................  184
+   21.3.3     302 Moved Temporarily ...............................  184
+   21.3.4     305 Use Proxy .......................................  185
+   21.3.5     380 Alternative Service .............................  185
+   21.4       Request Failure 4xx .................................  185
+   21.4.1     400 Bad Request .....................................  185
+   21.4.2     401 Unauthorized ....................................  185
+   21.4.3     402 Payment Required ................................  186
+   21.4.4     403 Forbidden .......................................  186
+   21.4.5     404 Not Found .......................................  186
+   21.4.6     405 Method Not Allowed ..............................  186
+   21.4.7     406 Not Acceptable ..................................  186
+   21.4.8     407 Proxy Authentication Required ...................  186
+   21.4.9     408 Request Timeout .................................  186
+   21.4.10    410 Gone ............................................  187
+   21.4.11    413 Request Entity Too Large ........................  187
+   21.4.12    414 Request-URI Too Long ............................  187
+   21.4.13    415 Unsupported Media Type ..........................  187
+   21.4.14    416 Unsupported URI Scheme ..........................  187
+   21.4.15    420 Bad Extension ...................................  187
+   21.4.16    421 Extension Required ..............................  188
+   21.4.17    423 Interval Too Brief ..............................  188
+   21.4.18    480 Temporarily Unavailable .........................  188
+   21.4.19    481 Call/Transaction Does Not Exist .................  188
+   21.4.20    482 Loop Detected ...................................  188
+   21.4.21    483 Too Many Hops ...................................  189
+   21.4.22    484 Address Incomplete ..............................  189
+
+
+
+Rosenberg, et. al.          Standards Track                     [Page 6]
+
+RFC 3261            SIP: Session Initiation Protocol           June 2002
+
+
+   21.4.23    485 Ambiguous .......................................  189
+   21.4.24    486 Busy Here .......................................  189
+   21.4.25    487 Request Terminated ..............................  190
+   21.4.26    488 Not Acceptable Here .............................  190
+   21.4.27    491 Request Pending .................................  190
+   21.4.28    493 Undecipherable ..................................  190
+   21.5       Server Failure 5xx ..................................  190
+   21.5.1     500 Server Internal Error ...........................  190
+   21.5.2     501 Not Implemented .................................  191
+   21.5.3     502 Bad Gateway .....................................  191
+   21.5.4     503 Service Unavailable .............................  191
+   21.5.5     504 Server Time-out .................................  191
+   21.5.6     505 Version Not Supported ...........................  192
+   21.5.7     513 Message Too Large ...............................  192
+   21.6       Global Failures 6xx .................................  192
+   21.6.1     600 Busy Everywhere .................................  192
+   21.6.2     603 Decline .........................................  192
+   21.6.3     604 Does Not Exist Anywhere .........................  192
+   21.6.4     606 Not Acceptable ..................................  192
+   22         Usage of HTTP Authentication ........................  193
+   22.1       Framework ...........................................  193
+   22.2       User-to-User Authentication .........................  195
+   22.3       Proxy-to-User Authentication ........................  197
+   22.4       The Digest Authentication Scheme ....................  199
+   23         S/MIME ..............................................  201
+   23.1       S/MIME Certificates .................................  201
+   23.2       S/MIME Key Exchange .................................  202
+   23.3       Securing MIME bodies ................................  205
+   23.4       SIP Header Privacy and Integrity using S/MIME:
+              Tunneling SIP .......................................  207
+   23.4.1     Integrity and Confidentiality Properties of SIP
+              Headers .............................................  207
+   23.4.1.1   Integrity ...........................................  207
+   23.4.1.2   Confidentiality .....................................  208
+   23.4.2     Tunneling Integrity and Authentication ..............  209
+   23.4.3     Tunneling Encryption ................................  211
+   24         Examples ............................................  213
+   24.1       Registration ........................................  213
+   24.2       Session Setup .......................................  214
+   25         Augmented BNF for the SIP Protocol ..................  219
+   25.1       Basic Rules .........................................  219
+   26         Security Considerations: Threat Model and Security
+              Usage Recommendations ...............................  232
+   26.1       Attacks and Threat Models ...........................  233
+   26.1.1     Registration Hijacking ..............................  233
+   26.1.2     Impersonating a Server ..............................  234
+   26.1.3     Tampering with Message Bodies .......................  235
+   26.1.4     Tearing Down Sessions ...............................  235
+
+
+
+Rosenberg, et. al.          Standards Track                     [Page 7]
+
+RFC 3261            SIP: Session Initiation Protocol           June 2002
+
+
+   26.1.5     Denial of Service and Amplification .................  236
+   26.2       Security Mechanisms .................................  237
+   26.2.1     Transport and Network Layer Security ................  238
+   26.2.2     SIPS URI Scheme .....................................  239
+   26.2.3     HTTP Authentication .................................  240
+   26.2.4     S/MIME ..............................................  240
+   26.3       Implementing Security Mechanisms ....................  241
+   26.3.1     Requirements for Implementers of SIP ................  241
+   26.3.2     Security Solutions ..................................  242
+   26.3.2.1   Registration ........................................  242
+   26.3.2.2   Interdomain Requests ................................  243
+   26.3.2.3   Peer-to-Peer Requests ...............................  245
+   26.3.2.4   DoS Protection ......................................  246
+   26.4       Limitations .........................................  247
+   26.4.1     HTTP Digest .........................................  247
+   26.4.2     S/MIME ..............................................  248
+   26.4.3     TLS .................................................  249
+   26.4.4     SIPS URIs ...........................................  249
+   26.5       Privacy .............................................  251
+   27         IANA Considerations .................................  252
+   27.1       Option Tags .........................................  252
+   27.2       Warn-Codes ..........................................  252
+   27.3       Header Field Names ..................................  253
+   27.4       Method and Response Codes ...........................  253
+   27.5       The "message/sip" MIME type.  .......................  254
+   27.6       New Content-Disposition Parameter Registrations .....  255
+   28         Changes From RFC 2543 ...............................  255
+   28.1       Major Functional Changes ............................  255
+   28.2       Minor Functional Changes ............................  260
+   29         Normative References ................................  261
+   30         Informative References ..............................  262
+   A          Table of Timer Values ...............................  265
+   Acknowledgments ................................................  266
+   Authors' Addresses .............................................  267
+   Full Copyright Statement .......................................  269
+
+1 Introduction
+
+   There are many applications of the Internet that require the creation
+   and management of a session, where a session is considered an
+   exchange of data between an association of participants.  The
+   implementation of these applications is complicated by the practices
+   of participants: users may move between endpoints, they may be
+   addressable by multiple names, and they may communicate in several
+   different media - sometimes simultaneously.  Numerous protocols have
+   been authored that carry various forms of real-time multimedia
+   session data such as voice, video, or text messages.  The Session
+   Initiation Protocol (SIP) works in concert with these protocols by
+
+
+
+Rosenberg, et. al.          Standards Track                     [Page 8]
+
+RFC 3261            SIP: Session Initiation Protocol           June 2002
+
+
+   enabling Internet endpoints (called user agents) to discover one
+   another and to agree on a characterization of a session they would
+   like to share.  For locating prospective session participants, and
+   for other functions, SIP enables the creation of an infrastructure of
+   network hosts (called proxy servers) to which user agents can send
+   registrations, invitations to sessions, and other requests.  SIP is
+   an agile, general-purpose tool for creating, modifying, and
+   terminating sessions that works independently of underlying transport
+   protocols and without dependency on the type of session that is being
+   established.
+
+2 Overview of SIP Functionality
+
+   SIP is an application-layer control protocol that can establish,
+   modify, and terminate multimedia sessions (conferences) such as
+   Internet telephony calls.  SIP can also invite participants to
+   already existing sessions, such as multicast conferences.  Media can
+   be added to (and removed from) an existing session.  SIP
+   transparently supports name mapping and redirection services, which
+   supports personal mobility [27] - users can maintain a single
+   externally visible identifier regardless of their network location.
+
+   SIP supports five facets of establishing and terminating multimedia
+   communications:
+
+      User location: determination of the end system to be used for
+           communication;
+
+      User availability: determination of the willingness of the called
+           party to engage in communications;
+
+      User capabilities: determination of the media and media parameters
+           to be used;
+
+      Session setup: "ringing", establishment of session parameters at
+           both called and calling party;
+
+      Session management: including transfer and termination of
+           sessions, modifying session parameters, and invoking
+           services.
+
+   SIP is not a vertically integrated communications system.  SIP is
+   rather a component that can be used with other IETF protocols to
+   build a complete multimedia architecture.  Typically, these
+   architectures will include protocols such as the Real-time Transport
+   Protocol (RTP) (RFC 1889 [28]) for transporting real-time data and
+   providing QoS feedback, the Real-Time streaming protocol (RTSP) (RFC
+   2326 [29]) for controlling delivery of streaming media, the Media
+
+
+
+Rosenberg, et. al.          Standards Track                     [Page 9]
+
+RFC 3261            SIP: Session Initiation Protocol           June 2002
+
+
+   Gateway Control Protocol (MEGACO) (RFC 3015 [30]) for controlling
+   gateways to the Public Switched Telephone Network (PSTN), and the
+   Session Description Protocol (SDP) (RFC 2327 [1]) for describing
+   multimedia sessions.  Therefore, SIP should be used in conjunction
+   with other protocols in order to provide complete services to the
+   users.  However, the basic functionality and operation of SIP does
+   not depend on any of these protocols.
+
+   SIP does not provide services.  Rather, SIP provides primitives that
+   can be used to implement different services.  For example, SIP can
+   locate a user and deliver an opaque object to his current location.
+   If this primitive is used to deliver a session description written in
+   SDP, for instance, the endpoints can agree on the parameters of a
+   session.  If the same primitive is used to deliver a photo of the
+   caller as well as the session description, a "caller ID" service can
+   be easily implemented.  As this example shows, a single primitive is
+   typically used to provide several different services.
+
+   SIP does not offer conference control services such as floor control
+   or voting and does not prescribe how a conference is to be managed.
+   SIP can be used to initiate a session that uses some other conference
+   control protocol.  Since SIP messages and the sessions they establish
+   can pass through entirely different networks, SIP cannot, and does
+   not, provide any kind of network resource reservation capabilities.
+
+   The nature of the services provided make security particularly
+   important.  To that end, SIP provides a suite of security services,
+   which include denial-of-service prevention, authentication (both user
+   to user and proxy to user), integrity protection, and encryption and
+   privacy services.
+
+   SIP works with both IPv4 and IPv6.
+
+3 Terminology
+
+   In this document, the key words "MUST", "MUST NOT", "REQUIRED",
+   "SHALL", "SHALL NOT", "SHOULD", "SHOULD NOT", "RECOMMENDED", "NOT
+   RECOMMENDED", "MAY", and "OPTIONAL" are to be interpreted as
+   described in BCP 14, RFC 2119 [2] and indicate requirement levels for
+   compliant SIP implementations.
+
+4 Overview of Operation
+
+   This section introduces the basic operations of SIP using simple
+   examples.  This section is tutorial in nature and does not contain
+   any normative statements.
+
+
+
+
+
+Rosenberg, et. al.          Standards Track                    [Page 10]
+
+RFC 3261            SIP: Session Initiation Protocol           June 2002
+
+
+   The first example shows the basic functions of SIP: location of an
+   end point, signal of a desire to communicate, negotiation of session
+   parameters to establish the session, and teardown of the session once
+   established.
+
+   Figure 1 shows a typical example of a SIP message exchange between
+   two users, Alice and Bob.  (Each message is labeled with the letter
+   "F" and a number for reference by the text.)  In this example, Alice
+   uses a SIP application on her PC (referred to as a softphone) to call
+   Bob on his SIP phone over the Internet.  Also shown are two SIP proxy
+   servers that act on behalf of Alice and Bob to facilitate the session
+   establishment.  This typical arrangement is often referred to as the
+   "SIP trapezoid" as shown by the geometric shape of the dotted lines
+   in Figure 1.
+
+   Alice "calls" Bob using his SIP identity, a type of Uniform Resource
+   Identifier (URI) called a SIP URI. SIP URIs are defined in Section
+   19.1.  It has a similar form to an email address, typically
+   containing a username and a host name.  In this case, it is
+   sip:bob@biloxi.com, where biloxi.com is the domain of Bob's SIP
+   service provider.  Alice has a SIP URI of sip:alice@atlanta.com.
+   Alice might have typed in Bob's URI or perhaps clicked on a hyperlink
+   or an entry in an address book.  SIP also provides a secure URI,
+   called a SIPS URI.  An example would be sips:bob@biloxi.com.  A call
+   made to a SIPS URI guarantees that secure, encrypted transport
+   (namely TLS) is used to carry all SIP messages from the caller to the
+   domain of the callee.  From there, the request is sent securely to
+   the callee, but with security mechanisms that depend on the policy of
+   the domain of the callee.
+
+   SIP is based on an HTTP-like request/response transaction model.
+   Each transaction consists of a request that invokes a particular
+   method, or function, on the server and at least one response.  In
+   this example, the transaction begins with Alice's softphone sending
+   an INVITE request addressed to Bob's SIP URI.  INVITE is an example
+   of a SIP method that specifies the action that the requestor (Alice)
+   wants the server (Bob) to take.  The INVITE request contains a number
+   of header fields.  Header fields are named attributes that provide
+   additional information about a message.  The ones present in an
+   INVITE include a unique identifier for the call, the destination
+   address, Alice's address, and information about the type of session
+   that Alice wishes to establish with Bob.  The INVITE (message F1 in
+   Figure 1) might look like this:
+
+
+
+
+
+
+
+
+Rosenberg, et. al.          Standards Track                    [Page 11]
+
+RFC 3261            SIP: Session Initiation Protocol           June 2002
+
+
+                     atlanta.com  . . . biloxi.com
+                 .      proxy              proxy     .
+               .                                       .
+       Alice's  . . . . . . . . . . . . . . . . . . . .  Bob's
+      softphone                                        SIP Phone
+         |                |                |                |
+         |    INVITE F1   |                |                |
+         |--------------->|    INVITE F2   |                |
+         |  100 Trying F3 |--------------->|    INVITE F4   |
+         |<---------------|  100 Trying F5 |--------------->|
+         |                |<-------------- | 180 Ringing F6 |
+         |                | 180 Ringing F7 |<---------------|
+         | 180 Ringing F8 |<---------------|     200 OK F9  |
+         |<---------------|    200 OK F10  |<---------------|
+         |    200 OK F11  |<---------------|                |
+         |<---------------|                |                |
+         |                       ACK F12                    |
+         |------------------------------------------------->|
+         |                   Media Session                  |
+         |<================================================>|
+         |                       BYE F13                    |
+         |<-------------------------------------------------|
+         |                     200 OK F14                   |
+         |------------------------------------------------->|
+         |                                                  |
+
+         Figure 1: SIP session setup example with SIP trapezoid
+
+      INVITE sip:bob@biloxi.com SIP/2.0
+      Via: SIP/2.0/UDP pc33.atlanta.com;branch=z9hG4bK776asdhds
+      Max-Forwards: 70
+      To: Bob <sip:bob@biloxi.com>
+      From: Alice <sip:alice@atlanta.com>;tag=1928301774
+      Call-ID: a84b4c76e66710@pc33.atlanta.com
+      CSeq: 314159 INVITE
+      Contact: <sip:alice@pc33.atlanta.com>
+      Content-Type: application/sdp
+      Content-Length: 142
+
+      (Alice's SDP not shown)
+
+   The first line of the text-encoded message contains the method name
+   (INVITE).  The lines that follow are a list of header fields.  This
+   example contains a minimum required set.  The header fields are
+   briefly described below:
+
+
+
+
+
+
+Rosenberg, et. al.          Standards Track                    [Page 12]
+
+RFC 3261            SIP: Session Initiation Protocol           June 2002
+
+
+   Via contains the address (pc33.atlanta.com) at which Alice is
+   expecting to receive responses to this request.  It also contains a
+   branch parameter that identifies this transaction.
+
+   To contains a display name (Bob) and a SIP or SIPS URI
+   (sip:bob@biloxi.com) towards which the request was originally
+   directed.  Display names are described in RFC 2822 [3].
+
+   From also contains a display name (Alice) and a SIP or SIPS URI
+   (sip:alice@atlanta.com) that indicate the originator of the request.
+   This header field also has a tag parameter containing a random string
+   (1928301774) that was added to the URI by the softphone.  It is used
+   for identification purposes.
+
+   Call-ID contains a globally unique identifier for this call,
+   generated by the combination of a random string and the softphone's
+   host name or IP address.  The combination of the To tag, From tag,
+   and Call-ID completely defines a peer-to-peer SIP relationship
+   between Alice and Bob and is referred to as a dialog.
+
+   CSeq or Command Sequence contains an integer and a method name.  The
+   CSeq number is incremented for each new request within a dialog and
+   is a traditional sequence number.
+
+   Contact contains a SIP or SIPS URI that represents a direct route to
+   contact Alice, usually composed of a username at a fully qualified
+   domain name (FQDN).  While an FQDN is preferred, many end systems do
+   not have registered domain names, so IP addresses are permitted.
+   While the Via header field tells other elements where to send the
+   response, the Contact header field tells other elements where to send
+   future requests.
+
+   Max-Forwards serves to limit the number of hops a request can make on
+   the way to its destination.  It consists of an integer that is
+   decremented by one at each hop.
+
+   Content-Type contains a description of the message body (not shown).
+
+   Content-Length contains an octet (byte) count of the message body.
+
+   The complete set of SIP header fields is defined in Section 20.
+
+   The details of the session, such as the type of media, codec, or
+   sampling rate, are not described using SIP.  Rather, the body of a
+   SIP message contains a description of the session, encoded in some
+   other protocol format.  One such format is the Session Description
+   Protocol (SDP) (RFC 2327 [1]).  This SDP message (not shown in the
+
+
+
+
+Rosenberg, et. al.          Standards Track                    [Page 13]
+
+RFC 3261            SIP: Session Initiation Protocol           June 2002
+
+
+   example) is carried by the SIP message in a way that is analogous to
+   a document attachment being carried by an email message, or a web
+   page being carried in an HTTP message.
+
+   Since the softphone does not know the location of Bob or the SIP
+   server in the biloxi.com domain, the softphone sends the INVITE to
+   the SIP server that serves Alice's domain, atlanta.com.  The address
+   of the atlanta.com SIP server could have been configured in Alice's
+   softphone, or it could have been discovered by DHCP, for example.
+
+   The atlanta.com SIP server is a type of SIP server known as a proxy
+   server.  A proxy server receives SIP requests and forwards them on
+   behalf of the requestor.  In this example, the proxy server receives
+   the INVITE request and sends a 100 (Trying) response back to Alice's
+   softphone.  The 100 (Trying) response indicates that the INVITE has
+   been received and that the proxy is working on her behalf to route
+   the INVITE to the destination.  Responses in SIP use a three-digit
+   code followed by a descriptive phrase.  This response contains the
+   same To, From, Call-ID, CSeq and branch parameter in the Via as the
+   INVITE, which allows Alice's softphone to correlate this response to
+   the sent INVITE.  The atlanta.com proxy server locates the proxy
+   server at biloxi.com, possibly by performing a particular type of DNS
+   (Domain Name Service) lookup to find the SIP server that serves the
+   biloxi.com domain.  This is described in [4].  As a result, it
+   obtains the IP address of the biloxi.com proxy server and forwards,
+   or proxies, the INVITE request there.  Before forwarding the request,
+   the atlanta.com proxy server adds an additional Via header field
+   value that contains its own address (the INVITE already contains
+   Alice's address in the first Via).  The biloxi.com proxy server
+   receives the INVITE and responds with a 100 (Trying) response back to
+   the atlanta.com proxy server to indicate that it has received the
+   INVITE and is processing the request.  The proxy server consults a
+   database, generically called a location service, that contains the
+   current IP address of Bob.  (We shall see in the next section how
+   this database can be populated.)  The biloxi.com proxy server adds
+   another Via header field value with its own address to the INVITE and
+   proxies it to Bob's SIP phone.
+
+   Bob's SIP phone receives the INVITE and alerts Bob to the incoming
+   call from Alice so that Bob can decide whether to answer the call,
+   that is, Bob's phone rings.  Bob's SIP phone indicates this in a 180
+   (Ringing) response, which is routed back through the two proxies in
+   the reverse direction.  Each proxy uses the Via header field to
+   determine where to send the response and removes its own address from
+   the top.  As a result, although DNS and location service lookups were
+   required to route the initial INVITE, the 180 (Ringing) response can
+   be returned to the caller without lookups or without state being
+
+
+
+
+Rosenberg, et. al.          Standards Track                    [Page 14]
+
+RFC 3261            SIP: Session Initiation Protocol           June 2002
+
+
+   maintained in the proxies.  This also has the desirable property that
+   each proxy that sees the INVITE will also see all responses to the
+   INVITE.
+
+   When Alice's softphone receives the 180 (Ringing) response, it passes
+   this information to Alice, perhaps using an audio ringback tone or by
+   displaying a message on Alice's screen.
+
+   In this example, Bob decides to answer the call.  When he picks up
+   the handset, his SIP phone sends a 200 (OK) response to indicate that
+   the call has been answered.  The 200 (OK) contains a message body
+   with the SDP media description of the type of session that Bob is
+   willing to establish with Alice.  As a result, there is a two-phase
+   exchange of SDP messages: Alice sent one to Bob, and Bob sent one
+   back to Alice.  This two-phase exchange provides basic negotiation
+   capabilities and is based on a simple offer/answer model of SDP
+   exchange.  If Bob did not wish to answer the call or was busy on
+   another call, an error response would have been sent instead of the
+   200 (OK), which would have resulted in no media session being
+   established.  The complete list of SIP response codes is in Section
+   21.  The 200 (OK) (message F9 in Figure 1) might look like this as
+   Bob sends it out:
+
+      SIP/2.0 200 OK
+      Via: SIP/2.0/UDP server10.biloxi.com
+         ;branch=z9hG4bKnashds8;received=192.0.2.3
+      Via: SIP/2.0/UDP bigbox3.site3.atlanta.com
+         ;branch=z9hG4bK77ef4c2312983.1;received=192.0.2.2
+      Via: SIP/2.0/UDP pc33.atlanta.com
+         ;branch=z9hG4bK776asdhds ;received=192.0.2.1
+      To: Bob <sip:bob@biloxi.com>;tag=a6c85cf
+      From: Alice <sip:alice@atlanta.com>;tag=1928301774
+      Call-ID: a84b4c76e66710@pc33.atlanta.com
+      CSeq: 314159 INVITE
+      Contact: <sip:bob@192.0.2.4>
+      Content-Type: application/sdp
+      Content-Length: 131
+
+      (Bob's SDP not shown)
+
+   The first line of the response contains the response code (200) and
+   the reason phrase (OK).  The remaining lines contain header fields.
+   The Via, To, From, Call-ID, and CSeq header fields are copied from
+   the INVITE request.  (There are three Via header field values - one
+   added by Alice's SIP phone, one added by the atlanta.com proxy, and
+   one added by the biloxi.com proxy.)  Bob's SIP phone has added a tag
+   parameter to the To header field.  This tag will be incorporated by
+   both endpoints into the dialog and will be included in all future
+
+
+
+Rosenberg, et. al.          Standards Track                    [Page 15]
+
+RFC 3261            SIP: Session Initiation Protocol           June 2002
+
+
+   requests and responses in this call.  The Contact header field
+   contains a URI at which Bob can be directly reached at his SIP phone.
+   The Content-Type and Content-Length refer to the message body (not
+   shown) that contains Bob's SDP media information.
+
+   In addition to DNS and location service lookups shown in this
+   example, proxy servers can make flexible "routing decisions" to
+   decide where to send a request.  For example, if Bob's SIP phone
+   returned a 486 (Busy Here) response, the biloxi.com proxy server
+   could proxy the INVITE to Bob's voicemail server.  A proxy server can
+   also send an INVITE to a number of locations at the same time.  This
+   type of parallel search is known as forking.
+
+   In this case, the 200 (OK) is routed back through the two proxies and
+   is received by Alice's softphone, which then stops the ringback tone
+   and indicates that the call has been answered.  Finally, Alice's
+   softphone sends an acknowledgement message, ACK, to Bob's SIP phone
+   to confirm the reception of the final response (200 (OK)).  In this
+   example, the ACK is sent directly from Alice's softphone to Bob's SIP
+   phone, bypassing the two proxies.  This occurs because the endpoints
+   have learned each other's address from the Contact header fields
+   through the INVITE/200 (OK) exchange, which was not known when the
+   initial INVITE was sent.  The lookups performed by the two proxies
+   are no longer needed, so the proxies drop out of the call flow.  This
+   completes the INVITE/200/ACK three-way handshake used to establish
+   SIP sessions.  Full details on session setup are in Section 13.
+
+   Alice and Bob's media session has now begun, and they send media
+   packets using the format to which they agreed in the exchange of SDP.
+   In general, the end-to-end media packets take a different path from
+   the SIP signaling messages.
+
+   During the session, either Alice or Bob may decide to change the
+   characteristics of the media session.  This is accomplished by
+   sending a re-INVITE containing a new media description.  This re-
+   INVITE references the existing dialog so that the other party knows
+   that it is to modify an existing session instead of establishing a
+   new session.  The other party sends a 200 (OK) to accept the change.
+   The requestor responds to the 200 (OK) with an ACK.  If the other
+   party does not accept the change, he sends an error response such as
+   488 (Not Acceptable Here), which also receives an ACK.  However, the
+   failure of the re-INVITE does not cause the existing call to fail -
+   the session continues using the previously negotiated
+   characteristics.  Full details on session modification are in Section
+   14.
+
+
+
+
+
+
+Rosenberg, et. al.          Standards Track                    [Page 16]
+
+RFC 3261            SIP: Session Initiation Protocol           June 2002
+
+
+   At the end of the call, Bob disconnects (hangs up) first and
+   generates a BYE message.  This BYE is routed directly to Alice's
+   softphone, again bypassing the proxies.  Alice confirms receipt of
+   the BYE with a 200 (OK) response, which terminates the session and
+   the BYE transaction.  No ACK is sent - an ACK is only sent in
+   response to a response to an INVITE request.  The reasons for this
+   special handling for INVITE will be discussed later, but relate to
+   the reliability mechanisms in SIP, the length of time it can take for
+   a ringing phone to be answered, and forking.  For this reason,
+   request handling in SIP is often classified as either INVITE or non-
+   INVITE, referring to all other methods besides INVITE.  Full details
+   on session termination are in Section 15.
+
+   Section 24.2 describes the messages shown in Figure 1 in full.
+
+   In some cases, it may be useful for proxies in the SIP signaling path
+   to see all the messaging between the endpoints for the duration of
+   the session.  For example, if the biloxi.com proxy server wished to
+   remain in the SIP messaging path beyond the initial INVITE, it would
+   add to the INVITE a required routing header field known as Record-
+   Route that contained a URI resolving to the hostname or IP address of
+   the proxy.  This information would be received by both Bob's SIP
+   phone and (due to the Record-Route header field being passed back in
+   the 200 (OK)) Alice's softphone and stored for the duration of the
+   dialog.  The biloxi.com proxy server would then receive and proxy the
+   ACK, BYE, and 200 (OK) to the BYE.  Each proxy can independently
+   decide to receive subsequent messages, and those messages will pass
+   through all proxies that elect to receive it.  This capability is
+   frequently used for proxies that are providing mid-call features.
+
+   Registration is another common operation in SIP.  Registration is one
+   way that the biloxi.com server can learn the current location of Bob.
+   Upon initialization, and at periodic intervals, Bob's SIP phone sends
+   REGISTER messages to a server in the biloxi.com domain known as a SIP
+   registrar.  The REGISTER messages associate Bob's SIP or SIPS URI
+   (sip:bob@biloxi.com) with the machine into which he is currently
+   logged (conveyed as a SIP or SIPS URI in the Contact header field).
+   The registrar writes this association, also called a binding, to a
+   database, called the location service, where it can be used by the
+   proxy in the biloxi.com domain.  Often, a registrar server for a
+   domain is co-located with the proxy for that domain.  It is an
+   important concept that the distinction between types of SIP servers
+   is logical, not physical.
+
+   Bob is not limited to registering from a single device.  For example,
+   both his SIP phone at home and the one in the office could send
+   registrations.  This information is stored together in the location
+
+
+
+
+Rosenberg, et. al.          Standards Track                    [Page 17]
+
+RFC 3261            SIP: Session Initiation Protocol           June 2002
+
+
+   service and allows a proxy to perform various types of searches to
+   locate Bob.  Similarly, more than one user can be registered on a
+   single device at the same time.
+
+   The location service is just an abstract concept.  It generally
+   contains information that allows a proxy to input a URI and receive a
+   set of zero or more URIs that tell the proxy where to send the
+   request.  Registrations are one way to create this information, but
+   not the only way.  Arbitrary mapping functions can be configured at
+   the discretion of the administrator.
+
+   Finally, it is important to note that in SIP, registration is used
+   for routing incoming SIP requests and has no role in authorizing
+   outgoing requests.  Authorization and authentication are handled in
+   SIP either on a request-by-request basis with a challenge/response
+   mechanism, or by using a lower layer scheme as discussed in Section
+   26.
+
+   The complete set of SIP message details for this registration example
+   is in Section 24.1.
+
+   Additional operations in SIP, such as querying for the capabilities
+   of a SIP server or client using OPTIONS, or canceling a pending
+   request using CANCEL, will be introduced in later sections.
+
+5 Structure of the Protocol
+
+   SIP is structured as a layered protocol, which means that its
+   behavior is described in terms of a set of fairly independent
+   processing stages with only a loose coupling between each stage.  The
+   protocol behavior is described as layers for the purpose of
+   presentation, allowing the description of functions common across
+   elements in a single section.  It does not dictate an implementation
+   in any way.  When we say that an element "contains" a layer, we mean
+   it is compliant to the set of rules defined by that layer.
+
+   Not every element specified by the protocol contains every layer.
+   Furthermore, the elements specified by SIP are logical elements, not
+   physical ones.  A physical realization can choose to act as different
+   logical elements, perhaps even on a transaction-by-transaction basis.
+
+   The lowest layer of SIP is its syntax and encoding.  Its encoding is
+   specified using an augmented Backus-Naur Form grammar (BNF).  The
+   complete BNF is specified in Section 25; an overview of a SIP
+   message's structure can be found in Section 7.
+
+
+
+
+
+
+Rosenberg, et. al.          Standards Track                    [Page 18]
+
+RFC 3261            SIP: Session Initiation Protocol           June 2002
+
+
+   The second layer is the transport layer.  It defines how a client
+   sends requests and receives responses and how a server receives
+   requests and sends responses over the network.  All SIP elements
+   contain a transport layer.  The transport layer is described in
+   Section 18.
+
+   The third layer is the transaction layer.  Transactions are a
+   fundamental component of SIP.  A transaction is a request sent by a
+   client transaction (using the transport layer) to a server
+   transaction, along with all responses to that request sent from the
+   server transaction back to the client.  The transaction layer handles
+   application-layer retransmissions, matching of responses to requests,
+   and application-layer timeouts.  Any task that a user agent client
+   (UAC) accomplishes takes place using a series of transactions.
+   Discussion of transactions can be found in Section 17.  User agents
+   contain a transaction layer, as do stateful proxies.  Stateless
+   proxies do not contain a transaction layer.  The transaction layer
+   has a client component (referred to as a client transaction) and a
+   server component (referred to as a server transaction), each of which
+   are represented by a finite state machine that is constructed to
+   process a particular request.
+
+   The layer above the transaction layer is called the transaction user
+   (TU).  Each of the SIP entities, except the stateless proxy, is a
+   transaction user.  When a TU wishes to send a request, it creates a
+   client transaction instance and passes it the request along with the
+   destination IP address, port, and transport to which to send the
+   request.  A TU that creates a client transaction can also cancel it.
+   When a client cancels a transaction, it requests that the server stop
+   further processing, revert to the state that existed before the
+   transaction was initiated, and generate a specific error response to
+   that transaction.  This is done with a CANCEL request, which
+   constitutes its own transaction, but references the transaction to be
+   cancelled (Section 9).
+
+   The SIP elements, that is, user agent clients and servers, stateless
+   and stateful proxies and registrars, contain a core that
+   distinguishes them from each other.  Cores, except for the stateless
+   proxy, are transaction users.  While the behavior of the UAC and UAS
+   cores depends on the method, there are some common rules for all
+   methods (Section 8).  For a UAC, these rules govern the construction
+   of a request; for a UAS, they govern the processing of a request and
+   generating a response.  Since registrations play an important role in
+   SIP, a UAS that handles a REGISTER is given the special name
+   registrar.  Section 10 describes UAC and UAS core behavior for the
+   REGISTER method.  Section 11 describes UAC and UAS core behavior for
+   the OPTIONS method, used for determining the capabilities of a UA.
+
+
+
+
+Rosenberg, et. al.          Standards Track                    [Page 19]
+
+RFC 3261            SIP: Session Initiation Protocol           June 2002
+
+
+   Certain other requests are sent within a dialog.  A dialog is a
+   peer-to-peer SIP relationship between two user agents that persists
+   for some time.  The dialog facilitates sequencing of messages and
+   proper routing of requests between the user agents.  The INVITE
+   method is the only way defined in this specification to establish a
+   dialog.  When a UAC sends a request that is within the context of a
+   dialog, it follows the common UAC rules as discussed in Section 8 but
+   also the rules for mid-dialog requests.  Section 12 discusses dialogs
+   and presents the procedures for their construction and maintenance,
+   in addition to construction of requests within a dialog.
+
+   The most important method in SIP is the INVITE method, which is used
+   to establish a session between participants.  A session is a
+   collection of participants, and streams of media between them, for
+   the purposes of communication.  Section 13 discusses how sessions are
+   initiated, resulting in one or more SIP dialogs.  Section 14
+   discusses how characteristics of that session are modified through
+   the use of an INVITE request within a dialog.  Finally, section 15
+   discusses how a session is terminated.
+
+   The procedures of Sections 8, 10, 11, 12, 13, 14, and 15 deal
+   entirely with the UA core (Section 9 describes cancellation, which
+   applies to both UA core and proxy core).  Section 16 discusses the
+   proxy element, which facilitates routing of messages between user
+   agents.
+
+6 Definitions
+
+   The following terms have special significance for SIP.
+
+      Address-of-Record: An address-of-record (AOR) is a SIP or SIPS URI
+         that points to a domain with a location service that can map
+         the URI to another URI where the user might be available.
+         Typically, the location service is populated through
+         registrations.  An AOR is frequently thought of as the "public
+         address" of the user.
+
+      Back-to-Back User Agent: A back-to-back user agent (B2BUA) is a
+         logical entity that receives a request and processes it as a
+         user agent server (UAS).  In order to determine how the request
+         should be answered, it acts as a user agent client (UAC) and
+         generates requests.  Unlike a proxy server, it maintains dialog
+         state and must participate in all requests sent on the dialogs
+         it has established.  Since it is a concatenation of a UAC and
+         UAS, no explicit definitions are needed for its behavior.
+
+
+
+
+
+
+Rosenberg, et. al.          Standards Track                    [Page 20]
+
+RFC 3261            SIP: Session Initiation Protocol           June 2002
+
+
+      Call: A call is an informal term that refers to some communication
+         between peers, generally set up for the purposes of a
+         multimedia conversation.
+
+      Call Leg: Another name for a dialog [31]; no longer used in this
+         specification.
+
+      Call Stateful: A proxy is call stateful if it retains state for a
+         dialog from the initiating INVITE to the terminating BYE
+         request.  A call stateful proxy is always transaction stateful,
+         but the converse is not necessarily true.
+
+      Client: A client is any network element that sends SIP requests
+         and receives SIP responses.  Clients may or may not interact
+         directly with a human user.  User agent clients and proxies are
+         clients.
+
+      Conference: A multimedia session (see below) that contains
+         multiple participants.
+
+      Core: Core designates the functions specific to a particular type
+         of SIP entity, i.e., specific to either a stateful or stateless
+         proxy, a user agent or registrar.  All cores, except those for
+         the stateless proxy, are transaction users.
+
+      Dialog: A dialog is a peer-to-peer SIP relationship between two
+         UAs that persists for some time.  A dialog is established by
+         SIP messages, such as a 2xx response to an INVITE request.  A
+         dialog is identified by a call identifier, local tag, and a
+         remote tag.  A dialog was formerly known as a call leg in RFC
+         2543.
+
+      Downstream: A direction of message forwarding within a transaction
+         that refers to the direction that requests flow from the user
+         agent client to user agent server.
+
+      Final Response: A response that terminates a SIP transaction, as
+         opposed to a provisional response that does not.  All 2xx, 3xx,
+         4xx, 5xx and 6xx responses are final.
+
+      Header: A header is a component of a SIP message that conveys
+         information about the message.  It is structured as a sequence
+         of header fields.
+
+      Header Field: A header field is a component of the SIP message
+         header.  A header field can appear as one or more header field
+         rows. Header field rows consist of a header field name and zero
+         or more header field values. Multiple header field values on a
+
+
+
+Rosenberg, et. al.          Standards Track                    [Page 21]
+
+RFC 3261            SIP: Session Initiation Protocol           June 2002
+
+
+         given header field row are separated by commas. Some header
+         fields can only have a single header field value, and as a
+         result, always appear as a single header field row.
+
+      Header Field Value: A header field value is a single value; a
+         header field consists of zero or more header field values.
+
+      Home Domain: The domain providing service to a SIP user.
+         Typically, this is the domain present in the URI in the
+         address-of-record of a registration.
+
+      Informational Response: Same as a provisional response.
+
+      Initiator, Calling Party, Caller: The party initiating a session
+         (and dialog) with an INVITE request.  A caller retains this
+         role from the time it sends the initial INVITE that established
+         a dialog until the termination of that dialog.
+
+      Invitation: An INVITE request.
+
+      Invitee, Invited User, Called Party, Callee: The party that
+         receives an INVITE request for the purpose of establishing a
+         new session.  A callee retains this role from the time it
+         receives the INVITE until the termination of the dialog
+         established by that INVITE.
+
+      Location Service: A location service is used by a SIP redirect or
+         proxy server to obtain information about a callee's possible
+         location(s).  It contains a list of bindings of address-of-
+         record keys to zero or more contact addresses.  The bindings
+         can be created and removed in many ways; this specification
+         defines a REGISTER method that updates the bindings.
+
+      Loop: A request that arrives at a proxy, is forwarded, and later
+         arrives back at the same proxy.  When it arrives the second
+         time, its Request-URI is identical to the first time, and other
+         header fields that affect proxy operation are unchanged, so
+         that the proxy would make the same processing decision on the
+         request it made the first time.  Looped requests are errors,
+         and the procedures for detecting them and handling them are
+         described by the protocol.
+
+      Loose Routing: A proxy is said to be loose routing if it follows
+         the procedures defined in this specification for processing of
+         the Route header field.  These procedures separate the
+         destination of the request (present in the Request-URI) from
+
+
+
+
+
+Rosenberg, et. al.          Standards Track                    [Page 22]
+
+RFC 3261            SIP: Session Initiation Protocol           June 2002
+
+
+         the set of proxies that need to be visited along the way
+         (present in the Route header field).  A proxy compliant to
+         these mechanisms is also known as a loose router.
+
+      Message: Data sent between SIP elements as part of the protocol.
+         SIP messages are either requests or responses.
+
+      Method: The method is the primary function that a request is meant
+         to invoke on a server.  The method is carried in the request
+         message itself.  Example methods are INVITE and BYE.
+
+      Outbound Proxy: A proxy that receives requests from a client, even
+         though it may not be the server resolved by the Request-URI.
+         Typically, a UA is manually configured with an outbound proxy,
+         or can learn about one through auto-configuration protocols.
+
+      Parallel Search: In a parallel search, a proxy issues several
+         requests to possible user locations upon receiving an incoming
+         request.  Rather than issuing one request and then waiting for
+         the final response before issuing the next request as in a
+         sequential search, a parallel search issues requests without
+         waiting for the result of previous requests.
+
+      Provisional Response: A response used by the server to indicate
+         progress, but that does not terminate a SIP transaction.  1xx
+         responses are provisional, other responses are considered
+         final.
+
+      Proxy, Proxy Server: An intermediary entity that acts as both a
+         server and a client for the purpose of making requests on
+         behalf of other clients.  A proxy server primarily plays the
+         role of routing, which means its job is to ensure that a
+         request is sent to another entity "closer" to the targeted
+         user.  Proxies are also useful for enforcing policy (for
+         example, making sure a user is allowed to make a call).  A
+         proxy interprets, and, if necessary, rewrites specific parts of
+         a request message before forwarding it.
+
+      Recursion: A client recurses on a 3xx response when it generates a
+         new request to one or more of the URIs in the Contact header
+         field in the response.
+
+      Redirect Server: A redirect server is a user agent server that
+         generates 3xx responses to requests it receives, directing the
+         client to contact an alternate set of URIs.
+
+
+
+
+
+
+Rosenberg, et. al.          Standards Track                    [Page 23]
+
+RFC 3261            SIP: Session Initiation Protocol           June 2002
+
+
+      Registrar: A registrar is a server that accepts REGISTER requests
+         and places the information it receives in those requests into
+         the location service for the domain it handles.
+
+      Regular Transaction: A regular transaction is any transaction with
+         a method other than INVITE, ACK, or CANCEL.
+
+      Request: A SIP message sent from a client to a server, for the
+         purpose of invoking a particular operation.
+
+      Response: A SIP message sent from a server to a client, for
+         indicating the status of a request sent from the client to the
+         server.
+
+      Ringback: Ringback is the signaling tone produced by the calling
+         party's application indicating that a called party is being
+         alerted (ringing).
+
+      Route Set: A route set is a collection of ordered SIP or SIPS URI
+         which represent a list of proxies that must be traversed when
+         sending a particular request.  A route set can be learned,
+         through headers like Record-Route, or it can be configured.
+
+      Server: A server is a network element that receives requests in
+         order to service them and sends back responses to those
+         requests.  Examples of servers are proxies, user agent servers,
+         redirect servers, and registrars.
+
+      Sequential Search: In a sequential search, a proxy server attempts
+         each contact address in sequence, proceeding to the next one
+         only after the previous has generated a final response.  A 2xx
+         or 6xx class final response always terminates a sequential
+         search.
+
+      Session: From the SDP specification: "A multimedia session is a
+         set of multimedia senders and receivers and the data streams
+         flowing from senders to receivers.  A multimedia conference is
+         an example of a multimedia session." (RFC 2327 [1]) (A session
+         as defined for SDP can comprise one or more RTP sessions.)  As
+         defined, a callee can be invited several times, by different
+         calls, to the same session.  If SDP is used, a session is
+         defined by the concatenation of the SDP user name, session id,
+         network type, address type, and address elements in the origin
+         field.
+
+      SIP Transaction: A SIP transaction occurs between a client and a
+         server and comprises all messages from the first request sent
+         from the client to the server up to a final (non-1xx) response
+
+
+
+Rosenberg, et. al.          Standards Track                    [Page 24]
+
+RFC 3261            SIP: Session Initiation Protocol           June 2002
+
+
+         sent from the server to the client.  If the request is INVITE
+         and the final response is a non-2xx, the transaction also
+         includes an ACK to the response.  The ACK for a 2xx response to
+         an INVITE request is a separate transaction.
+
+      Spiral: A spiral is a SIP request that is routed to a proxy,
+         forwarded onwards, and arrives once again at that proxy, but
+         this time differs in a way that will result in a different
+         processing decision than the original request.  Typically, this
+         means that the request's Request-URI differs from its previous
+         arrival.  A spiral is not an error condition, unlike a loop.  A
+         typical cause for this is call forwarding.  A user calls
+         joe@example.com.  The example.com proxy forwards it to Joe's
+         PC, which in turn, forwards it to bob@example.com.  This
+         request is proxied back to the example.com proxy.  However,
+         this is not a loop.  Since the request is targeted at a
+         different user, it is considered a spiral, and is a valid
+         condition.
+
+      Stateful Proxy: A logical entity that maintains the client and
+         server transaction state machines defined by this specification
+         during the processing of a request, also known as a transaction
+         stateful proxy.  The behavior of a stateful proxy is further
+         defined in Section 16.  A (transaction) stateful proxy is not
+         the same as a call stateful proxy.
+
+      Stateless Proxy: A logical entity that does not maintain the
+         client or server transaction state machines defined in this
+         specification when it processes requests.  A stateless proxy
+         forwards every request it receives downstream and every
+         response it receives upstream.
+
+      Strict Routing: A proxy is said to be strict routing if it follows
+         the Route processing rules of RFC 2543 and many prior work in
+         progress versions of this RFC.  That rule caused proxies to
+         destroy the contents of the Request-URI when a Route header
+         field was present.  Strict routing behavior is not used in this
+         specification, in favor of a loose routing behavior.  Proxies
+         that perform strict routing are also known as strict routers.
+
+      Target Refresh Request: A target refresh request sent within a
+         dialog is defined as a request that can modify the remote
+         target of the dialog.
+
+      Transaction User (TU): The layer of protocol processing that
+         resides above the transaction layer.  Transaction users include
+         the UAC core, UAS core, and proxy core.
+
+
+
+
+Rosenberg, et. al.          Standards Track                    [Page 25]
+
+RFC 3261            SIP: Session Initiation Protocol           June 2002
+
+
+      Upstream: A direction of message forwarding within a transaction
+         that refers to the direction that responses flow from the user
+         agent server back to the user agent client.
+
+      URL-encoded: A character string encoded according to RFC 2396,
+         Section 2.4 [5].
+
+      User Agent Client (UAC): A user agent client is a logical entity
+         that creates a new request, and then uses the client
+         transaction state machinery to send it.  The role of UAC lasts
+         only for the duration of that transaction.  In other words, if
+         a piece of software initiates a request, it acts as a UAC for
+         the duration of that transaction.  If it receives a request
+         later, it assumes the role of a user agent server for the
+         processing of that transaction.
+
+      UAC Core: The set of processing functions required of a UAC that
+         reside above the transaction and transport layers.
+
+      User Agent Server (UAS): A user agent server is a logical entity
+         that generates a response to a SIP request.  The response
+         accepts, rejects, or redirects the request.  This role lasts
+         only for the duration of that transaction.  In other words, if
+         a piece of software responds to a request, it acts as a UAS for
+         the duration of that transaction.  If it generates a request
+         later, it assumes the role of a user agent client for the
+         processing of that transaction.
+
+      UAS Core: The set of processing functions required at a UAS that
+         resides above the transaction and transport layers.
+
+      User Agent (UA): A logical entity that can act as both a user
+         agent client and user agent server.
+
+   The role of UAC and UAS, as well as proxy and redirect servers, are
+   defined on a transaction-by-transaction basis.  For example, the user
+   agent initiating a call acts as a UAC when sending the initial INVITE
+   request and as a UAS when receiving a BYE request from the callee.
+   Similarly, the same software can act as a proxy server for one
+   request and as a redirect server for the next request.
+
+   Proxy, location, and registrar servers defined above are logical
+   entities; implementations MAY combine them into a single application.
+
+7 SIP Messages
+
+   SIP is a text-based protocol and uses the UTF-8 charset (RFC 2279
+   [7]).
+
+
+
+Rosenberg, et. al.          Standards Track                    [Page 26]
+
+RFC 3261            SIP: Session Initiation Protocol           June 2002
+
+
+   A SIP message is either a request from a client to a server, or a
+   response from a server to a client.
+
+   Both Request (section 7.1) and Response (section 7.2) messages use
+   the basic format of RFC 2822 [3], even though the syntax differs in
+   character set and syntax specifics.  (SIP allows header fields that
+   would not be valid RFC 2822 header fields, for example.)  Both types
+   of messages consist of a start-line, one or more header fields, an
+   empty line indicating the end of the header fields, and an optional
+   message-body.
+
+         generic-message  =  start-line
+                             *message-header
+                             CRLF
+                             [ message-body ]
+         start-line       =  Request-Line / Status-Line
+
+   The start-line, each message-header line, and the empty line MUST be
+   terminated by a carriage-return line-feed sequence (CRLF).  Note that
+   the empty line MUST be present even if the message-body is not.
+
+   Except for the above difference in character sets, much of SIP's
+   message and header field syntax is identical to HTTP/1.1.  Rather
+   than repeating the syntax and semantics here, we use [HX.Y] to refer
+   to Section X.Y of the current HTTP/1.1 specification (RFC 2616 [8]).
+
+   However, SIP is not an extension of HTTP.
+
+7.1 Requests
+
+   SIP requests are distinguished by having a Request-Line for a start-
+   line.  A Request-Line contains a method name, a Request-URI, and the
+   protocol version separated by a single space (SP) character.
+
+   The Request-Line ends with CRLF.  No CR or LF are allowed except in
+   the end-of-line CRLF sequence.  No linear whitespace (LWS) is allowed
+   in any of the elements.
+
+         Request-Line  =  Method SP Request-URI SP SIP-Version CRLF
+
+      Method: This specification defines six methods: REGISTER for
+           registering contact information, INVITE, ACK, and CANCEL for
+           setting up sessions, BYE for terminating sessions, and
+           OPTIONS for querying servers about their capabilities.  SIP
+           extensions, documented in standards track RFCs, may define
+           additional methods.
+
+
+
+
+
+Rosenberg, et. al.          Standards Track                    [Page 27]
+
+RFC 3261            SIP: Session Initiation Protocol           June 2002
+
+
+      Request-URI: The Request-URI is a SIP or SIPS URI as described in
+           Section 19.1 or a general URI (RFC 2396 [5]).  It indicates
+           the user or service to which this request is being addressed.
+           The Request-URI MUST NOT contain unescaped spaces or control
+           characters and MUST NOT be enclosed in "<>".
+
+           SIP elements MAY support Request-URIs with schemes other than
+           "sip" and "sips", for example the "tel" URI scheme of RFC
+           2806 [9].  SIP elements MAY translate non-SIP URIs using any
+           mechanism at their disposal, resulting in SIP URI, SIPS URI,
+           or some other scheme.
+
+      SIP-Version: Both request and response messages include the
+           version of SIP in use, and follow [H3.1] (with HTTP replaced
+           by SIP, and HTTP/1.1 replaced by SIP/2.0) regarding version
+           ordering, compliance requirements, and upgrading of version
+           numbers.  To be compliant with this specification,
+           applications sending SIP messages MUST include a SIP-Version
+           of "SIP/2.0".  The SIP-Version string is case-insensitive,
+           but implementations MUST send upper-case.
+
+           Unlike HTTP/1.1, SIP treats the version number as a literal
+           string.  In practice, this should make no difference.
+
+7.2 Responses
+
+   SIP responses are distinguished from requests by having a Status-Line
+   as their start-line.  A Status-Line consists of the protocol version
+   followed by a numeric Status-Code and its associated textual phrase,
+   with each element separated by a single SP character.
+
+   No CR or LF is allowed except in the final CRLF sequence.
+
+      Status-Line  =  SIP-Version SP Status-Code SP Reason-Phrase CRLF
+
+   The Status-Code is a 3-digit integer result code that indicates the
+   outcome of an attempt to understand and satisfy a request.  The
+   Reason-Phrase is intended to give a short textual description of the
+   Status-Code.  The Status-Code is intended for use by automata,
+   whereas the Reason-Phrase is intended for the human user.  A client
+   is not required to examine or display the Reason-Phrase.
+
+   While this specification suggests specific wording for the reason
+   phrase, implementations MAY choose other text, for example, in the
+   language indicated in the Accept-Language header field of the
+   request.
+
+
+
+
+
+Rosenberg, et. al.          Standards Track                    [Page 28]
+
+RFC 3261            SIP: Session Initiation Protocol           June 2002
+
+
+   The first digit of the Status-Code defines the class of response.
+   The last two digits do not have any categorization role.  For this
+   reason, any response with a status code between 100 and 199 is
+   referred to as a "1xx response", any response with a status code
+   between 200 and 299 as a "2xx response", and so on.  SIP/2.0 allows
+   six values for the first digit:
+
+      1xx: Provisional -- request received, continuing to process the
+           request;
+
+      2xx: Success -- the action was successfully received, understood,
+           and accepted;
+
+      3xx: Redirection -- further action needs to be taken in order to
+           complete the request;
+
+      4xx: Client Error -- the request contains bad syntax or cannot be
+           fulfilled at this server;
+
+      5xx: Server Error -- the server failed to fulfill an apparently
+           valid request;
+
+      6xx: Global Failure -- the request cannot be fulfilled at any
+           server.
+
+   Section 21 defines these classes and describes the individual codes.
+
+7.3 Header Fields
+
+   SIP header fields are similar to HTTP header fields in both syntax
+   and semantics.  In particular, SIP header fields follow the [H4.2]
+   definitions of syntax for the message-header and the rules for
+   extending header fields over multiple lines.  However, the latter is
+   specified in HTTP with implicit whitespace and folding.  This
+   specification conforms to RFC 2234 [10] and uses only explicit
+   whitespace and folding as an integral part of the grammar.
+
+   [H4.2] also specifies that multiple header fields of the same field
+   name whose value is a comma-separated list can be combined into one
+   header field.  That applies to SIP as well, but the specific rule is
+   different because of the different grammars.  Specifically, any SIP
+   header whose grammar is of the form
+
+      header  =  "header-name" HCOLON header-value *(COMMA header-value)
+
+   allows for combining header fields of the same name into a comma-
+   separated list.  The Contact header field allows a comma-separated
+   list unless the header field value is "*".
+
+
+
+Rosenberg, et. al.          Standards Track                    [Page 29]
+
+RFC 3261            SIP: Session Initiation Protocol           June 2002
+
+
+7.3.1 Header Field Format
+
+   Header fields follow the same generic header format as that given in
+   Section 2.2 of RFC 2822 [3].  Each header field consists of a field
+   name followed by a colon (":") and the field value.
+
+      field-name: field-value
+
+   The formal grammar for a message-header specified in Section 25
+   allows for an arbitrary amount of whitespace on either side of the
+   colon; however, implementations should avoid spaces between the field
+   name and the colon and use a single space (SP) between the colon and
+   the field-value.
+
+      Subject:            lunch
+      Subject      :      lunch
+      Subject            :lunch
+      Subject: lunch
+
+   Thus, the above are all valid and equivalent, but the last is the
+   preferred form.
+
+   Header fields can be extended over multiple lines by preceding each
+   extra line with at least one SP or horizontal tab (HT).  The line
+   break and the whitespace at the beginning of the next line are
+   treated as a single SP character.  Thus, the following are
+   equivalent:
+
+      Subject: I know you're there, pick up the phone and talk to me!
+      Subject: I know you're there,
+               pick up the phone
+               and talk to me!
+
+   The relative order of header fields with different field names is not
+   significant.  However, it is RECOMMENDED that header fields which are
+   needed for proxy processing (Via, Route, Record-Route, Proxy-Require,
+   Max-Forwards, and Proxy-Authorization, for example) appear towards
+   the top of the message to facilitate rapid parsing.  The relative
+   order of header field rows with the same field name is important.
+   Multiple header field rows with the same field-name MAY be present in
+   a message if and only if the entire field-value for that header field
+   is defined as a comma-separated list (that is, if follows the grammar
+   defined in Section 7.3).  It MUST be possible to combine the multiple
+   header field rows into one "field-name: field-value" pair, without
+   changing the semantics of the message, by appending each subsequent
+   field-value to the first, each separated by a comma.  The exceptions
+   to this rule are the WWW-Authenticate, Authorization, Proxy-
+   Authenticate, and Proxy-Authorization header fields.  Multiple header
+
+
+
+Rosenberg, et. al.          Standards Track                    [Page 30]
+
+RFC 3261            SIP: Session Initiation Protocol           June 2002
+
+
+   field rows with these names MAY be present in a message, but since
+   their grammar does not follow the general form listed in Section 7.3,
+   they MUST NOT be combined into a single header field row.
+
+   Implementations MUST be able to process multiple header field rows
+   with the same name in any combination of the single-value-per-line or
+   comma-separated value forms.
+
+   The following groups of header field rows are valid and equivalent:
+
+      Route: <sip:alice@atlanta.com>
+      Subject: Lunch
+      Route: <sip:bob@biloxi.com>
+      Route: <sip:carol@chicago.com>
+
+      Route: <sip:alice@atlanta.com>, <sip:bob@biloxi.com>
+      Route: <sip:carol@chicago.com>
+      Subject: Lunch
+
+      Subject: Lunch
+      Route: <sip:alice@atlanta.com>, <sip:bob@biloxi.com>,
+             <sip:carol@chicago.com>
+
+   Each of the following blocks is valid but not equivalent to the
+   others:
+
+      Route: <sip:alice@atlanta.com>
+      Route: <sip:bob@biloxi.com>
+      Route: <sip:carol@chicago.com>
+
+      Route: <sip:bob@biloxi.com>
+      Route: <sip:alice@atlanta.com>
+      Route: <sip:carol@chicago.com>
+
+      Route: <sip:alice@atlanta.com>,<sip:carol@chicago.com>,
+             <sip:bob@biloxi.com>
+
+   The format of a header field-value is defined per header-name.  It
+   will always be either an opaque sequence of TEXT-UTF8 octets, or a
+   combination of whitespace, tokens, separators, and quoted strings.
+   Many existing header fields will adhere to the general form of a
+   value followed by a semi-colon separated sequence of parameter-name,
+   parameter-value pairs:
+
+         field-name: field-value *(;parameter-name=parameter-value)
+
+
+
+
+
+
+Rosenberg, et. al.          Standards Track                    [Page 31]
+
+RFC 3261            SIP: Session Initiation Protocol           June 2002
+
+
+   Even though an arbitrary number of parameter pairs may be attached to
+   a header field value, any given parameter-name MUST NOT appear more
+   than once.
+
+   When comparing header fields, field names are always case-
+   insensitive.  Unless otherwise stated in the definition of a
+   particular header field, field values, parameter names, and parameter
+   values are case-insensitive.  Tokens are always case-insensitive.
+   Unless specified otherwise, values expressed as quoted strings are
+   case-sensitive.  For example,
+
+      Contact: <sip:alice@atlanta.com>;expires=3600
+
+   is equivalent to
+
+      CONTACT: <sip:alice@atlanta.com>;ExPiReS=3600
+
+   and
+
+      Content-Disposition: session;handling=optional
+
+   is equivalent to
+
+      content-disposition: Session;HANDLING=OPTIONAL
+
+   The following two header fields are not equivalent:
+
+      Warning: 370 devnull "Choose a bigger pipe"
+      Warning: 370 devnull "CHOOSE A BIGGER PIPE"
+
+7.3.2 Header Field Classification
+
+   Some header fields only make sense in requests or responses.  These
+   are called request header fields and response header fields,
+   respectively.  If a header field appears in a message not matching
+   its category (such as a request header field in a response), it MUST
+   be ignored.  Section 20 defines the classification of each header
+   field.
+
+7.3.3 Compact Form
+
+   SIP provides a mechanism to represent common header field names in an
+   abbreviated form.  This may be useful when messages would otherwise
+   become too large to be carried on the transport available to it
+   (exceeding the maximum transmission unit (MTU) when using UDP, for
+   example).  These compact forms are defined in Section 20.  A compact
+   form MAY be substituted for the longer form of a header field name at
+   any time without changing the semantics of the message.  A header
+
+
+
+Rosenberg, et. al.          Standards Track                    [Page 32]
+
+RFC 3261            SIP: Session Initiation Protocol           June 2002
+
+
+   field name MAY appear in both long and short forms within the same
+   message.  Implementations MUST accept both the long and short forms
+   of each header name.
+
+7.4 Bodies
+
+   Requests, including new requests defined in extensions to this
+   specification, MAY contain message bodies unless otherwise noted.
+   The interpretation of the body depends on the request method.
+
+   For response messages, the request method and the response status
+   code determine the type and interpretation of any message body.  All
+   responses MAY include a body.
+
+7.4.1 Message Body Type
+
+   The Internet media type of the message body MUST be given by the
+   Content-Type header field.  If the body has undergone any encoding
+   such as compression, then this MUST be indicated by the Content-
+   Encoding header field; otherwise, Content-Encoding MUST be omitted.
+   If applicable, the character set of the message body is indicated as
+   part of the Content-Type header-field value.
+
+   The "multipart" MIME type defined in RFC 2046 [11] MAY be used within
+   the body of the message.  Implementations that send requests
+   containing multipart message bodies MUST send a session description
+   as a non-multipart message body if the remote implementation requests
+   this through an Accept header field that does not contain multipart.
+
+   SIP messages MAY contain binary bodies or body parts. When no
+   explicit charset parameter is provided by the sender, media subtypes
+   of the "text" type are defined to have a default charset value of
+   "UTF-8".
+
+7.4.2 Message Body Length
+
+   The body length in bytes is provided by the Content-Length header
+   field.  Section 20.14 describes the necessary contents of this header
+   field in detail.
+
+   The "chunked" transfer encoding of HTTP/1.1 MUST NOT be used for SIP.
+   (Note: The chunked encoding modifies the body of a message in order
+   to transfer it as a series of chunks, each with its own size
+   indicator.)
+
+
+
+
+
+
+
+Rosenberg, et. al.          Standards Track                    [Page 33]
+
+RFC 3261            SIP: Session Initiation Protocol           June 2002
+
+
+7.5 Framing SIP Messages
+
+   Unlike HTTP, SIP implementations can use UDP or other unreliable
+   datagram protocols.  Each such datagram carries one request or
+   response.  See Section 18 on constraints on usage of unreliable
+   transports.
+
+   Implementations processing SIP messages over stream-oriented
+   transports MUST ignore any CRLF appearing before the start-line
+   [H4.1].
+
+      The Content-Length header field value is used to locate the end of
+      each SIP message in a stream.  It will always be present when SIP
+      messages are sent over stream-oriented transports.
+
+8 General User Agent Behavior
+
+   A user agent represents an end system.  It contains a user agent
+   client (UAC), which generates requests, and a user agent server
+   (UAS), which responds to them.  A UAC is capable of generating a
+   request based on some external stimulus (the user clicking a button,
+   or a signal on a PSTN line) and processing a response.  A UAS is
+   capable of receiving a request and generating a response based on
+   user input, external stimulus, the result of a program execution, or
+   some other mechanism.
+
+   When a UAC sends a request, the request passes through some number of
+   proxy servers, which forward the request towards the UAS. When the
+   UAS generates a response, the response is forwarded towards the UAC.
+
+   UAC and UAS procedures depend strongly on two factors.  First, based
+   on whether the request or response is inside or outside of a dialog,
+   and second, based on the method of a request.  Dialogs are discussed
+   thoroughly in Section 12; they represent a peer-to-peer relationship
+   between user agents and are established by specific SIP methods, such
+   as INVITE.
+
+   In this section, we discuss the method-independent rules for UAC and
+   UAS behavior when processing requests that are outside of a dialog.
+   This includes, of course, the requests which themselves establish a
+   dialog.
+
+   Security procedures for requests and responses outside of a dialog
+   are described in Section 26.  Specifically, mechanisms exist for the
+   UAS and UAC to mutually authenticate.  A limited set of privacy
+   features are also supported through encryption of bodies using
+   S/MIME.
+
+
+
+
+Rosenberg, et. al.          Standards Track                    [Page 34]
+
+RFC 3261            SIP: Session Initiation Protocol           June 2002
+
+
+8.1 UAC Behavior
+
+   This section covers UAC behavior outside of a dialog.
+
+8.1.1 Generating the Request
+
+   A valid SIP request formulated by a UAC MUST, at a minimum, contain
+   the following header fields: To, From, CSeq, Call-ID, Max-Forwards,
+   and Via; all of these header fields are mandatory in all SIP
+   requests.  These six header fields are the fundamental building
+   blocks of a SIP message, as they jointly provide for most of the
+   critical message routing services including the addressing of
+   messages, the routing of responses, limiting message propagation,
+   ordering of messages, and the unique identification of transactions.
+   These header fields are in addition to the mandatory request line,
+   which contains the method, Request-URI, and SIP version.
+
+   Examples of requests sent outside of a dialog include an INVITE to
+   establish a session (Section 13) and an OPTIONS to query for
+   capabilities (Section 11).
+
+8.1.1.1 Request-URI
+
+   The initial Request-URI of the message SHOULD be set to the value of
+   the URI in the To field.  One notable exception is the REGISTER
+   method; behavior for setting the Request-URI of REGISTER is given in
+   Section 10.  It may also be undesirable for privacy reasons or
+   convenience to set these fields to the same value (especially if the
+   originating UA expects that the Request-URI will be changed during
+   transit).
+
+   In some special circumstances, the presence of a pre-existing route
+   set can affect the Request-URI of the message.  A pre-existing route
+   set is an ordered set of URIs that identify a chain of servers, to
+   which a UAC will send outgoing requests that are outside of a dialog.
+   Commonly, they are configured on the UA by a user or service provider
+   manually, or through some other non-SIP mechanism.  When a provider
+   wishes to configure a UA with an outbound proxy, it is RECOMMENDED
+   that this be done by providing it with a pre-existing route set with
+   a single URI, that of the outbound proxy.
+
+   When a pre-existing route set is present, the procedures for
+   populating the Request-URI and Route header field detailed in Section
+   12.2.1.1 MUST be followed (even though there is no dialog), using the
+   desired Request-URI as the remote target URI.
+
+
+
+
+
+
+Rosenberg, et. al.          Standards Track                    [Page 35]
+
+RFC 3261            SIP: Session Initiation Protocol           June 2002
+
+
+8.1.1.2 To
+
+   The To header field first and foremost specifies the desired
+   "logical" recipient of the request, or the address-of-record of the
+   user or resource that is the target of this request.  This may or may
+   not be the ultimate recipient of the request.  The To header field
+   MAY contain a SIP or SIPS URI, but it may also make use of other URI
+   schemes (the tel URL (RFC 2806 [9]), for example) when appropriate.
+   All SIP implementations MUST support the SIP URI scheme.  Any
+   implementation that supports TLS MUST support the SIPS URI scheme.
+   The To header field allows for a display name.
+
+   A UAC may learn how to populate the To header field for a particular
+   request in a number of ways.  Usually the user will suggest the To
+   header field through a human interface, perhaps inputting the URI
+   manually or selecting it from some sort of address book.  Frequently,
+   the user will not enter a complete URI, but rather a string of digits
+   or letters (for example, "bob").  It is at the discretion of the UA
+   to choose how to interpret this input.  Using the string to form the
+   user part of a SIP URI implies that the UA wishes the name to be
+   resolved in the domain to the right-hand side (RHS) of the at-sign in
+   the SIP URI (for instance, sip:bob@example.com).  Using the string to
+   form the user part of a SIPS URI implies that the UA wishes to
+   communicate securely, and that the name is to be resolved in the
+   domain to the RHS of the at-sign.  The RHS will frequently be the
+   home domain of the requestor, which allows for the home domain to
+   process the outgoing request.  This is useful for features like
+   "speed dial" that require interpretation of the user part in the home
+   domain.  The tel URL may be used when the UA does not wish to specify
+   the domain that should interpret a telephone number that has been
+   input by the user.  Rather, each domain through which the request
+   passes would be given that opportunity.  As an example, a user in an
+   airport might log in and send requests through an outbound proxy in
+   the airport.  If they enter "411" (this is the phone number for local
+   directory assistance in the United States), that needs to be
+   interpreted and processed by the outbound proxy in the airport, not
+   the user's home domain.  In this case, tel:411 would be the right
+   choice.
+
+   A request outside of a dialog MUST NOT contain a To tag; the tag in
+   the To field of a request identifies the peer of the dialog.  Since
+   no dialog is established, no tag is present.
+
+   For further information on the To header field, see Section 20.39.
+   The following is an example of a valid To header field:
+
+      To: Carol <sip:carol@chicago.com>
+
+
+
+
+Rosenberg, et. al.          Standards Track                    [Page 36]
+
+RFC 3261            SIP: Session Initiation Protocol           June 2002
+
+
+8.1.1.3 From
+
+   The From header field indicates the logical identity of the initiator
+   of the request, possibly the user's address-of-record.  Like the To
+   header field, it contains a URI and optionally a display name.  It is
+   used by SIP elements to determine which processing rules to apply to
+   a request (for example, automatic call rejection).  As such, it is
+   very important that the From URI not contain IP addresses or the FQDN
+   of the host on which the UA is running, since these are not logical
+   names.
+
+   The From header field allows for a display name.  A UAC SHOULD use
+   the display name "Anonymous", along with a syntactically correct, but
+   otherwise meaningless URI (like sip:thisis@anonymous.invalid), if the
+   identity of the client is to remain hidden.
+
+   Usually, the value that populates the From header field in requests
+   generated by a particular UA is pre-provisioned by the user or by the
+   administrators of the user's local domain.  If a particular UA is
+   used by multiple users, it might have switchable profiles that
+   include a URI corresponding to the identity of the profiled user.
+   Recipients of requests can authenticate the originator of a request
+   in order to ascertain that they are who their From header field
+   claims they are (see Section 22 for more on authentication).
+
+   The From field MUST contain a new "tag" parameter, chosen by the UAC.
+   See Section 19.3 for details on choosing a tag.
+
+   For further information on the From header field, see Section 20.20.
+   Examples:
+
+      From: "Bob" <sips:bob@biloxi.com> ;tag=a48s
+      From: sip:+12125551212@phone2net.com;tag=887s
+      From: Anonymous <sip:c8oqz84zk7z@privacy.org>;tag=hyh8
+
+8.1.1.4 Call-ID
+
+   The Call-ID header field acts as a unique identifier to group
+   together a series of messages.  It MUST be the same for all requests
+   and responses sent by either UA in a dialog.  It SHOULD be the same
+   in each registration from a UA.
+
+   In a new request created by a UAC outside of any dialog, the Call-ID
+   header field MUST be selected by the UAC as a globally unique
+   identifier over space and time unless overridden by method-specific
+   behavior.  All SIP UAs must have a means to guarantee that the Call-
+   ID header fields they produce will not be inadvertently generated by
+   any other UA.  Note that when requests are retried after certain
+
+
+
+Rosenberg, et. al.          Standards Track                    [Page 37]
+
+RFC 3261            SIP: Session Initiation Protocol           June 2002
+
+
+   failure responses that solicit an amendment to a request (for
+   example, a challenge for authentication), these retried requests are
+   not considered new requests, and therefore do not need new Call-ID
+   header fields; see Section 8.1.3.5.
+
+   Use of cryptographically random identifiers (RFC 1750 [12]) in the
+   generation of Call-IDs is RECOMMENDED.  Implementations MAY use the
+   form "localid@host".  Call-IDs are case-sensitive and are simply
+   compared byte-by-byte.
+
+      Using cryptographically random identifiers provides some
+      protection against session hijacking and reduces the likelihood of
+      unintentional Call-ID collisions.
+
+   No provisioning or human interface is required for the selection of
+   the Call-ID header field value for a request.
+
+   For further information on the Call-ID header field, see Section
+   20.8.
+
+   Example:
+
+      Call-ID: f81d4fae-7dec-11d0-a765-00a0c91e6bf6@foo.bar.com
+
+8.1.1.5 CSeq
+
+   The CSeq header field serves as a way to identify and order
+   transactions.  It consists of a sequence number and a method.  The
+   method MUST match that of the request.  For non-REGISTER requests
+   outside of a dialog, the sequence number value is arbitrary.  The
+   sequence number value MUST be expressible as a 32-bit unsigned
+   integer and MUST be less than 2**31.  As long as it follows the above
+   guidelines, a client may use any mechanism it would like to select
+   CSeq header field values.
+
+   Section 12.2.1.1 discusses construction of the CSeq for requests
+   within a dialog.
+
+   Example:
+
+      CSeq: 4711 INVITE
+
+
+
+
+
+
+
+
+
+
+Rosenberg, et. al.          Standards Track                    [Page 38]
+
+RFC 3261            SIP: Session Initiation Protocol           June 2002
+
+
+8.1.1.6 Max-Forwards
+
+   The Max-Forwards header field serves to limit the number of hops a
+   request can transit on the way to its destination.  It consists of an
+   integer that is decremented by one at each hop.  If the Max-Forwards
+   value reaches 0 before the request reaches its destination, it will
+   be rejected with a 483(Too Many Hops) error response.
+
+   A UAC MUST insert a Max-Forwards header field into each request it
+   originates with a value that SHOULD be 70.  This number was chosen to
+   be sufficiently large to guarantee that a request would not be
+   dropped in any SIP network when there were no loops, but not so large
+   as to consume proxy resources when a loop does occur.  Lower values
+   should be used with caution and only in networks where topologies are
+   known by the UA.
+
+8.1.1.7 Via
+
+   The Via header field indicates the transport used for the transaction
+   and identifies the location where the response is to be sent.  A Via
+   header field value is added only after the transport that will be
+   used to reach the next hop has been selected (which may involve the
+   usage of the procedures in [4]).
+
+   When the UAC creates a request, it MUST insert a Via into that
+   request.  The protocol name and protocol version in the header field
+   MUST be SIP and 2.0, respectively.  The Via header field value MUST
+   contain a branch parameter.  This parameter is used to identify the
+   transaction created by that request.  This parameter is used by both
+   the client and the server.
+
+   The branch parameter value MUST be unique across space and time for
+   all requests sent by the UA.  The exceptions to this rule are CANCEL
+   and ACK for non-2xx responses.  As discussed below, a CANCEL request
+   will have the same value of the branch parameter as the request it
+   cancels.  As discussed in Section 17.1.1.3, an ACK for a non-2xx
+   response will also have the same branch ID as the INVITE whose
+   response it acknowledges.
+
+      The uniqueness property of the branch ID parameter, to facilitate
+      its use as a transaction ID, was not part of RFC 2543.
+
+   The branch ID inserted by an element compliant with this
+   specification MUST always begin with the characters "z9hG4bK".  These
+   7 characters are used as a magic cookie (7 is deemed sufficient to
+   ensure that an older RFC 2543 implementation would not pick such a
+   value), so that servers receiving the request can determine that the
+   branch ID was constructed in the fashion described by this
+
+
+
+Rosenberg, et. al.          Standards Track                    [Page 39]
+
+RFC 3261            SIP: Session Initiation Protocol           June 2002
+
+
+   specification (that is, globally unique).  Beyond this requirement,
+   the precise format of the branch token is implementation-defined.
+
+   The Via header maddr, ttl, and sent-by components will be set when
+   the request is processed by the transport layer (Section 18).
+
+   Via processing for proxies is described in Section 16.6 Item 8 and
+   Section 16.7 Item 3.
+
+8.1.1.8 Contact
+
+   The Contact header field provides a SIP or SIPS URI that can be used
+   to contact that specific instance of the UA for subsequent requests.
+   The Contact header field MUST be present and contain exactly one SIP
+   or SIPS URI in any request that can result in the establishment of a
+   dialog.  For the methods defined in this specification, that includes
+   only the INVITE request.  For these requests, the scope of the
+   Contact is global.  That is, the Contact header field value contains
+   the URI at which the UA would like to receive requests, and this URI
+   MUST be valid even if used in subsequent requests outside of any
+   dialogs.
+
+   If the Request-URI or top Route header field value contains a SIPS
+   URI, the Contact header field MUST contain a SIPS URI as well.
+
+   For further information on the Contact header field, see Section
+   20.10.
+
+8.1.1.9 Supported and Require
+
+   If the UAC supports extensions to SIP that can be applied by the
+   server to the response, the UAC SHOULD include a Supported header
+   field in the request listing the option tags (Section 19.2) for those
+   extensions.
+
+   The option tags listed MUST only refer to extensions defined in
+   standards-track RFCs.  This is to prevent servers from insisting that
+   clients implement non-standard, vendor-defined features in order to
+   receive service.  Extensions defined by experimental and
+   informational RFCs are explicitly excluded from usage with the
+   Supported header field in a request, since they too are often used to
+   document vendor-defined extensions.
+
+   If the UAC wishes to insist that a UAS understand an extension that
+   the UAC will apply to the request in order to process the request, it
+   MUST insert a Require header field into the request listing the
+   option tag for that extension.  If the UAC wishes to apply an
+   extension to the request and insist that any proxies that are
+
+
+
+Rosenberg, et. al.          Standards Track                    [Page 40]
+
+RFC 3261            SIP: Session Initiation Protocol           June 2002
+
+
+   traversed understand that extension, it MUST insert a Proxy-Require
+   header field into the request listing the option tag for that
+   extension.
+
+   As with the Supported header field, the option tags in the Require
+   and Proxy-Require header fields MUST only refer to extensions defined
+   in standards-track RFCs.
+
+8.1.1.10 Additional Message Components
+
+   After a new request has been created, and the header fields described
+   above have been properly constructed, any additional optional header
+   fields are added, as are any header fields specific to the method.
+
+   SIP requests MAY contain a MIME-encoded message-body.  Regardless of
+   the type of body that a request contains, certain header fields must
+   be formulated to characterize the contents of the body.  For further
+   information on these header fields, see Sections 20.11 through 20.15.
+
+8.1.2 Sending the Request
+
+   The destination for the request is then computed.  Unless there is
+   local policy specifying otherwise, the destination MUST be determined
+   by applying the DNS procedures described in [4] as follows.  If the
+   first element in the route set indicated a strict router (resulting
+   in forming the request as described in Section 12.2.1.1), the
+   procedures MUST be applied to the Request-URI of the request.
+   Otherwise, the procedures are applied to the first Route header field
+   value in the request (if one exists), or to the request's Request-URI
+   if there is no Route header field present.  These procedures yield an
+   ordered set of address, port, and transports to attempt.  Independent
+   of which URI is used as input to the procedures of [4], if the
+   Request-URI specifies a SIPS resource, the UAC MUST follow the
+   procedures of [4] as if the input URI were a SIPS URI.
+
+   Local policy MAY specify an alternate set of destinations to attempt.
+   If the Request-URI contains a SIPS URI, any alternate destinations
+   MUST be contacted with TLS.  Beyond that, there are no restrictions
+   on the alternate destinations if the request contains no Route header
+   field.  This provides a simple alternative to a pre-existing route
+   set as a way to specify an outbound proxy.  However, that approach
+   for configuring an outbound proxy is NOT RECOMMENDED; a pre-existing
+   route set with a single URI SHOULD be used instead.  If the request
+   contains a Route header field, the request SHOULD be sent to the
+   locations derived from its topmost value, but MAY be sent to any
+   server that the UA is certain will honor the Route and Request-URI
+   policies specified in this document (as opposed to those in RFC
+   2543).  In particular, a UAC configured with an outbound proxy SHOULD
+
+
+
+Rosenberg, et. al.          Standards Track                    [Page 41]
+
+RFC 3261            SIP: Session Initiation Protocol           June 2002
+
+
+   attempt to send the request to the location indicated in the first
+   Route header field value instead of adopting the policy of sending
+   all messages to the outbound proxy.
+
+      This ensures that outbound proxies that do not add Record-Route
+      header field values will drop out of the path of subsequent
+      requests.  It allows endpoints that cannot resolve the first Route
+      URI to delegate that task to an outbound proxy.
+
+   The UAC SHOULD follow the procedures defined in [4] for stateful
+   elements, trying each address until a server is contacted.  Each try
+   constitutes a new transaction, and therefore each carries a different
+   topmost Via header field value with a new branch parameter.
+   Furthermore, the transport value in the Via header field is set to
+   whatever transport was determined for the target server.
+
+8.1.3 Processing Responses
+
+   Responses are first processed by the transport layer and then passed
+   up to the transaction layer.  The transaction layer performs its
+   processing and then passes the response up to the TU.  The majority
+   of response processing in the TU is method specific.  However, there
+   are some general behaviors independent of the method.
+
+8.1.3.1 Transaction Layer Errors
+
+   In some cases, the response returned by the transaction layer will
+   not be a SIP message, but rather a transaction layer error.  When a
+   timeout error is received from the transaction layer, it MUST be
+   treated as if a 408 (Request Timeout) status code has been received.
+   If a fatal transport error is reported by the transport layer
+   (generally, due to fatal ICMP errors in UDP or connection failures in
+   TCP), the condition MUST be treated as a 503 (Service Unavailable)
+   status code.
+
+8.1.3.2 Unrecognized Responses
+
+   A UAC MUST treat any final response it does not recognize as being
+   equivalent to the x00 response code of that class, and MUST be able
+   to process the x00 response code for all classes.  For example, if a
+   UAC receives an unrecognized response code of 431, it can safely
+   assume that there was something wrong with its request and treat the
+   response as if it had received a 400 (Bad Request) response code.  A
+   UAC MUST treat any provisional response different than 100 that it
+   does not recognize as 183 (Session Progress).  A UAC MUST be able to
+   process 100 and 183 responses.
+
+
+
+
+
+Rosenberg, et. al.          Standards Track                    [Page 42]
+
+RFC 3261            SIP: Session Initiation Protocol           June 2002
+
+
+8.1.3.3 Vias
+
+   If more than one Via header field value is present in a response, the
+   UAC SHOULD discard the message.
+
+      The presence of additional Via header field values that precede
+      the originator of the request suggests that the message was
+      misrouted or possibly corrupted.
+
+8.1.3.4 Processing 3xx Responses
+
+   Upon receipt of a redirection response (for example, a 301 response
+   status code), clients SHOULD use the URI(s) in the Contact header
+   field to formulate one or more new requests based on the redirected
+   request.  This process is similar to that of a proxy recursing on a
+   3xx class response as detailed in Sections 16.5 and 16.6.  A client
+   starts with an initial target set containing exactly one URI, the
+   Request-URI of the original request.  If a client wishes to formulate
+   new requests based on a 3xx class response to that request, it places
+   the URIs to try into the target set.  Subject to the restrictions in
+   this specification, a client can choose which Contact URIs it places
+   into the target set.  As with proxy recursion, a client processing
+   3xx class responses MUST NOT add any given URI to the target set more
+   than once.  If the original request had a SIPS URI in the Request-
+   URI, the client MAY choose to recurse to a non-SIPS URI, but SHOULD
+   inform the user of the redirection to an insecure URI.
+
+      Any new request may receive 3xx responses themselves containing
+      the original URI as a contact.  Two locations can be configured to
+      redirect to each other.  Placing any given URI in the target set
+      only once prevents infinite redirection loops.
+
+   As the target set grows, the client MAY generate new requests to the
+   URIs in any order.  A common mechanism is to order the set by the "q"
+   parameter value from the Contact header field value.  Requests to the
+   URIs MAY be generated serially or in parallel.  One approach is to
+   process groups of decreasing q-values serially and process the URIs
+   in each q-value group in parallel.  Another is to perform only serial
+   processing in decreasing q-value order, arbitrarily choosing between
+   contacts of equal q-value.
+
+   If contacting an address in the list results in a failure, as defined
+   in the next paragraph, the element moves to the next address in the
+   list, until the list is exhausted.  If the list is exhausted, then
+   the request has failed.
+
+
+
+
+
+
+Rosenberg, et. al.          Standards Track                    [Page 43]
+
+RFC 3261            SIP: Session Initiation Protocol           June 2002
+
+
+   Failures SHOULD be detected through failure response codes (codes
+   greater than 399); for network errors the client transaction will
+   report any transport layer failures to the transaction user.  Note
+   that some response codes (detailed in 8.1.3.5) indicate that the
+   request can be retried; requests that are reattempted should not be
+   considered failures.
+
+   When a failure for a particular contact address is received, the
+   client SHOULD try the next contact address.  This will involve
+   creating a new client transaction to deliver a new request.
+
+   In order to create a request based on a contact address in a 3xx
+   response, a UAC MUST copy the entire URI from the target set into the
+   Request-URI, except for the "method-param" and "header" URI
+   parameters (see Section 19.1.1 for a definition of these parameters).
+   It uses the "header" parameters to create header field values for the
+   new request, overwriting header field values associated with the
+   redirected request in accordance with the guidelines in Section
+   19.1.5.
+
+   Note that in some instances, header fields that have been
+   communicated in the contact address may instead append to existing
+   request header fields in the original redirected request.  As a
+   general rule, if the header field can accept a comma-separated list
+   of values, then the new header field value MAY be appended to any
+   existing values in the original redirected request.  If the header
+   field does not accept multiple values, the value in the original
+   redirected request MAY be overwritten by the header field value
+   communicated in the contact address.  For example, if a contact
+   address is returned with the following value:
+
+      sip:user@host?Subject=foo&Call-Info=<http://www.foo.com>
+
+   Then any Subject header field in the original redirected request is
+   overwritten, but the HTTP URL is merely appended to any existing
+   Call-Info header field values.
+
+   It is RECOMMENDED that the UAC reuse the same To, From, and Call-ID
+   used in the original redirected request, but the UAC MAY also choose
+   to update the Call-ID header field value for new requests, for
+   example.
+
+   Finally, once the new request has been constructed, it is sent using
+   a new client transaction, and therefore MUST have a new branch ID in
+   the top Via field as discussed in Section 8.1.1.7.
+
+
+
+
+
+
+Rosenberg, et. al.          Standards Track                    [Page 44]
+
+RFC 3261            SIP: Session Initiation Protocol           June 2002
+
+
+   In all other respects, requests sent upon receipt of a redirect
+   response SHOULD re-use the header fields and bodies of the original
+   request.
+
+   In some instances, Contact header field values may be cached at UAC
+   temporarily or permanently depending on the status code received and
+   the presence of an expiration interval; see Sections 21.3.2 and
+   21.3.3.
+
+8.1.3.5 Processing 4xx Responses
+
+   Certain 4xx response codes require specific UA processing,
+   independent of the method.
+
+   If a 401 (Unauthorized) or 407 (Proxy Authentication Required)
+   response is received, the UAC SHOULD follow the authorization
+   procedures of Section 22.2 and Section 22.3 to retry the request with
+   credentials.
+
+   If a 413 (Request Entity Too Large) response is received (Section
+   21.4.11), the request contained a body that was longer than the UAS
+   was willing to accept.  If possible, the UAC SHOULD retry the
+   request, either omitting the body or using one of a smaller length.
+
+   If a 415 (Unsupported Media Type) response is received (Section
+   21.4.13), the request contained media types not supported by the UAS.
+   The UAC SHOULD retry sending the request, this time only using
+   content with types listed in the Accept header field in the response,
+   with encodings listed in the Accept-Encoding header field in the
+   response, and with languages listed in the Accept-Language in the
+   response.
+
+   If a 416 (Unsupported URI Scheme) response is received (Section
+   21.4.14), the Request-URI used a URI scheme not supported by the
+   server.  The client SHOULD retry the request, this time, using a SIP
+   URI.
+
+   If a 420 (Bad Extension) response is received (Section 21.4.15), the
+   request contained a Require or Proxy-Require header field listing an
+   option-tag for a feature not supported by a proxy or UAS.  The UAC
+   SHOULD retry the request, this time omitting any extensions listed in
+   the Unsupported header field in the response.
+
+   In all of the above cases, the request is retried by creating a new
+   request with the appropriate modifications.  This new request
+   constitutes a new transaction and SHOULD have the same value of the
+   Call-ID, To, and From of the previous request, but the CSeq should
+   contain a new sequence number that is one higher than the previous.
+
+
+
+Rosenberg, et. al.          Standards Track                    [Page 45]
+
+RFC 3261            SIP: Session Initiation Protocol           June 2002
+
+
+   With other 4xx responses, including those yet to be defined, a retry
+   may or may not be possible depending on the method and the use case.
+
+8.2 UAS Behavior
+
+   When a request outside of a dialog is processed by a UAS, there is a
+   set of processing rules that are followed, independent of the method.
+   Section 12 gives guidance on how a UAS can tell whether a request is
+   inside or outside of a dialog.
+
+   Note that request processing is atomic.  If a request is accepted,
+   all state changes associated with it MUST be performed.  If it is
+   rejected, all state changes MUST NOT be performed.
+
+   UASs SHOULD process the requests in the order of the steps that
+   follow in this section (that is, starting with authentication, then
+   inspecting the method, the header fields, and so on throughout the
+   remainder of this section).
+
+8.2.1 Method Inspection
+
+   Once a request is authenticated (or authentication is skipped), the
+   UAS MUST inspect the method of the request.  If the UAS recognizes
+   but does not support the method of a request, it MUST generate a 405
+   (Method Not Allowed) response.  Procedures for generating responses
+   are described in Section 8.2.6.  The UAS MUST also add an Allow
+   header field to the 405 (Method Not Allowed) response.  The Allow
+   header field MUST list the set of methods supported by the UAS
+   generating the message.  The Allow header field is presented in
+   Section 20.5.
+
+   If the method is one supported by the server, processing continues.
+
+8.2.2 Header Inspection
+
+   If a UAS does not understand a header field in a request (that is,
+   the header field is not defined in this specification or in any
+   supported extension), the server MUST ignore that header field and
+   continue processing the message.  A UAS SHOULD ignore any malformed
+   header fields that are not necessary for processing requests.
+
+8.2.2.1 To and Request-URI
+
+   The To header field identifies the original recipient of the request
+   designated by the user identified in the From field.  The original
+   recipient may or may not be the UAS processing the request, due to
+   call forwarding or other proxy operations.  A UAS MAY apply any
+   policy it wishes to determine whether to accept requests when the To
+
+
+
+Rosenberg, et. al.          Standards Track                    [Page 46]
+
+RFC 3261            SIP: Session Initiation Protocol           June 2002
+
+
+   header field is not the identity of the UAS.  However, it is
+   RECOMMENDED that a UAS accept requests even if they do not recognize
+   the URI scheme (for example, a tel: URI) in the To header field, or
+   if the To header field does not address a known or current user of
+   this UAS.  If, on the other hand, the UAS decides to reject the
+   request, it SHOULD generate a response with a 403 (Forbidden) status
+   code and pass it to the server transaction for transmission.
+
+   However, the Request-URI identifies the UAS that is to process the
+   request.  If the Request-URI uses a scheme not supported by the UAS,
+   it SHOULD reject the request with a 416 (Unsupported URI Scheme)
+   response.  If the Request-URI does not identify an address that the
+   UAS is willing to accept requests for, it SHOULD reject the request
+   with a 404 (Not Found) response.  Typically, a UA that uses the
+   REGISTER method to bind its address-of-record to a specific contact
+   address will see requests whose Request-URI equals that contact
+   address.  Other potential sources of received Request-URIs include
+   the Contact header fields of requests and responses sent by the UA
+   that establish or refresh dialogs.
+
+8.2.2.2 Merged Requests
+
+   If the request has no tag in the To header field, the UAS core MUST
+   check the request against ongoing transactions.  If the From tag,
+   Call-ID, and CSeq exactly match those associated with an ongoing
+   transaction, but the request does not match that transaction (based
+   on the matching rules in Section 17.2.3), the UAS core SHOULD
+   generate a 482 (Loop Detected) response and pass it to the server
+   transaction.
+
+      The same request has arrived at the UAS more than once, following
+      different paths, most likely due to forking.  The UAS processes
+      the first such request received and responds with a 482 (Loop
+      Detected) to the rest of them.
+
+8.2.2.3 Require
+
+   Assuming the UAS decides that it is the proper element to process the
+   request, it examines the Require header field, if present.
+
+   The Require header field is used by a UAC to tell a UAS about SIP
+   extensions that the UAC expects the UAS to support in order to
+   process the request properly.  Its format is described in Section
+   20.32.  If a UAS does not understand an option-tag listed in a
+   Require header field, it MUST respond by generating a response with
+   status code 420 (Bad Extension).  The UAS MUST add an Unsupported
+   header field, and list in it those options it does not understand
+   amongst those in the Require header field of the request.
+
+
+
+Rosenberg, et. al.          Standards Track                    [Page 47]
+
+RFC 3261            SIP: Session Initiation Protocol           June 2002
+
+
+   Note that Require and Proxy-Require MUST NOT be used in a SIP CANCEL
+   request, or in an ACK request sent for a non-2xx response.  These
+   header fields MUST be ignored if they are present in these requests.
+
+   An ACK request for a 2xx response MUST contain only those Require and
+   Proxy-Require values that were present in the initial request.
+
+   Example:
+
+      UAC->UAS:   INVITE sip:watson@bell-telephone.com SIP/2.0
+                  Require: 100rel
+
+      UAS->UAC:   SIP/2.0 420 Bad Extension
+                  Unsupported: 100rel
+
+      This behavior ensures that the client-server interaction will
+      proceed without delay when all options are understood by both
+      sides, and only slow down if options are not understood (as in the
+      example above).  For a well-matched client-server pair, the
+      interaction proceeds quickly, saving a round-trip often required
+      by negotiation mechanisms.  In addition, it also removes ambiguity
+      when the client requires features that the server does not
+      understand.  Some features, such as call handling fields, are only
+      of interest to end systems.
+
+8.2.3 Content Processing
+
+   Assuming the UAS understands any extensions required by the client,
+   the UAS examines the body of the message, and the header fields that
+   describe it.  If there are any bodies whose type (indicated by the
+   Content-Type), language (indicated by the Content-Language) or
+   encoding (indicated by the Content-Encoding) are not understood, and
+   that body part is not optional (as indicated by the Content-
+   Disposition header field), the UAS MUST reject the request with a 415
+   (Unsupported Media Type) response.  The response MUST contain an
+   Accept header field listing the types of all bodies it understands,
+   in the event the request contained bodies of types not supported by
+   the UAS.  If the request contained content encodings not understood
+   by the UAS, the response MUST contain an Accept-Encoding header field
+   listing the encodings understood by the UAS.  If the request
+   contained content with languages not understood by the UAS, the
+   response MUST contain an Accept-Language header field indicating the
+   languages understood by the UAS.  Beyond these checks, body handling
+   depends on the method and type.  For further information on the
+   processing of content-specific header fields, see Section 7.4 as well
+   as Section 20.11 through 20.15.
+
+
+
+
+
+Rosenberg, et. al.          Standards Track                    [Page 48]
+
+RFC 3261            SIP: Session Initiation Protocol           June 2002
+
+
+8.2.4 Applying Extensions
+
+   A UAS that wishes to apply some extension when generating the
+   response MUST NOT do so unless support for that extension is
+   indicated in the Supported header field in the request.  If the
+   desired extension is not supported, the server SHOULD rely only on
+   baseline SIP and any other extensions supported by the client.  In
+   rare circumstances, where the server cannot process the request
+   without the extension, the server MAY send a 421 (Extension Required)
+   response.  This response indicates that the proper response cannot be
+   generated without support of a specific extension.  The needed
+   extension(s) MUST be included in a Require header field in the
+   response.  This behavior is NOT RECOMMENDED, as it will generally
+   break interoperability.
+
+   Any extensions applied to a non-421 response MUST be listed in a
+   Require header field included in the response.  Of course, the server
+   MUST NOT apply extensions not listed in the Supported header field in
+   the request.  As a result of this, the Require header field in a
+   response will only ever contain option tags defined in standards-
+   track RFCs.
+
+8.2.5 Processing the Request
+
+   Assuming all of the checks in the previous subsections are passed,
+   the UAS processing becomes method-specific.  Section 10 covers the
+   REGISTER request, Section 11 covers the OPTIONS request, Section 13
+   covers the INVITE request, and Section 15 covers the BYE request.
+
+8.2.6 Generating the Response
+
+   When a UAS wishes to construct a response to a request, it follows
+   the general procedures detailed in the following subsections.
+   Additional behaviors specific to the response code in question, which
+   are not detailed in this section, may also be required.
+
+   Once all procedures associated with the creation of a response have
+   been completed, the UAS hands the response back to the server
+   transaction from which it received the request.
+
+8.2.6.1 Sending a Provisional Response
+
+   One largely non-method-specific guideline for the generation of
+   responses is that UASs SHOULD NOT issue a provisional response for a
+   non-INVITE request.  Rather, UASs SHOULD generate a final response to
+   a non-INVITE request as soon as possible.
+
+
+
+
+
+Rosenberg, et. al.          Standards Track                    [Page 49]
+
+RFC 3261            SIP: Session Initiation Protocol           June 2002
+
+
+   When a 100 (Trying) response is generated, any Timestamp header field
+   present in the request MUST be copied into this 100 (Trying)
+   response.  If there is a delay in generating the response, the UAS
+   SHOULD add a delay value into the Timestamp value in the response.
+   This value MUST contain the difference between the time of sending of
+   the response and receipt of the request, measured in seconds.
+
+8.2.6.2 Headers and Tags
+
+   The From field of the response MUST equal the From header field of
+   the request.  The Call-ID header field of the response MUST equal the
+   Call-ID header field of the request.  The CSeq header field of the
+   response MUST equal the CSeq field of the request.  The Via header
+   field values in the response MUST equal the Via header field values
+   in the request and MUST maintain the same ordering.
+
+   If a request contained a To tag in the request, the To header field
+   in the response MUST equal that of the request.  However, if the To
+   header field in the request did not contain a tag, the URI in the To
+   header field in the response MUST equal the URI in the To header
+   field; additionally, the UAS MUST add a tag to the To header field in
+   the response (with the exception of the 100 (Trying) response, in
+   which a tag MAY be present).  This serves to identify the UAS that is
+   responding, possibly resulting in a component of a dialog ID.  The
+   same tag MUST be used for all responses to that request, both final
+   and provisional (again excepting the 100 (Trying)).  Procedures for
+   the generation of tags are defined in Section 19.3.
+
+8.2.7 Stateless UAS Behavior
+
+   A stateless UAS is a UAS that does not maintain transaction state.
+   It replies to requests normally, but discards any state that would
+   ordinarily be retained by a UAS after a response has been sent.  If a
+   stateless UAS receives a retransmission of a request, it regenerates
+   the response and resends it, just as if it were replying to the first
+   instance of the request. A UAS cannot be stateless unless the request
+   processing for that method would always result in the same response
+   if the requests are identical. This rules out stateless registrars,
+   for example.  Stateless UASs do not use a transaction layer; they
+   receive requests directly from the transport layer and send responses
+   directly to the transport layer.
+
+   The stateless UAS role is needed primarily to handle unauthenticated
+   requests for which a challenge response is issued.  If
+   unauthenticated requests were handled statefully, then malicious
+   floods of unauthenticated requests could create massive amounts of
+
+
+
+
+
+Rosenberg, et. al.          Standards Track                    [Page 50]
+
+RFC 3261            SIP: Session Initiation Protocol           June 2002
+
+
+   transaction state that might slow or completely halt call processing
+   in a UAS, effectively creating a denial of service condition; for
+   more information see Section 26.1.5.
+
+   The most important behaviors of a stateless UAS are the following:
+
+      o  A stateless UAS MUST NOT send provisional (1xx) responses.
+
+      o  A stateless UAS MUST NOT retransmit responses.
+
+      o  A stateless UAS MUST ignore ACK requests.
+
+      o  A stateless UAS MUST ignore CANCEL requests.
+
+      o  To header tags MUST be generated for responses in a stateless
+         manner - in a manner that will generate the same tag for the
+         same request consistently.  For information on tag construction
+         see Section 19.3.
+
+   In all other respects, a stateless UAS behaves in the same manner as
+   a stateful UAS.  A UAS can operate in either a stateful or stateless
+   mode for each new request.
+
+8.3 Redirect Servers
+
+   In some architectures it may be desirable to reduce the processing
+   load on proxy servers that are responsible for routing requests, and
+   improve signaling path robustness, by relying on redirection.
+
+   Redirection allows servers to push routing information for a request
+   back in a response to the client, thereby taking themselves out of
+   the loop of further messaging for this transaction while still aiding
+   in locating the target of the request.  When the originator of the
+   request receives the redirection, it will send a new request based on
+   the URI(s) it has received.  By propagating URIs from the core of the
+   network to its edges, redirection allows for considerable network
+   scalability.
+
+   A redirect server is logically constituted of a server transaction
+   layer and a transaction user that has access to a location service of
+   some kind (see Section 10 for more on registrars and location
+   services).  This location service is effectively a database
+   containing mappings between a single URI and a set of one or more
+   alternative locations at which the target of that URI can be found.
+
+   A redirect server does not issue any SIP requests of its own.  After
+   receiving a request other than CANCEL, the server either refuses the
+   request or gathers the list of alternative locations from the
+
+
+
+Rosenberg, et. al.          Standards Track                    [Page 51]
+
+RFC 3261            SIP: Session Initiation Protocol           June 2002
+
+
+   location service and returns a final response of class 3xx.  For
+   well-formed CANCEL requests, it SHOULD return a 2xx response.  This
+   response ends the SIP transaction.  The redirect server maintains
+   transaction state for an entire SIP transaction.  It is the
+   responsibility of clients to detect forwarding loops between redirect
+   servers.
+
+   When a redirect server returns a 3xx response to a request, it
+   populates the list of (one or more) alternative locations into the
+   Contact header field.  An "expires" parameter to the Contact header
+   field values may also be supplied to indicate the lifetime of the
+   Contact data.
+
+   The Contact header field contains URIs giving the new locations or
+   user names to try, or may simply specify additional transport
+   parameters.  A 301 (Moved Permanently) or 302 (Moved Temporarily)
+   response may also give the same location and username that was
+   targeted by the initial request but specify additional transport
+   parameters such as a different server or multicast address to try, or
+   a change of SIP transport from UDP to TCP or vice versa.
+
+   However, redirect servers MUST NOT redirect a request to a URI equal
+   to the one in the Request-URI; instead, provided that the URI does
+   not point to itself, the server MAY proxy the request to the
+   destination URI, or MAY reject it with a 404.
+
+      If a client is using an outbound proxy, and that proxy actually
+      redirects requests, a potential arises for infinite redirection
+      loops.
+
+   Note that a Contact header field value MAY also refer to a different
+   resource than the one originally called.  For example, a SIP call
+   connected to PSTN gateway may need to deliver a special informational
+   announcement such as "The number you have dialed has been changed."
+
+   A Contact response header field can contain any suitable URI
+   indicating where the called party can be reached, not limited to SIP
+   URIs.  For example, it could contain URIs for phones, fax, or irc (if
+   they were defined) or a mailto:  (RFC 2368 [32]) URL.  Section 26.4.4
+   discusses implications and limitations of redirecting a SIPS URI to a
+   non-SIPS URI.
+
+   The "expires" parameter of a Contact header field value indicates how
+   long the URI is valid.  The value of the parameter is a number
+   indicating seconds.  If this parameter is not provided, the value of
+   the Expires header field determines how long the URI is valid.
+   Malformed values SHOULD be treated as equivalent to 3600.
+
+
+
+
+Rosenberg, et. al.          Standards Track                    [Page 52]
+
+RFC 3261            SIP: Session Initiation Protocol           June 2002
+
+
+      This provides a modest level of backwards compatibility with RFC
+      2543, which allowed absolute times in this header field.  If an
+      absolute time is received, it will be treated as malformed, and
+      then default to 3600.
+
+   Redirect servers MUST ignore features that are not understood
+   (including unrecognized header fields, any unknown option tags in
+   Require, or even method names) and proceed with the redirection of
+   the request in question.
+
+9 Canceling a Request
+
+   The previous section has discussed general UA behavior for generating
+   requests and processing responses for requests of all methods.  In
+   this section, we discuss a general purpose method, called CANCEL.
+
+   The CANCEL request, as the name implies, is used to cancel a previous
+   request sent by a client.  Specifically, it asks the UAS to cease
+   processing the request and to generate an error response to that
+   request.  CANCEL has no effect on a request to which a UAS has
+   already given a final response.  Because of this, it is most useful
+   to CANCEL requests to which it can take a server long time to
+   respond.  For this reason, CANCEL is best for INVITE requests, which
+   can take a long time to generate a response.  In that usage, a UAS
+   that receives a CANCEL request for an INVITE, but has not yet sent a
+   final response, would "stop ringing", and then respond to the INVITE
+   with a specific error response (a 487).
+
+   CANCEL requests can be constructed and sent by both proxies and user
+   agent clients.  Section 15 discusses under what conditions a UAC
+   would CANCEL an INVITE request, and Section 16.10 discusses proxy
+   usage of CANCEL.
+
+   A stateful proxy responds to a CANCEL, rather than simply forwarding
+   a response it would receive from a downstream element.  For that
+   reason, CANCEL is referred to as a "hop-by-hop" request, since it is
+   responded to at each stateful proxy hop.
+
+9.1 Client Behavior
+
+   A CANCEL request SHOULD NOT be sent to cancel a request other than
+   INVITE.
+
+      Since requests other than INVITE are responded to immediately,
+      sending a CANCEL for a non-INVITE request would always create a
+      race condition.
+
+
+
+
+
+Rosenberg, et. al.          Standards Track                    [Page 53]
+
+RFC 3261            SIP: Session Initiation Protocol           June 2002
+
+
+   The following procedures are used to construct a CANCEL request.  The
+   Request-URI, Call-ID, To, the numeric part of CSeq, and From header
+   fields in the CANCEL request MUST be identical to those in the
+   request being cancelled, including tags.  A CANCEL constructed by a
+   client MUST have only a single Via header field value matching the
+   top Via value in the request being cancelled.  Using the same values
+   for these header fields allows the CANCEL to be matched with the
+   request it cancels (Section 9.2 indicates how such matching occurs).
+   However, the method part of the CSeq header field MUST have a value
+   of CANCEL.  This allows it to be identified and processed as a
+   transaction in its own right (See Section 17).
+
+   If the request being cancelled contains a Route header field, the
+   CANCEL request MUST include that Route header field's values.
+
+      This is needed so that stateless proxies are able to route CANCEL
+      requests properly.
+
+   The CANCEL request MUST NOT contain any Require or Proxy-Require
+   header fields.
+
+   Once the CANCEL is constructed, the client SHOULD check whether it
+   has received any response (provisional or final) for the request
+   being cancelled (herein referred to as the "original request").
+
+   If no provisional response has been received, the CANCEL request MUST
+   NOT be sent; rather, the client MUST wait for the arrival of a
+   provisional response before sending the request.  If the original
+   request has generated a final response, the CANCEL SHOULD NOT be
+   sent, as it is an effective no-op, since CANCEL has no effect on
+   requests that have already generated a final response.  When the
+   client decides to send the CANCEL, it creates a client transaction
+   for the CANCEL and passes it the CANCEL request along with the
+   destination address, port, and transport.  The destination address,
+   port, and transport for the CANCEL MUST be identical to those used to
+   send the original request.
+
+      If it was allowed to send the CANCEL before receiving a response
+      for the previous request, the server could receive the CANCEL
+      before the original request.
+
+   Note that both the transaction corresponding to the original request
+   and the CANCEL transaction will complete independently.  However, a
+   UAC canceling a request cannot rely on receiving a 487 (Request
+   Terminated) response for the original request, as an RFC 2543-
+   compliant UAS will not generate such a response.  If there is no
+   final response for the original request in 64*T1 seconds (T1 is
+
+
+
+
+Rosenberg, et. al.          Standards Track                    [Page 54]
+
+RFC 3261            SIP: Session Initiation Protocol           June 2002
+
+
+   defined in Section 17.1.1.1), the client SHOULD then consider the
+   original transaction cancelled and SHOULD destroy the client
+   transaction handling the original request.
+
+9.2 Server Behavior
+
+   The CANCEL method requests that the TU at the server side cancel a
+   pending transaction.  The TU determines the transaction to be
+   cancelled by taking the CANCEL request, and then assuming that the
+   request method is anything but CANCEL or ACK and applying the
+   transaction matching procedures of Section 17.2.3.  The matching
+   transaction is the one to be cancelled.
+
+   The processing of a CANCEL request at a server depends on the type of
+   server.  A stateless proxy will forward it, a stateful proxy might
+   respond to it and generate some CANCEL requests of its own, and a UAS
+   will respond to it.  See Section 16.10 for proxy treatment of CANCEL.
+
+   A UAS first processes the CANCEL request according to the general UAS
+   processing described in Section 8.2.  However, since CANCEL requests
+   are hop-by-hop and cannot be resubmitted, they cannot be challenged
+   by the server in order to get proper credentials in an Authorization
+   header field.  Note also that CANCEL requests do not contain a
+   Require header field.
+
+   If the UAS did not find a matching transaction for the CANCEL
+   according to the procedure above, it SHOULD respond to the CANCEL
+   with a 481 (Call Leg/Transaction Does Not Exist).  If the transaction
+   for the original request still exists, the behavior of the UAS on
+   receiving a CANCEL request depends on whether it has already sent a
+   final response for the original request.  If it has, the CANCEL
+   request has no effect on the processing of the original request, no
+   effect on any session state, and no effect on the responses generated
+   for the original request.  If the UAS has not issued a final response
+   for the original request, its behavior depends on the method of the
+   original request.  If the original request was an INVITE, the UAS
+   SHOULD immediately respond to the INVITE with a 487 (Request
+   Terminated).  A CANCEL request has no impact on the processing of
+   transactions with any other method defined in this specification.
+
+   Regardless of the method of the original request, as long as the
+   CANCEL matched an existing transaction, the UAS answers the CANCEL
+   request itself with a 200 (OK) response.  This response is
+   constructed following the procedures described in Section 8.2.6
+   noting that the To tag of the response to the CANCEL and the To tag
+   in the response to the original request SHOULD be the same.  The
+   response to CANCEL is passed to the server transaction for
+   transmission.
+
+
+
+Rosenberg, et. al.          Standards Track                    [Page 55]
+
+RFC 3261            SIP: Session Initiation Protocol           June 2002
+
+
+10 Registrations
+
+10.1 Overview
+
+   SIP offers a discovery capability.  If a user wants to initiate a
+   session with another user, SIP must discover the current host(s) at
+   which the destination user is reachable.  This discovery process is
+   frequently accomplished by SIP network elements such as proxy servers
+   and redirect servers which are responsible for receiving a request,
+   determining where to send it based on knowledge of the location of
+   the user, and then sending it there.  To do this, SIP network
+   elements consult an abstract service known as a location service,
+   which provides address bindings for a particular domain.  These
+   address bindings map an incoming SIP or SIPS URI, sip:bob@biloxi.com,
+   for example, to one or more URIs that are somehow "closer" to the
+   desired user, sip:bob@engineering.biloxi.com, for example.
+   Ultimately, a proxy will consult a location service that maps a
+   received URI to the user agent(s) at which the desired recipient is
+   currently residing.
+
+   Registration creates bindings in a location service for a particular
+   domain that associates an address-of-record URI with one or more
+   contact addresses.  Thus, when a proxy for that domain receives a
+   request whose Request-URI matches the address-of-record, the proxy
+   will forward the request to the contact addresses registered to that
+   address-of-record.  Generally, it only makes sense to register an
+   address-of-record at a domain's location service when requests for
+   that address-of-record would be routed to that domain.  In most
+   cases, this means that the domain of the registration will need to
+   match the domain in the URI of the address-of-record.
+
+   There are many ways by which the contents of the location service can
+   be established.  One way is administratively.  In the above example,
+   Bob is known to be a member of the engineering department through
+   access to a corporate database.  However, SIP provides a mechanism
+   for a UA to create a binding explicitly.  This mechanism is known as
+   registration.
+
+   Registration entails sending a REGISTER request to a special type of
+   UAS known as a registrar.  A registrar acts as the front end to the
+   location service for a domain, reading and writing mappings based on
+   the contents of REGISTER requests.  This location service is then
+   typically consulted by a proxy server that is responsible for routing
+   requests for that domain.
+
+   An illustration of the overall registration process is given in
+   Figure 2.  Note that the registrar and proxy server are logical roles
+   that can be played by a single device in a network; for purposes of
+
+
+
+Rosenberg, et. al.          Standards Track                    [Page 56]
+
+RFC 3261            SIP: Session Initiation Protocol           June 2002
+
+
+   clarity the two are separated in this illustration.  Also note that
+   UAs may send requests through a proxy server in order to reach a
+   registrar if the two are separate elements.
+
+   SIP does not mandate a particular mechanism for implementing the
+   location service.  The only requirement is that a registrar for some
+   domain MUST be able to read and write data to the location service,
+   and a proxy or a redirect server for that domain MUST be capable of
+   reading that same data.  A registrar MAY be co-located with a
+   particular SIP proxy server for the same domain.
+
+10.2 Constructing the REGISTER Request
+
+   REGISTER requests add, remove, and query bindings.  A REGISTER
+   request can add a new binding between an address-of-record and one or
+   more contact addresses.  Registration on behalf of a particular
+   address-of-record can be performed by a suitably authorized third
+   party.  A client can also remove previous bindings or query to
+   determine which bindings are currently in place for an address-of-
+   record.
+
+   Except as noted, the construction of the REGISTER request and the
+   behavior of clients sending a REGISTER request is identical to the
+   general UAC behavior described in Section 8.1 and Section 17.1.
+
+   A REGISTER request does not establish a dialog.  A UAC MAY include a
+   Route header field in a REGISTER request based on a pre-existing
+   route set as described in Section 8.1.  The Record-Route header field
+   has no meaning in REGISTER requests or responses, and MUST be ignored
+   if present.  In particular, the UAC MUST NOT create a new route set
+   based on the presence or absence of a Record-Route header field in
+   any response to a REGISTER request.
+
+   The following header fields, except Contact, MUST be included in a
+   REGISTER request.  A Contact header field MAY be included:
+
+      Request-URI: The Request-URI names the domain of the location
+           service for which the registration is meant (for example,
+           "sip:chicago.com").  The "userinfo" and "@" components of the
+           SIP URI MUST NOT be present.
+
+      To: The To header field contains the address of record whose
+           registration is to be created, queried, or modified.  The To
+           header field and the Request-URI field typically differ, as
+           the former contains a user name.  This address-of-record MUST
+           be a SIP URI or SIPS URI.
+
+
+
+
+
+Rosenberg, et. al.          Standards Track                    [Page 57]
+
+RFC 3261            SIP: Session Initiation Protocol           June 2002
+
+
+      From: The From header field contains the address-of-record of the
+           person responsible for the registration.  The value is the
+           same as the To header field unless the request is a third-
+           party registration.
+
+      Call-ID: All registrations from a UAC SHOULD use the same Call-ID
+           header field value for registrations sent to a particular
+           registrar.
+
+           If the same client were to use different Call-ID values, a
+           registrar could not detect whether a delayed REGISTER request
+           might have arrived out of order.
+
+      CSeq: The CSeq value guarantees proper ordering of REGISTER
+           requests.  A UA MUST increment the CSeq value by one for each
+           REGISTER request with the same Call-ID.
+
+      Contact: REGISTER requests MAY contain a Contact header field with
+           zero or more values containing address bindings.
+
+   UAs MUST NOT send a new registration (that is, containing new Contact
+   header field values, as opposed to a retransmission) until they have
+   received a final response from the registrar for the previous one or
+   the previous REGISTER request has timed out.
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+Rosenberg, et. al.          Standards Track                    [Page 58]
+
+RFC 3261            SIP: Session Initiation Protocol           June 2002
+
+
+                                                 bob
+                                               +----+
+                                               | UA |
+                                               |    |
+                                               +----+
+                                                  |
+                                                  |3)INVITE
+                                                  |   carol@chicago.com
+         chicago.com        +--------+            V
+         +---------+ 2)Store|Location|4)Query +-----+
+         |Registrar|=======>| Service|<=======|Proxy|sip.chicago.com
+         +---------+        +--------+=======>+-----+
+               A                      5)Resp      |
+               |                                  |
+               |                                  |
+     1)REGISTER|                                  |
+               |                                  |
+            +----+                                |
+            | UA |<-------------------------------+
+   cube2214a|    |                            6)INVITE
+            +----+                    carol@cube2214a.chicago.com
+             carol
+
+                      Figure 2: REGISTER example
+
+      The following Contact header parameters have a special meaning in
+           REGISTER requests:
+
+      action: The "action" parameter from RFC 2543 has been deprecated.
+           UACs SHOULD NOT use the "action" parameter.
+
+      expires: The "expires" parameter indicates how long the UA would
+           like the binding to be valid.  The value is a number
+           indicating seconds.  If this parameter is not provided, the
+           value of the Expires header field is used instead.
+           Implementations MAY treat values larger than 2**32-1
+           (4294967295 seconds or 136 years) as equivalent to 2**32-1.
+           Malformed values SHOULD be treated as equivalent to 3600.
+
+10.2.1 Adding Bindings
+
+   The REGISTER request sent to a registrar includes the contact
+   address(es) to which SIP requests for the address-of-record should be
+   forwarded.  The address-of-record is included in the To header field
+   of the REGISTER request.
+
+
+
+
+
+
+Rosenberg, et. al.          Standards Track                    [Page 59]
+
+RFC 3261            SIP: Session Initiation Protocol           June 2002
+
+
+   The Contact header field values of the request typically consist of
+   SIP or SIPS URIs that identify particular SIP endpoints (for example,
+   "sip:carol@cube2214a.chicago.com"), but they MAY use any URI scheme.
+   A SIP UA can choose to register telephone numbers (with the tel URL,
+   RFC 2806 [9]) or email addresses (with a mailto URL, RFC 2368 [32])
+   as Contacts for an address-of-record, for example.
+
+   For example, Carol, with address-of-record "sip:carol@chicago.com",
+   would register with the SIP registrar of the domain chicago.com.  Her
+   registrations would then be used by a proxy server in the chicago.com
+   domain to route requests for Carol's address-of-record to her SIP
+   endpoint.
+
+   Once a client has established bindings at a registrar, it MAY send
+   subsequent registrations containing new bindings or modifications to
+   existing bindings as necessary.  The 2xx response to the REGISTER
+   request will contain, in a Contact header field, a complete list of
+   bindings that have been registered for this address-of-record at this
+   registrar.
+
+   If the address-of-record in the To header field of a REGISTER request
+   is a SIPS URI, then any Contact header field values in the request
+   SHOULD also be SIPS URIs.  Clients should only register non-SIPS URIs
+   under a SIPS address-of-record when the security of the resource
+   represented by the contact address is guaranteed by other means.
+   This may be applicable to URIs that invoke protocols other than SIP,
+   or SIP devices secured by protocols other than TLS.
+
+   Registrations do not need to update all bindings.  Typically, a UA
+   only updates its own contact addresses.
+
+10.2.1.1 Setting the Expiration Interval of Contact Addresses
+
+   When a client sends a REGISTER request, it MAY suggest an expiration
+   interval that indicates how long the client would like the
+   registration to be valid.  (As described in Section 10.3, the
+   registrar selects the actual time interval based on its local
+   policy.)
+
+   There are two ways in which a client can suggest an expiration
+   interval for a binding: through an Expires header field or an
+   "expires" Contact header parameter.  The latter allows expiration
+   intervals to be suggested on a per-binding basis when more than one
+   binding is given in a single REGISTER request, whereas the former
+   suggests an expiration interval for all Contact header field values
+   that do not contain the "expires" parameter.
+
+
+
+
+
+Rosenberg, et. al.          Standards Track                    [Page 60]
+
+RFC 3261            SIP: Session Initiation Protocol           June 2002
+
+
+   If neither mechanism for expressing a suggested expiration time is
+   present in a REGISTER, the client is indicating its desire for the
+   server to choose.
+
+10.2.1.2 Preferences among Contact Addresses
+
+   If more than one Contact is sent in a REGISTER request, the
+   registering UA intends to associate all of the URIs in these Contact
+   header field values with the address-of-record present in the To
+   field.  This list can be prioritized with the "q" parameter in the
+   Contact header field.  The "q" parameter indicates a relative
+   preference for the particular Contact header field value compared to
+   other bindings for this address-of-record.  Section 16.6 describes
+   how a proxy server uses this preference indication.
+
+10.2.2 Removing Bindings
+
+   Registrations are soft state and expire unless refreshed, but can
+   also be explicitly removed.  A client can attempt to influence the
+   expiration interval selected by the registrar as described in Section
+   10.2.1.  A UA requests the immediate removal of a binding by
+   specifying an expiration interval of "0" for that contact address in
+   a REGISTER request.  UAs SHOULD support this mechanism so that
+   bindings can be removed before their expiration interval has passed.
+
+   The REGISTER-specific Contact header field value of "*" applies to
+   all registrations, but it MUST NOT be used unless the Expires header
+   field is present with a value of "0".
+
+      Use of the "*" Contact header field value allows a registering UA
+      to remove all bindings associated with an address-of-record
+      without knowing their precise values.
+
+10.2.3 Fetching Bindings
+
+   A success response to any REGISTER request contains the complete list
+   of existing bindings, regardless of whether the request contained a
+   Contact header field.  If no Contact header field is present in a
+   REGISTER request, the list of bindings is left unchanged.
+
+10.2.4 Refreshing Bindings
+
+   Each UA is responsible for refreshing the bindings that it has
+   previously established.  A UA SHOULD NOT refresh bindings set up by
+   other UAs.
+
+
+
+
+
+
+Rosenberg, et. al.          Standards Track                    [Page 61]
+
+RFC 3261            SIP: Session Initiation Protocol           June 2002
+
+
+   The 200 (OK) response from the registrar contains a list of Contact
+   fields enumerating all current bindings.  The UA compares each
+   contact address to see if it created the contact address, using
+   comparison rules in Section 19.1.4.  If so, it updates the expiration
+   time interval according to the expires parameter or, if absent, the
+   Expires field value.  The UA then issues a REGISTER request for each
+   of its bindings before the expiration interval has elapsed.  It MAY
+   combine several updates into one REGISTER request.
+
+   A UA SHOULD use the same Call-ID for all registrations during a
+   single boot cycle.  Registration refreshes SHOULD be sent to the same
+   network address as the original registration, unless redirected.
+
+10.2.5 Setting the Internal Clock
+
+   If the response for a REGISTER request contains a Date header field,
+   the client MAY use this header field to learn the current time in
+   order to set any internal clocks.
+
+10.2.6 Discovering a Registrar
+
+   UAs can use three ways to determine the address to which to send
+   registrations:  by configuration, using the address-of-record, and
+   multicast.  A UA can be configured, in ways beyond the scope of this
+   specification, with a registrar address.  If there is no configured
+   registrar address, the UA SHOULD use the host part of the address-
+   of-record as the Request-URI and address the request there, using the
+   normal SIP server location mechanisms [4].  For example, the UA for
+   the user "sip:carol@chicago.com" addresses the REGISTER request to
+   "sip:chicago.com".
+
+   Finally, a UA can be configured to use multicast.  Multicast
+   registrations are addressed to the well-known "all SIP servers"
+   multicast address "sip.mcast.net" (224.0.1.75 for IPv4).  No well-
+   known IPv6 multicast address has been allocated; such an allocation
+   will be documented separately when needed.  SIP UAs MAY listen to
+   that address and use it to become aware of the location of other
+   local users (see [33]); however, they do not respond to the request.
+
+      Multicast registration may be inappropriate in some environments,
+      for example, if multiple businesses share the same local area
+      network.
+
+10.2.7 Transmitting a Request
+
+   Once the REGISTER method has been constructed, and the destination of
+   the message identified, UACs follow the procedures described in
+   Section 8.1.2 to hand off the REGISTER to the transaction layer.
+
+
+
+Rosenberg, et. al.          Standards Track                    [Page 62]
+
+RFC 3261            SIP: Session Initiation Protocol           June 2002
+
+
+   If the transaction layer returns a timeout error because the REGISTER
+   yielded no response, the UAC SHOULD NOT immediately re-attempt a
+   registration to the same registrar.
+
+      An immediate re-attempt is likely to also timeout.  Waiting some
+      reasonable time interval for the conditions causing the timeout to
+      be corrected reduces unnecessary load on the network.  No specific
+      interval is mandated.
+
+10.2.8 Error Responses
+
+   If a UA receives a 423 (Interval Too Brief) response, it MAY retry
+   the registration after making the expiration interval of all contact
+   addresses in the REGISTER request equal to or greater than the
+   expiration interval within the Min-Expires header field of the 423
+   (Interval Too Brief) response.
+
+10.3 Processing REGISTER Requests
+
+   A registrar is a UAS that responds to REGISTER requests and maintains
+   a list of bindings that are accessible to proxy servers and redirect
+   servers within its administrative domain.  A registrar handles
+   requests according to Section 8.2 and Section 17.2, but it accepts
+   only REGISTER requests.  A registrar MUST not generate 6xx responses.
+
+   A registrar MAY redirect REGISTER requests as appropriate.  One
+   common usage would be for a registrar listening on a multicast
+   interface to redirect multicast REGISTER requests to its own unicast
+   interface with a 302 (Moved Temporarily) response.
+
+   Registrars MUST ignore the Record-Route header field if it is
+   included in a REGISTER request.  Registrars MUST NOT include a
+   Record-Route header field in any response to a REGISTER request.
+
+      A registrar might receive a request that traversed a proxy which
+      treats REGISTER as an unknown request and which added a Record-
+      Route header field value.
+
+   A registrar has to know (for example, through configuration) the set
+   of domain(s) for which it maintains bindings.  REGISTER requests MUST
+   be processed by a registrar in the order that they are received.
+   REGISTER requests MUST also be processed atomically, meaning that a
+   particular REGISTER request is either processed completely or not at
+   all.  Each REGISTER message MUST be processed independently of any
+   other registration or binding changes.
+
+
+
+
+
+
+Rosenberg, et. al.          Standards Track                    [Page 63]
+
+RFC 3261            SIP: Session Initiation Protocol           June 2002
+
+
+   When receiving a REGISTER request, a registrar follows these steps:
+
+      1. The registrar inspects the Request-URI to determine whether it
+         has access to bindings for the domain identified in the
+         Request-URI.  If not, and if the server also acts as a proxy
+         server, the server SHOULD forward the request to the addressed
+         domain, following the general behavior for proxying messages
+         described in Section 16.
+
+      2. To guarantee that the registrar supports any necessary
+         extensions, the registrar MUST process the Require header field
+         values as described for UASs in Section 8.2.2.
+
+      3. A registrar SHOULD authenticate the UAC.  Mechanisms for the
+         authentication of SIP user agents are described in Section 22.
+         Registration behavior in no way overrides the generic
+         authentication framework for SIP.  If no authentication
+         mechanism is available, the registrar MAY take the From address
+         as the asserted identity of the originator of the request.
+
+      4. The registrar SHOULD determine if the authenticated user is
+         authorized to modify registrations for this address-of-record.
+         For example, a registrar might consult an authorization
+         database that maps user names to a list of addresses-of-record
+         for which that user has authorization to modify bindings.  If
+         the authenticated user is not authorized to modify bindings,
+         the registrar MUST return a 403 (Forbidden) and skip the
+         remaining steps.
+
+         In architectures that support third-party registration, one
+         entity may be responsible for updating the registrations
+         associated with multiple addresses-of-record.
+
+      5. The registrar extracts the address-of-record from the To header
+         field of the request.  If the address-of-record is not valid
+         for the domain in the Request-URI, the registrar MUST send a
+         404 (Not Found) response and skip the remaining steps.  The URI
+         MUST then be converted to a canonical form.  To do that, all
+         URI parameters MUST be removed (including the user-param), and
+         any escaped characters MUST be converted to their unescaped
+         form.  The result serves as an index into the list of bindings.
+
+
+
+
+
+
+
+
+
+
+Rosenberg, et. al.          Standards Track                    [Page 64]
+
+RFC 3261            SIP: Session Initiation Protocol           June 2002
+
+
+      6. The registrar checks whether the request contains the Contact
+         header field.  If not, it skips to the last step.  If the
+         Contact header field is present, the registrar checks if there
+         is one Contact field value that contains the special value "*"
+         and an Expires field.  If the request has additional Contact
+         fields or an expiration time other than zero, the request is
+         invalid, and the server MUST return a 400 (Invalid Request) and
+         skip the remaining steps.  If not, the registrar checks whether
+         the Call-ID agrees with the value stored for each binding.  If
+         not, it MUST remove the binding.  If it does agree, it MUST
+         remove the binding only if the CSeq in the request is higher
+         than the value stored for that binding.  Otherwise, the update
+         MUST be aborted and the request fails.
+
+      7. The registrar now processes each contact address in the Contact
+         header field in turn.  For each address, it determines the
+         expiration interval as follows:
+
+         -  If the field value has an "expires" parameter, that value
+            MUST be taken as the requested expiration.
+
+         -  If there is no such parameter, but the request has an
+            Expires header field, that value MUST be taken as the
+            requested expiration.
+
+         -  If there is neither, a locally-configured default value MUST
+            be taken as the requested expiration.
+
+         The registrar MAY choose an expiration less than the requested
+         expiration interval.  If and only if the requested expiration
+         interval is greater than zero AND smaller than one hour AND
+         less than a registrar-configured minimum, the registrar MAY
+         reject the registration with a response of 423 (Interval Too
+         Brief).  This response MUST contain a Min-Expires header field
+         that states the minimum expiration interval the registrar is
+         willing to honor.  It then skips the remaining steps.
+
+         Allowing the registrar to set the registration interval
+         protects it against excessively frequent registration refreshes
+         while limiting the state that it needs to maintain and
+         decreasing the likelihood of registrations going stale.  The
+         expiration interval of a registration is frequently used in the
+         creation of services.  An example is a follow-me service, where
+         the user may only be available at a terminal for a brief
+         period.  Therefore, registrars should accept brief
+         registrations; a request should only be rejected if the
+         interval is so short that the refreshes would degrade registrar
+         performance.
+
+
+
+Rosenberg, et. al.          Standards Track                    [Page 65]
+
+RFC 3261            SIP: Session Initiation Protocol           June 2002
+
+
+         For each address, the registrar then searches the list of
+         current bindings using the URI comparison rules.  If the
+         binding does not exist, it is tentatively added.  If the
+         binding does exist, the registrar checks the Call-ID value.  If
+         the Call-ID value in the existing binding differs from the
+         Call-ID value in the request, the binding MUST be removed if
+         the expiration time is zero and updated otherwise.  If they are
+         the same, the registrar compares the CSeq value.  If the value
+         is higher than that of the existing binding, it MUST update or
+         remove the binding as above.  If not, the update MUST be
+         aborted and the request fails.
+
+         This algorithm ensures that out-of-order requests from the same
+         UA are ignored.
+
+         Each binding record records the Call-ID and CSeq values from
+         the request.
+
+         The binding updates MUST be committed (that is, made visible to
+         the proxy or redirect server) if and only if all binding
+         updates and additions succeed.  If any one of them fails (for
+         example, because the back-end database commit failed), the
+         request MUST fail with a 500 (Server Error) response and all
+         tentative binding updates MUST be removed.
+
+      8. The registrar returns a 200 (OK) response.  The response MUST
+         contain Contact header field values enumerating all current
+         bindings.  Each Contact value MUST feature an "expires"
+         parameter indicating its expiration interval chosen by the
+         registrar.  The response SHOULD include a Date header field.
+
+11 Querying for Capabilities
+
+   The SIP method OPTIONS allows a UA to query another UA or a proxy
+   server as to its capabilities.  This allows a client to discover
+   information about the supported methods, content types, extensions,
+   codecs, etc. without "ringing" the other party.  For example, before
+   a client inserts a Require header field into an INVITE listing an
+   option that it is not certain the destination UAS supports, the
+   client can query the destination UAS with an OPTIONS to see if this
+   option is returned in a Supported header field.  All UAs MUST support
+   the OPTIONS method.
+
+   The target of the OPTIONS request is identified by the Request-URI,
+   which could identify another UA or a SIP server.  If the OPTIONS is
+   addressed to a proxy server, the Request-URI is set without a user
+   part, similar to the way a Request-URI is set for a REGISTER request.
+
+
+
+
+Rosenberg, et. al.          Standards Track                    [Page 66]
+
+RFC 3261            SIP: Session Initiation Protocol           June 2002
+
+
+   Alternatively, a server receiving an OPTIONS request with a Max-
+   Forwards header field value of 0 MAY respond to the request
+   regardless of the Request-URI.
+
+      This behavior is common with HTTP/1.1.  This behavior can be used
+      as a "traceroute" functionality to check the capabilities of
+      individual hop servers by sending a series of OPTIONS requests
+      with incremented Max-Forwards values.
+
+   As is the case for general UA behavior, the transaction layer can
+   return a timeout error if the OPTIONS yields no response.  This may
+   indicate that the target is unreachable and hence unavailable.
+
+   An OPTIONS request MAY be sent as part of an established dialog to
+   query the peer on capabilities that may be utilized later in the
+   dialog.
+
+11.1 Construction of OPTIONS Request
+
+   An OPTIONS request is constructed using the standard rules for a SIP
+   request as discussed in Section 8.1.1.
+
+   A Contact header field MAY be present in an OPTIONS.
+
+   An Accept header field SHOULD be included to indicate the type of
+   message body the UAC wishes to receive in the response.  Typically,
+   this is set to a format that is used to describe the media
+   capabilities of a UA, such as SDP (application/sdp).
+
+   The response to an OPTIONS request is assumed to be scoped to the
+   Request-URI in the original request.  However, only when an OPTIONS
+   is sent as part of an established dialog is it guaranteed that future
+   requests will be received by the server that generated the OPTIONS
+   response.
+
+   Example OPTIONS request:
+
+      OPTIONS sip:carol@chicago.com SIP/2.0
+      Via: SIP/2.0/UDP pc33.atlanta.com;branch=z9hG4bKhjhs8ass877
+      Max-Forwards: 70
+      To: <sip:carol@chicago.com>
+      From: Alice <sip:alice@atlanta.com>;tag=1928301774
+      Call-ID: a84b4c76e66710
+      CSeq: 63104 OPTIONS
+      Contact: <sip:alice@pc33.atlanta.com>
+      Accept: application/sdp
+      Content-Length: 0
+
+
+
+
+Rosenberg, et. al.          Standards Track                    [Page 67]
+
+RFC 3261            SIP: Session Initiation Protocol           June 2002
+
+
+11.2 Processing of OPTIONS Request
+
+   The response to an OPTIONS is constructed using the standard rules
+   for a SIP response as discussed in Section 8.2.6.  The response code
+   chosen MUST be the same that would have been chosen had the request
+   been an INVITE.  That is, a 200 (OK) would be returned if the UAS is
+   ready to accept a call, a 486 (Busy Here) would be returned if the
+   UAS is busy, etc.  This allows an OPTIONS request to be used to
+   determine the basic state of a UAS, which can be an indication of
+   whether the UAS will accept an INVITE request.
+
+   An OPTIONS request received within a dialog generates a 200 (OK)
+   response that is identical to one constructed outside a dialog and
+   does not have any impact on the dialog.
+
+   This use of OPTIONS has limitations due to the differences in proxy
+   handling of OPTIONS and INVITE requests.  While a forked INVITE can
+   result in multiple 200 (OK) responses being returned, a forked
+   OPTIONS will only result in a single 200 (OK) response, since it is
+   treated by proxies using the non-INVITE handling.  See Section 16.7
+   for the normative details.
+
+   If the response to an OPTIONS is generated by a proxy server, the
+   proxy returns a 200 (OK), listing the capabilities of the server.
+   The response does not contain a message body.
+
+   Allow, Accept, Accept-Encoding, Accept-Language, and Supported header
+   fields SHOULD be present in a 200 (OK) response to an OPTIONS
+   request.  If the response is generated by a proxy, the Allow header
+   field SHOULD be omitted as it is ambiguous since a proxy is method
+   agnostic.  Contact header fields MAY be present in a 200 (OK)
+   response and have the same semantics as in a 3xx response.  That is,
+   they may list a set of alternative names and methods of reaching the
+   user.  A Warning header field MAY be present.
+
+   A message body MAY be sent, the type of which is determined by the
+   Accept header field in the OPTIONS request (application/sdp is the
+   default if the Accept header field is not present).  If the types
+   include one that can describe media capabilities, the UAS SHOULD
+   include a body in the response for that purpose.  Details on the
+   construction of such a body in the case of application/sdp are
+   described in [13].
+
+
+
+
+
+
+
+
+
+Rosenberg, et. al.          Standards Track                    [Page 68]
+
+RFC 3261            SIP: Session Initiation Protocol           June 2002
+
+
+   Example OPTIONS response generated by a UAS (corresponding to the
+   request in Section 11.1):
+
+      SIP/2.0 200 OK
+      Via: SIP/2.0/UDP pc33.atlanta.com;branch=z9hG4bKhjhs8ass877
+       ;received=192.0.2.4
+      To: <sip:carol@chicago.com>;tag=93810874
+      From: Alice <sip:alice@atlanta.com>;tag=1928301774
+      Call-ID: a84b4c76e66710
+      CSeq: 63104 OPTIONS
+      Contact: <sip:carol@chicago.com>
+      Contact: <mailto:carol@chicago.com>
+      Allow: INVITE, ACK, CANCEL, OPTIONS, BYE
+      Accept: application/sdp
+      Accept-Encoding: gzip
+      Accept-Language: en
+      Supported: foo
+      Content-Type: application/sdp
+      Content-Length: 274
+
+      (SDP not shown)
+
+12 Dialogs
+
+   A key concept for a user agent is that of a dialog.  A dialog
+   represents a peer-to-peer SIP relationship between two user agents
+   that persists for some time.  The dialog facilitates sequencing of
+   messages between the user agents and proper routing of requests
+   between both of them.  The dialog represents a context in which to
+   interpret SIP messages.  Section 8 discussed method independent UA
+   processing for requests and responses outside of a dialog.  This
+   section discusses how those requests and responses are used to
+   construct a dialog, and then how subsequent requests and responses
+   are sent within a dialog.
+
+   A dialog is identified at each UA with a dialog ID, which consists of
+   a Call-ID value, a local tag and a remote tag.  The dialog ID at each
+   UA involved in the dialog is not the same.  Specifically, the local
+   tag at one UA is identical to the remote tag at the peer UA.  The
+   tags are opaque tokens that facilitate the generation of unique
+   dialog IDs.
+
+   A dialog ID is also associated with all responses and with any
+   request that contains a tag in the To field.  The rules for computing
+   the dialog ID of a message depend on whether the SIP element is a UAC
+   or UAS.  For a UAC, the Call-ID value of the dialog ID is set to the
+   Call-ID of the message, the remote tag is set to the tag in the To
+   field of the message, and the local tag is set to the tag in the From
+
+
+
+Rosenberg, et. al.          Standards Track                    [Page 69]
+
+RFC 3261            SIP: Session Initiation Protocol           June 2002
+
+
+   field of the message (these rules apply to both requests and
+   responses).  As one would expect for a UAS, the Call-ID value of the
+   dialog ID is set to the Call-ID of the message, the remote tag is set
+   to the tag in the From field of the message, and the local tag is set
+   to the tag in the To field of the message.
+
+   A dialog contains certain pieces of state needed for further message
+   transmissions within the dialog.  This state consists of the dialog
+   ID, a local sequence number (used to order requests from the UA to
+   its peer), a remote sequence number (used to order requests from its
+   peer to the UA), a local URI, a remote URI, remote target, a boolean
+   flag called "secure", and a route set, which is an ordered list of
+   URIs.  The route set is the list of servers that need to be traversed
+   to send a request to the peer.  A dialog can also be in the "early"
+   state, which occurs when it is created with a provisional response,
+   and then transition to the "confirmed" state when a 2xx final
+   response arrives.  For other responses, or if no response arrives at
+   all on that dialog, the early dialog terminates.
+
+12.1 Creation of a Dialog
+
+   Dialogs are created through the generation of non-failure responses
+   to requests with specific methods.  Within this specification, only
+   2xx and 101-199 responses with a To tag, where the request was
+   INVITE, will establish a dialog.  A dialog established by a non-final
+   response to a request is in the "early" state and it is called an
+   early dialog.  Extensions MAY define other means for creating
+   dialogs.  Section 13 gives more details that are specific to the
+   INVITE method.  Here, we describe the process for creation of dialog
+   state that is not dependent on the method.
+
+   UAs MUST assign values to the dialog ID components as described
+   below.
+
+12.1.1 UAS behavior
+
+   When a UAS responds to a request with a response that establishes a
+   dialog (such as a 2xx to INVITE), the UAS MUST copy all Record-Route
+   header field values from the request into the response (including the
+   URIs, URI parameters, and any Record-Route header field parameters,
+   whether they are known or unknown to the UAS) and MUST maintain the
+   order of those values.  The UAS MUST add a Contact header field to
+   the response.  The Contact header field contains an address where the
+   UAS would like to be contacted for subsequent requests in the dialog
+   (which includes the ACK for a 2xx response in the case of an INVITE).
+   Generally, the host portion of this URI is the IP address or FQDN of
+   the host.  The URI provided in the Contact header field MUST be a SIP
+   or SIPS URI.  If the request that initiated the dialog contained a
+
+
+
+Rosenberg, et. al.          Standards Track                    [Page 70]
+
+RFC 3261            SIP: Session Initiation Protocol           June 2002
+
+
+   SIPS URI in the Request-URI or in the top Record-Route header field
+   value, if there was any, or the Contact header field if there was no
+   Record-Route header field, the Contact header field in the response
+   MUST be a SIPS URI.  The URI SHOULD have global scope (that is, the
+   same URI can be used in messages outside this dialog).  The same way,
+   the scope of the URI in the Contact header field of the INVITE is not
+   limited to this dialog either.  It can therefore be used in messages
+   to the UAC even outside this dialog.
+
+   The UAS then constructs the state of the dialog.  This state MUST be
+   maintained for the duration of the dialog.
+
+   If the request arrived over TLS, and the Request-URI contained a SIPS
+   URI, the "secure" flag is set to TRUE.
+
+   The route set MUST be set to the list of URIs in the Record-Route
+   header field from the request, taken in order and preserving all URI
+   parameters.  If no Record-Route header field is present in the
+   request, the route set MUST be set to the empty set.  This route set,
+   even if empty, overrides any pre-existing route set for future
+   requests in this dialog.  The remote target MUST be set to the URI
+   from the Contact header field of the request.
+
+   The remote sequence number MUST be set to the value of the sequence
+   number in the CSeq header field of the request.  The local sequence
+   number MUST be empty.  The call identifier component of the dialog ID
+   MUST be set to the value of the Call-ID in the request.  The local
+   tag component of the dialog ID MUST be set to the tag in the To field
+   in the response to the request (which always includes a tag), and the
+   remote tag component of the dialog ID MUST be set to the tag from the
+   From field in the request.  A UAS MUST be prepared to receive a
+   request without a tag in the From field, in which case the tag is
+   considered to have a value of null.
+
+      This is to maintain backwards compatibility with RFC 2543, which
+      did not mandate From tags.
+
+   The remote URI MUST be set to the URI in the From field, and the
+   local URI MUST be set to the URI in the To field.
+
+12.1.2 UAC Behavior
+
+   When a UAC sends a request that can establish a dialog (such as an
+   INVITE) it MUST provide a SIP or SIPS URI with global scope (i.e.,
+   the same SIP URI can be used in messages outside this dialog) in the
+   Contact header field of the request.  If the request has a Request-
+   URI or a topmost Route header field value with a SIPS URI, the
+   Contact header field MUST contain a SIPS URI.
+
+
+
+Rosenberg, et. al.          Standards Track                    [Page 71]
+
+RFC 3261            SIP: Session Initiation Protocol           June 2002
+
+
+   When a UAC receives a response that establishes a dialog, it
+   constructs the state of the dialog.  This state MUST be maintained
+   for the duration of the dialog.
+
+   If the request was sent over TLS, and the Request-URI contained a
+   SIPS URI, the "secure" flag is set to TRUE.
+
+   The route set MUST be set to the list of URIs in the Record-Route
+   header field from the response, taken in reverse order and preserving
+   all URI parameters.  If no Record-Route header field is present in
+   the response, the route set MUST be set to the empty set.  This route
+   set, even if empty, overrides any pre-existing route set for future
+   requests in this dialog.  The remote target MUST be set to the URI
+   from the Contact header field of the response.
+
+   The local sequence number MUST be set to the value of the sequence
+   number in the CSeq header field of the request.  The remote sequence
+   number MUST be empty (it is established when the remote UA sends a
+   request within the dialog).  The call identifier component of the
+   dialog ID MUST be set to the value of the Call-ID in the request.
+   The local tag component of the dialog ID MUST be set to the tag in
+   the From field in the request, and the remote tag component of the
+   dialog ID MUST be set to the tag in the To field of the response.  A
+   UAC MUST be prepared to receive a response without a tag in the To
+   field, in which case the tag is considered to have a value of null.
+
+      This is to maintain backwards compatibility with RFC 2543, which
+      did not mandate To tags.
+
+   The remote URI MUST be set to the URI in the To field, and the local
+   URI MUST be set to the URI in the From field.
+
+12.2 Requests within a Dialog
+
+   Once a dialog has been established between two UAs, either of them
+   MAY initiate new transactions as needed within the dialog.  The UA
+   sending the request will take the UAC role for the transaction.  The
+   UA receiving the request will take the UAS role.  Note that these may
+   be different roles than the UAs held during the transaction that
+   established the dialog.
+
+   Requests within a dialog MAY contain Record-Route and Contact header
+   fields.  However, these requests do not cause the dialog's route set
+   to be modified, although they may modify the remote target URI.
+   Specifically, requests that are not target refresh requests do not
+   modify the dialog's remote target URI, and requests that are target
+   refresh requests do.  For dialogs that have been established with an
+
+
+
+
+Rosenberg, et. al.          Standards Track                    [Page 72]
+
+RFC 3261            SIP: Session Initiation Protocol           June 2002
+
+
+   INVITE, the only target refresh request defined is re-INVITE (see
+   Section 14).  Other extensions may define different target refresh
+   requests for dialogs established in other ways.
+
+      Note that an ACK is NOT a target refresh request.
+
+   Target refresh requests only update the dialog's remote target URI,
+   and not the route set formed from the Record-Route.  Updating the
+   latter would introduce severe backwards compatibility problems with
+   RFC 2543-compliant systems.
+
+12.2.1 UAC Behavior
+
+12.2.1.1 Generating the Request
+
+   A request within a dialog is constructed by using many of the
+   components of the state stored as part of the dialog.
+
+   The URI in the To field of the request MUST be set to the remote URI
+   from the dialog state.  The tag in the To header field of the request
+   MUST be set to the remote tag of the dialog ID.  The From URI of the
+   request MUST be set to the local URI from the dialog state.  The tag
+   in the From header field of the request MUST be set to the local tag
+   of the dialog ID.  If the value of the remote or local tags is null,
+   the tag parameter MUST be omitted from the To or From header fields,
+   respectively.
+
+      Usage of the URI from the To and From fields in the original
+      request within subsequent requests is done for backwards
+      compatibility with RFC 2543, which used the URI for dialog
+      identification.  In this specification, only the tags are used for
+      dialog identification.  It is expected that mandatory reflection
+      of the original To and From URI in mid-dialog requests will be
+      deprecated in a subsequent revision of this specification.
+
+   The Call-ID of the request MUST be set to the Call-ID of the dialog.
+   Requests within a dialog MUST contain strictly monotonically
+   increasing and contiguous CSeq sequence numbers (increasing-by-one)
+   in each direction (excepting ACK and CANCEL of course, whose numbers
+   equal the requests being acknowledged or cancelled).  Therefore, if
+   the local sequence number is not empty, the value of the local
+   sequence number MUST be incremented by one, and this value MUST be
+   placed into the CSeq header field.  If the local sequence number is
+   empty, an initial value MUST be chosen using the guidelines of
+   Section 8.1.1.5.  The method field in the CSeq header field value
+   MUST match the method of the request.
+
+
+
+
+
+Rosenberg, et. al.          Standards Track                    [Page 73]
+
+RFC 3261            SIP: Session Initiation Protocol           June 2002
+
+
+      With a length of 32 bits, a client could generate, within a single
+      call, one request a second for about 136 years before needing to
+      wrap around.  The initial value of the sequence number is chosen
+      so that subsequent requests within the same call will not wrap
+      around.  A non-zero initial value allows clients to use a time-
+      based initial sequence number.  A client could, for example,
+      choose the 31 most significant bits of a 32-bit second clock as an
+      initial sequence number.
+
+   The UAC uses the remote target and route set to build the Request-URI
+   and Route header field of the request.
+
+   If the route set is empty, the UAC MUST place the remote target URI
+   into the Request-URI.  The UAC MUST NOT add a Route header field to
+   the request.
+
+   If the route set is not empty, and the first URI in the route set
+   contains the lr parameter (see Section 19.1.1), the UAC MUST place
+   the remote target URI into the Request-URI and MUST include a Route
+   header field containing the route set values in order, including all
+   parameters.
+
+   If the route set is not empty, and its first URI does not contain the
+   lr parameter, the UAC MUST place the first URI from the route set
+   into the Request-URI, stripping any parameters that are not allowed
+   in a Request-URI.  The UAC MUST add a Route header field containing
+   the remainder of the route set values in order, including all
+   parameters.  The UAC MUST then place the remote target URI into the
+   Route header field as the last value.
+
+   For example, if the remote target is sip:user@remoteua and the route
+   set contains:
+
+      <sip:proxy1>,<sip:proxy2>,<sip:proxy3;lr>,<sip:proxy4>
+
+   The request will be formed with the following Request-URI and Route
+   header field:
+
+   METHOD sip:proxy1
+   Route: <sip:proxy2>,<sip:proxy3;lr>,<sip:proxy4>,<sip:user@remoteua>
+
+      If the first URI of the route set does not contain the lr
+      parameter, the proxy indicated does not understand the routing
+      mechanisms described in this document and will act as specified in
+      RFC 2543, replacing the Request-URI with the first Route header
+      field value it receives while forwarding the message.  Placing the
+      Request-URI at the end of the Route header field preserves the
+
+
+
+
+Rosenberg, et. al.          Standards Track                    [Page 74]
+
+RFC 3261            SIP: Session Initiation Protocol           June 2002
+
+
+      information in that Request-URI across the strict router (it will
+      be returned to the Request-URI when the request reaches a loose-
+      router).
+
+   A UAC SHOULD include a Contact header field in any target refresh
+   requests within a dialog, and unless there is a need to change it,
+   the URI SHOULD be the same as used in previous requests within the
+   dialog.  If the "secure" flag is true, that URI MUST be a SIPS URI.
+   As discussed in Section 12.2.2, a Contact header field in a target
+   refresh request updates the remote target URI.  This allows a UA to
+   provide a new contact address, should its address change during the
+   duration of the dialog.
+
+   However, requests that are not target refresh requests do not affect
+   the remote target URI for the dialog.
+
+   The rest of the request is formed as described in Section 8.1.1.
+
+   Once the request has been constructed, the address of the server is
+   computed and the request is sent, using the same procedures for
+   requests outside of a dialog (Section 8.1.2).
+
+      The procedures in Section 8.1.2 will normally result in the
+      request being sent to the address indicated by the topmost Route
+      header field value or the Request-URI if no Route header field is
+      present.  Subject to certain restrictions, they allow the request
+      to be sent to an alternate address (such as a default outbound
+      proxy not represented in the route set).
+
+12.2.1.2 Processing the Responses
+
+   The UAC will receive responses to the request from the transaction
+   layer.  If the client transaction returns a timeout, this is treated
+   as a 408 (Request Timeout) response.
+
+   The behavior of a UAC that receives a 3xx response for a request sent
+   within a dialog is the same as if the request had been sent outside a
+   dialog.  This behavior is described in Section 8.1.3.4.
+
+      Note, however, that when the UAC tries alternative locations, it
+      still uses the route set for the dialog to build the Route header
+      of the request.
+
+   When a UAC receives a 2xx response to a target refresh request, it
+   MUST replace the dialog's remote target URI with the URI from the
+   Contact header field in that response, if present.
+
+
+
+
+
+Rosenberg, et. al.          Standards Track                    [Page 75]
+
+RFC 3261            SIP: Session Initiation Protocol           June 2002
+
+
+   If the response for a request within a dialog is a 481
+   (Call/Transaction Does Not Exist) or a 408 (Request Timeout), the UAC
+   SHOULD terminate the dialog.  A UAC SHOULD also terminate a dialog if
+   no response at all is received for the request (the client
+   transaction would inform the TU about the timeout.)
+
+      For INVITE initiated dialogs, terminating the dialog consists of
+      sending a BYE.
+
+12.2.2 UAS Behavior
+
+   Requests sent within a dialog, as any other requests, are atomic.  If
+   a particular request is accepted by the UAS, all the state changes
+   associated with it are performed.  If the request is rejected, none
+   of the state changes are performed.
+
+      Note that some requests, such as INVITEs, affect several pieces of
+      state.
+
+   The UAS will receive the request from the transaction layer.  If the
+   request has a tag in the To header field, the UAS core computes the
+   dialog identifier corresponding to the request and compares it with
+   existing dialogs.  If there is a match, this is a mid-dialog request.
+   In that case, the UAS first applies the same processing rules for
+   requests outside of a dialog, discussed in Section 8.2.
+
+   If the request has a tag in the To header field, but the dialog
+   identifier does not match any existing dialogs, the UAS may have
+   crashed and restarted, or it may have received a request for a
+   different (possibly failed) UAS (the UASs can construct the To tags
+   so that a UAS can identify that the tag was for a UAS for which it is
+   providing recovery).  Another possibility is that the incoming
+   request has been simply misrouted.  Based on the To tag, the UAS MAY
+   either accept or reject the request.  Accepting the request for
+   acceptable To tags provides robustness, so that dialogs can persist
+   even through crashes.  UAs wishing to support this capability must
+   take into consideration some issues such as choosing monotonically
+   increasing CSeq sequence numbers even across reboots, reconstructing
+   the route set, and accepting out-of-range RTP timestamps and sequence
+   numbers.
+
+   If the UAS wishes to reject the request because it does not wish to
+   recreate the dialog, it MUST respond to the request with a 481
+   (Call/Transaction Does Not Exist) status code and pass that to the
+   server transaction.
+
+
+
+
+
+
+Rosenberg, et. al.          Standards Track                    [Page 76]
+
+RFC 3261            SIP: Session Initiation Protocol           June 2002
+
+
+   Requests that do not change in any way the state of a dialog may be
+   received within a dialog (for example, an OPTIONS request).  They are
+   processed as if they had been received outside the dialog.
+
+   If the remote sequence number is empty, it MUST be set to the value
+   of the sequence number in the CSeq header field value in the request.
+   If the remote sequence number was not empty, but the sequence number
+   of the request is lower than the remote sequence number, the request
+   is out of order and MUST be rejected with a 500 (Server Internal
+   Error) response.  If the remote sequence number was not empty, and
+   the sequence number of the request is greater than the remote
+   sequence number, the request is in order.  It is possible for the
+   CSeq sequence number to be higher than the remote sequence number by
+   more than one.  This is not an error condition, and a UAS SHOULD be
+   prepared to receive and process requests with CSeq values more than
+   one higher than the previous received request.  The UAS MUST then set
+   the remote sequence number to the value of the sequence number in the
+   CSeq header field value in the request.
+
+      If a proxy challenges a request generated by the UAC, the UAC has
+      to resubmit the request with credentials.  The resubmitted request
+      will have a new CSeq number.  The UAS will never see the first
+      request, and thus, it will notice a gap in the CSeq number space.
+      Such a gap does not represent any error condition.
+
+   When a UAS receives a target refresh request, it MUST replace the
+   dialog's remote target URI with the URI from the Contact header field
+   in that request, if present.
+
+12.3 Termination of a Dialog
+
+   Independent of the method, if a request outside of a dialog generates
+   a non-2xx final response, any early dialogs created through
+   provisional responses to that request are terminated.  The mechanism
+   for terminating confirmed dialogs is method specific.  In this
+   specification, the BYE method terminates a session and the dialog
+   associated with it.  See Section 15 for details.
+
+13 Initiating a Session
+
+13.1 Overview
+
+   When a user agent client desires to initiate a session (for example,
+   audio, video, or a game), it formulates an INVITE request.  The
+   INVITE request asks a server to establish a session.  This request
+   may be forwarded by proxies, eventually arriving at one or more UAS
+   that can potentially accept the invitation.  These UASs will
+   frequently need to query the user about whether to accept the
+
+
+
+Rosenberg, et. al.          Standards Track                    [Page 77]
+
+RFC 3261            SIP: Session Initiation Protocol           June 2002
+
+
+   invitation.  After some time, those UASs can accept the invitation
+   (meaning the session is to be established) by sending a 2xx response.
+   If the invitation is not accepted, a 3xx, 4xx, 5xx or 6xx response is
+   sent, depending on the reason for the rejection.  Before sending a
+   final response, the UAS can also send provisional responses (1xx) to
+   advise the UAC of progress in contacting the called user.
+
+   After possibly receiving one or more provisional responses, the UAC
+   will get one or more 2xx responses or one non-2xx final response.
+   Because of the protracted amount of time it can take to receive final
+   responses to INVITE, the reliability mechanisms for INVITE
+   transactions differ from those of other requests (like OPTIONS).
+   Once it receives a final response, the UAC needs to send an ACK for
+   every final response it receives.  The procedure for sending this ACK
+   depends on the type of response.  For final responses between 300 and
+   699, the ACK processing is done in the transaction layer and follows
+   one set of rules (See Section 17).  For 2xx responses, the ACK is
+   generated by the UAC core.
+
+   A 2xx response to an INVITE establishes a session, and it also
+   creates a dialog between the UA that issued the INVITE and the UA
+   that generated the 2xx response.  Therefore, when multiple 2xx
+   responses are received from different remote UAs (because the INVITE
+   forked), each 2xx establishes a different dialog.  All these dialogs
+   are part of the same call.
+
+   This section provides details on the establishment of a session using
+   INVITE.  A UA that supports INVITE MUST also support ACK, CANCEL and
+   BYE.
+
+13.2 UAC Processing
+
+13.2.1 Creating the Initial INVITE
+
+   Since the initial INVITE represents a request outside of a dialog,
+   its construction follows the procedures of Section 8.1.1.  Additional
+   processing is required for the specific case of INVITE.
+
+   An Allow header field (Section 20.5) SHOULD be present in the INVITE.
+   It indicates what methods can be invoked within a dialog, on the UA
+   sending the INVITE, for the duration of the dialog.  For example, a
+   UA capable of receiving INFO requests within a dialog [34] SHOULD
+   include an Allow header field listing the INFO method.
+
+   A Supported header field (Section 20.37) SHOULD be present in the
+   INVITE.  It enumerates all the extensions understood by the UAC.
+
+
+
+
+
+Rosenberg, et. al.          Standards Track                    [Page 78]
+
+RFC 3261            SIP: Session Initiation Protocol           June 2002
+
+
+   An Accept (Section 20.1) header field MAY be present in the INVITE.
+   It indicates which Content-Types are acceptable to the UA, in both
+   the response received by it, and in any subsequent requests sent to
+   it within dialogs established by the INVITE.  The Accept header field
+   is especially useful for indicating support of various session
+   description formats.
+
+   The UAC MAY add an Expires header field (Section 20.19) to limit the
+   validity of the invitation.  If the time indicated in the Expires
+   header field is reached and no final answer for the INVITE has been
+   received, the UAC core SHOULD generate a CANCEL request for the
+   INVITE, as per Section 9.
+
+   A UAC MAY also find it useful to add, among others, Subject (Section
+   20.36), Organization (Section 20.25) and User-Agent (Section 20.41)
+   header fields.  They all contain information related to the INVITE.
+
+   The UAC MAY choose to add a message body to the INVITE.  Section
+   8.1.1.10 deals with how to construct the header fields -- Content-
+   Type among others -- needed to describe the message body.
+
+   There are special rules for message bodies that contain a session
+   description - their corresponding Content-Disposition is "session".
+   SIP uses an offer/answer model where one UA sends a session
+   description, called the offer, which contains a proposed description
+   of the session.  The offer indicates the desired communications means
+   (audio, video, games), parameters of those means (such as codec
+   types) and addresses for receiving media from the answerer.  The
+   other UA responds with another session description, called the
+   answer, which indicates which communications means are accepted, the
+   parameters that apply to those means, and addresses for receiving
+   media from the offerer. An offer/answer exchange is within the
+   context of a dialog, so that if a SIP INVITE results in multiple
+   dialogs, each is a separate offer/answer exchange.  The offer/answer
+   model defines restrictions on when offers and answers can be made
+   (for example, you cannot make a new offer while one is in progress).
+   This results in restrictions on where the offers and answers can
+   appear in SIP messages.  In this specification, offers and answers
+   can only appear in INVITE requests and responses, and ACK.  The usage
+   of offers and answers is further restricted.  For the initial INVITE
+   transaction, the rules are:
+
+      o  The initial offer MUST be in either an INVITE or, if not there,
+         in the first reliable non-failure message from the UAS back to
+         the UAC.  In this specification, that is the final 2xx
+         response.
+
+
+
+
+
+Rosenberg, et. al.          Standards Track                    [Page 79]
+
+RFC 3261            SIP: Session Initiation Protocol           June 2002
+
+
+      o  If the initial offer is in an INVITE, the answer MUST be in a
+         reliable non-failure message from UAS back to UAC which is
+         correlated to that INVITE.  For this specification, that is
+         only the final 2xx response to that INVITE.  That same exact
+         answer MAY also be placed in any provisional responses sent
+         prior to the answer.  The UAC MUST treat the first session
+         description it receives as the answer, and MUST ignore any
+         session descriptions in subsequent responses to the initial
+         INVITE.
+
+      o  If the initial offer is in the first reliable non-failure
+         message from the UAS back to UAC, the answer MUST be in the
+         acknowledgement for that message (in this specification, ACK
+         for a 2xx response).
+
+      o  After having sent or received an answer to the first offer, the
+         UAC MAY generate subsequent offers in requests based on rules
+         specified for that method, but only if it has received answers
+         to any previous offers, and has not sent any offers to which it
+         hasn't gotten an answer.
+
+      o  Once the UAS has sent or received an answer to the initial
+         offer, it MUST NOT generate subsequent offers in any responses
+         to the initial INVITE.  This means that a UAS based on this
+         specification alone can never generate subsequent offers until
+         completion of the initial transaction.
+
+   Concretely, the above rules specify two exchanges for UAs compliant
+   to this specification alone - the offer is in the INVITE, and the
+   answer in the 2xx (and possibly in a 1xx as well, with the same
+   value), or the offer is in the 2xx, and the answer is in the ACK.
+   All user agents that support INVITE MUST support these two exchanges.
+
+   The Session Description Protocol (SDP) (RFC 2327 [1]) MUST be
+   supported by all user agents as a means to describe sessions, and its
+   usage for constructing offers and answers MUST follow the procedures
+   defined in [13].
+
+   The restrictions of the offer-answer model just described only apply
+   to bodies whose Content-Disposition header field value is "session".
+   Therefore, it is possible that both the INVITE and the ACK contain a
+   body message (for example, the INVITE carries a photo (Content-
+   Disposition: render) and the ACK a session description (Content-
+   Disposition: session)).
+
+   If the Content-Disposition header field is missing, bodies of
+   Content-Type application/sdp imply the disposition "session", while
+   other content types imply "render".
+
+
+
+Rosenberg, et. al.          Standards Track                    [Page 80]
+
+RFC 3261            SIP: Session Initiation Protocol           June 2002
+
+
+   Once the INVITE has been created, the UAC follows the procedures
+   defined for sending requests outside of a dialog (Section 8).  This
+   results in the construction of a client transaction that will
+   ultimately send the request and deliver responses to the UAC.
+
+13.2.2 Processing INVITE Responses
+
+   Once the INVITE has been passed to the INVITE client transaction, the
+   UAC waits for responses for the INVITE.  If the INVITE client
+   transaction returns a timeout rather than a response the TU acts as
+   if a 408 (Request Timeout) response had been received, as described
+   in Section 8.1.3.
+
+13.2.2.1 1xx Responses
+
+   Zero, one or multiple provisional responses may arrive before one or
+   more final responses are received.  Provisional responses for an
+   INVITE request can create "early dialogs".  If a provisional response
+   has a tag in the To field, and if the dialog ID of the response does
+   not match an existing dialog, one is constructed using the procedures
+   defined in Section 12.1.2.
+
+   The early dialog will only be needed if the UAC needs to send a
+   request to its peer within the dialog before the initial INVITE
+   transaction completes.  Header fields present in a provisional
+   response are applicable as long as the dialog is in the early state
+   (for example, an Allow header field in a provisional response
+   contains the methods that can be used in the dialog while this is in
+   the early state).
+
+13.2.2.2 3xx Responses
+
+   A 3xx response may contain one or more Contact header field values
+   providing new addresses where the callee might be reachable.
+   Depending on the status code of the 3xx response (see Section 21.3),
+   the UAC MAY choose to try those new addresses.
+
+13.2.2.3 4xx, 5xx and 6xx Responses
+
+   A single non-2xx final response may be received for the INVITE.  4xx,
+   5xx and 6xx responses may contain a Contact header field value
+   indicating the location where additional information about the error
+   can be found.  Subsequent final responses (which would only arrive
+   under error conditions) MUST be ignored.
+
+   All early dialogs are considered terminated upon reception of the
+   non-2xx final response.
+
+
+
+
+Rosenberg, et. al.          Standards Track                    [Page 81]
+
+RFC 3261            SIP: Session Initiation Protocol           June 2002
+
+
+   After having received the non-2xx final response the UAC core
+   considers the INVITE transaction completed.  The INVITE client
+   transaction handles the generation of ACKs for the response (see
+   Section 17).
+
+13.2.2.4 2xx Responses
+
+   Multiple 2xx responses may arrive at the UAC for a single INVITE
+   request due to a forking proxy.  Each response is distinguished by
+   the tag parameter in the To header field, and each represents a
+   distinct dialog, with a distinct dialog identifier.
+
+   If the dialog identifier in the 2xx response matches the dialog
+   identifier of an existing dialog, the dialog MUST be transitioned to
+   the "confirmed" state, and the route set for the dialog MUST be
+   recomputed based on the 2xx response using the procedures of Section
+   12.2.1.2.  Otherwise, a new dialog in the "confirmed" state MUST be
+   constructed using the procedures of Section 12.1.2.
+
+      Note that the only piece of state that is recomputed is the route
+      set.  Other pieces of state such as the highest sequence numbers
+      (remote and local) sent within the dialog are not recomputed.  The
+      route set only is recomputed for backwards compatibility.  RFC
+      2543 did not mandate mirroring of the Record-Route header field in
+      a 1xx, only 2xx.  However, we cannot update the entire state of
+      the dialog, since mid-dialog requests may have been sent within
+      the early dialog, modifying the sequence numbers, for example.
+
+   The UAC core MUST generate an ACK request for each 2xx received from
+   the transaction layer.  The header fields of the ACK are constructed
+   in the same way as for any request sent within a dialog (see Section
+   12) with the exception of the CSeq and the header fields related to
+   authentication.  The sequence number of the CSeq header field MUST be
+   the same as the INVITE being acknowledged, but the CSeq method MUST
+   be ACK.  The ACK MUST contain the same credentials as the INVITE.  If
+   the 2xx contains an offer (based on the rules above), the ACK MUST
+   carry an answer in its body.  If the offer in the 2xx response is not
+   acceptable, the UAC core MUST generate a valid answer in the ACK and
+   then send a BYE immediately.
+
+   Once the ACK has been constructed, the procedures of [4] are used to
+   determine the destination address, port and transport.  However, the
+   request is passed to the transport layer directly for transmission,
+   rather than a client transaction.  This is because the UAC core
+   handles retransmissions of the ACK, not the transaction layer.  The
+   ACK MUST be passed to the client transport every time a
+   retransmission of the 2xx final response that triggered the ACK
+   arrives.
+
+
+
+Rosenberg, et. al.          Standards Track                    [Page 82]
+
+RFC 3261            SIP: Session Initiation Protocol           June 2002
+
+
+   The UAC core considers the INVITE transaction completed 64*T1 seconds
+   after the reception of the first 2xx response.  At this point all the
+   early dialogs that have not transitioned to established dialogs are
+   terminated.  Once the INVITE transaction is considered completed by
+   the UAC core, no more new 2xx responses are expected to arrive.
+
+   If, after acknowledging any 2xx response to an INVITE, the UAC does
+   not want to continue with that dialog, then the UAC MUST terminate
+   the dialog by sending a BYE request as described in Section 15.
+
+13.3 UAS Processing
+
+13.3.1 Processing of the INVITE
+
+   The UAS core will receive INVITE requests from the transaction layer.
+   It first performs the request processing procedures of Section 8.2,
+   which are applied for both requests inside and outside of a dialog.
+
+   Assuming these processing states are completed without generating a
+   response, the UAS core performs the additional processing steps:
+
+      1. If the request is an INVITE that contains an Expires header
+         field, the UAS core sets a timer for the number of seconds
+         indicated in the header field value.  When the timer fires, the
+         invitation is considered to be expired.  If the invitation
+         expires before the UAS has generated a final response, a 487
+         (Request Terminated) response SHOULD be generated.
+
+      2. If the request is a mid-dialog request, the method-independent
+         processing described in Section 12.2.2 is first applied.  It
+         might also modify the session; Section 14 provides details.
+
+      3. If the request has a tag in the To header field but the dialog
+         identifier does not match any of the existing dialogs, the UAS
+         may have crashed and restarted, or may have received a request
+         for a different (possibly failed) UAS.  Section 12.2.2 provides
+         guidelines to achieve a robust behavior under such a situation.
+
+   Processing from here forward assumes that the INVITE is outside of a
+   dialog, and is thus for the purposes of establishing a new session.
+
+   The INVITE may contain a session description, in which case the UAS
+   is being presented with an offer for that session.  It is possible
+   that the user is already a participant in that session, even though
+   the INVITE is outside of a dialog.  This can happen when a user is
+   invited to the same multicast conference by multiple other
+   participants.  If desired, the UAS MAY use identifiers within the
+   session description to detect this duplication.  For example, SDP
+
+
+
+Rosenberg, et. al.          Standards Track                    [Page 83]
+
+RFC 3261            SIP: Session Initiation Protocol           June 2002
+
+
+   contains a session id and version number in the origin (o) field.  If
+   the user is already a member of the session, and the session
+   parameters contained in the session description have not changed, the
+   UAS MAY silently accept the INVITE (that is, send a 2xx response
+   without prompting the user).
+
+   If the INVITE does not contain a session description, the UAS is
+   being asked to participate in a session, and the UAC has asked that
+   the UAS provide the offer of the session.  It MUST provide the offer
+   in its first non-failure reliable message back to the UAC.  In this
+   specification, that is a 2xx response to the INVITE.
+
+   The UAS can indicate progress, accept, redirect, or reject the
+   invitation.  In all of these cases, it formulates a response using
+   the procedures described in Section 8.2.6.
+
+13.3.1.1 Progress
+
+   If the UAS is not able to answer the invitation immediately, it can
+   choose to indicate some kind of progress to the UAC (for example, an
+   indication that a phone is ringing).  This is accomplished with a
+   provisional response between 101 and 199.  These provisional
+   responses establish early dialogs and therefore follow the procedures
+   of Section 12.1.1 in addition to those of Section 8.2.6.  A UAS MAY
+   send as many provisional responses as it likes.  Each of these MUST
+   indicate the same dialog ID.  However, these will not be delivered
+   reliably.
+
+   If the UAS desires an extended period of time to answer the INVITE,
+   it will need to ask for an "extension" in order to prevent proxies
+   from canceling the transaction.  A proxy has the option of canceling
+   a transaction when there is a gap of 3 minutes between responses in a
+   transaction.  To prevent cancellation, the UAS MUST send a non-100
+   provisional response at every minute, to handle the possibility of
+   lost provisional responses.
+
+      An INVITE transaction can go on for extended durations when the
+      user is placed on hold, or when interworking with PSTN systems
+      which allow communications to take place without answering the
+      call.  The latter is common in Interactive Voice Response (IVR)
+      systems.
+
+13.3.1.2 The INVITE is Redirected
+
+   If the UAS decides to redirect the call, a 3xx response is sent.  A
+   300 (Multiple Choices), 301 (Moved Permanently) or 302 (Moved
+   Temporarily) response SHOULD contain a Contact header field
+
+
+
+
+Rosenberg, et. al.          Standards Track                    [Page 84]
+
+RFC 3261            SIP: Session Initiation Protocol           June 2002
+
+
+   containing one or more URIs of new addresses to be tried.  The
+   response is passed to the INVITE server transaction, which will deal
+   with its retransmissions.
+
+13.3.1.3 The INVITE is Rejected
+
+   A common scenario occurs when the callee is currently not willing or
+   able to take additional calls at this end system.  A 486 (Busy Here)
+   SHOULD be returned in such a scenario.  If the UAS knows that no
+   other end system will be able to accept this call, a 600 (Busy
+   Everywhere) response SHOULD be sent instead.  However, it is unlikely
+   that a UAS will be able to know this in general, and thus this
+   response will not usually be used.  The response is passed to the
+   INVITE server transaction, which will deal with its retransmissions.
+
+   A UAS rejecting an offer contained in an INVITE SHOULD return a 488
+   (Not Acceptable Here) response.  Such a response SHOULD include a
+   Warning header field value explaining why the offer was rejected.
+
+13.3.1.4 The INVITE is Accepted
+
+   The UAS core generates a 2xx response.  This response establishes a
+   dialog, and therefore follows the procedures of Section 12.1.1 in
+   addition to those of Section 8.2.6.
+
+   A 2xx response to an INVITE SHOULD contain the Allow header field and
+   the Supported header field, and MAY contain the Accept header field.
+   Including these header fields allows the UAC to determine the
+   features and extensions supported by the UAS for the duration of the
+   call, without probing.
+
+   If the INVITE request contained an offer, and the UAS had not yet
+   sent an answer, the 2xx MUST contain an answer.  If the INVITE did
+   not contain an offer, the 2xx MUST contain an offer if the UAS had
+   not yet sent an offer.
+
+   Once the response has been constructed, it is passed to the INVITE
+   server transaction.  Note, however, that the INVITE server
+   transaction will be destroyed as soon as it receives this final
+   response and passes it to the transport.  Therefore, it is necessary
+   to periodically pass the response directly to the transport until the
+   ACK arrives.  The 2xx response is passed to the transport with an
+   interval that starts at T1 seconds and doubles for each
+   retransmission until it reaches T2 seconds (T1 and T2 are defined in
+   Section 17).  Response retransmissions cease when an ACK request for
+   the response is received.  This is independent of whatever transport
+   protocols are used to send the response.
+
+
+
+
+Rosenberg, et. al.          Standards Track                    [Page 85]
+
+RFC 3261            SIP: Session Initiation Protocol           June 2002
+
+
+      Since 2xx is retransmitted end-to-end, there may be hops between
+      UAS and UAC that are UDP.  To ensure reliable delivery across
+      these hops, the response is retransmitted periodically even if the
+      transport at the UAS is reliable.
+
+   If the server retransmits the 2xx response for 64*T1 seconds without
+   receiving an ACK, the dialog is confirmed, but the session SHOULD be
+   terminated.  This is accomplished with a BYE, as described in Section
+   15.
+
+14 Modifying an Existing Session
+
+   A successful INVITE request (see Section 13) establishes both a
+   dialog between two user agents and a session using the offer-answer
+   model.  Section 12 explains how to modify an existing dialog using a
+   target refresh request (for example, changing the remote target URI
+   of the dialog).  This section describes how to modify the actual
+   session.  This modification can involve changing addresses or ports,
+   adding a media stream, deleting a media stream, and so on.  This is
+   accomplished by sending a new INVITE request within the same dialog
+   that established the session.  An INVITE request sent within an
+   existing dialog is known as a re-INVITE.
+
+      Note that a single re-INVITE can modify the dialog and the
+      parameters of the session at the same time.
+
+   Either the caller or callee can modify an existing session.
+
+   The behavior of a UA on detection of media failure is a matter of
+   local policy.  However, automated generation of re-INVITE or BYE is
+   NOT RECOMMENDED to avoid flooding the network with traffic when there
+   is congestion.  In any case, if these messages are sent
+   automatically, they SHOULD be sent after some randomized interval.
+
+      Note that the paragraph above refers to automatically generated
+      BYEs and re-INVITEs.  If the user hangs up upon media failure, the
+      UA would send a BYE request as usual.
+
+14.1 UAC Behavior
+
+   The same offer-answer model that applies to session descriptions in
+   INVITEs (Section 13.2.1) applies to re-INVITEs.  As a result, a UAC
+   that wants to add a media stream, for example, will create a new
+   offer that contains this media stream, and send that in an INVITE
+   request to its peer.  It is important to note that the full
+   description of the session, not just the change, is sent.  This
+   supports stateless session processing in various elements, and
+   supports failover and recovery capabilities.  Of course, a UAC MAY
+
+
+
+Rosenberg, et. al.          Standards Track                    [Page 86]
+
+RFC 3261            SIP: Session Initiation Protocol           June 2002
+
+
+   send a re-INVITE with no session description, in which case the first
+   reliable non-failure response to the re-INVITE will contain the offer
+   (in this specification, that is a 2xx response).
+
+   If the session description format has the capability for version
+   numbers, the offerer SHOULD indicate that the version of the session
+   description has changed.
+
+   The To, From, Call-ID, CSeq, and Request-URI of a re-INVITE are set
+   following the same rules as for regular requests within an existing
+   dialog, described in Section 12.
+
+   A UAC MAY choose not to add an Alert-Info header field or a body with
+   Content-Disposition "alert" to re-INVITEs because UASs do not
+   typically alert the user upon reception of a re-INVITE.
+
+   Unlike an INVITE, which can fork, a re-INVITE will never fork, and
+   therefore, only ever generate a single final response.  The reason a
+   re-INVITE will never fork is that the Request-URI identifies the
+   target as the UA instance it established the dialog with, rather than
+   identifying an address-of-record for the user.
+
+   Note that a UAC MUST NOT initiate a new INVITE transaction within a
+   dialog while another INVITE transaction is in progress in either
+   direction.
+
+      1. If there is an ongoing INVITE client transaction, the TU MUST
+         wait until the transaction reaches the completed or terminated
+         state before initiating the new INVITE.
+
+      2. If there is an ongoing INVITE server transaction, the TU MUST
+         wait until the transaction reaches the confirmed or terminated
+         state before initiating the new INVITE.
+
+   However, a UA MAY initiate a regular transaction while an INVITE
+   transaction is in progress.  A UA MAY also initiate an INVITE
+   transaction while a regular transaction is in progress.
+
+   If a UA receives a non-2xx final response to a re-INVITE, the session
+   parameters MUST remain unchanged, as if no re-INVITE had been issued.
+   Note that, as stated in Section 12.2.1.2, if the non-2xx final
+   response is a 481 (Call/Transaction Does Not Exist), or a 408
+   (Request Timeout), or no response at all is received for the re-
+   INVITE (that is, a timeout is returned by the INVITE client
+   transaction), the UAC will terminate the dialog.
+
+
+
+
+
+
+Rosenberg, et. al.          Standards Track                    [Page 87]
+
+RFC 3261            SIP: Session Initiation Protocol           June 2002
+
+
+   If a UAC receives a 491 response to a re-INVITE, it SHOULD start a
+   timer with a value T chosen as follows:
+
+      1. If the UAC is the owner of the Call-ID of the dialog ID
+         (meaning it generated the value), T has a randomly chosen value
+         between 2.1 and 4 seconds in units of 10 ms.
+
+      2. If the UAC is not the owner of the Call-ID of the dialog ID, T
+         has a randomly chosen value of between 0 and 2 seconds in units
+         of 10 ms.
+
+   When the timer fires, the UAC SHOULD attempt the re-INVITE once more,
+   if it still desires for that session modification to take place.  For
+   example, if the call was already hung up with a BYE, the re-INVITE
+   would not take place.
+
+   The rules for transmitting a re-INVITE and for generating an ACK for
+   a 2xx response to re-INVITE are the same as for the initial INVITE
+   (Section 13.2.1).
+
+14.2 UAS Behavior
+
+   Section 13.3.1 describes the procedure for distinguishing incoming
+   re-INVITEs from incoming initial INVITEs and handling a re-INVITE for
+   an existing dialog.
+
+   A UAS that receives a second INVITE before it sends the final
+   response to a first INVITE with a lower CSeq sequence number on the
+   same dialog MUST return a 500 (Server Internal Error) response to the
+   second INVITE and MUST include a Retry-After header field with a
+   randomly chosen value of between 0 and 10 seconds.
+
+   A UAS that receives an INVITE on a dialog while an INVITE it had sent
+   on that dialog is in progress MUST return a 491 (Request Pending)
+   response to the received INVITE.
+
+   If a UA receives a re-INVITE for an existing dialog, it MUST check
+   any version identifiers in the session description or, if there are
+   no version identifiers, the content of the session description to see
+   if it has changed.  If the session description has changed, the UAS
+   MUST adjust the session parameters accordingly, possibly after asking
+   the user for confirmation.
+
+      Versioning of the session description can be used to accommodate
+      the capabilities of new arrivals to a conference, add or delete
+      media, or change from a unicast to a multicast conference.
+
+
+
+
+
+Rosenberg, et. al.          Standards Track                    [Page 88]
+
+RFC 3261            SIP: Session Initiation Protocol           June 2002
+
+
+   If the new session description is not acceptable, the UAS can reject
+   it by returning a 488 (Not Acceptable Here) response for the re-
+   INVITE.  This response SHOULD include a Warning header field.
+
+   If a UAS generates a 2xx response and never receives an ACK, it
+   SHOULD generate a BYE to terminate the dialog.
+
+   A UAS MAY choose not to generate 180 (Ringing) responses for a re-
+   INVITE because UACs do not typically render this information to the
+   user.  For the same reason, UASs MAY choose not to use an Alert-Info
+   header field or a body with Content-Disposition "alert" in responses
+   to a re-INVITE.
+
+   A UAS providing an offer in a 2xx (because the INVITE did not contain
+   an offer) SHOULD construct the offer as if the UAS were making a
+   brand new call, subject to the constraints of sending an offer that
+   updates an existing session, as described in [13] in the case of SDP.
+   Specifically, this means that it SHOULD include as many media formats
+   and media types that the UA is willing to support.  The UAS MUST
+   ensure that the session description overlaps with its previous
+   session description in media formats, transports, or other parameters
+   that require support from the peer.  This is to avoid the need for
+   the peer to reject the session description.  If, however, it is
+   unacceptable to the UAC, the UAC SHOULD generate an answer with a
+   valid session description, and then send a BYE to terminate the
+   session.
+
+15 Terminating a Session
+
+   This section describes the procedures for terminating a session
+   established by SIP.  The state of the session and the state of the
+   dialog are very closely related.  When a session is initiated with an
+   INVITE, each 1xx or 2xx response from a distinct UAS creates a
+   dialog, and if that response completes the offer/answer exchange, it
+   also creates a session.  As a result, each session is "associated"
+   with a single dialog - the one which resulted in its creation.  If an
+   initial INVITE generates a non-2xx final response, that terminates
+   all sessions (if any) and all dialogs (if any) that were created
+   through responses to the request.  By virtue of completing the
+   transaction, a non-2xx final response also prevents further sessions
+   from being created as a result of the INVITE.  The BYE request is
+   used to terminate a specific session or attempted session.  In this
+   case, the specific session is the one with the peer UA on the other
+   side of the dialog.  When a BYE is received on a dialog, any session
+   associated with that dialog SHOULD terminate.  A UA MUST NOT send a
+   BYE outside of a dialog.  The caller's UA MAY send a BYE for either
+   confirmed or early dialogs, and the callee's UA MAY send a BYE on
+   confirmed dialogs, but MUST NOT send a BYE on early dialogs.
+
+
+
+Rosenberg, et. al.          Standards Track                    [Page 89]
+
+RFC 3261            SIP: Session Initiation Protocol           June 2002
+
+
+   However, the callee's UA MUST NOT send a BYE on a confirmed dialog
+   until it has received an ACK for its 2xx response or until the server
+   transaction times out.  If no SIP extensions have defined other
+   application layer states associated with the dialog, the BYE also
+   terminates the dialog.
+
+   The impact of a non-2xx final response to INVITE on dialogs and
+   sessions makes the use of CANCEL attractive.  The CANCEL attempts to
+   force a non-2xx response to the INVITE (in particular, a 487).
+   Therefore, if a UAC wishes to give up on its call attempt entirely,
+   it can send a CANCEL.  If the INVITE results in 2xx final response(s)
+   to the INVITE, this means that a UAS accepted the invitation while
+   the CANCEL was in progress.  The UAC MAY continue with the sessions
+   established by any 2xx responses, or MAY terminate them with BYE.
+
+      The notion of "hanging up" is not well defined within SIP.  It is
+      specific to a particular, albeit common, user interface.
+      Typically, when the user hangs up, it indicates a desire to
+      terminate the attempt to establish a session, and to terminate any
+      sessions already created.  For the caller's UA, this would imply a
+      CANCEL request if the initial INVITE has not generated a final
+      response, and a BYE to all confirmed dialogs after a final
+      response.  For the callee's UA, it would typically imply a BYE;
+      presumably, when the user picked up the phone, a 2xx was
+      generated, and so hanging up would result in a BYE after the ACK
+      is received.  This does not mean a user cannot hang up before
+      receipt of the ACK, it just means that the software in his phone
+      needs to maintain state for a short while in order to clean up
+      properly.  If the particular UI allows for the user to reject a
+      call before its answered, a 403 (Forbidden) is a good way to
+      express that.  As per the rules above, a BYE can't be sent.
+
+15.1 Terminating a Session with a BYE Request
+
+15.1.1 UAC Behavior
+
+   A BYE request is constructed as would any other request within a
+   dialog, as described in Section 12.
+
+   Once the BYE is constructed, the UAC core creates a new non-INVITE
+   client transaction, and passes it the BYE request.  The UAC MUST
+   consider the session terminated (and therefore stop sending or
+   listening for media) as soon as the BYE request is passed to the
+   client transaction.  If the response for the BYE is a 481
+   (Call/Transaction Does Not Exist) or a 408 (Request Timeout) or no
+
+
+
+
+
+
+Rosenberg, et. al.          Standards Track                    [Page 90]
+
+RFC 3261            SIP: Session Initiation Protocol           June 2002
+
+
+   response at all is received for the BYE (that is, a timeout is
+   returned by the client transaction), the UAC MUST consider the
+   session and the dialog terminated.
+
+15.1.2 UAS Behavior
+
+   A UAS first processes the BYE request according to the general UAS
+   processing described in Section 8.2.  A UAS core receiving a BYE
+   request checks if it matches an existing dialog.  If the BYE does not
+   match an existing dialog, the UAS core SHOULD generate a 481
+   (Call/Transaction Does Not Exist) response and pass that to the
+   server transaction.
+
+      This rule means that a BYE sent without tags by a UAC will be
+      rejected.  This is a change from RFC 2543, which allowed BYE
+      without tags.
+
+   A UAS core receiving a BYE request for an existing dialog MUST follow
+   the procedures of Section 12.2.2 to process the request.  Once done,
+   the UAS SHOULD terminate the session (and therefore stop sending and
+   listening for media).  The only case where it can elect not to are
+   multicast sessions, where participation is possible even if the other
+   participant in the dialog has terminated its involvement in the
+   session.  Whether or not it ends its participation on the session,
+   the UAS core MUST generate a 2xx response to the BYE, and MUST pass
+   that to the server transaction for transmission.
+
+   The UAS MUST still respond to any pending requests received for that
+   dialog.  It is RECOMMENDED that a 487 (Request Terminated) response
+   be generated to those pending requests.
+
+16 Proxy Behavior
+
+16.1 Overview
+
+   SIP proxies are elements that route SIP requests to user agent
+   servers and SIP responses to user agent clients.  A request may
+   traverse several proxies on its way to a UAS.  Each will make routing
+   decisions, modifying the request before forwarding it to the next
+   element.  Responses will route through the same set of proxies
+   traversed by the request in the reverse order.
+
+   Being a proxy is a logical role for a SIP element.  When a request
+   arrives, an element that can play the role of a proxy first decides
+   if it needs to respond to the request on its own.  For instance, the
+   request may be malformed or the element may need credentials from the
+   client before acting as a proxy.  The element MAY respond with any
+
+
+
+
+Rosenberg, et. al.          Standards Track                    [Page 91]
+
+RFC 3261            SIP: Session Initiation Protocol           June 2002
+
+
+   appropriate error code.  When responding directly to a request, the
+   element is playing the role of a UAS and MUST behave as described in
+   Section 8.2.
+
+   A proxy can operate in either a stateful or stateless mode for each
+   new request.  When stateless, a proxy acts as a simple forwarding
+   element.  It forwards each request downstream to a single element
+   determined by making a targeting and routing decision based on the
+   request.  It simply forwards every response it receives upstream.  A
+   stateless proxy discards information about a message once the message
+   has been forwarded.  A stateful proxy remembers information
+   (specifically, transaction state) about each incoming request and any
+   requests it sends as a result of processing the incoming request.  It
+   uses this information to affect the processing of future messages
+   associated with that request.  A stateful proxy MAY choose to "fork"
+   a request, routing it to multiple destinations.  Any request that is
+   forwarded to more than one location MUST be handled statefully.
+
+   In some circumstances, a proxy MAY forward requests using stateful
+   transports (such as TCP) without being transaction-stateful.  For
+   instance, a proxy MAY forward a request from one TCP connection to
+   another transaction statelessly as long as it places enough
+   information in the message to be able to forward the response down
+   the same connection the request arrived on.  Requests forwarded
+   between different types of transports where the proxy's TU must take
+   an active role in ensuring reliable delivery on one of the transports
+   MUST be forwarded transaction statefully.
+
+   A stateful proxy MAY transition to stateless operation at any time
+   during the processing of a request, so long as it did not do anything
+   that would otherwise prevent it from being stateless initially
+   (forking, for example, or generation of a 100 response).  When
+   performing such a transition, all state is simply discarded.  The
+   proxy SHOULD NOT initiate a CANCEL request.
+
+   Much of the processing involved when acting statelessly or statefully
+   for a request is identical.  The next several subsections are written
+   from the point of view of a stateful proxy.  The last section calls
+   out those places where a stateless proxy behaves differently.
+
+16.2 Stateful Proxy
+
+   When stateful, a proxy is purely a SIP transaction processing engine.
+   Its behavior is modeled here in terms of the server and client
+   transactions defined in Section 17.  A stateful proxy has a server
+   transaction associated with one or more client transactions by a
+   higher layer proxy processing component (see figure 3), known as a
+   proxy core.  An incoming request is processed by a server
+
+
+
+Rosenberg, et. al.          Standards Track                    [Page 92]
+
+RFC 3261            SIP: Session Initiation Protocol           June 2002
+
+
+   transaction.  Requests from the server transaction are passed to a
+   proxy core.  The proxy core determines where to route the request,
+   choosing one or more next-hop locations.  An outgoing request for
+   each next-hop location is processed by its own associated client
+   transaction.  The proxy core collects the responses from the client
+   transactions and uses them to send responses to the server
+   transaction.
+
+   A stateful proxy creates a new server transaction for each new
+   request received.  Any retransmissions of the request will then be
+   handled by that server transaction per Section 17.  The proxy core
+   MUST behave as a UAS with respect to sending an immediate provisional
+   on that server transaction (such as 100 Trying) as described in
+   Section 8.2.6.  Thus, a stateful proxy SHOULD NOT generate 100
+   (Trying) responses to non-INVITE requests.
+
+   This is a model of proxy behavior, not of software.  An
+   implementation is free to take any approach that replicates the
+   external behavior this model defines.
+
+   For all new requests, including any with unknown methods, an element
+   intending to proxy the request MUST:
+
+      1. Validate the request (Section 16.3)
+
+      2. Preprocess routing information (Section 16.4)
+
+      3. Determine target(s) for the request (Section 16.5)
+
+            +--------------------+
+            |                    | +---+
+            |                    | | C |
+            |                    | | T |
+            |                    | +---+
+      +---+ |       Proxy        | +---+   CT = Client Transaction
+      | S | |  "Higher" Layer    | | C |
+      | T | |                    | | T |   ST = Server Transaction
+      +---+ |                    | +---+
+            |                    | +---+
+            |                    | | C |
+            |                    | | T |
+            |                    | +---+
+            +--------------------+
+
+               Figure 3: Stateful Proxy Model
+
+
+
+
+
+
+Rosenberg, et. al.          Standards Track                    [Page 93]
+
+RFC 3261            SIP: Session Initiation Protocol           June 2002
+
+
+      4. Forward the request to each target (Section 16.6)
+
+      5. Process all responses (Section 16.7)
+
+16.3 Request Validation
+
+   Before an element can proxy a request, it MUST verify the message's
+   validity.  A valid message must pass the following checks:
+
+      1. Reasonable Syntax
+
+      2. URI scheme
+
+      3. Max-Forwards
+
+      4. (Optional) Loop Detection
+
+      5. Proxy-Require
+
+      6. Proxy-Authorization
+
+   If any of these checks fail, the element MUST behave as a user agent
+   server (see Section 8.2) and respond with an error code.
+
+   Notice that a proxy is not required to detect merged requests and
+   MUST NOT treat merged requests as an error condition.  The endpoints
+   receiving the requests will resolve the merge as described in Section
+   8.2.2.2.
+
+   1. Reasonable syntax check
+
+      The request MUST be well-formed enough to be handled with a server
+      transaction.  Any components involved in the remainder of these
+      Request Validation steps or the Request Forwarding section MUST be
+      well-formed.  Any other components, well-formed or not, SHOULD be
+      ignored and remain unchanged when the message is forwarded.  For
+      instance, an element would not reject a request because of a
+      malformed Date header field.  Likewise, a proxy would not remove a
+      malformed Date header field before forwarding a request.
+
+      This protocol is designed to be extended.  Future extensions may
+      define new methods and header fields at any time.  An element MUST
+      NOT refuse to proxy a request because it contains a method or
+      header field it does not know about.
+
+
+
+
+
+
+
+Rosenberg, et. al.          Standards Track                    [Page 94]
+
+RFC 3261            SIP: Session Initiation Protocol           June 2002
+
+
+   2. URI scheme check
+
+      If the Request-URI has a URI whose scheme is not understood by the
+      proxy, the proxy SHOULD reject the request with a 416 (Unsupported
+      URI Scheme) response.
+
+   3. Max-Forwards check
+
+      The Max-Forwards header field (Section 20.22) is used to limit the
+      number of elements a SIP request can traverse.
+
+      If the request does not contain a Max-Forwards header field, this
+      check is passed.
+
+      If the request contains a Max-Forwards header field with a field
+      value greater than zero, the check is passed.
+
+      If the request contains a Max-Forwards header field with a field
+      value of zero (0), the element MUST NOT forward the request.  If
+      the request was for OPTIONS, the element MAY act as the final
+      recipient and respond per Section 11.  Otherwise, the element MUST
+      return a 483 (Too many hops) response.
+
+   4. Optional Loop Detection check
+
+      An element MAY check for forwarding loops before forwarding a
+      request.  If the request contains a Via header field with a sent-
+      by value that equals a value placed into previous requests by the
+      proxy, the request has been forwarded by this element before.  The
+      request has either looped or is legitimately spiraling through the
+      element.  To determine if the request has looped, the element MAY
+      perform the branch parameter calculation described in Step 8 of
+      Section 16.6 on this message and compare it to the parameter
+      received in that Via header field.  If the parameters match, the
+      request has looped.  If they differ, the request is spiraling, and
+      processing continues.  If a loop is detected, the element MAY
+      return a 482 (Loop Detected) response.
+
+   5. Proxy-Require check
+
+      Future extensions to this protocol may introduce features that
+      require special handling by proxies.  Endpoints will include a
+      Proxy-Require header field in requests that use these features,
+      telling the proxy not to process the request unless the feature is
+      understood.
+
+
+
+
+
+
+Rosenberg, et. al.          Standards Track                    [Page 95]
+
+RFC 3261            SIP: Session Initiation Protocol           June 2002
+
+
+      If the request contains a Proxy-Require header field (Section
+      20.29) with one or more option-tags this element does not
+      understand, the element MUST return a 420 (Bad Extension)
+      response.  The response MUST include an Unsupported (Section
+      20.40) header field listing those option-tags the element did not
+      understand.
+
+   6. Proxy-Authorization check
+
+      If an element requires credentials before forwarding a request,
+      the request MUST be inspected as described in Section 22.3.  That
+      section also defines what the element must do if the inspection
+      fails.
+
+16.4 Route Information Preprocessing
+
+   The proxy MUST inspect the Request-URI of the request.  If the
+   Request-URI of the request contains a value this proxy previously
+   placed into a Record-Route header field (see Section 16.6 item 4),
+   the proxy MUST replace the Request-URI in the request with the last
+   value from the Route header field, and remove that value from the
+   Route header field.  The proxy MUST then proceed as if it received
+   this modified request.
+
+      This will only happen when the element sending the request to the
+      proxy (which may have been an endpoint) is a strict router.  This
+      rewrite on receive is necessary to enable backwards compatibility
+      with those elements.  It also allows elements following this
+      specification to preserve the Request-URI through strict-routing
+      proxies (see Section 12.2.1.1).
+
+      This requirement does not obligate a proxy to keep state in order
+      to detect URIs it previously placed in Record-Route header fields.
+      Instead, a proxy need only place enough information in those URIs
+      to recognize them as values it provided when they later appear.
+
+   If the Request-URI contains a maddr parameter, the proxy MUST check
+   to see if its value is in the set of addresses or domains the proxy
+   is configured to be responsible for.  If the Request-URI has a maddr
+   parameter with a value the proxy is responsible for, and the request
+   was received using the port and transport indicated (explicitly or by
+   default) in the Request-URI, the proxy MUST strip the maddr and any
+   non-default port or transport parameter and continue processing as if
+   those values had not been present in the request.
+
+
+
+
+
+
+
+Rosenberg, et. al.          Standards Track                    [Page 96]
+
+RFC 3261            SIP: Session Initiation Protocol           June 2002
+
+
+      A request may arrive with a maddr matching the proxy, but on a
+      port or transport different from that indicated in the URI.  Such
+      a request needs to be forwarded to the proxy using the indicated
+      port and transport.
+
+   If the first value in the Route header field indicates this proxy,
+   the proxy MUST remove that value from the request.
+
+16.5 Determining Request Targets
+
+   Next, the proxy calculates the target(s) of the request.  The set of
+   targets will either be predetermined by the contents of the request
+   or will be obtained from an abstract location service.  Each target
+   in the set is represented as a URI.
+
+   If the Request-URI of the request contains an maddr parameter, the
+   Request-URI MUST be placed into the target set as the only target
+   URI, and the proxy MUST proceed to Section 16.6.
+
+   If the domain of the Request-URI indicates a domain this element is
+   not responsible for, the Request-URI MUST be placed into the target
+   set as the only target, and the element MUST proceed to the task of
+   Request Forwarding (Section 16.6).
+
+      There are many circumstances in which a proxy might receive a
+      request for a domain it is not responsible for.  A firewall proxy
+      handling outgoing calls (the way HTTP proxies handle outgoing
+      requests) is an example of where this is likely to occur.
+
+   If the target set for the request has not been predetermined as
+   described above, this implies that the element is responsible for the
+   domain in the Request-URI, and the element MAY use whatever mechanism
+   it desires to determine where to send the request.  Any of these
+   mechanisms can be modeled as accessing an abstract Location Service.
+   This may consist of obtaining information from a location service
+   created by a SIP Registrar, reading a database, consulting a presence
+   server, utilizing other protocols, or simply performing an
+   algorithmic substitution on the Request-URI.  When accessing the
+   location service constructed by a registrar, the Request-URI MUST
+   first be canonicalized as described in Section 10.3 before being used
+   as an index.  The output of these mechanisms is used to construct the
+   target set.
+
+   If the Request-URI does not provide sufficient information for the
+   proxy to determine the target set, it SHOULD return a 485 (Ambiguous)
+   response.  This response SHOULD contain a Contact header field
+   containing URIs of new addresses to be tried.  For example, an INVITE
+
+
+
+
+Rosenberg, et. al.          Standards Track                    [Page 97]
+
+RFC 3261            SIP: Session Initiation Protocol           June 2002
+
+
+   to sip:John.Smith@company.com may be ambiguous at a proxy whose
+   location service has multiple John Smiths listed.  See Section
+   21.4.23 for details.
+
+   Any information in or about the request or the current environment of
+   the element MAY be used in the construction of the target set.  For
+   instance, different sets may be constructed depending on contents or
+   the presence of header fields and bodies, the time of day of the
+   request's arrival, the interface on which the request arrived,
+   failure of previous requests, or even the element's current level of
+   utilization.
+
+   As potential targets are located through these services, their URIs
+   are added to the target set.  Targets can only be placed in the
+   target set once.  If a target URI is already present in the set
+   (based on the definition of equality for the URI type), it MUST NOT
+   be added again.
+
+   A proxy MUST NOT add additional targets to the target set if the
+   Request-URI of the original request does not indicate a resource this
+   proxy is responsible for.
+
+      A proxy can only change the Request-URI of a request during
+      forwarding if it is responsible for that URI.  If the proxy is not
+      responsible for that URI, it will not recurse on 3xx or 416
+      responses as described below.
+
+   If the Request-URI of the original request indicates a resource this
+   proxy is responsible for, the proxy MAY continue to add targets to
+   the set after beginning Request Forwarding.  It MAY use any
+   information obtained during that processing to determine new targets.
+   For instance, a proxy may choose to incorporate contacts obtained in
+   a redirect response (3xx) into the target set.  If a proxy uses a
+   dynamic source of information while building the target set (for
+   instance, if it consults a SIP Registrar), it SHOULD monitor that
+   source for the duration of processing the request.  New locations
+   SHOULD be added to the target set as they become available.  As
+   above, any given URI MUST NOT be added to the set more than once.
+
+      Allowing a URI to be added to the set only once reduces
+      unnecessary network traffic, and in the case of incorporating
+      contacts from redirect requests prevents infinite recursion.
+
+   For example, a trivial location service is a "no-op", where the
+   target URI is equal to the incoming request URI.  The request is sent
+   to a specific next hop proxy for further processing.  During request
+
+
+
+
+
+Rosenberg, et. al.          Standards Track                    [Page 98]
+
+RFC 3261            SIP: Session Initiation Protocol           June 2002
+
+
+   forwarding of Section 16.6, Item 6, the identity of that next hop,
+   expressed as a SIP or SIPS URI, is inserted as the top-most Route
+   header field value into the request.
+
+   If the Request-URI indicates a resource at this proxy that does not
+   exist, the proxy MUST return a 404 (Not Found) response.
+
+   If the target set remains empty after applying all of the above, the
+   proxy MUST return an error response, which SHOULD be the 480
+   (Temporarily Unavailable) response.
+
+16.6 Request Forwarding
+
+   As soon as the target set is non-empty, a proxy MAY begin forwarding
+   the request.  A stateful proxy MAY process the set in any order.  It
+   MAY process multiple targets serially, allowing each client
+   transaction to complete before starting the next.  It MAY start
+   client transactions with every target in parallel.  It also MAY
+   arbitrarily divide the set into groups, processing the groups
+   serially and processing the targets in each group in parallel.
+
+   A common ordering mechanism is to use the qvalue parameter of targets
+   obtained from Contact header fields (see Section 20.10).  Targets are
+   processed from highest qvalue to lowest.  Targets with equal qvalues
+   may be processed in parallel.
+
+   A stateful proxy must have a mechanism to maintain the target set as
+   responses are received and associate the responses to each forwarded
+   request with the original request.  For the purposes of this model,
+   this mechanism is a "response context" created by the proxy layer
+   before forwarding the first request.
+
+   For each target, the proxy forwards the request following these
+   steps:
+
+      1.  Make a copy of the received request
+
+      2.  Update the Request-URI
+
+      3.  Update the Max-Forwards header field
+
+      4.  Optionally add a Record-route header field value
+
+      5.  Optionally add additional header fields
+
+      6.  Postprocess routing information
+
+      7.  Determine the next-hop address, port, and transport
+
+
+
+Rosenberg, et. al.          Standards Track                    [Page 99]
+
+RFC 3261            SIP: Session Initiation Protocol           June 2002
+
+
+      8.  Add a Via header field value
+
+      9.  Add a Content-Length header field if necessary
+
+      10. Forward the new request
+
+      11. Set timer C
+
+   Each of these steps is detailed below:
+
+      1. Copy request
+
+         The proxy starts with a copy of the received request.  The copy
+         MUST initially contain all of the header fields from the
+         received request.  Fields not detailed in the processing
+         described below MUST NOT be removed.  The copy SHOULD maintain
+         the ordering of the header fields as in the received request.
+         The proxy MUST NOT reorder field values with a common field
+         name (See Section 7.3.1).  The proxy MUST NOT add to, modify,
+         or remove the message body.
+
+         An actual implementation need not perform a copy; the primary
+         requirement is that the processing for each next hop begin with
+         the same request.
+
+      2. Request-URI
+
+         The Request-URI in the copy's start line MUST be replaced with
+         the URI for this target.  If the URI contains any parameters
+         not allowed in a Request-URI, they MUST be removed.
+
+         This is the essence of a proxy's role.  This is the mechanism
+         through which a proxy routes a request toward its destination.
+
+         In some circumstances, the received Request-URI is placed into
+         the target set without being modified.  For that target, the
+         replacement above is effectively a no-op.
+
+      3. Max-Forwards
+
+         If the copy contains a Max-Forwards header field, the proxy
+         MUST decrement its value by one (1).
+
+         If the copy does not contain a Max-Forwards header field, the
+         proxy MUST add one with a field value, which SHOULD be 70.
+
+         Some existing UAs will not provide a Max-Forwards header field
+         in a request.
+
+
+
+Rosenberg, et. al.          Standards Track                   [Page 100]
+
+RFC 3261            SIP: Session Initiation Protocol           June 2002
+
+
+      4. Record-Route
+
+         If this proxy wishes to remain on the path of future requests
+         in a dialog created by this request (assuming the request
+         creates a dialog), it MUST insert a Record-Route header field
+         value into the copy before any existing Record-Route header
+         field values, even if a Route header field is already present.
+
+         Requests establishing a dialog may contain a preloaded Route
+         header field.
+
+         If this request is already part of a dialog, the proxy SHOULD
+         insert a Record-Route header field value if it wishes to remain
+         on the path of future requests in the dialog.  In normal
+         endpoint operation as described in Section 12, these Record-
+         Route header field values will not have any effect on the route
+         sets used by the endpoints.
+
+         The proxy will remain on the path if it chooses to not insert a
+         Record-Route header field value into requests that are already
+         part of a dialog.  However, it would be removed from the path
+         when an endpoint that has failed reconstitutes the dialog.
+
+         A proxy MAY insert a Record-Route header field value into any
+         request.  If the request does not initiate a dialog, the
+         endpoints will ignore the value.  See Section 12 for details on
+         how endpoints use the Record-Route header field values to
+         construct Route header fields.
+
+         Each proxy in the path of a request chooses whether to add a
+         Record-Route header field value independently - the presence of
+         a Record-Route header field in a request does not obligate this
+         proxy to add a value.
+
+         The URI placed in the Record-Route header field value MUST be a
+         SIP or SIPS URI.  This URI MUST contain an lr parameter (see
+         Section 19.1.1).  This URI MAY be different for each
+         destination the request is forwarded to.  The URI SHOULD NOT
+         contain the transport parameter unless the proxy has knowledge
+         (such as in a private network) that the next downstream element
+         that will be in the path of subsequent requests supports that
+         transport.
+
+         The URI this proxy provides will be used by some other element
+         to make a routing decision.  This proxy, in general, has no way
+         of knowing the capabilities of that element, so it must
+         restrict itself to the mandatory elements of a SIP
+         implementation: SIP URIs and either the TCP or UDP transports.
+
+
+
+Rosenberg, et. al.          Standards Track                   [Page 101]
+
+RFC 3261            SIP: Session Initiation Protocol           June 2002
+
+
+         The URI placed in the Record-Route header field MUST resolve to
+         the element inserting it (or a suitable stand-in) when the
+         server location procedures of [4] are applied to it, so that
+         subsequent requests reach the same SIP element.  If the
+         Request-URI contains a SIPS URI, or the topmost Route header
+         field value (after the post processing of bullet 6) contains a
+         SIPS URI, the URI placed into the Record-Route header field
+         MUST be a SIPS URI.  Furthermore, if the request was not
+         received over TLS, the proxy MUST insert a Record-Route header
+         field.  In a similar fashion, a proxy that receives a request
+         over TLS, but generates a request without a SIPS URI in the
+         Request-URI or topmost Route header field value (after the post
+         processing of bullet 6), MUST insert a Record-Route header
+         field that is not a SIPS URI.
+
+         A proxy at a security perimeter must remain on the perimeter
+         throughout the dialog.
+
+         If the URI placed in the Record-Route header field needs to be
+         rewritten when it passes back through in a response, the URI
+         MUST be distinct enough to locate at that time.  (The request
+         may spiral through this proxy, resulting in more than one
+         Record-Route header field value being added).  Item 8 of
+         Section 16.7 recommends a mechanism to make the URI
+         sufficiently distinct.
+
+         The proxy MAY include parameters in the Record-Route header
+         field value.  These will be echoed in some responses to the
+         request such as the 200 (OK) responses to INVITE.  Such
+         parameters may be useful for keeping state in the message
+         rather than the proxy.
+
+         If a proxy needs to be in the path of any type of dialog (such
+         as one straddling a firewall), it SHOULD add a Record-Route
+         header field value to every request with a method it does not
+         understand since that method may have dialog semantics.
+
+         The URI a proxy places into a Record-Route header field is only
+         valid for the lifetime of any dialog created by the transaction
+         in which it occurs.  A dialog-stateful proxy, for example, MAY
+         refuse to accept future requests with that value in the
+         Request-URI after the dialog has terminated.  Non-dialog-
+         stateful proxies, of course, have no concept of when the dialog
+         has terminated, but they MAY encode enough information in the
+         value to compare it against the dialog identifier of future
+         requests and MAY reject requests not matching that information.
+         Endpoints MUST NOT use a URI obtained from a Record-Route
+         header field outside the dialog in which it was provided.  See
+
+
+
+Rosenberg, et. al.          Standards Track                   [Page 102]
+
+RFC 3261            SIP: Session Initiation Protocol           June 2002
+
+
+         Section 12 for more information on an endpoint's use of
+         Record-Route header fields.
+
+         Record-routing may be required by certain services where the
+         proxy needs to observe all messages in a dialog.  However, it
+         slows down processing and impairs scalability and thus proxies
+         should only record-route if required for a particular service.
+
+         The Record-Route process is designed to work for any SIP
+         request that initiates a dialog.  INVITE is the only such
+         request in this specification, but extensions to the protocol
+         MAY define others.
+
+      5. Add Additional Header Fields
+
+         The proxy MAY add any other appropriate header fields to the
+         copy at this point.
+
+      6. Postprocess routing information
+
+         A proxy MAY have a local policy that mandates that a request
+         visit a specific set of proxies before being delivered to the
+         destination.  A proxy MUST ensure that all such proxies are
+         loose routers.  Generally, this can only be known with
+         certainty if the proxies are within the same administrative
+         domain.  This set of proxies is represented by a set of URIs
+         (each of which contains the lr parameter).  This set MUST be
+         pushed into the Route header field of the copy ahead of any
+         existing values, if present.  If the Route header field is
+         absent, it MUST be added, containing that list of URIs.
+
+         If the proxy has a local policy that mandates that the request
+         visit one specific proxy, an alternative to pushing a Route
+         value into the Route header field is to bypass the forwarding
+         logic of item 10 below, and instead just send the request to
+         the address, port, and transport for that specific proxy.  If
+         the request has a Route header field, this alternative MUST NOT
+         be used unless it is known that next hop proxy is a loose
+         router.  Otherwise, this approach MAY be used, but the Route
+         insertion mechanism above is preferred for its robustness,
+         flexibility, generality and consistency of operation.
+         Furthermore, if the Request-URI contains a SIPS URI, TLS MUST
+         be used to communicate with that proxy.
+
+         If the copy contains a Route header field, the proxy MUST
+         inspect the URI in its first value.  If that URI does not
+         contain an lr parameter, the proxy MUST modify the copy as
+         follows:
+
+
+
+Rosenberg, et. al.          Standards Track                   [Page 103]
+
+RFC 3261            SIP: Session Initiation Protocol           June 2002
+
+
+         -  The proxy MUST place the Request-URI into the Route header
+            field as the last value.
+
+         -  The proxy MUST then place the first Route header field value
+            into the Request-URI and remove that value from the Route
+            header field.
+
+         Appending the Request-URI to the Route header field is part of
+         a mechanism used to pass the information in that Request-URI
+         through strict-routing elements.  "Popping" the first Route
+         header field value into the Request-URI formats the message the
+         way a strict-routing element expects to receive it (with its
+         own URI in the Request-URI and the next location to visit in
+         the first Route header field value).
+
+      7. Determine Next-Hop Address, Port, and Transport
+
+         The proxy MAY have a local policy to send the request to a
+         specific IP address, port, and transport, independent of the
+         values of the Route and Request-URI.  Such a policy MUST NOT be
+         used if the proxy is not certain that the IP address, port, and
+         transport correspond to a server that is a loose router.
+         However, this mechanism for sending the request through a
+         specific next hop is NOT RECOMMENDED; instead a Route header
+         field should be used for that purpose as described above.
+
+         In the absence of such an overriding mechanism, the proxy
+         applies the procedures listed in [4] as follows to determine
+         where to send the request.  If the proxy has reformatted the
+         request to send to a strict-routing element as described in
+         step 6 above, the proxy MUST apply those procedures to the
+         Request-URI of the request.  Otherwise, the proxy MUST apply
+         the procedures to the first value in the Route header field, if
+         present, else the Request-URI.  The procedures will produce an
+         ordered set of (address, port, transport) tuples.
+         Independently of which URI is being used as input to the
+         procedures of [4], if the Request-URI specifies a SIPS
+         resource, the proxy MUST follow the procedures of [4] as if the
+         input URI were a SIPS URI.
+
+         As described in [4], the proxy MUST attempt to deliver the
+         message to the first tuple in that set, and proceed through the
+         set in order until the delivery attempt succeeds.
+
+         For each tuple attempted, the proxy MUST format the message as
+         appropriate for the tuple and send the request using a new
+         client transaction as detailed in steps 8 through 10.
+
+
+
+
+Rosenberg, et. al.          Standards Track                   [Page 104]
+
+RFC 3261            SIP: Session Initiation Protocol           June 2002
+
+
+         Since each attempt uses a new client transaction, it represents
+         a new branch.  Thus, the branch parameter provided with the Via
+         header field inserted in step 8 MUST be different for each
+         attempt.
+
+         If the client transaction reports failure to send the request
+         or a timeout from its state machine, the proxy continues to the
+         next address in that ordered set.  If the ordered set is
+         exhausted, the request cannot be forwarded to this element in
+         the target set.  The proxy does not need to place anything in
+         the response context, but otherwise acts as if this element of
+         the target set returned a 408 (Request Timeout) final response.
+
+      8. Add a Via header field value
+
+         The proxy MUST insert a Via header field value into the copy
+         before the existing Via header field values.  The construction
+         of this value follows the same guidelines of Section 8.1.1.7.
+         This implies that the proxy will compute its own branch
+         parameter, which will be globally unique for that branch, and
+         contain the requisite magic cookie. Note that this implies that
+         the branch parameter will be different for different instances
+         of a spiraled or looped request through a proxy.
+
+         Proxies choosing to detect loops have an additional constraint
+         in the value they use for construction of the branch parameter.
+         A proxy choosing to detect loops SHOULD create a branch
+         parameter separable into two parts by the implementation.  The
+         first part MUST satisfy the constraints of Section 8.1.1.7 as
+         described above.  The second is used to perform loop detection
+         and distinguish loops from spirals.
+
+         Loop detection is performed by verifying that, when a request
+         returns to a proxy, those fields having an impact on the
+         processing of the request have not changed.  The value placed
+         in this part of the branch parameter SHOULD reflect all of
+         those fields (including any Route, Proxy-Require and Proxy-
+         Authorization header fields).  This is to ensure that if the
+         request is routed back to the proxy and one of those fields
+         changes, it is treated as a spiral and not a loop (see Section
+         16.3).  A common way to create this value is to compute a
+         cryptographic hash of the To tag, From tag, Call-ID header
+         field, the Request-URI of the request received (before
+         translation), the topmost Via header, and the sequence number
+         from the CSeq header field, in addition to any Proxy-Require
+         and Proxy-Authorization header fields that may be present.  The
+
+
+
+
+
+Rosenberg, et. al.          Standards Track                   [Page 105]
+
+RFC 3261            SIP: Session Initiation Protocol           June 2002
+
+
+         algorithm used to compute the hash is implementation-dependent,
+         but MD5 (RFC 1321 [35]), expressed in hexadecimal, is a
+         reasonable choice.  (Base64 is not permissible for a token.)
+
+         If a proxy wishes to detect loops, the "branch" parameter it
+         supplies MUST depend on all information affecting processing of
+         a request, including the incoming Request-URI and any header
+         fields affecting the request's admission or routing.  This is
+         necessary to distinguish looped requests from requests whose
+         routing parameters have changed before returning to this
+         server.
+
+         The request method MUST NOT be included in the calculation of
+         the branch parameter.  In particular, CANCEL and ACK requests
+         (for non-2xx responses) MUST have the same branch value as the
+         corresponding request they cancel or acknowledge.  The branch
+         parameter is used in correlating those requests at the server
+         handling them (see Sections 17.2.3 and 9.2).
+
+      9. Add a Content-Length header field if necessary
+
+         If the request will be sent to the next hop using a stream-
+         based transport and the copy contains no Content-Length header
+         field, the proxy MUST insert one with the correct value for the
+         body of the request (see Section 20.14).
+
+      10. Forward Request
+
+         A stateful proxy MUST create a new client transaction for this
+         request as described in Section 17.1 and instructs the
+         transaction to send the request using the address, port and
+         transport determined in step 7.
+
+      11. Set timer C
+
+         In order to handle the case where an INVITE request never
+         generates a final response, the TU uses a timer which is called
+         timer C.  Timer C MUST be set for each client transaction when
+         an INVITE request is proxied.  The timer MUST be larger than 3
+         minutes.  Section 16.7 bullet 2 discusses how this timer is
+         updated with provisional responses, and Section 16.8 discusses
+         processing when it fires.
+
+
+
+
+
+
+
+
+
+Rosenberg, et. al.          Standards Track                   [Page 106]
+
+RFC 3261            SIP: Session Initiation Protocol           June 2002
+
+
+16.7 Response Processing
+
+   When a response is received by an element, it first tries to locate a
+   client transaction (Section 17.1.3) matching the response.  If none
+   is found, the element MUST process the response (even if it is an
+   informational response) as a stateless proxy (described below).  If a
+   match is found, the response is handed to the client transaction.
+
+      Forwarding responses for which a client transaction (or more
+      generally any knowledge of having sent an associated request) is
+      not found improves robustness.  In particular, it ensures that
+      "late" 2xx responses to INVITE requests are forwarded properly.
+
+   As client transactions pass responses to the proxy layer, the
+   following processing MUST take place:
+
+      1.  Find the appropriate response context
+
+      2.  Update timer C for provisional responses
+
+      3.  Remove the topmost Via
+
+      4.  Add the response to the response context
+
+      5.  Check to see if this response should be forwarded immediately
+
+      6.  When necessary, choose the best final response from the
+          response context
+
+   If no final response has been forwarded after every client
+   transaction associated with the response context has been terminated,
+   the proxy must choose and forward the "best" response from those it
+   has seen so far.
+
+   The following processing MUST be performed on each response that is
+   forwarded.  It is likely that more than one response to each request
+   will be forwarded: at least each provisional and one final response.
+
+      7.  Aggregate authorization header field values if necessary
+
+      8.  Optionally rewrite Record-Route header field values
+
+      9.  Forward the response
+
+      10. Generate any necessary CANCEL requests
+
+
+
+
+
+
+Rosenberg, et. al.          Standards Track                   [Page 107]
+
+RFC 3261            SIP: Session Initiation Protocol           June 2002
+
+
+   Each of the above steps are detailed below:
+
+      1.  Find Context
+
+         The proxy locates the "response context" it created before
+         forwarding the original request using the key described in
+         Section 16.6.  The remaining processing steps take place in
+         this context.
+
+      2.  Update timer C for provisional responses
+
+         For an INVITE transaction, if the response is a provisional
+         response with status codes 101 to 199 inclusive (i.e., anything
+         but 100), the proxy MUST reset timer C for that client
+         transaction.  The timer MAY be reset to a different value, but
+         this value MUST be greater than 3 minutes.
+
+      3.  Via
+
+         The proxy removes the topmost Via header field value from the
+         response.
+
+         If no Via header field values remain in the response, the
+         response was meant for this element and MUST NOT be forwarded.
+         The remainder of the processing described in this section is
+         not performed on this message, the UAC processing rules
+         described in Section 8.1.3 are followed instead (transport
+         layer processing has already occurred).
+
+         This will happen, for instance, when the element generates
+         CANCEL requests as described in Section 10.
+
+      4.  Add response to context
+
+         Final responses received are stored in the response context
+         until a final response is generated on the server transaction
+         associated with this context.  The response may be a candidate
+         for the best final response to be returned on that server
+         transaction.  Information from this response may be needed in
+         forming the best response, even if this response is not chosen.
+
+         If the proxy chooses to recurse on any contacts in a 3xx
+         response by adding them to the target set, it MUST remove them
+         from the response before adding the response to the response
+         context.  However, a proxy SHOULD NOT recurse to a non-SIPS URI
+         if the Request-URI of the original request was a SIPS URI.  If
+
+
+
+
+
+Rosenberg, et. al.          Standards Track                   [Page 108]
+
+RFC 3261            SIP: Session Initiation Protocol           June 2002
+
+
+         the proxy recurses on all of the contacts in a 3xx response,
+         the proxy SHOULD NOT add the resulting contactless response to
+         the response context.
+
+         Removing the contact before adding the response to the response
+         context prevents the next element upstream from retrying a
+         location this proxy has already attempted.
+
+         3xx responses may contain a mixture of SIP, SIPS, and non-SIP
+         URIs.  A proxy may choose to recurse on the SIP and SIPS URIs
+         and place the remainder into the response context to be
+         returned, potentially in the final response.
+
+         If a proxy receives a 416 (Unsupported URI Scheme) response to
+         a request whose Request-URI scheme was not SIP, but the scheme
+         in the original received request was SIP or SIPS (that is, the
+         proxy changed the scheme from SIP or SIPS to something else
+         when it proxied a request), the proxy SHOULD add a new URI to
+         the target set.  This URI SHOULD be a SIP URI version of the
+         non-SIP URI that was just tried.  In the case of the tel URL,
+         this is accomplished by placing the telephone-subscriber part
+         of the tel URL into the user part of the SIP URI, and setting
+         the hostpart to the domain where the prior request was sent.
+         See Section 19.1.6 for more detail on forming SIP URIs from tel
+         URLs.
+
+         As with a 3xx response, if a proxy "recurses" on the 416 by
+         trying a SIP or SIPS URI instead, the 416 response SHOULD NOT
+         be added to the response context.
+
+      5.  Check response for forwarding
+
+         Until a final response has been sent on the server transaction,
+         the following responses MUST be forwarded immediately:
+
+         -  Any provisional response other than 100 (Trying)
+
+         -  Any 2xx response
+
+         If a 6xx response is received, it is not immediately forwarded,
+         but the stateful proxy SHOULD cancel all client pending
+         transactions as described in Section 10, and it MUST NOT create
+         any new branches in this context.
+
+         This is a change from RFC 2543, which mandated that the proxy
+         was to forward the 6xx response immediately.  For an INVITE
+         transaction, this approach had the problem that a 2xx response
+         could arrive on another branch, in which case the proxy would
+
+
+
+Rosenberg, et. al.          Standards Track                   [Page 109]
+
+RFC 3261            SIP: Session Initiation Protocol           June 2002
+
+
+         have to forward the 2xx.  The result was that the UAC could
+         receive a 6xx response followed by a 2xx response, which should
+         never be allowed to happen.  Under the new rules, upon
+         receiving a 6xx, a proxy will issue a CANCEL request, which
+         will generally result in 487 responses from all outstanding
+         client transactions, and then at that point the 6xx is
+         forwarded upstream.
+
+         After a final response has been sent on the server transaction,
+         the following responses MUST be forwarded immediately:
+
+         -  Any 2xx response to an INVITE request
+
+         A stateful proxy MUST NOT immediately forward any other
+         responses.  In particular, a stateful proxy MUST NOT forward
+         any 100 (Trying) response.  Those responses that are candidates
+         for forwarding later as the "best" response have been gathered
+         as described in step "Add Response to Context".
+
+         Any response chosen for immediate forwarding MUST be processed
+         as described in steps "Aggregate Authorization Header Field
+         Values" through "Record-Route".
+
+         This step, combined with the next, ensures that a stateful
+         proxy will forward exactly one final response to a non-INVITE
+         request, and either exactly one non-2xx response or one or more
+         2xx responses to an INVITE request.
+
+      6.  Choosing the best response
+
+         A stateful proxy MUST send a final response to a response
+         context's server transaction if no final responses have been
+         immediately forwarded by the above rules and all client
+         transactions in this response context have been terminated.
+
+         The stateful proxy MUST choose the "best" final response among
+         those received and stored in the response context.
+
+         If there are no final responses in the context, the proxy MUST
+         send a 408 (Request Timeout) response to the server
+         transaction.
+
+         Otherwise, the proxy MUST forward a response from the responses
+         stored in the response context.  It MUST choose from the 6xx
+         class responses if any exist in the context.  If no 6xx class
+         responses are present, the proxy SHOULD choose from the lowest
+         response class stored in the response context.  The proxy MAY
+         select any response within that chosen class.  The proxy SHOULD
+
+
+
+Rosenberg, et. al.          Standards Track                   [Page 110]
+
+RFC 3261            SIP: Session Initiation Protocol           June 2002
+
+
+         give preference to responses that provide information affecting
+         resubmission of this request, such as 401, 407, 415, 420, and
+         484 if the 4xx class is chosen.
+
+         A proxy which receives a 503 (Service Unavailable) response
+         SHOULD NOT forward it upstream unless it can determine that any
+         subsequent requests it might proxy will also generate a 503.
+         In other words, forwarding a 503 means that the proxy knows it
+         cannot service any requests, not just the one for the Request-
+         URI in the request which generated the 503.  If the only
+         response that was received is a 503, the proxy SHOULD generate
+         a 500 response and forward that upstream.
+
+         The forwarded response MUST be processed as described in steps
+         "Aggregate Authorization Header Field Values" through "Record-
+         Route".
+
+         For example, if a proxy forwarded a request to 4 locations, and
+         received 503, 407, 501, and 404 responses, it may choose to
+         forward the 407 (Proxy Authentication Required) response.
+
+         1xx and 2xx responses may be involved in the establishment of
+         dialogs.  When a request does not contain a To tag, the To tag
+         in the response is used by the UAC to distinguish multiple
+         responses to a dialog creating request.  A proxy MUST NOT
+         insert a tag into the To header field of a 1xx or 2xx response
+         if the request did not contain one.  A proxy MUST NOT modify
+         the tag in the To header field of a 1xx or 2xx response.
+
+         Since a proxy may not insert a tag into the To header field of
+         a 1xx response to a request that did not contain one, it cannot
+         issue non-100 provisional responses on its own.  However, it
+         can branch the request to a UAS sharing the same element as the
+         proxy.  This UAS can return its own provisional responses,
+         entering into an early dialog with the initiator of the
+         request.  The UAS does not have to be a discreet process from
+         the proxy.  It could be a virtual UAS implemented in the same
+         code space as the proxy.
+
+         3-6xx responses are delivered hop-by-hop.  When issuing a 3-6xx
+         response, the element is effectively acting as a UAS, issuing
+         its own response, usually based on the responses received from
+         downstream elements.  An element SHOULD preserve the To tag
+         when simply forwarding a 3-6xx response to a request that did
+         not contain a To tag.
+
+         A proxy MUST NOT modify the To tag in any forwarded response to
+         a request that contains a To tag.
+
+
+
+Rosenberg, et. al.          Standards Track                   [Page 111]
+
+RFC 3261            SIP: Session Initiation Protocol           June 2002
+
+
+         While it makes no difference to the upstream elements if the
+         proxy replaced the To tag in a forwarded 3-6xx response,
+         preserving the original tag may assist with debugging.
+
+         When the proxy is aggregating information from several
+         responses, choosing a To tag from among them is arbitrary, and
+         generating a new To tag may make debugging easier.  This
+         happens, for instance, when combining 401 (Unauthorized) and
+         407 (Proxy Authentication Required) challenges, or combining
+         Contact values from unencrypted and unauthenticated 3xx
+         responses.
+
+      7.  Aggregate Authorization Header Field Values
+
+         If the selected response is a 401 (Unauthorized) or 407 (Proxy
+         Authentication Required), the proxy MUST collect any WWW-
+         Authenticate and Proxy-Authenticate header field values from
+         all other 401 (Unauthorized) and 407 (Proxy Authentication
+         Required) responses received so far in this response context
+         and add them to this response without modification before
+         forwarding.  The resulting 401 (Unauthorized) or 407 (Proxy
+         Authentication Required) response could have several WWW-
+         Authenticate AND Proxy-Authenticate header field values.
+
+         This is necessary because any or all of the destinations the
+         request was forwarded to may have requested credentials.  The
+         client needs to receive all of those challenges and supply
+         credentials for each of them when it retries the request.
+         Motivation for this behavior is provided in Section 26.
+
+      8.  Record-Route
+
+         If the selected response contains a Record-Route header field
+         value originally provided by this proxy, the proxy MAY choose
+         to rewrite the value before forwarding the response.  This
+         allows the proxy to provide different URIs for itself to the
+         next upstream and downstream elements.  A proxy may choose to
+         use this mechanism for any reason.  For instance, it is useful
+         for multi-homed hosts.
+
+         If the proxy received the request over TLS, and sent it out
+         over a non-TLS connection, the proxy MUST rewrite the URI in
+         the Record-Route header field to be a SIPS URI.  If the proxy
+         received the request over a non-TLS connection, and sent it out
+         over TLS, the proxy MUST rewrite the URI in the Record-Route
+         header field to be a SIP URI.
+
+
+
+
+
+Rosenberg, et. al.          Standards Track                   [Page 112]
+
+RFC 3261            SIP: Session Initiation Protocol           June 2002
+
+
+         The new URI provided by the proxy MUST satisfy the same
+         constraints on URIs placed in Record-Route header fields in
+         requests (see Step 4 of Section 16.6) with the following
+         modifications:
+
+         The URI SHOULD NOT contain the transport parameter unless the
+         proxy has knowledge that the next upstream (as opposed to
+         downstream) element that will be in the path of subsequent
+         requests supports that transport.
+
+         When a proxy does decide to modify the Record-Route header
+         field in the response, one of the operations it performs is
+         locating the Record-Route value that it had inserted.  If the
+         request spiraled, and the proxy inserted a Record-Route value
+         in each iteration of the spiral, locating the correct value in
+         the response (which must be the proper iteration in the reverse
+         direction) is tricky.  The rules above recommend that a proxy
+         wishing to rewrite Record-Route header field values insert
+         sufficiently distinct URIs into the Record-Route header field
+         so that the right one may be selected for rewriting.  A
+         RECOMMENDED mechanism to achieve this is for the proxy to
+         append a unique identifier for the proxy instance to the user
+         portion of the URI.
+
+         When the response arrives, the proxy modifies the first
+         Record-Route whose identifier matches the proxy instance.  The
+         modification results in a URI without this piece of data
+         appended to the user portion of the URI.  Upon the next
+         iteration, the same algorithm (find the topmost Record-Route
+         header field value with the parameter) will correctly extract
+         the next Record-Route header field value inserted by that
+         proxy.
+
+         Not every response to a request to which a proxy adds a
+         Record-Route header field value will contain a Record-Route
+         header field.  If the response does contain a Record-Route
+         header field, it will contain the value the proxy added.
+
+      9.  Forward response
+
+         After performing the processing described in steps "Aggregate
+         Authorization Header Field Values" through "Record-Route", the
+         proxy MAY perform any feature specific manipulations on the
+         selected response.  The proxy MUST NOT add to, modify, or
+         remove the message body.  Unless otherwise specified, the proxy
+         MUST NOT remove any header field values other than the Via
+         header field value discussed in Section 16.7 Item 3.  In
+         particular, the proxy MUST NOT remove any "received" parameter
+
+
+
+Rosenberg, et. al.          Standards Track                   [Page 113]
+
+RFC 3261            SIP: Session Initiation Protocol           June 2002
+
+
+         it may have added to the next Via header field value while
+         processing the request associated with this response.  The
+         proxy MUST pass the response to the server transaction
+         associated with the response context.  This will result in the
+         response being sent to the location now indicated in the
+         topmost Via header field value.  If the server transaction is
+         no longer available to handle the transmission, the element
+         MUST forward the response statelessly by sending it to the
+         server transport.  The server transaction might indicate
+         failure to send the response or signal a timeout in its state
+         machine.  These errors would be logged for diagnostic purposes
+         as appropriate, but the protocol requires no remedial action
+         from the proxy.
+
+         The proxy MUST maintain the response context until all of its
+         associated transactions have been terminated, even after
+         forwarding a final response.
+
+      10. Generate CANCELs
+
+         If the forwarded response was a final response, the proxy MUST
+         generate a CANCEL request for all pending client transactions
+         associated with this response context.  A proxy SHOULD also
+         generate a CANCEL request for all pending client transactions
+         associated with this response context when it receives a 6xx
+         response.  A pending client transaction is one that has
+         received a provisional response, but no final response (it is
+         in the proceeding state) and has not had an associated CANCEL
+         generated for it.  Generating CANCEL requests is described in
+         Section 9.1.
+
+         The requirement to CANCEL pending client transactions upon
+         forwarding a final response does not guarantee that an endpoint
+         will not receive multiple 200 (OK) responses to an INVITE.  200
+         (OK) responses on more than one branch may be generated before
+         the CANCEL requests can be sent and processed.  Further, it is
+         reasonable to expect that a future extension may override this
+         requirement to issue CANCEL requests.
+
+16.8 Processing Timer C
+
+   If timer C should fire, the proxy MUST either reset the timer with
+   any value it chooses, or terminate the client transaction.  If the
+   client transaction has received a provisional response, the proxy
+   MUST generate a CANCEL request matching that transaction.  If the
+   client transaction has not received a provisional response, the proxy
+   MUST behave as if the transaction received a 408 (Request Timeout)
+   response.
+
+
+
+Rosenberg, et. al.          Standards Track                   [Page 114]
+
+RFC 3261            SIP: Session Initiation Protocol           June 2002
+
+
+   Allowing the proxy to reset the timer allows the proxy to dynamically
+   extend the transaction's lifetime based on current conditions (such
+   as utilization) when the timer fires.
+
+16.9 Handling Transport Errors
+
+   If the transport layer notifies a proxy of an error when it tries to
+   forward a request (see Section 18.4), the proxy MUST behave as if the
+   forwarded request received a 503 (Service Unavailable) response.
+
+   If the proxy is notified of an error when forwarding a response, it
+   drops the response.  The proxy SHOULD NOT cancel any outstanding
+   client transactions associated with this response context due to this
+   notification.
+
+      If a proxy cancels its outstanding client transactions, a single
+      malicious or misbehaving client can cause all transactions to fail
+      through its Via header field.
+
+16.10 CANCEL Processing
+
+   A stateful proxy MAY generate a CANCEL to any other request it has
+   generated at any time (subject to receiving a provisional response to
+   that request as described in section 9.1).  A proxy MUST cancel any
+   pending client transactions associated with a response context when
+   it receives a matching CANCEL request.
+
+   A stateful proxy MAY generate CANCEL requests for pending INVITE
+   client transactions based on the period specified in the INVITE's
+   Expires header field elapsing.  However, this is generally
+   unnecessary since the endpoints involved will take care of signaling
+   the end of the transaction.
+
+   While a CANCEL request is handled in a stateful proxy by its own
+   server transaction, a new response context is not created for it.
+   Instead, the proxy layer searches its existing response contexts for
+   the server transaction handling the request associated with this
+   CANCEL.  If a matching response context is found, the element MUST
+   immediately return a 200 (OK) response to the CANCEL request.  In
+   this case, the element is acting as a user agent server as defined in
+   Section 8.2.  Furthermore, the element MUST generate CANCEL requests
+   for all pending client transactions in the context as described in
+   Section 16.7 step 10.
+
+   If a response context is not found, the element does not have any
+   knowledge of the request to apply the CANCEL to.  It MUST statelessly
+   forward the CANCEL request (it may have statelessly forwarded the
+   associated request previously).
+
+
+
+Rosenberg, et. al.          Standards Track                   [Page 115]
+
+RFC 3261            SIP: Session Initiation Protocol           June 2002
+
+
+16.11 Stateless Proxy
+
+   When acting statelessly, a proxy is a simple message forwarder.  Much
+   of the processing performed when acting statelessly is the same as
+   when behaving statefully.  The differences are detailed here.
+
+   A stateless proxy does not have any notion of a transaction, or of
+   the response context used to describe stateful proxy behavior.
+   Instead, the stateless proxy takes messages, both requests and
+   responses, directly from the transport layer (See section 18).  As a
+   result, stateless proxies do not retransmit messages on their own.
+   They do, however, forward all retransmissions they receive (they do
+   not have the ability to distinguish a retransmission from the
+   original message).  Furthermore, when handling a request statelessly,
+   an element MUST NOT generate its own 100 (Trying) or any other
+   provisional response.
+
+   A stateless proxy MUST validate a request as described in Section
+   16.3
+
+   A stateless proxy MUST follow the request processing steps described
+   in Sections 16.4 through 16.5 with the following exception:
+
+      o  A stateless proxy MUST choose one and only one target from the
+         target set.  This choice MUST only rely on fields in the
+         message and time-invariant properties of the server.  In
+         particular, a retransmitted request MUST be forwarded to the
+         same destination each time it is processed.  Furthermore,
+         CANCEL and non-Routed ACK requests MUST generate the same
+         choice as their associated INVITE.
+
+   A stateless proxy MUST follow the request processing steps described
+   in Section 16.6 with the following exceptions:
+
+      o  The requirement for unique branch IDs across space and time
+         applies to stateless proxies as well.  However, a stateless
+         proxy cannot simply use a random number generator to compute
+         the first component of the branch ID, as described in Section
+         16.6 bullet 8.  This is because retransmissions of a request
+         need to have the same value, and a stateless proxy cannot tell
+         a retransmission from the original request.  Therefore, the
+         component of the branch parameter that makes it unique MUST be
+         the same each time a retransmitted request is forwarded.  Thus
+         for a stateless proxy, the branch parameter MUST be computed as
+         a combinatoric function of message parameters which are
+         invariant on retransmission.
+
+
+
+
+
+Rosenberg, et. al.          Standards Track                   [Page 116]
+
+RFC 3261            SIP: Session Initiation Protocol           June 2002
+
+
+         The stateless proxy MAY use any technique it likes to guarantee
+         uniqueness of its branch IDs across transactions.  However, the
+         following procedure is RECOMMENDED.  The proxy examines the
+         branch ID in the topmost Via header field of the received
+         request.  If it begins with the magic cookie, the first
+         component of the branch ID of the outgoing request is computed
+         as a hash of the received branch ID.  Otherwise, the first
+         component of the branch ID is computed as a hash of the topmost
+         Via, the tag in the To header field, the tag in the From header
+         field, the Call-ID header field, the CSeq number (but not
+         method), and the Request-URI from the received request.  One of
+         these fields will always vary across two different
+         transactions.
+
+      o  All other message transformations specified in Section 16.6
+         MUST result in the same transformation of a retransmitted
+         request.  In particular, if the proxy inserts a Record-Route
+         value or pushes URIs into the Route header field, it MUST place
+         the same values in retransmissions of the request.  As for the
+         Via branch parameter, this implies that the transformations
+         MUST be based on time-invariant configuration or
+         retransmission-invariant properties of the request.
+
+      o  A stateless proxy determines where to forward the request as
+         described for stateful proxies in Section 16.6 Item 10.  The
+         request is sent directly to the transport layer instead of
+         through a client transaction.
+
+         Since a stateless proxy must forward retransmitted requests to
+         the same destination and add identical branch parameters to
+         each of them, it can only use information from the message
+         itself and time-invariant configuration data for those
+         calculations.  If the configuration state is not time-invariant
+         (for example, if a routing table is updated) any requests that
+         could be affected by the change may not be forwarded
+         statelessly during an interval equal to the transaction timeout
+         window before or after the change.  The method of processing
+         the affected requests in that interval is an implementation
+         decision.  A common solution is to forward them transaction
+         statefully.
+
+   Stateless proxies MUST NOT perform special processing for CANCEL
+   requests.  They are processed by the above rules as any other
+   requests.  In particular, a stateless proxy applies the same Route
+   header field processing to CANCEL requests that it applies to any
+   other request.
+
+
+
+
+
+Rosenberg, et. al.          Standards Track                   [Page 117]
+
+RFC 3261            SIP: Session Initiation Protocol           June 2002
+
+
+   Response processing as described in Section 16.7 does not apply to a
+   proxy behaving statelessly.  When a response arrives at a stateless
+   proxy, the proxy MUST inspect the sent-by value in the first
+   (topmost) Via header field value.  If that address matches the proxy,
+   (it equals a value this proxy has inserted into previous requests)
+   the proxy MUST remove that header field value from the response and
+   forward the result to the location indicated in the next Via header
+   field value.  The proxy MUST NOT add to, modify, or remove the
+   message body.  Unless specified otherwise, the proxy MUST NOT remove
+   any other header field values.  If the address does not match the
+   proxy, the message MUST be silently discarded.
+
+16.12 Summary of Proxy Route Processing
+
+   In the absence of local policy to the contrary, the processing a
+   proxy performs on a request containing a Route header field can be
+   summarized in the following steps.
+
+      1.  The proxy will inspect the Request-URI.  If it indicates a
+          resource owned by this proxy, the proxy will replace it with
+          the results of running a location service.  Otherwise, the
+          proxy will not change the Request-URI.
+
+      2.  The proxy will inspect the URI in the topmost Route header
+          field value.  If it indicates this proxy, the proxy removes it
+          from the Route header field (this route node has been
+          reached).
+
+      3.  The proxy will forward the request to the resource indicated
+          by the URI in the topmost Route header field value or in the
+          Request-URI if no Route header field is present.  The proxy
+          determines the address, port and transport to use when
+          forwarding the request by applying the procedures in [4] to
+          that URI.
+
+   If no strict-routing elements are encountered on the path of the
+   request, the Request-URI will always indicate the target of the
+   request.
+
+16.12.1 Examples
+
+16.12.1.1 Basic SIP Trapezoid
+
+   This scenario is the basic SIP trapezoid, U1 -> P1 -> P2 -> U2, with
+   both proxies record-routing.  Here is the flow.
+
+
+
+
+
+
+Rosenberg, et. al.          Standards Track                   [Page 118]
+
+RFC 3261            SIP: Session Initiation Protocol           June 2002
+
+
+   U1 sends:
+
+      INVITE sip:callee@domain.com SIP/2.0
+      Contact: sip:caller@u1.example.com
+
+   to P1.  P1 is an outbound proxy.  P1 is not responsible for
+   domain.com, so it looks it up in DNS and sends it there.  It also
+   adds a Record-Route header field value:
+
+      INVITE sip:callee@domain.com SIP/2.0
+      Contact: sip:caller@u1.example.com
+      Record-Route: <sip:p1.example.com;lr>
+
+   P2 gets this.  It is responsible for domain.com so it runs a location
+   service and rewrites the Request-URI.  It also adds a Record-Route
+   header field value.  There is no Route header field, so it resolves
+   the new Request-URI to determine where to send the request:
+
+      INVITE sip:callee@u2.domain.com SIP/2.0
+      Contact: sip:caller@u1.example.com
+      Record-Route: <sip:p2.domain.com;lr>
+      Record-Route: <sip:p1.example.com;lr>
+
+   The callee at u2.domain.com gets this and responds with a 200 OK:
+
+      SIP/2.0 200 OK
+      Contact: sip:callee@u2.domain.com
+      Record-Route: <sip:p2.domain.com;lr>
+      Record-Route: <sip:p1.example.com;lr>
+
+   The callee at u2 also sets its dialog state's remote target URI to
+   sip:caller@u1.example.com and its route set to:
+
+      (<sip:p2.domain.com;lr>,<sip:p1.example.com;lr>)
+
+   This is forwarded by P2 to P1 to U1 as normal.  Now, U1 sets its
+   dialog state's remote target URI to sip:callee@u2.domain.com and its
+   route set to:
+
+      (<sip:p1.example.com;lr>,<sip:p2.domain.com;lr>)
+
+   Since all the route set elements contain the lr parameter, U1
+   constructs the following BYE request:
+
+      BYE sip:callee@u2.domain.com SIP/2.0
+      Route: <sip:p1.example.com;lr>,<sip:p2.domain.com;lr>
+
+
+
+
+
+Rosenberg, et. al.          Standards Track                   [Page 119]
+
+RFC 3261            SIP: Session Initiation Protocol           June 2002
+
+
+   As any other element (including proxies) would do, it resolves the
+   URI in the topmost Route header field value using DNS to determine
+   where to send the request.  This goes to P1.  P1 notices that it is
+   not responsible for the resource indicated in the Request-URI so it
+   doesn't change it.  It does see that it is the first value in the
+   Route header field, so it removes that value, and forwards the
+   request to P2:
+
+      BYE sip:callee@u2.domain.com SIP/2.0
+      Route: <sip:p2.domain.com;lr>
+
+   P2 also notices it is not responsible for the resource indicated by
+   the Request-URI (it is responsible for domain.com, not
+   u2.domain.com), so it doesn't change it.  It does see itself in the
+   first Route header field value, so it removes it and forwards the
+   following to u2.domain.com based on a DNS lookup against the
+   Request-URI:
+
+      BYE sip:callee@u2.domain.com SIP/2.0
+
+16.12.1.2 Traversing a Strict-Routing Proxy
+
+   In this scenario, a dialog is established across four proxies, each
+   of which adds Record-Route header field values.  The third proxy
+   implements the strict-routing procedures specified in RFC 2543 and
+   many works in progress.
+
+      U1->P1->P2->P3->P4->U2
+
+   The INVITE arriving at U2 contains:
+
+      INVITE sip:callee@u2.domain.com SIP/2.0
+      Contact: sip:caller@u1.example.com
+      Record-Route: <sip:p4.domain.com;lr>
+      Record-Route: <sip:p3.middle.com>
+      Record-Route: <sip:p2.example.com;lr>
+      Record-Route: <sip:p1.example.com;lr>
+
+   Which U2 responds to with a 200 OK.  Later, U2 sends the following
+   BYE request to P4 based on the first Route header field value.
+
+      BYE sip:caller@u1.example.com SIP/2.0
+      Route: <sip:p4.domain.com;lr>
+      Route: <sip:p3.middle.com>
+      Route: <sip:p2.example.com;lr>
+      Route: <sip:p1.example.com;lr>
+
+
+
+
+
+Rosenberg, et. al.          Standards Track                   [Page 120]
+
+RFC 3261            SIP: Session Initiation Protocol           June 2002
+
+
+   P4 is not responsible for the resource indicated in the Request-URI
+   so it will leave it alone.  It notices that it is the element in the
+   first Route header field value so it removes it.  It then prepares to
+   send the request based on the now first Route header field value of
+   sip:p3.middle.com, but it notices that this URI does not contain the
+   lr parameter, so before sending, it reformats the request to be:
+
+      BYE sip:p3.middle.com SIP/2.0
+      Route: <sip:p2.example.com;lr>
+      Route: <sip:p1.example.com;lr>
+      Route: <sip:caller@u1.example.com>
+
+   P3 is a strict router, so it forwards the following to P2:
+
+      BYE sip:p2.example.com;lr SIP/2.0
+      Route: <sip:p1.example.com;lr>
+      Route: <sip:caller@u1.example.com>
+
+   P2 sees the request-URI is a value it placed into a Record-Route
+   header field, so before further processing, it rewrites the request
+   to be:
+
+      BYE sip:caller@u1.example.com SIP/2.0
+      Route: <sip:p1.example.com;lr>
+
+   P2 is not responsible for u1.example.com, so it sends the request to
+   P1 based on the resolution of the Route header field value.
+
+   P1 notices itself in the topmost Route header field value, so it
+   removes it, resulting in:
+
+      BYE sip:caller@u1.example.com SIP/2.0
+
+   Since P1 is not responsible for u1.example.com and there is no Route
+   header field, P1 will forward the request to u1.example.com based on
+   the Request-URI.
+
+16.12.1.3 Rewriting Record-Route Header Field Values
+
+   In this scenario, U1 and U2 are in different private namespaces and
+   they enter a dialog through a proxy P1, which acts as a gateway
+   between the namespaces.
+
+      U1->P1->U2
+
+
+
+
+
+
+
+Rosenberg, et. al.          Standards Track                   [Page 121]
+
+RFC 3261            SIP: Session Initiation Protocol           June 2002
+
+
+   U1 sends:
+
+      INVITE sip:callee@gateway.leftprivatespace.com SIP/2.0
+      Contact: <sip:caller@u1.leftprivatespace.com>
+
+   P1 uses its location service and sends the following to U2:
+
+      INVITE sip:callee@rightprivatespace.com SIP/2.0
+      Contact: <sip:caller@u1.leftprivatespace.com>
+      Record-Route: <sip:gateway.rightprivatespace.com;lr>
+
+   U2 sends this 200 (OK) back to P1:
+
+      SIP/2.0 200 OK
+      Contact: <sip:callee@u2.rightprivatespace.com>
+      Record-Route: <sip:gateway.rightprivatespace.com;lr>
+
+   P1 rewrites its Record-Route header parameter to provide a value that
+   U1 will find useful, and sends the following to U1:
+
+      SIP/2.0 200 OK
+      Contact: <sip:callee@u2.rightprivatespace.com>
+      Record-Route: <sip:gateway.leftprivatespace.com;lr>
+
+   Later, U1 sends the following BYE request to P1:
+
+      BYE sip:callee@u2.rightprivatespace.com SIP/2.0
+      Route: <sip:gateway.leftprivatespace.com;lr>
+
+   which P1 forwards to U2 as:
+
+      BYE sip:callee@u2.rightprivatespace.com SIP/2.0
+
+17 Transactions
+
+   SIP is a transactional protocol: interactions between components take
+   place in a series of independent message exchanges.  Specifically, a
+   SIP transaction consists of a single request and any responses to
+   that request, which include zero or more provisional responses and
+   one or more final responses.  In the case of a transaction where the
+   request was an INVITE (known as an INVITE transaction), the
+   transaction also includes the ACK only if the final response was not
+   a 2xx response.  If the response was a 2xx, the ACK is not considered
+   part of the transaction.
+
+      The reason for this separation is rooted in the importance of
+      delivering all 200 (OK) responses to an INVITE to the UAC.  To
+      deliver them all to the UAC, the UAS alone takes responsibility
+
+
+
+Rosenberg, et. al.          Standards Track                   [Page 122]
+
+RFC 3261            SIP: Session Initiation Protocol           June 2002
+
+
+      for retransmitting them (see Section 13.3.1.4), and the UAC alone
+      takes responsibility for acknowledging them with ACK (see Section
+      13.2.2.4).  Since this ACK is retransmitted only by the UAC, it is
+      effectively considered its own transaction.
+
+   Transactions have a client side and a server side.  The client side
+   is known as a client transaction and the server side as a server
+   transaction.  The client transaction sends the request, and the
+   server transaction sends the response.  The client and server
+   transactions are logical functions that are embedded in any number of
+   elements.  Specifically, they exist within user agents and stateful
+   proxy servers.  Consider the example in Section 4.  In this example,
+   the UAC executes the client transaction, and its outbound proxy
+   executes the server transaction.  The outbound proxy also executes a
+   client transaction, which sends the request to a server transaction
+   in the inbound proxy.  That proxy also executes a client transaction,
+   which in turn sends the request to a server transaction in the UAS.
+   This is shown in Figure 4.
+
+   +---------+        +---------+        +---------+        +---------+
+   |      +-+|Request |+-+   +-+|Request |+-+   +-+|Request |+-+      |
+   |      |C||------->||S|   |C||------->||S|   |C||------->||S|      |
+   |      |l||        ||e|   |l||        ||e|   |l||        ||e|      |
+   |      |i||        ||r|   |i||        ||r|   |i||        ||r|      |
+   |      |e||        ||v|   |e||        ||v|   |e||        ||v|      |
+   |      |n||        ||e|   |n||        ||e|   |n||        ||e|      |
+   |      |t||        ||r|   |t||        ||r|   |t||        ||r|      |
+   |      | ||        || |   | ||        || |   | ||        || |      |
+   |      |T||        ||T|   |T||        ||T|   |T||        ||T|      |
+   |      |r||        ||r|   |r||        ||r|   |r||        ||r|      |
+   |      |a||        ||a|   |a||        ||a|   |a||        ||a|      |
+   |      |n||        ||n|   |n||        ||n|   |n||        ||n|      |
+   |      |s||Response||s|   |s||Response||s|   |s||Response||s|      |
+   |      +-+|<-------|+-+   +-+|<-------|+-+   +-+|<-------|+-+      |
+   +---------+        +---------+        +---------+        +---------+
+      UAC               Outbound           Inbound              UAS
+                        Proxy               Proxy
+
+                  Figure 4: Transaction relationships
+
+   A stateless proxy does not contain a client or server transaction.
+   The transaction exists between the UA or stateful proxy on one side,
+   and the UA or stateful proxy on the other side.  As far as SIP
+   transactions are concerned, stateless proxies are effectively
+   transparent.  The purpose of the client transaction is to receive a
+   request from the element in which the client is embedded (call this
+   element the "Transaction User" or TU; it can be a UA or a stateful
+   proxy), and reliably deliver the request to a server transaction.
+
+
+
+Rosenberg, et. al.          Standards Track                   [Page 123]
+
+RFC 3261            SIP: Session Initiation Protocol           June 2002
+
+
+   The client transaction is also responsible for receiving responses
+   and delivering them to the TU, filtering out any response
+   retransmissions or disallowed responses (such as a response to ACK).
+   Additionally, in the case of an INVITE request, the client
+   transaction is responsible for generating the ACK request for any
+   final response accepting a 2xx response.
+
+   Similarly, the purpose of the server transaction is to receive
+   requests from the transport layer and deliver them to the TU.  The
+   server transaction filters any request retransmissions from the
+   network.  The server transaction accepts responses from the TU and
+   delivers them to the transport layer for transmission over the
+   network.  In the case of an INVITE transaction, it absorbs the ACK
+   request for any final response excepting a 2xx response.
+
+   The 2xx response and its ACK receive special treatment.  This
+   response is retransmitted only by a UAS, and its ACK generated only
+   by the UAC.  This end-to-end treatment is needed so that a caller
+   knows the entire set of users that have accepted the call.  Because
+   of this special handling, retransmissions of the 2xx response are
+   handled by the UA core, not the transaction layer.  Similarly,
+   generation of the ACK for the 2xx is handled by the UA core.  Each
+   proxy along the path merely forwards each 2xx response to INVITE and
+   its corresponding ACK.
+
+17.1 Client Transaction
+
+   The client transaction provides its functionality through the
+   maintenance of a state machine.
+
+   The TU communicates with the client transaction through a simple
+   interface.  When the TU wishes to initiate a new transaction, it
+   creates a client transaction and passes it the SIP request to send
+   and an IP address, port, and transport to which to send it.  The
+   client transaction begins execution of its state machine.  Valid
+   responses are passed up to the TU from the client transaction.
+
+   There are two types of client transaction state machines, depending
+   on the method of the request passed by the TU.  One handles client
+   transactions for INVITE requests.  This type of machine is referred
+   to as an INVITE client transaction.  Another type handles client
+   transactions for all requests except INVITE and ACK.  This is
+   referred to as a non-INVITE client transaction.  There is no client
+   transaction for ACK.  If the TU wishes to send an ACK, it passes one
+   directly to the transport layer for transmission.
+
+
+
+
+
+
+Rosenberg, et. al.          Standards Track                   [Page 124]
+
+RFC 3261            SIP: Session Initiation Protocol           June 2002
+
+
+   The INVITE transaction is different from those of other methods
+   because of its extended duration.  Normally, human input is required
+   in order to respond to an INVITE.  The long delays expected for
+   sending a response argue for a three-way handshake.  On the other
+   hand, requests of other methods are expected to complete rapidly.
+   Because of the non-INVITE transaction's reliance on a two-way
+   handshake, TUs SHOULD respond immediately to non-INVITE requests.
+
+17.1.1 INVITE Client Transaction
+
+17.1.1.1 Overview of INVITE Transaction
+
+   The INVITE transaction consists of a three-way handshake.  The client
+   transaction sends an INVITE, the server transaction sends responses,
+   and the client transaction sends an ACK.  For unreliable transports
+   (such as UDP), the client transaction retransmits requests at an
+   interval that starts at T1 seconds and doubles after every
+   retransmission.  T1 is an estimate of the round-trip time (RTT), and
+   it defaults to 500 ms.  Nearly all of the transaction timers
+   described here scale with T1, and changing T1 adjusts their values.
+   The request is not retransmitted over reliable transports.  After
+   receiving a 1xx response, any retransmissions cease altogether, and
+   the client waits for further responses.  The server transaction can
+   send additional 1xx responses, which are not transmitted reliably by
+   the server transaction.  Eventually, the server transaction decides
+   to send a final response.  For unreliable transports, that response
+   is retransmitted periodically, and for reliable transports, it is
+   sent once.  For each final response that is received at the client
+   transaction, the client transaction sends an ACK, the purpose of
+   which is to quench retransmissions of the response.
+
+17.1.1.2 Formal Description
+
+   The state machine for the INVITE client transaction is shown in
+   Figure 5.  The initial state, "calling", MUST be entered when the TU
+   initiates a new client transaction with an INVITE request.  The
+   client transaction MUST pass the request to the transport layer for
+   transmission (see Section 18).  If an unreliable transport is being
+   used, the client transaction MUST start timer A with a value of T1.
+   If a reliable transport is being used, the client transaction SHOULD
+   NOT start timer A (Timer A controls request retransmissions).  For
+   any transport, the client transaction MUST start timer B with a value
+   of 64*T1 seconds (Timer B controls transaction timeouts).
+
+   When timer A fires, the client transaction MUST retransmit the
+   request by passing it to the transport layer, and MUST reset the
+   timer with a value of 2*T1.  The formal definition of retransmit
+
+
+
+
+Rosenberg, et. al.          Standards Track                   [Page 125]
+
+RFC 3261            SIP: Session Initiation Protocol           June 2002
+
+
+   within the context of the transaction layer is to take the message
+   previously sent to the transport layer and pass it to the transport
+   layer once more.
+
+   When timer A fires 2*T1 seconds later, the request MUST be
+   retransmitted again (assuming the client transaction is still in this
+   state).  This process MUST continue so that the request is
+   retransmitted with intervals that double after each transmission.
+   These retransmissions SHOULD only be done while the client
+   transaction is in the "calling" state.
+
+   The default value for T1 is 500 ms.  T1 is an estimate of the RTT
+   between the client and server transactions.  Elements MAY (though it
+   is NOT RECOMMENDED) use smaller values of T1 within closed, private
+   networks that do not permit general Internet connection.  T1 MAY be
+   chosen larger, and this is RECOMMENDED if it is known in advance
+   (such as on high latency access links) that the RTT is larger.
+   Whatever the value of T1, the exponential backoffs on retransmissions
+   described in this section MUST be used.
+
+   If the client transaction is still in the "Calling" state when timer
+   B fires, the client transaction SHOULD inform the TU that a timeout
+   has occurred.  The client transaction MUST NOT generate an ACK.  The
+   value of 64*T1 is equal to the amount of time required to send seven
+   requests in the case of an unreliable transport.
+
+   If the client transaction receives a provisional response while in
+   the "Calling" state, it transitions to the "Proceeding" state. In the
+   "Proceeding" state, the client transaction SHOULD NOT retransmit the
+   request any longer. Furthermore, the provisional response MUST be
+   passed to the TU.  Any further provisional responses MUST be passed
+   up to the TU while in the "Proceeding" state.
+
+   When in either the "Calling" or "Proceeding" states, reception of a
+   response with status code from 300-699 MUST cause the client
+   transaction to transition to "Completed".  The client transaction
+   MUST pass the received response up to the TU, and the client
+   transaction MUST generate an ACK request, even if the transport is
+   reliable (guidelines for constructing the ACK from the response are
+   given in Section 17.1.1.3) and then pass the ACK to the transport
+   layer for transmission.  The ACK MUST be sent to the same address,
+   port, and transport to which the original request was sent.  The
+   client transaction SHOULD start timer D when it enters the
+   "Completed" state, with a value of at least 32 seconds for unreliable
+   transports, and a value of zero seconds for reliable transports.
+   Timer D reflects the amount of time that the server transaction can
+   remain in the "Completed" state when unreliable transports are used.
+   This is equal to Timer H in the INVITE server transaction, whose
+
+
+
+Rosenberg, et. al.          Standards Track                   [Page 126]
+
+RFC 3261            SIP: Session Initiation Protocol           June 2002
+
+
+   default is 64*T1.  However, the client transaction does not know the
+   value of T1 in use by the server transaction, so an absolute minimum
+   of 32s is used instead of basing Timer D on T1.
+
+   Any retransmissions of the final response that are received while in
+   the "Completed" state MUST cause the ACK to be re-passed to the
+   transport layer for retransmission, but the newly received response
+   MUST NOT be passed up to the TU.  A retransmission of the response is
+   defined as any response which would match the same client transaction
+   based on the rules of Section 17.1.3.
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+Rosenberg, et. al.          Standards Track                   [Page 127]
+
+RFC 3261            SIP: Session Initiation Protocol           June 2002
+
+
+                               |INVITE from TU
+             Timer A fires     |INVITE sent
+             Reset A,          V                      Timer B fires
+             INVITE sent +-----------+                or Transport Err.
+               +---------|           |---------------+inform TU
+               |         |  Calling  |               |
+               +-------->|           |-------------->|
+                         +-----------+ 2xx           |
+                            |  |       2xx to TU     |
+                            |  |1xx                  |
+    300-699 +---------------+  |1xx to TU            |
+   ACK sent |                  |                     |
+resp. to TU |  1xx             V                     |
+            |  1xx to TU  -----------+               |
+            |  +---------|           |               |
+            |  |         |Proceeding |-------------->|
+            |  +-------->|           | 2xx           |
+            |            +-----------+ 2xx to TU     |
+            |       300-699    |                     |
+            |       ACK sent,  |                     |
+            |       resp. to TU|                     |
+            |                  |                     |      NOTE:
+            |  300-699         V                     |
+            |  ACK sent  +-----------+Transport Err. |  transitions
+            |  +---------|           |Inform TU      |  labeled with
+            |  |         | Completed |-------------->|  the event
+            |  +-------->|           |               |  over the action
+            |            +-----------+               |  to take
+            |              ^   |                     |
+            |              |   | Timer D fires       |
+            +--------------+   | -                   |
+                               |                     |
+                               V                     |
+                         +-----------+               |
+                         |           |               |
+                         | Terminated|<--------------+
+                         |           |
+                         +-----------+
+
+                 Figure 5: INVITE client transaction
+
+   If timer D fires while the client transaction is in the "Completed"
+   state, the client transaction MUST move to the terminated state.
+
+   When in either the "Calling" or "Proceeding" states, reception of a
+   2xx response MUST cause the client transaction to enter the
+   "Terminated" state, and the response MUST be passed up to the TU.
+   The handling of this response depends on whether the TU is a proxy
+
+
+
+Rosenberg, et. al.          Standards Track                   [Page 128]
+
+RFC 3261            SIP: Session Initiation Protocol           June 2002
+
+
+   core or a UAC core.  A UAC core will handle generation of the ACK for
+   this response, while a proxy core will always forward the 200 (OK)
+   upstream.  The differing treatment of 200 (OK) between proxy and UAC
+   is the reason that handling of it does not take place in the
+   transaction layer.
+
+   The client transaction MUST be destroyed the instant it enters the
+   "Terminated" state.  This is actually necessary to guarantee correct
+   operation.  The reason is that 2xx responses to an INVITE are treated
+   differently; each one is forwarded by proxies, and the ACK handling
+   in a UAC is different.  Thus, each 2xx needs to be passed to a proxy
+   core (so that it can be forwarded) and to a UAC core (so it can be
+   acknowledged).  No transaction layer processing takes place.
+   Whenever a response is received by the transport, if the transport
+   layer finds no matching client transaction (using the rules of
+   Section 17.1.3), the response is passed directly to the core.  Since
+   the matching client transaction is destroyed by the first 2xx,
+   subsequent 2xx will find no match and therefore be passed to the
+   core.
+
+17.1.1.3 Construction of the ACK Request
+
+   This section specifies the construction of ACK requests sent within
+   the client transaction.  A UAC core that generates an ACK for 2xx
+   MUST instead follow the rules described in Section 13.
+
+   The ACK request constructed by the client transaction MUST contain
+   values for the Call-ID, From, and Request-URI that are equal to the
+   values of those header fields in the request passed to the transport
+   by the client transaction (call this the "original request").  The To
+   header field in the ACK MUST equal the To header field in the
+   response being acknowledged, and therefore will usually differ from
+   the To header field in the original request by the addition of the
+   tag parameter.  The ACK MUST contain a single Via header field, and
+   this MUST be equal to the top Via header field of the original
+   request.  The CSeq header field in the ACK MUST contain the same
+   value for the sequence number as was present in the original request,
+   but the method parameter MUST be equal to "ACK".
+
+
+
+
+
+
+
+
+
+
+
+
+
+Rosenberg, et. al.          Standards Track                   [Page 129]
+
+RFC 3261            SIP: Session Initiation Protocol           June 2002
+
+
+   If the INVITE request whose response is being acknowledged had Route
+   header fields, those header fields MUST appear in the ACK.  This is
+   to ensure that the ACK can be routed properly through any downstream
+   stateless proxies.
+
+   Although any request MAY contain a body, a body in an ACK is special
+   since the request cannot be rejected if the body is not understood.
+   Therefore, placement of bodies in ACK for non-2xx is NOT RECOMMENDED,
+   but if done, the body types are restricted to any that appeared in
+   the INVITE, assuming that the response to the INVITE was not 415.  If
+   it was, the body in the ACK MAY be any type listed in the Accept
+   header field in the 415.
+
+   For example, consider the following request:
+
+   INVITE sip:bob@biloxi.com SIP/2.0
+   Via: SIP/2.0/UDP pc33.atlanta.com;branch=z9hG4bKkjshdyff
+   To: Bob <sip:bob@biloxi.com>
+   From: Alice <sip:alice@atlanta.com>;tag=88sja8x
+   Max-Forwards: 70
+   Call-ID: 987asjd97y7atg
+   CSeq: 986759 INVITE
+
+   The ACK request for a non-2xx final response to this request would
+   look like this:
+
+   ACK sip:bob@biloxi.com SIP/2.0
+   Via: SIP/2.0/UDP pc33.atlanta.com;branch=z9hG4bKkjshdyff
+   To: Bob <sip:bob@biloxi.com>;tag=99sa0xk
+   From: Alice <sip:alice@atlanta.com>;tag=88sja8x
+   Max-Forwards: 70
+   Call-ID: 987asjd97y7atg
+   CSeq: 986759 ACK
+
+17.1.2 Non-INVITE Client Transaction
+
+17.1.2.1 Overview of the non-INVITE Transaction
+
+   Non-INVITE transactions do not make use of ACK.  They are simple
+   request-response interactions.  For unreliable transports, requests
+   are retransmitted at an interval which starts at T1 and doubles until
+   it hits T2.  If a provisional response is received, retransmissions
+   continue for unreliable transports, but at an interval of T2.  The
+   server transaction retransmits the last response it sent, which can
+   be a provisional or final response, only when a retransmission of the
+   request is received.  This is why request retransmissions need to
+   continue even after a provisional response; they are to ensure
+   reliable delivery of the final response.
+
+
+
+Rosenberg, et. al.          Standards Track                   [Page 130]
+
+RFC 3261            SIP: Session Initiation Protocol           June 2002
+
+
+   Unlike an INVITE transaction, a non-INVITE transaction has no special
+   handling for the 2xx response.  The result is that only a single 2xx
+   response to a non-INVITE is ever delivered to a UAC.
+
+17.1.2.2 Formal Description
+
+   The state machine for the non-INVITE client transaction is shown in
+   Figure 6.  It is very similar to the state machine for INVITE.
+
+   The "Trying" state is entered when the TU initiates a new client
+   transaction with a request.  When entering this state, the client
+   transaction SHOULD set timer F to fire in 64*T1 seconds.  The request
+   MUST be passed to the transport layer for transmission.  If an
+   unreliable transport is in use, the client transaction MUST set timer
+   E to fire in T1 seconds.  If timer E fires while still in this state,
+   the timer is reset, but this time with a value of MIN(2*T1, T2).
+   When the timer fires again, it is reset to a MIN(4*T1, T2).  This
+   process continues so that retransmissions occur with an exponentially
+   increasing interval that caps at T2.  The default value of T2 is 4s,
+   and it represents the amount of time a non-INVITE server transaction
+   will take to respond to a request, if it does not respond
+   immediately.  For the default values of T1 and T2, this results in
+   intervals of 500 ms, 1 s, 2 s, 4 s, 4 s, 4 s, etc.
+
+   If Timer F fires while the client transaction is still in the
+   "Trying" state, the client transaction SHOULD inform the TU about the
+   timeout, and then it SHOULD enter the "Terminated" state.  If a
+   provisional response is received while in the "Trying" state, the
+   response MUST be passed to the TU, and then the client transaction
+   SHOULD move to the "Proceeding" state.  If a final response (status
+   codes 200-699) is received while in the "Trying" state, the response
+   MUST be passed to the TU, and the client transaction MUST transition
+   to the "Completed" state.
+
+   If Timer E fires while in the "Proceeding" state, the request MUST be
+   passed to the transport layer for retransmission, and Timer E MUST be
+   reset with a value of T2 seconds.  If timer F fires while in the
+   "Proceeding" state, the TU MUST be informed of a timeout, and the
+   client transaction MUST transition to the terminated state.  If a
+   final response (status codes 200-699) is received while in the
+   "Proceeding" state, the response MUST be passed to the TU, and the
+   client transaction MUST transition to the "Completed" state.
+
+   Once the client transaction enters the "Completed" state, it MUST set
+   Timer K to fire in T4 seconds for unreliable transports, and zero
+   seconds for reliable transports.  The "Completed" state exists to
+   buffer any additional response retransmissions that may be received
+   (which is why the client transaction remains there only for
+
+
+
+Rosenberg, et. al.          Standards Track                   [Page 131]
+
+RFC 3261            SIP: Session Initiation Protocol           June 2002
+
+
+   unreliable transports).  T4 represents the amount of time the network
+   will take to clear messages between client and server transactions.
+   The default value of T4 is 5s.  A response is a retransmission when
+   it matches the same transaction, using the rules specified in Section
+   17.1.3.  If Timer K fires while in this state, the client transaction
+   MUST transition to the "Terminated" state.
+
+   Once the transaction is in the terminated state, it MUST be destroyed
+   immediately.
+
+17.1.3 Matching Responses to Client Transactions
+
+   When the transport layer in the client receives a response, it has to
+   determine which client transaction will handle the response, so that
+   the processing of Sections 17.1.1 and 17.1.2 can take place.  The
+   branch parameter in the top Via header field is used for this
+   purpose.  A response matches a client transaction under two
+   conditions:
+
+      1.  If the response has the same value of the branch parameter in
+          the top Via header field as the branch parameter in the top
+          Via header field of the request that created the transaction.
+
+      2.  If the method parameter in the CSeq header field matches the
+          method of the request that created the transaction.  The
+          method is needed since a CANCEL request constitutes a
+          different transaction, but shares the same value of the branch
+          parameter.
+
+   If a request is sent via multicast, it is possible that it will
+   generate multiple responses from different servers.  These responses
+   will all have the same branch parameter in the topmost Via, but vary
+   in the To tag.  The first response received, based on the rules
+   above, will be used, and others will be viewed as retransmissions.
+   That is not an error; multicast SIP provides only a rudimentary
+   "single-hop-discovery-like" service that is limited to processing a
+   single response.  See Section 18.1.1 for details.
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+Rosenberg, et. al.          Standards Track                   [Page 132]
+
+RFC 3261            SIP: Session Initiation Protocol           June 2002
+
+
+17.1.4 Handling Transport Errors
+
+                                   |Request from TU
+                                   |send request
+               Timer E             V
+               send request  +-----------+
+                   +---------|           |-------------------+
+                   |         |  Trying   |  Timer F          |
+                   +-------->|           |  or Transport Err.|
+                             +-----------+  inform TU        |
+                200-699         |  |                         |
+                resp. to TU     |  |1xx                      |
+                +---------------+  |resp. to TU              |
+                |                  |                         |
+                |   Timer E        V       Timer F           |
+                |   send req +-----------+ or Transport Err. |
+                |  +---------|           | inform TU         |
+                |  |         |Proceeding |------------------>|
+                |  +-------->|           |-----+             |
+                |            +-----------+     |1xx          |
+                |              |      ^        |resp to TU   |
+                | 200-699      |      +--------+             |
+                | resp. to TU  |                             |
+                |              |                             |
+                |              V                             |
+                |            +-----------+                   |
+                |            |           |                   |
+                |            | Completed |                   |
+                |            |           |                   |
+                |            +-----------+                   |
+                |              ^   |                         |
+                |              |   | Timer K                 |
+                +--------------+   | -                       |
+                                   |                         |
+                                   V                         |
+             NOTE:           +-----------+                   |
+                             |           |                   |
+         transitions         | Terminated|<------------------+
+         labeled with        |           |
+         the event           +-----------+
+         over the action
+         to take
+
+                 Figure 6: non-INVITE client transaction
+
+   When the client transaction sends a request to the transport layer to
+   be sent, the following procedures are followed if the transport layer
+   indicates a failure.
+
+
+
+Rosenberg, et. al.          Standards Track                   [Page 133]
+
+RFC 3261            SIP: Session Initiation Protocol           June 2002
+
+
+   The client transaction SHOULD inform the TU that a transport failure
+   has occurred, and the client transaction SHOULD transition directly
+   to the "Terminated" state.  The TU will handle the failover
+   mechanisms described in [4].
+
+17.2 Server Transaction
+
+   The server transaction is responsible for the delivery of requests to
+   the TU and the reliable transmission of responses.  It accomplishes
+   this through a state machine.  Server transactions are created by the
+   core when a request is received, and transaction handling is desired
+   for that request (this is not always the case).
+
+   As with the client transactions, the state machine depends on whether
+   the received request is an INVITE request.
+
+17.2.1 INVITE Server Transaction
+
+   The state diagram for the INVITE server transaction is shown in
+   Figure 7.
+
+   When a server transaction is constructed for a request, it enters the
+   "Proceeding" state.  The server transaction MUST generate a 100
+   (Trying) response unless it knows that the TU will generate a
+   provisional or final response within 200 ms, in which case it MAY
+   generate a 100 (Trying) response.  This provisional response is
+   needed to quench request retransmissions rapidly in order to avoid
+   network congestion.  The 100 (Trying) response is constructed
+   according to the procedures in Section 8.2.6, except that the
+   insertion of tags in the To header field of the response (when none
+   was present in the request) is downgraded from MAY to SHOULD NOT.
+   The request MUST be passed to the TU.
+
+   The TU passes any number of provisional responses to the server
+   transaction.  So long as the server transaction is in the
+   "Proceeding" state, each of these MUST be passed to the transport
+   layer for transmission.  They are not sent reliably by the
+   transaction layer (they are not retransmitted by it) and do not cause
+   a change in the state of the server transaction.  If a request
+   retransmission is received while in the "Proceeding" state, the most
+   recent provisional response that was received from the TU MUST be
+   passed to the transport layer for retransmission.  A request is a
+   retransmission if it matches the same server transaction based on the
+   rules of Section 17.2.3.
+
+   If, while in the "Proceeding" state, the TU passes a 2xx response to
+   the server transaction, the server transaction MUST pass this
+   response to the transport layer for transmission.  It is not
+
+
+
+Rosenberg, et. al.          Standards Track                   [Page 134]
+
+RFC 3261            SIP: Session Initiation Protocol           June 2002
+
+
+   retransmitted by the server transaction; retransmissions of 2xx
+   responses are handled by the TU.  The server transaction MUST then
+   transition to the "Terminated" state.
+
+   While in the "Proceeding" state, if the TU passes a response with
+   status code from 300 to 699 to the server transaction, the response
+   MUST be passed to the transport layer for transmission, and the state
+   machine MUST enter the "Completed" state.  For unreliable transports,
+   timer G is set to fire in T1 seconds, and is not set to fire for
+   reliable transports.
+
+      This is a change from RFC 2543, where responses were always
+      retransmitted, even over reliable transports.
+
+   When the "Completed" state is entered, timer H MUST be set to fire in
+   64*T1 seconds for all transports.  Timer H determines when the server
+   transaction abandons retransmitting the response.  Its value is
+   chosen to equal Timer B, the amount of time a client transaction will
+   continue to retry sending a request.  If timer G fires, the response
+   is passed to the transport layer once more for retransmission, and
+   timer G is set to fire in MIN(2*T1, T2) seconds.  From then on, when
+   timer G fires, the response is passed to the transport again for
+   transmission, and timer G is reset with a value that doubles, unless
+   that value exceeds T2, in which case it is reset with the value of
+   T2.  This is identical to the retransmit behavior for requests in the
+   "Trying" state of the non-INVITE client transaction.  Furthermore,
+   while in the "Completed" state, if a request retransmission is
+   received, the server SHOULD pass the response to the transport for
+   retransmission.
+
+   If an ACK is received while the server transaction is in the
+   "Completed" state, the server transaction MUST transition to the
+   "Confirmed" state.  As Timer G is ignored in this state, any
+   retransmissions of the response will cease.
+
+   If timer H fires while in the "Completed" state, it implies that the
+   ACK was never received.  In this case, the server transaction MUST
+   transition to the "Terminated" state, and MUST indicate to the TU
+   that a transaction failure has occurred.
+
+
+
+
+
+
+
+
+
+
+
+
+Rosenberg, et. al.          Standards Track                   [Page 135]
+
+RFC 3261            SIP: Session Initiation Protocol           June 2002
+
+
+                               |INVITE
+                               |pass INV to TU
+            INVITE             V send 100 if TU won't in 200ms
+            send response+-----------+
+                +--------|           |--------+101-199 from TU
+                |        | Proceeding|        |send response
+                +------->|           |<-------+
+                         |           |          Transport Err.
+                         |           |          Inform TU
+                         |           |--------------->+
+                         +-----------+                |
+            300-699 from TU |     |2xx from TU        |
+            send response   |     |send response      |
+                            |     +------------------>+
+                            |                         |
+            INVITE          V          Timer G fires  |
+            send response+-----------+ send response  |
+                +--------|           |--------+       |
+                |        | Completed |        |       |
+                +------->|           |<-------+       |
+                         +-----------+                |
+                            |     |                   |
+                        ACK |     |                   |
+                        -   |     +------------------>+
+                            |        Timer H fires    |
+                            V        or Transport Err.|
+                         +-----------+  Inform TU     |
+                         |           |                |
+                         | Confirmed |                |
+                         |           |                |
+                         +-----------+                |
+                               |                      |
+                               |Timer I fires         |
+                               |-                     |
+                               |                      |
+                               V                      |
+                         +-----------+                |
+                         |           |                |
+                         | Terminated|<---------------+
+                         |           |
+                         +-----------+
+
+              Figure 7: INVITE server transaction
+
+
+
+
+
+
+
+
+Rosenberg, et. al.          Standards Track                   [Page 136]
+
+RFC 3261            SIP: Session Initiation Protocol           June 2002
+
+
+   The purpose of the "Confirmed" state is to absorb any additional ACK
+   messages that arrive, triggered from retransmissions of the final
+   response.  When this state is entered, timer I is set to fire in T4
+   seconds for unreliable transports, and zero seconds for reliable
+   transports.  Once timer I fires, the server MUST transition to the
+   "Terminated" state.
+
+   Once the transaction is in the "Terminated" state, it MUST be
+   destroyed immediately.  As with client transactions, this is needed
+   to ensure reliability of the 2xx responses to INVITE.
+
+17.2.2 Non-INVITE Server Transaction
+
+   The state machine for the non-INVITE server transaction is shown in
+   Figure 8.
+
+   The state machine is initialized in the "Trying" state and is passed
+   a request other than INVITE or ACK when initialized.  This request is
+   passed up to the TU.  Once in the "Trying" state, any further request
+   retransmissions are discarded.  A request is a retransmission if it
+   matches the same server transaction, using the rules specified in
+   Section 17.2.3.
+
+   While in the "Trying" state, if the TU passes a provisional response
+   to the server transaction, the server transaction MUST enter the
+   "Proceeding" state.  The response MUST be passed to the transport
+   layer for transmission.  Any further provisional responses that are
+   received from the TU while in the "Proceeding" state MUST be passed
+   to the transport layer for transmission.  If a retransmission of the
+   request is received while in the "Proceeding" state, the most
+   recently sent provisional response MUST be passed to the transport
+   layer for retransmission.  If the TU passes a final response (status
+   codes 200-699) to the server while in the "Proceeding" state, the
+   transaction MUST enter the "Completed" state, and the response MUST
+   be passed to the transport layer for transmission.
+
+   When the server transaction enters the "Completed" state, it MUST set
+   Timer J to fire in 64*T1 seconds for unreliable transports, and zero
+   seconds for reliable transports.  While in the "Completed" state, the
+   server transaction MUST pass the final response to the transport
+   layer for retransmission whenever a retransmission of the request is
+   received.  Any other final responses passed by the TU to the server
+   transaction MUST be discarded while in the "Completed" state.  The
+   server transaction remains in this state until Timer J fires, at
+   which point it MUST transition to the "Terminated" state.
+
+   The server transaction MUST be destroyed the instant it enters the
+   "Terminated" state.
+
+
+
+Rosenberg, et. al.          Standards Track                   [Page 137]
+
+RFC 3261            SIP: Session Initiation Protocol           June 2002
+
+
+17.2.3 Matching Requests to Server Transactions
+
+   When a request is received from the network by the server, it has to
+   be matched to an existing transaction.  This is accomplished in the
+   following manner.
+
+   The branch parameter in the topmost Via header field of the request
+   is examined.  If it is present and begins with the magic cookie
+   "z9hG4bK", the request was generated by a client transaction
+   compliant to this specification.  Therefore, the branch parameter
+   will be unique across all transactions sent by that client.  The
+   request matches a transaction if:
+
+      1. the branch parameter in the request is equal to the one in the
+         top Via header field of the request that created the
+         transaction, and
+
+      2. the sent-by value in the top Via of the request is equal to the
+         one in the request that created the transaction, and
+
+      3. the method of the request matches the one that created the
+         transaction, except for ACK, where the method of the request
+         that created the transaction is INVITE.
+
+   This matching rule applies to both INVITE and non-INVITE transactions
+   alike.
+
+      The sent-by value is used as part of the matching process because
+      there could be accidental or malicious duplication of branch
+      parameters from different clients.
+
+   If the branch parameter in the top Via header field is not present,
+   or does not contain the magic cookie, the following procedures are
+   used.  These exist to handle backwards compatibility with RFC 2543
+   compliant implementations.
+
+   The INVITE request matches a transaction if the Request-URI, To tag,
+   From tag, Call-ID, CSeq, and top Via header field match those of the
+   INVITE request which created the transaction.  In this case, the
+   INVITE is a retransmission of the original one that created the
+   transaction.  The ACK request matches a transaction if the Request-
+   URI, From tag, Call-ID, CSeq number (not the method), and top Via
+   header field match those of the INVITE request which created the
+   transaction, and the To tag of the ACK matches the To tag of the
+   response sent by the server transaction.  Matching is done based on
+   the matching rules defined for each of those header fields.
+   Inclusion of the tag in the To header field in the ACK matching
+   process helps disambiguate ACK for 2xx from ACK for other responses
+
+
+
+Rosenberg, et. al.          Standards Track                   [Page 138]
+
+RFC 3261            SIP: Session Initiation Protocol           June 2002
+
+
+   at a proxy, which may have forwarded both responses (This can occur
+   in unusual conditions.  Specifically, when a proxy forked a request,
+   and then crashes, the responses may be delivered to another proxy,
+   which might end up forwarding multiple responses upstream).  An ACK
+   request that matches an INVITE transaction matched by a previous ACK
+   is considered a retransmission of that previous ACK.
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+Rosenberg, et. al.          Standards Track                   [Page 139]
+
+RFC 3261            SIP: Session Initiation Protocol           June 2002
+
+
+                                  |Request received
+                                  |pass to TU
+                                  V
+                            +-----------+
+                            |           |
+                            | Trying    |-------------+
+                            |           |             |
+                            +-----------+             |200-699 from TU
+                                  |                   |send response
+                                  |1xx from TU        |
+                                  |send response      |
+                                  |                   |
+               Request            V      1xx from TU  |
+               send response+-----------+send response|
+                   +--------|           |--------+    |
+                   |        | Proceeding|        |    |
+                   +------->|           |<-------+    |
+            +<--------------|           |             |
+            |Trnsprt Err    +-----------+             |
+            |Inform TU            |                   |
+            |                     |                   |
+            |                     |200-699 from TU    |
+            |                     |send response      |
+            |  Request            V                   |
+            |  send response+-----------+             |
+            |      +--------|           |             |
+            |      |        | Completed |<------------+
+            |      +------->|           |
+            +<--------------|           |
+            |Trnsprt Err    +-----------+
+            |Inform TU            |
+            |                     |Timer J fires
+            |                     |-
+            |                     |
+            |                     V
+            |               +-----------+
+            |               |           |
+            +-------------->| Terminated|
+                            |           |
+                            +-----------+
+
+                Figure 8: non-INVITE server transaction
+
+   For all other request methods, a request is matched to a transaction
+   if the Request-URI, To tag, From tag, Call-ID, CSeq (including the
+   method), and top Via header field match those of the request that
+   created the transaction.  Matching is done based on the matching
+
+
+
+
+Rosenberg, et. al.          Standards Track                   [Page 140]
+
+RFC 3261            SIP: Session Initiation Protocol           June 2002
+
+
+   rules defined for each of those header fields.  When a non-INVITE
+   request matches an existing transaction, it is a retransmission of
+   the request that created that transaction.
+
+   Because the matching rules include the Request-URI, the server cannot
+   match a response to a transaction.  When the TU passes a response to
+   the server transaction, it must pass it to the specific server
+   transaction for which the response is targeted.
+
+17.2.4 Handling Transport Errors
+
+   When the server transaction sends a response to the transport layer
+   to be sent, the following procedures are followed if the transport
+   layer indicates a failure.
+
+   First, the procedures in [4] are followed, which attempt to deliver
+   the response to a backup.  If those should all fail, based on the
+   definition of failure in [4], the server transaction SHOULD inform
+   the TU that a failure has occurred, and SHOULD transition to the
+   terminated state.
+
+18 Transport
+
+   The transport layer is responsible for the actual transmission of
+   requests and responses over network transports.  This includes
+   determination of the connection to use for a request or response in
+   the case of connection-oriented transports.
+
+   The transport layer is responsible for managing persistent
+   connections for transport protocols like TCP and SCTP, or TLS over
+   those, including ones opened to the transport layer.  This includes
+   connections opened by the client or server transports, so that
+   connections are shared between client and server transport functions.
+   These connections are indexed by the tuple formed from the address,
+   port, and transport protocol at the far end of the connection.  When
+   a connection is opened by the transport layer, this index is set to
+   the destination IP, port and transport.  When the connection is
+   accepted by the transport layer, this index is set to the source IP
+   address, port number, and transport.  Note that, because the source
+   port is often ephemeral, but it cannot be known whether it is
+   ephemeral or selected through procedures in [4], connections accepted
+   by the transport layer will frequently not be reused.  The result is
+   that two proxies in a "peering" relationship using a connection-
+   oriented transport frequently will have two connections in use, one
+   for transactions initiated in each direction.
+
+
+
+
+
+
+Rosenberg, et. al.          Standards Track                   [Page 141]
+
+RFC 3261            SIP: Session Initiation Protocol           June 2002
+
+
+   It is RECOMMENDED that connections be kept open for some
+   implementation-defined duration after the last message was sent or
+   received over that connection.  This duration SHOULD at least equal
+   the longest amount of time the element would need in order to bring a
+   transaction from instantiation to the terminated state.  This is to
+   make it likely that transactions are completed over the same
+   connection on which they are initiated (for example, request,
+   response, and in the case of INVITE, ACK for non-2xx responses).
+   This usually means at least 64*T1 (see Section 17.1.1.1 for a
+   definition of T1).  However, it could be larger in an element that
+   has a TU using a large value for timer C (bullet 11 of Section 16.6),
+   for example.
+
+   All SIP elements MUST implement UDP and TCP.  SIP elements MAY
+   implement other protocols.
+
+      Making TCP mandatory for the UA is a substantial change from RFC
+      2543.  It has arisen out of the need to handle larger messages,
+      which MUST use TCP, as discussed below.  Thus, even if an element
+      never sends large messages, it may receive one and needs to be
+      able to handle them.
+
+18.1 Clients
+
+18.1.1 Sending Requests
+
+   The client side of the transport layer is responsible for sending the
+   request and receiving responses.  The user of the transport layer
+   passes the client transport the request, an IP address, port,
+   transport, and possibly TTL for multicast destinations.
+
+   If a request is within 200 bytes of the path MTU, or if it is larger
+   than 1300 bytes and the path MTU is unknown, the request MUST be sent
+   using an RFC 2914 [43] congestion controlled transport protocol, such
+   as TCP. If this causes a change in the transport protocol from the
+   one indicated in the top Via, the value in the top Via MUST be
+   changed.  This prevents fragmentation of messages over UDP and
+   provides congestion control for larger messages.  However,
+   implementations MUST be able to handle messages up to the maximum
+   datagram packet size.  For UDP, this size is 65,535 bytes, including
+   IP and UDP headers.
+
+      The 200 byte "buffer" between the message size and the MTU
+      accommodates the fact that the response in SIP can be larger than
+      the request.  This happens due to the addition of Record-Route
+      header field values to the responses to INVITE, for example.  With
+      the extra buffer, the response can be about 170 bytes larger than
+      the request, and still not be fragmented on IPv4 (about 30 bytes
+
+
+
+Rosenberg, et. al.          Standards Track                   [Page 142]
+
+RFC 3261            SIP: Session Initiation Protocol           June 2002
+
+
+      is consumed by IP/UDP, assuming no IPSec).  1300 is chosen when
+      path MTU is not known, based on the assumption of a 1500 byte
+      Ethernet MTU.
+
+   If an element sends a request over TCP because of these message size
+   constraints, and that request would have otherwise been sent over
+   UDP, if the attempt to establish the connection generates either an
+   ICMP Protocol Not Supported, or results in a TCP reset, the element
+   SHOULD retry the request, using UDP.  This is only to provide
+   backwards compatibility with RFC 2543 compliant implementations that
+   do not support TCP.  It is anticipated that this behavior will be
+   deprecated in a future revision of this specification.
+
+   A client that sends a request to a multicast address MUST add the
+   "maddr" parameter to its Via header field value containing the
+   destination multicast address, and for IPv4, SHOULD add the "ttl"
+   parameter with a value of 1.  Usage of IPv6 multicast is not defined
+   in this specification, and will be a subject of future
+   standardization when the need arises.
+
+   These rules result in a purposeful limitation of multicast in SIP.
+   Its primary function is to provide a "single-hop-discovery-like"
+   service, delivering a request to a group of homogeneous servers,
+   where it is only required to process the response from any one of
+   them.  This functionality is most useful for registrations.  In fact,
+   based on the transaction processing rules in Section 17.1.3, the
+   client transaction will accept the first response, and view any
+   others as retransmissions because they all contain the same Via
+   branch identifier.
+
+   Before a request is sent, the client transport MUST insert a value of
+   the "sent-by" field into the Via header field.  This field contains
+   an IP address or host name, and port.  The usage of an FQDN is
+   RECOMMENDED.  This field is used for sending responses under certain
+   conditions, described below.  If the port is absent, the default
+   value depends on the transport.  It is 5060 for UDP, TCP and SCTP,
+   5061 for TLS.
+
+   For reliable transports, the response is normally sent on the
+   connection on which the request was received.  Therefore, the client
+   transport MUST be prepared to receive the response on the same
+   connection used to send the request.  Under error conditions, the
+   server may attempt to open a new connection to send the response.  To
+   handle this case, the transport layer MUST also be prepared to
+   receive an incoming connection on the source IP address from which
+   the request was sent and port number in the "sent-by" field.  It also
+
+
+
+
+
+Rosenberg, et. al.          Standards Track                   [Page 143]
+
+RFC 3261            SIP: Session Initiation Protocol           June 2002
+
+
+   MUST be prepared to receive incoming connections on any address and
+   port that would be selected by a server based on the procedures
+   described in Section 5 of [4].
+
+   For unreliable unicast transports, the client transport MUST be
+   prepared to receive responses on the source IP address from which the
+   request is sent (as responses are sent back to the source address)
+   and the port number in the "sent-by" field.  Furthermore, as with
+   reliable transports, in certain cases the response will be sent
+   elsewhere.  The client MUST be prepared to receive responses on any
+   address and port that would be selected by a server based on the
+   procedures described in Section 5 of [4].
+
+   For multicast, the client transport MUST be prepared to receive
+   responses on the same multicast group and port to which the request
+   is sent (that is, it needs to be a member of the multicast group it
+   sent the request to.)
+
+   If a request is destined to an IP address, port, and transport to
+   which an existing connection is open, it is RECOMMENDED that this
+   connection be used to send the request, but another connection MAY be
+   opened and used.
+
+   If a request is sent using multicast, it is sent to the group
+   address, port, and TTL provided by the transport user.  If a request
+   is sent using unicast unreliable transports, it is sent to the IP
+   address and port provided by the transport user.
+
+18.1.2 Receiving Responses
+
+   When a response is received, the client transport examines the top
+   Via header field value.  If the value of the "sent-by" parameter in
+   that header field value does not correspond to a value that the
+   client transport is configured to insert into requests, the response
+   MUST be silently discarded.
+
+   If there are any client transactions in existence, the client
+   transport uses the matching procedures of Section 17.1.3 to attempt
+   to match the response to an existing transaction.  If there is a
+   match, the response MUST be passed to that transaction.  Otherwise,
+   the response MUST be passed to the core (whether it be stateless
+   proxy, stateful proxy, or UA) for further processing.  Handling of
+   these "stray" responses is dependent on the core (a proxy will
+   forward them, while a UA will discard, for example).
+
+
+
+
+
+
+
+Rosenberg, et. al.          Standards Track                   [Page 144]
+
+RFC 3261            SIP: Session Initiation Protocol           June 2002
+
+
+18.2 Servers
+
+18.2.1 Receiving Requests
+
+   A server SHOULD be prepared to receive requests on any IP address,
+   port and transport combination that can be the result of a DNS lookup
+   on a SIP or SIPS URI [4] that is handed out for the purposes of
+   communicating with that server.  In this context, "handing out"
+   includes placing a URI in a Contact header field in a REGISTER
+   request or a redirect response, or in a Record-Route header field in
+   a request or response.  A URI can also be "handed out" by placing it
+   on a web page or business card.  It is also RECOMMENDED that a server
+   listen for requests on the default SIP ports (5060 for TCP and UDP,
+   5061 for TLS over TCP) on all public interfaces.  The typical
+   exception would be private networks, or when multiple server
+   instances are running on the same host.  For any port and interface
+   that a server listens on for UDP, it MUST listen on that same port
+   and interface for TCP.  This is because a message may need to be sent
+   using TCP, rather than UDP, if it is too large.  As a result, the
+   converse is not true.  A server need not listen for UDP on a
+   particular address and port just because it is listening on that same
+   address and port for TCP.  There may, of course, be other reasons why
+   a server needs to listen for UDP on a particular address and port.
+
+   When the server transport receives a request over any transport, it
+   MUST examine the value of the "sent-by" parameter in the top Via
+   header field value.  If the host portion of the "sent-by" parameter
+   contains a domain name, or if it contains an IP address that differs
+   from the packet source address, the server MUST add a "received"
+   parameter to that Via header field value.  This parameter MUST
+   contain the source address from which the packet was received.  This
+   is to assist the server transport layer in sending the response,
+   since it must be sent to the source IP address from which the request
+   came.
+
+   Consider a request received by the server transport which looks like,
+   in part:
+
+      INVITE sip:bob@Biloxi.com SIP/2.0
+      Via: SIP/2.0/UDP bobspc.biloxi.com:5060
+
+   The request is received with a source IP address of 192.0.2.4.
+   Before passing the request up, the transport adds a "received"
+   parameter, so that the request would look like, in part:
+
+      INVITE sip:bob@Biloxi.com SIP/2.0
+      Via: SIP/2.0/UDP bobspc.biloxi.com:5060;received=192.0.2.4
+
+
+
+
+Rosenberg, et. al.          Standards Track                   [Page 145]
+
+RFC 3261            SIP: Session Initiation Protocol           June 2002
+
+
+   Next, the server transport attempts to match the request to a server
+   transaction.  It does so using the matching rules described in
+   Section 17.2.3.  If a matching server transaction is found, the
+   request is passed to that transaction for processing.  If no match is
+   found, the request is passed to the core, which may decide to
+   construct a new server transaction for that request.  Note that when
+   a UAS core sends a 2xx response to INVITE, the server transaction is
+   destroyed.  This means that when the ACK arrives, there will be no
+   matching server transaction, and based on this rule, the ACK is
+   passed to the UAS core, where it is processed.
+
+18.2.2 Sending Responses
+
+   The server transport uses the value of the top Via header field in
+   order to determine where to send a response.  It MUST follow the
+   following process:
+
+      o  If the "sent-protocol" is a reliable transport protocol such as
+         TCP or SCTP, or TLS over those, the response MUST be sent using
+         the existing connection to the source of the original request
+         that created the transaction, if that connection is still open.
+         This requires the server transport to maintain an association
+         between server transactions and transport connections.  If that
+         connection is no longer open, the server SHOULD open a
+         connection to the IP address in the "received" parameter, if
+         present, using the port in the "sent-by" value, or the default
+         port for that transport, if no port is specified.  If that
+         connection attempt fails, the server SHOULD use the procedures
+         in [4] for servers in order to determine the IP address and
+         port to open the connection and send the response to.
+
+      o  Otherwise, if the Via header field value contains a "maddr"
+         parameter, the response MUST be forwarded to the address listed
+         there, using the port indicated in "sent-by", or port 5060 if
+         none is present.  If the address is a multicast address, the
+         response SHOULD be sent using the TTL indicated in the "ttl"
+         parameter, or with a TTL of 1 if that parameter is not present.
+
+      o  Otherwise (for unreliable unicast transports), if the top Via
+         has a "received" parameter, the response MUST be sent to the
+         address in the "received" parameter, using the port indicated
+         in the "sent-by" value, or using port 5060 if none is specified
+         explicitly.  If this fails, for example, elicits an ICMP "port
+         unreachable" response, the procedures of Section 5 of [4]
+         SHOULD be used to determine where to send the response.
+
+
+
+
+
+
+Rosenberg, et. al.          Standards Track                   [Page 146]
+
+RFC 3261            SIP: Session Initiation Protocol           June 2002
+
+
+      o  Otherwise, if it is not receiver-tagged, the response MUST be
+         sent to the address indicated by the "sent-by" value, using the
+         procedures in Section 5 of [4].
+
+18.3 Framing
+
+   In the case of message-oriented transports (such as UDP), if the
+   message has a Content-Length header field, the message body is
+   assumed to contain that many bytes.  If there are additional bytes in
+   the transport packet beyond the end of the body, they MUST be
+   discarded.  If the transport packet ends before the end of the
+   message body, this is considered an error.  If the message is a
+   response, it MUST be discarded.  If the message is a request, the
+   element SHOULD generate a 400 (Bad Request) response.  If the message
+   has no Content-Length header field, the message body is assumed to
+   end at the end of the transport packet.
+
+   In the case of stream-oriented transports such as TCP, the Content-
+   Length header field indicates the size of the body.  The Content-
+   Length header field MUST be used with stream oriented transports.
+
+18.4 Error Handling
+
+   Error handling is independent of whether the message was a request or
+   response.
+
+   If the transport user asks for a message to be sent over an
+   unreliable transport, and the result is an ICMP error, the behavior
+   depends on the type of ICMP error.  Host, network, port or protocol
+   unreachable errors, or parameter problem errors SHOULD cause the
+   transport layer to inform the transport user of a failure in sending.
+   Source quench and TTL exceeded ICMP errors SHOULD be ignored.
+
+   If the transport user asks for a request to be sent over a reliable
+   transport, and the result is a connection failure, the transport
+   layer SHOULD inform the transport user of a failure in sending.
+
+19 Common Message Components
+
+   There are certain components of SIP messages that appear in various
+   places within SIP messages (and sometimes, outside of them) that
+   merit separate discussion.
+
+
+
+
+
+
+
+
+
+Rosenberg, et. al.          Standards Track                   [Page 147]
+
+RFC 3261            SIP: Session Initiation Protocol           June 2002
+
+
+19.1 SIP and SIPS Uniform Resource Indicators
+
+   A SIP or SIPS URI identifies a communications resource.  Like all
+   URIs, SIP and SIPS URIs may be placed in web pages, email messages,
+   or printed literature.  They contain sufficient information to
+   initiate and maintain a communication session with the resource.
+
+   Examples of communications resources include the following:
+
+      o  a user of an online service
+
+      o  an appearance on a multi-line phone
+
+      o  a mailbox on a messaging system
+
+      o  a PSTN number at a gateway service
+
+      o  a group (such as "sales" or "helpdesk") in an organization
+
+   A SIPS URI specifies that the resource be contacted securely.  This
+   means, in particular, that TLS is to be used between the UAC and the
+   domain that owns the URI.  From there, secure communications are used
+   to reach the user, where the specific security mechanism depends on
+   the policy of the domain.  Any resource described by a SIP URI can be
+   "upgraded" to a SIPS URI by just changing the scheme, if it is
+   desired to communicate with that resource securely.
+
+19.1.1 SIP and SIPS URI Components
+
+   The "sip:" and "sips:" schemes follow the guidelines in RFC 2396 [5].
+   They use a form similar to the mailto URL, allowing the specification
+   of SIP request-header fields and the SIP message-body.  This makes it
+   possible to specify the subject, media type, or urgency of sessions
+   initiated by using a URI on a web page or in an email message.  The
+   formal syntax for a SIP or SIPS URI is presented in Section 25.  Its
+   general form, in the case of a SIP URI, is:
+
+      sip:user:password@host:port;uri-parameters?headers
+
+   The format for a SIPS URI is the same, except that the scheme is
+   "sips" instead of sip.  These tokens, and some of the tokens in their
+   expansions, have the following meanings:
+
+      user: The identifier of a particular resource at the host being
+         addressed.  The term "host" in this context frequently refers
+         to a domain.  The "userinfo" of a URI consists of this user
+         field, the password field, and the @ sign following them.  The
+         userinfo part of a URI is optional and MAY be absent when the
+
+
+
+Rosenberg, et. al.          Standards Track                   [Page 148]
+
+RFC 3261            SIP: Session Initiation Protocol           June 2002
+
+
+         destination host does not have a notion of users or when the
+         host itself is the resource being identified.  If the @ sign is
+         present in a SIP or SIPS URI, the user field MUST NOT be empty.
+
+         If the host being addressed can process telephone numbers, for
+         instance, an Internet telephony gateway, a telephone-
+         subscriber field defined in RFC 2806 [9] MAY be used to
+         populate the user field.  There are special escaping rules for
+         encoding telephone-subscriber fields in SIP and SIPS URIs
+         described in Section 19.1.2.
+
+      password: A password associated with the user.  While the SIP and
+         SIPS URI syntax allows this field to be present, its use is NOT
+         RECOMMENDED, because the passing of authentication information
+         in clear text (such as URIs) has proven to be a security risk
+         in almost every case where it has been used.  For instance,
+         transporting a PIN number in this field exposes the PIN.
+
+         Note that the password field is just an extension of the user
+         portion.  Implementations not wishing to give special
+         significance to the password portion of the field MAY simply
+         treat "user:password" as a single string.
+
+      host: The host providing the SIP resource.  The host part contains
+         either a fully-qualified domain name or numeric IPv4 or IPv6
+         address.  Using the fully-qualified domain name form is
+         RECOMMENDED whenever possible.
+
+      port: The port number where the request is to be sent.
+
+      URI parameters: Parameters affecting a request constructed from
+         the URI.
+
+         URI parameters are added after the hostport component and are
+         separated by semi-colons.
+
+         URI parameters take the form:
+
+            parameter-name "=" parameter-value
+
+         Even though an arbitrary number of URI parameters may be
+         included in a URI, any given parameter-name MUST NOT appear
+         more than once.
+
+         This extensible mechanism includes the transport, maddr, ttl,
+         user, method and lr parameters.
+
+
+
+
+
+Rosenberg, et. al.          Standards Track                   [Page 149]
+
+RFC 3261            SIP: Session Initiation Protocol           June 2002
+
+
+         The transport parameter determines the transport mechanism to
+         be used for sending SIP messages, as specified in [4].  SIP can
+         use any network transport protocol.  Parameter names are
+         defined for UDP (RFC 768 [14]), TCP (RFC 761 [15]), and SCTP
+         (RFC 2960 [16]).  For a SIPS URI, the transport parameter MUST
+         indicate a reliable transport.
+
+         The maddr parameter indicates the server address to be
+         contacted for this user, overriding any address derived from
+         the host field.  When an maddr parameter is present, the port
+         and transport components of the URI apply to the address
+         indicated in the maddr parameter value.  [4] describes the
+         proper interpretation of the transport, maddr, and hostport in
+         order to obtain the destination address, port, and transport
+         for sending a request.
+
+         The maddr field has been used as a simple form of loose source
+         routing.  It allows a URI to specify a proxy that must be
+         traversed en-route to the destination.  Continuing to use the
+         maddr parameter this way is strongly discouraged (the
+         mechanisms that enable it are deprecated).  Implementations
+         should instead use the Route mechanism described in this
+         document, establishing a pre-existing route set if necessary
+         (see Section 8.1.1.1).  This provides a full URI to describe
+         the node to be traversed.
+
+         The ttl parameter determines the time-to-live value of the UDP
+         multicast packet and MUST only be used if maddr is a multicast
+         address and the transport protocol is UDP.  For example, to
+         specify a call to alice@atlanta.com using multicast to
+         239.255.255.1 with a ttl of 15, the following URI would be
+         used:
+
+            sip:alice@atlanta.com;maddr=239.255.255.1;ttl=15
+
+         The set of valid telephone-subscriber strings is a subset of
+         valid user strings.  The user URI parameter exists to
+         distinguish telephone numbers from user names that happen to
+         look like telephone numbers.  If the user string contains a
+         telephone number formatted as a telephone-subscriber, the user
+         parameter value "phone" SHOULD be present.  Even without this
+         parameter, recipients of SIP and SIPS URIs MAY interpret the
+         pre-@ part as a telephone number if local restrictions on the
+         name space for user name allow it.
+
+         The method of the SIP request constructed from the URI can be
+         specified with the method parameter.
+
+
+
+
+Rosenberg, et. al.          Standards Track                   [Page 150]
+
+RFC 3261            SIP: Session Initiation Protocol           June 2002
+
+
+         The lr parameter, when present, indicates that the element
+         responsible for this resource implements the routing mechanisms
+         specified in this document.  This parameter will be used in the
+         URIs proxies place into Record-Route header field values, and
+         may appear in the URIs in a pre-existing route set.
+
+         This parameter is used to achieve backwards compatibility with
+         systems implementing the strict-routing mechanisms of RFC 2543
+         and the rfc2543bis drafts up to bis-05.  An element preparing
+         to send a request based on a URI not containing this parameter
+         can assume the receiving element implements strict-routing and
+         reformat the message to preserve the information in the
+         Request-URI.
+
+         Since the uri-parameter mechanism is extensible, SIP elements
+         MUST silently ignore any uri-parameters that they do not
+         understand.
+
+      Headers: Header fields to be included in a request constructed
+         from the URI.
+
+         Headers fields in the SIP request can be specified with the "?"
+         mechanism within a URI.  The header names and values are
+         encoded in ampersand separated hname = hvalue pairs.  The
+         special hname "body" indicates that the associated hvalue is
+         the message-body of the SIP request.
+
+   Table 1 summarizes the use of SIP and SIPS URI components based on
+   the context in which the URI appears.  The external column describes
+   URIs appearing anywhere outside of a SIP message, for instance on a
+   web page or business card.  Entries marked "m" are mandatory, those
+   marked "o" are optional, and those marked "-" are not allowed.
+   Elements processing URIs SHOULD ignore any disallowed components if
+   they are present.  The second column indicates the default value of
+   an optional element if it is not present.  "--" indicates that the
+   element is either not optional, or has no default value.
+
+   URIs in Contact header fields have different restrictions depending
+   on the context in which the header field appears.  One set applies to
+   messages that establish and maintain dialogs (INVITE and its 200 (OK)
+   response).  The other applies to registration and redirection
+   messages (REGISTER, its 200 (OK) response, and 3xx class responses to
+   any method).
+
+
+
+
+
+
+
+
+Rosenberg, et. al.          Standards Track                   [Page 151]
+
+RFC 3261            SIP: Session Initiation Protocol           June 2002
+
+
+19.1.2 Character Escaping Requirements
+
+                                                       dialog
+                                          reg./redir. Contact/
+              default  Req.-URI  To  From  Contact   R-R/Route  external
+user          --          o      o    o       o          o         o
+password      --          o      o    o       o          o         o
+host          --          m      m    m       m          m         m
+port          (1)         o      -    -       o          o         o
+user-param    ip          o      o    o       o          o         o
+method        INVITE      -      -    -       -          -         o
+maddr-param   --          o      -    -       o          o         o
+ttl-param     1           o      -    -       o          -         o
+transp.-param (2)         o      -    -       o          o         o
+lr-param      --          o      -    -       -          o         o
+other-param   --          o      o    o       o          o         o
+headers       --          -      -    -       o          -         o
+
+   (1): The default port value is transport and scheme dependent.  The
+   default  is  5060  for  sip: using UDP, TCP, or SCTP.  The default is
+   5061 for sip: using TLS over TCP and sips: over TCP.
+
+   (2): The default transport is scheme dependent.  For sip:, it is UDP.
+   For sips:, it is TCP.
+
+   Table 1: Use and default values of URI components for SIP header
+   field values, Request-URI and references
+
+   SIP follows the requirements and guidelines of RFC 2396 [5] when
+   defining the set of characters that must be escaped in a SIP URI, and
+   uses its ""%" HEX HEX" mechanism for escaping.  From RFC 2396 [5]:
+
+      The set of characters actually reserved within any given URI
+      component is defined by that component.  In general, a character
+      is reserved if the semantics of the URI changes if the character
+      is replaced with its escaped US-ASCII encoding [5].  Excluded US-
+      ASCII characters (RFC 2396 [5]), such as space and control
+      characters and characters used as URI delimiters, also MUST be
+      escaped.  URIs MUST NOT contain unescaped space and control
+      characters.
+
+   For each component, the set of valid BNF expansions defines exactly
+   which characters may appear unescaped.  All other characters MUST be
+   escaped.
+
+   For example, "@" is not in the set of characters in the user
+   component, so the user "j@s0n" must have at least the @ sign encoded,
+   as in "j%40s0n".
+
+
+
+Rosenberg, et. al.          Standards Track                   [Page 152]
+
+RFC 3261            SIP: Session Initiation Protocol           June 2002
+
+
+   Expanding the hname and hvalue tokens in Section 25 show that all URI
+   reserved characters in header field names and values MUST be escaped.
+
+   The telephone-subscriber subset of the user component has special
+   escaping considerations.  The set of characters not reserved in the
+   RFC 2806 [9] description of telephone-subscriber contains a number of
+   characters in various syntax elements that need to be escaped when
+   used in SIP URIs.  Any characters occurring in a telephone-subscriber
+   that do not appear in an expansion of the BNF for the user rule MUST
+   be escaped.
+
+   Note that character escaping is not allowed in the host component of
+   a SIP or SIPS URI (the % character is not valid in its expansion).
+   This is likely to change in the future as requirements for
+   Internationalized Domain Names are finalized.  Current
+   implementations MUST NOT attempt to improve robustness by treating
+   received escaped characters in the host component as literally
+   equivalent to their unescaped counterpart.  The behavior required to
+   meet the requirements of IDN may be significantly different.
+
+19.1.3 Example SIP and SIPS URIs
+
+   sip:alice@atlanta.com
+   sip:alice:secretword@atlanta.com;transport=tcp
+   sips:alice@atlanta.com?subject=project%20x&priority=urgent
+   sip:+1-212-555-1212:1234@gateway.com;user=phone
+   sips:1212@gateway.com
+   sip:alice@192.0.2.4
+   sip:atlanta.com;method=REGISTER?to=alice%40atlanta.com
+   sip:alice;day=tuesday@atlanta.com
+
+   The last sample URI above has a user field value of
+   "alice;day=tuesday".  The escaping rules defined above allow a
+   semicolon to appear unescaped in this field.  For the purposes of
+   this protocol, the field is opaque.  The structure of that value is
+   only useful to the SIP element responsible for the resource.
+
+19.1.4 URI Comparison
+
+   Some operations in this specification require determining whether two
+   SIP or SIPS URIs are equivalent.  In this specification, registrars
+   need to compare bindings in Contact URIs in REGISTER requests (see
+   Section 10.3.).  SIP and SIPS URIs are compared for equality
+   according to the following rules:
+
+      o  A SIP and SIPS URI are never equivalent.
+
+
+
+
+
+Rosenberg, et. al.          Standards Track                   [Page 153]
+
+RFC 3261            SIP: Session Initiation Protocol           June 2002
+
+
+      o  Comparison of the userinfo of SIP and SIPS URIs is case-
+         sensitive.  This includes userinfo containing passwords or
+         formatted as telephone-subscribers.  Comparison of all other
+         components of the URI is case-insensitive unless explicitly
+         defined otherwise.
+
+      o  The ordering of parameters and header fields is not significant
+         in comparing SIP and SIPS URIs.
+
+      o  Characters other than those in the "reserved" set (see RFC 2396
+         [5]) are equivalent to their ""%" HEX HEX" encoding.
+
+      o  An IP address that is the result of a DNS lookup of a host name
+         does not match that host name.
+
+      o  For two URIs to be equal, the user, password, host, and port
+         components must match.
+
+         A URI omitting the user component will not match a URI that
+         includes one.  A URI omitting the password component will not
+         match a URI that includes one.
+
+         A URI omitting any component with a default value will not
+         match a URI explicitly containing that component with its
+         default value.  For instance, a URI omitting the optional port
+         component will not match a URI explicitly declaring port 5060.
+         The same is true for the transport-parameter, ttl-parameter,
+         user-parameter, and method components.
+
+            Defining sip:user@host to not be equivalent to
+            sip:user@host:5060 is a change from RFC 2543.  When deriving
+            addresses from URIs, equivalent addresses are expected from
+            equivalent URIs.  The URI sip:user@host:5060 will always
+            resolve to port 5060.  The URI sip:user@host may resolve to
+            other ports through the DNS SRV mechanisms detailed in [4].
+
+      o  URI uri-parameter components are compared as follows:
+
+         -  Any uri-parameter appearing in both URIs must match.
+
+         -  A user, ttl, or method uri-parameter appearing in only one
+            URI never matches, even if it contains the default value.
+
+         -  A URI that includes an maddr parameter will not match a URI
+            that contains no maddr parameter.
+
+         -  All other uri-parameters appearing in only one URI are
+            ignored when comparing the URIs.
+
+
+
+Rosenberg, et. al.          Standards Track                   [Page 154]
+
+RFC 3261            SIP: Session Initiation Protocol           June 2002
+
+
+      o  URI header components are never ignored.  Any present header
+         component MUST be present in both URIs and match for the URIs
+         to match.  The matching rules are defined for each header field
+         in Section 20.
+
+   The URIs within each of the following sets are equivalent:
+
+   sip:%61lice@atlanta.com;transport=TCP
+   sip:alice@AtLanTa.CoM;Transport=tcp
+
+   sip:carol@chicago.com
+   sip:carol@chicago.com;newparam=5
+   sip:carol@chicago.com;security=on
+
+   sip:biloxi.com;transport=tcp;method=REGISTER?to=sip:bob%40biloxi.com
+   sip:biloxi.com;method=REGISTER;transport=tcp?to=sip:bob%40biloxi.com
+
+   sip:alice@atlanta.com?subject=project%20x&priority=urgent
+   sip:alice@atlanta.com?priority=urgent&subject=project%20x
+
+   The URIs within each of the following sets are not equivalent:
+
+   SIP:ALICE@AtLanTa.CoM;Transport=udp             (different usernames)
+   sip:alice@AtLanTa.CoM;Transport=UDP
+
+   sip:bob@biloxi.com                   (can resolve to different ports)
+   sip:bob@biloxi.com:5060
+
+   sip:bob@biloxi.com              (can resolve to different transports)
+   sip:bob@biloxi.com;transport=udp
+
+   sip:bob@biloxi.com     (can resolve to different port and transports)
+   sip:bob@biloxi.com:6000;transport=tcp
+
+   sip:carol@chicago.com                    (different header component)
+   sip:carol@chicago.com?Subject=next%20meeting
+
+   sip:bob@phone21.boxesbybob.com   (even though that's what
+   sip:bob@192.0.2.4                 phone21.boxesbybob.com resolves to)
+
+   Note that equality is not transitive:
+
+      o  sip:carol@chicago.com and sip:carol@chicago.com;security=on are
+         equivalent
+
+      o  sip:carol@chicago.com and sip:carol@chicago.com;security=off
+         are equivalent
+
+
+
+
+Rosenberg, et. al.          Standards Track                   [Page 155]
+
+RFC 3261            SIP: Session Initiation Protocol           June 2002
+
+
+      o  sip:carol@chicago.com;security=on and
+         sip:carol@chicago.com;security=off are not equivalent
+
+19.1.5 Forming Requests from a URI
+
+   An implementation needs to take care when forming requests directly
+   from a URI.  URIs from business cards, web pages, and even from
+   sources inside the protocol such as registered contacts may contain
+   inappropriate header fields or body parts.
+
+   An implementation MUST include any provided transport, maddr, ttl, or
+   user parameter in the Request-URI of the formed request.  If the URI
+   contains a method parameter, its value MUST be used as the method of
+   the request.  The method parameter MUST NOT be placed in the
+   Request-URI.  Unknown URI parameters MUST be placed in the message's
+   Request-URI.
+
+   An implementation SHOULD treat the presence of any headers or body
+   parts in the URI as a desire to include them in the message, and
+   choose to honor the request on a per-component basis.
+
+   An implementation SHOULD NOT honor these obviously dangerous header
+   fields: From, Call-ID, CSeq, Via, and Record-Route.
+
+   An implementation SHOULD NOT honor any requested Route header field
+   values in order to not be used as an unwitting agent in malicious
+   attacks.
+
+   An implementation SHOULD NOT honor requests to include header fields
+   that may cause it to falsely advertise its location or capabilities.
+   These include: Accept, Accept-Encoding, Accept-Language, Allow,
+   Contact (in its dialog usage), Organization, Supported, and User-
+   Agent.
+
+   An implementation SHOULD verify the accuracy of any requested
+   descriptive header fields, including: Content-Disposition, Content-
+   Encoding, Content-Language, Content-Length, Content-Type, Date,
+   Mime-Version, and Timestamp.
+
+   If the request formed from constructing a message from a given URI is
+   not a valid SIP request, the URI is invalid.  An implementation MUST
+   NOT proceed with transmitting the request.  It should instead pursue
+   the course of action due an invalid URI in the context it occurs.
+
+      The constructed request can be invalid in many ways.  These
+      include, but are not limited to, syntax error in header fields,
+      invalid combinations of URI parameters, or an incorrect
+      description of the message body.
+
+
+
+Rosenberg, et. al.          Standards Track                   [Page 156]
+
+RFC 3261            SIP: Session Initiation Protocol           June 2002
+
+
+   Sending a request formed from a given URI may require capabilities
+   unavailable to the implementation.  The URI might indicate use of an
+   unimplemented transport or extension, for example.  An implementation
+   SHOULD refuse to send these requests rather than modifying them to
+   match their capabilities.  An implementation MUST NOT send a request
+   requiring an extension that it does not support.
+
+      For example, such a request can be formed through the presence of
+      a Require header parameter or a method URI parameter with an
+      unknown or explicitly unsupported value.
+
+19.1.6 Relating SIP URIs and tel URLs
+
+   When a tel URL (RFC 2806 [9]) is converted to a SIP or SIPS URI, the
+   entire telephone-subscriber portion of the tel URL, including any
+   parameters, is placed into the userinfo part of the SIP or SIPS URI.
+
+   Thus, tel:+358-555-1234567;postd=pp22 becomes
+
+      sip:+358-555-1234567;postd=pp22@foo.com;user=phone
+
+   or
+      sips:+358-555-1234567;postd=pp22@foo.com;user=phone
+
+   not
+      sip:+358-555-1234567@foo.com;postd=pp22;user=phone
+
+   or
+
+      sips:+358-555-1234567@foo.com;postd=pp22;user=phone
+
+   In general, equivalent "tel" URLs converted to SIP or SIPS URIs in
+   this fashion may not produce equivalent SIP or SIPS URIs.  The
+   userinfo of SIP and SIPS URIs are compared as a case-sensitive
+   string.  Variance in case-insensitive portions of tel URLs and
+   reordering of tel URL parameters does not affect tel URL equivalence,
+   but does affect the equivalence of SIP URIs formed from them.
+
+   For example,
+
+      tel:+358-555-1234567;postd=pp22
+      tel:+358-555-1234567;POSTD=PP22
+
+   are equivalent, while
+
+      sip:+358-555-1234567;postd=pp22@foo.com;user=phone
+      sip:+358-555-1234567;POSTD=PP22@foo.com;user=phone
+
+
+
+
+Rosenberg, et. al.          Standards Track                   [Page 157]
+
+RFC 3261            SIP: Session Initiation Protocol           June 2002
+
+
+   are not.
+
+   Likewise,
+
+      tel:+358-555-1234567;postd=pp22;isub=1411
+      tel:+358-555-1234567;isub=1411;postd=pp22
+
+   are equivalent, while
+
+      sip:+358-555-1234567;postd=pp22;isub=1411@foo.com;user=phone
+      sip:+358-555-1234567;isub=1411;postd=pp22@foo.com;user=phone
+
+   are not.
+
+   To mitigate this problem, elements constructing telephone-subscriber
+   fields to place in the userinfo part of a SIP or SIPS URI SHOULD fold
+   any case-insensitive portion of telephone-subscriber to lower case,
+   and order the telephone-subscriber parameters lexically by parameter
+   name, excepting isdn-subaddress and post-dial, which occur first and
+   in that order.  (All components of a tel URL except for future-
+   extension parameters are defined to be compared case-insensitive.)
+
+   Following this suggestion, both
+
+      tel:+358-555-1234567;postd=pp22
+      tel:+358-555-1234567;POSTD=PP22
+
+      become
+
+        sip:+358-555-1234567;postd=pp22@foo.com;user=phone
+
+   and both
+
+        tel:+358-555-1234567;tsp=a.b;phone-context=5
+        tel:+358-555-1234567;phone-context=5;tsp=a.b
+
+      become
+
+        sip:+358-555-1234567;phone-context=5;tsp=a.b@foo.com;user=phone
+
+19.2 Option Tags
+
+   Option tags are unique identifiers used to designate new options
+   (extensions) in SIP.  These tags are used in Require (Section 20.32),
+   Proxy-Require (Section 20.29), Supported (Section 20.37) and
+   Unsupported (Section 20.40) header fields.  Note that these options
+   appear as parameters in those header fields in an option-tag = token
+   form (see Section 25 for the definition of token).
+
+
+
+Rosenberg, et. al.          Standards Track                   [Page 158]
+
+RFC 3261            SIP: Session Initiation Protocol           June 2002
+
+
+   Option tags are defined in standards track RFCs.  This is a change
+   from past practice, and is instituted to ensure continuing multi-
+   vendor interoperability (see discussion in Section 20.32 and Section
+   20.37).  An IANA registry of option tags is used to ensure easy
+   reference.
+
+19.3 Tags
+
+   The "tag" parameter is used in the To and From header fields of SIP
+   messages.  It serves as a general mechanism to identify a dialog,
+   which is the combination of the Call-ID along with two tags, one from
+   each participant in the dialog.  When a UA sends a request outside of
+   a dialog, it contains a From tag only, providing "half" of the dialog
+   ID.  The dialog is completed from the response(s), each of which
+   contributes the second half in the To header field.  The forking of
+   SIP requests means that multiple dialogs can be established from a
+   single request.  This also explains the need for the two-sided dialog
+   identifier; without a contribution from the recipients, the
+   originator could not disambiguate the multiple dialogs established
+   from a single request.
+
+   When a tag is generated by a UA for insertion into a request or
+   response, it MUST be globally unique and cryptographically random
+   with at least 32 bits of randomness.  A property of this selection
+   requirement is that a UA will place a different tag into the From
+   header of an INVITE than it would place into the To header of the
+   response to the same INVITE.  This is needed in order for a UA to
+   invite itself to a session, a common case for "hairpinning" of calls
+   in PSTN gateways.  Similarly, two INVITEs for different calls will
+   have different From tags, and two responses for different calls will
+   have different To tags.
+
+   Besides the requirement for global uniqueness, the algorithm for
+   generating a tag is implementation-specific.  Tags are helpful in
+   fault tolerant systems, where a dialog is to be recovered on an
+   alternate server after a failure.  A UAS can select the tag in such a
+   way that a backup can recognize a request as part of a dialog on the
+   failed server, and therefore determine that it should attempt to
+   recover the dialog and any other state associated with it.
+
+20 Header Fields
+
+   The general syntax for header fields is covered in Section 7.3.  This
+   section lists the full set of header fields along with notes on
+   syntax, meaning, and usage.  Throughout this section, we use [HX.Y]
+   to refer to Section X.Y of the current HTTP/1.1 specification RFC
+   2616 [8].  Examples of each header field are given.
+
+
+
+
+Rosenberg, et. al.          Standards Track                   [Page 159]
+
+RFC 3261            SIP: Session Initiation Protocol           June 2002
+
+
+   Information about header fields in relation to methods and proxy
+   processing is summarized in Tables 2 and 3.
+
+   The "where" column describes the request and response types in which
+   the header field can be used.  Values in this column are:
+
+      R: header field may only appear in requests;
+
+      r: header field may only appear in responses;
+
+      2xx, 4xx, etc.: A numerical value or range indicates response
+           codes with which the header field can be used;
+
+      c: header field is copied from the request to the response.
+
+      An empty entry in the "where" column indicates that the header
+           field may be present in all requests and responses.
+
+   The "proxy" column describes the operations a proxy may perform on a
+   header field:
+
+      a: A proxy can add or concatenate the header field if not present.
+
+      m: A proxy can modify an existing header field value.
+
+      d: A proxy can delete a header field value.
+
+      r: A proxy must be able to read the header field, and thus this
+           header field cannot be encrypted.
+
+   The next six columns relate to the presence of a header field in a
+   method:
+
+      c: Conditional; requirements on the header field depend on the
+           context of the message.
+
+      m: The header field is mandatory.
+
+      m*: The header field SHOULD be sent, but clients/servers need to
+           be prepared to receive messages without that header field.
+
+      o: The header field is optional.
+
+      t: The header field SHOULD be sent, but clients/servers need to be
+           prepared to receive messages without that header field.
+
+           If a stream-based protocol (such as TCP) is used as a
+           transport, then the header field MUST be sent.
+
+
+
+Rosenberg, et. al.          Standards Track                   [Page 160]
+
+RFC 3261            SIP: Session Initiation Protocol           June 2002
+
+
+      *: The header field is required if the message body is not empty.
+           See Sections 20.14, 20.15 and 7.4 for details.
+
+      -: The header field is not applicable.
+
+   "Optional" means that an element MAY include the header field in a
+   request or response, and a UA MAY ignore the header field if present
+   in the request or response (The exception to this rule is the Require
+   header field discussed in 20.32).  A "mandatory" header field MUST be
+   present in a request, and MUST be understood by the UAS receiving the
+   request.  A mandatory response header field MUST be present in the
+   response, and the header field MUST be understood by the UAC
+   processing the response.  "Not applicable" means that the header
+   field MUST NOT be present in a request.  If one is placed in a
+   request by mistake, it MUST be ignored by the UAS receiving the
+   request.  Similarly, a header field labeled "not applicable" for a
+   response means that the UAS MUST NOT place the header field in the
+   response, and the UAC MUST ignore the header field in the response.
+
+   A UA SHOULD ignore extension header parameters that are not
+   understood.
+
+   A compact form of some common header field names is also defined for
+   use when overall message size is an issue.
+
+   The Contact, From, and To header fields contain a URI.  If the URI
+   contains a comma, question mark or semicolon, the URI MUST be
+   enclosed in angle brackets (< and >).  Any URI parameters are
+   contained within these brackets.  If the URI is not enclosed in angle
+   brackets, any semicolon-delimited parameters are header-parameters,
+   not URI parameters.
+
+20.1 Accept
+
+   The Accept header field follows the syntax defined in [H14.1].  The
+   semantics are also identical, with the exception that if no Accept
+   header field is present, the server SHOULD assume a default value of
+   application/sdp.
+
+   An empty Accept header field means that no formats are acceptable.
+
+
+
+
+
+
+
+
+
+
+
+Rosenberg, et. al.          Standards Track                   [Page 161]
+
+RFC 3261            SIP: Session Initiation Protocol           June 2002
+
+
+   Example:
+
+      Header field          where   proxy ACK BYE CAN INV OPT REG
+      ___________________________________________________________
+      Accept                  R            -   o   -   o   m*  o
+      Accept                 2xx           -   -   -   o   m*  o
+      Accept                 415           -   c   -   c   c   c
+      Accept-Encoding         R            -   o   -   o   o   o
+      Accept-Encoding        2xx           -   -   -   o   m*  o
+      Accept-Encoding        415           -   c   -   c   c   c
+      Accept-Language         R            -   o   -   o   o   o
+      Accept-Language        2xx           -   -   -   o   m*  o
+      Accept-Language        415           -   c   -   c   c   c
+      Alert-Info              R      ar    -   -   -   o   -   -
+      Alert-Info             180     ar    -   -   -   o   -   -
+      Allow                   R            -   o   -   o   o   o
+      Allow                  2xx           -   o   -   m*  m*  o
+      Allow                   r            -   o   -   o   o   o
+      Allow                  405           -   m   -   m   m   m
+      Authentication-Info    2xx           -   o   -   o   o   o
+      Authorization           R            o   o   o   o   o   o
+      Call-ID                 c       r    m   m   m   m   m   m
+      Call-Info                      ar    -   -   -   o   o   o
+      Contact                 R            o   -   -   m   o   o
+      Contact                1xx           -   -   -   o   -   -
+      Contact                2xx           -   -   -   m   o   o
+      Contact                3xx      d    -   o   -   o   o   o
+      Contact                485           -   o   -   o   o   o
+      Content-Disposition                  o   o   -   o   o   o
+      Content-Encoding                     o   o   -   o   o   o
+      Content-Language                     o   o   -   o   o   o
+      Content-Length                 ar    t   t   t   t   t   t
+      Content-Type                         *   *   -   *   *   *
+      CSeq                    c       r    m   m   m   m   m   m
+      Date                            a    o   o   o   o   o   o
+      Error-Info           300-699    a    -   o   o   o   o   o
+      Expires                              -   -   -   o   -   o
+      From                    c       r    m   m   m   m   m   m
+      In-Reply-To             R            -   -   -   o   -   -
+      Max-Forwards            R      amr   m   m   m   m   m   m
+      Min-Expires            423           -   -   -   -   -   m
+      MIME-Version                         o   o   -   o   o   o
+      Organization                   ar    -   -   -   o   o   o
+
+             Table 2: Summary of header fields, A--O
+
+
+
+
+
+
+Rosenberg, et. al.          Standards Track                   [Page 162]
+
+RFC 3261            SIP: Session Initiation Protocol           June 2002
+
+
+   Header field              where       proxy ACK BYE CAN INV OPT REG
+   ___________________________________________________________________
+   Priority                    R          ar    -   -   -   o   -   -
+   Proxy-Authenticate         407         ar    -   m   -   m   m   m
+   Proxy-Authenticate         401         ar    -   o   o   o   o   o
+   Proxy-Authorization         R          dr    o   o   -   o   o   o
+   Proxy-Require               R          ar    -   o   -   o   o   o
+   Record-Route                R          ar    o   o   o   o   o   -
+   Record-Route             2xx,18x       mr    -   o   o   o   o   -
+   Reply-To                                     -   -   -   o   -   -
+   Require                                ar    -   c   -   c   c   c
+   Retry-After          404,413,480,486         -   o   o   o   o   o
+                            500,503             -   o   o   o   o   o
+                            600,603             -   o   o   o   o   o
+   Route                       R          adr   c   c   c   c   c   c
+   Server                      r                -   o   o   o   o   o
+   Subject                     R                -   -   -   o   -   -
+   Supported                   R                -   o   o   m*  o   o
+   Supported                  2xx               -   o   o   m*  m*  o
+   Timestamp                                    o   o   o   o   o   o
+   To                        c(1)          r    m   m   m   m   m   m
+   Unsupported                420               -   m   -   m   m   m
+   User-Agent                                   o   o   o   o   o   o
+   Via                         R          amr   m   m   m   m   m   m
+   Via                        rc          dr    m   m   m   m   m   m
+   Warning                     r                -   o   o   o   o   o
+   WWW-Authenticate           401         ar    -   m   -   m   m   m
+   WWW-Authenticate           407         ar    -   o   -   o   o   o
+
+   Table 3: Summary of header fields, P--Z; (1): copied with possible
+   addition of tag
+
+      Accept: application/sdp;level=1, application/x-private, text/html
+
+20.2 Accept-Encoding
+
+   The Accept-Encoding header field is similar to Accept, but restricts
+   the content-codings [H3.5] that are acceptable in the response.  See
+   [H14.3].  The semantics in SIP are identical to those defined in
+   [H14.3].
+
+   An empty Accept-Encoding header field is permissible.  It is
+   equivalent to Accept-Encoding: identity, that is, only the identity
+   encoding, meaning no encoding, is permissible.
+
+   If no Accept-Encoding header field is present, the server SHOULD
+   assume a default value of identity.
+
+
+
+
+Rosenberg, et. al.          Standards Track                   [Page 163]
+
+RFC 3261            SIP: Session Initiation Protocol           June 2002
+
+
+   This differs slightly from the HTTP definition, which indicates that
+   when not present, any encoding can be used, but the identity encoding
+   is preferred.
+
+   Example:
+
+      Accept-Encoding: gzip
+
+20.3 Accept-Language
+
+   The Accept-Language header field is used in requests to indicate the
+   preferred languages for reason phrases, session descriptions, or
+   status responses carried as message bodies in the response.  If no
+   Accept-Language header field is present, the server SHOULD assume all
+   languages are acceptable to the client.
+
+   The Accept-Language header field follows the syntax defined in
+   [H14.4].  The rules for ordering the languages based on the "q"
+   parameter apply to SIP as well.
+
+   Example:
+
+      Accept-Language: da, en-gb;q=0.8, en;q=0.7
+
+20.4 Alert-Info
+
+   When present in an INVITE request, the Alert-Info header field
+   specifies an alternative ring tone to the UAS.  When present in a 180
+   (Ringing) response, the Alert-Info header field specifies an
+   alternative ringback tone to the UAC.  A typical usage is for a proxy
+   to insert this header field to provide a distinctive ring feature.
+
+   The Alert-Info header field can introduce security risks.  These
+   risks and the ways to handle them are discussed in Section 20.9,
+   which discusses the Call-Info header field since the risks are
+   identical.
+
+   In addition, a user SHOULD be able to disable this feature
+   selectively.
+
+      This helps prevent disruptions that could result from the use of
+      this header field by untrusted elements.
+
+   Example:
+
+      Alert-Info: <http://www.example.com/sounds/moo.wav>
+
+
+
+
+
+Rosenberg, et. al.          Standards Track                   [Page 164]
+
+RFC 3261            SIP: Session Initiation Protocol           June 2002
+
+
+20.5 Allow
+
+   The Allow header field lists the set of methods supported by the UA
+   generating the message.
+
+   All methods, including ACK and CANCEL, understood by the UA MUST be
+   included in the list of methods in the Allow header field, when
+   present.  The absence of an Allow header field MUST NOT be
+   interpreted to mean that the UA sending the message supports no
+   methods.   Rather, it implies that the UA is not providing any
+   information on what methods it supports.
+
+   Supplying an Allow header field in responses to methods other than
+   OPTIONS reduces the number of messages needed.
+
+   Example:
+
+      Allow: INVITE, ACK, OPTIONS, CANCEL, BYE
+
+20.6 Authentication-Info
+
+   The Authentication-Info header field provides for mutual
+   authentication with HTTP Digest.  A UAS MAY include this header field
+   in a 2xx response to a request that was successfully authenticated
+   using digest based on the Authorization header field.
+
+   Syntax and semantics follow those specified in RFC 2617 [17].
+
+   Example:
+
+      Authentication-Info: nextnonce="47364c23432d2e131a5fb210812c"
+
+20.7 Authorization
+
+   The Authorization header field contains authentication credentials of
+   a UA.  Section 22.2 overviews the use of the Authorization header
+   field, and Section 22.4 describes the syntax and semantics when used
+   with HTTP authentication.
+
+   This header field, along with Proxy-Authorization, breaks the general
+   rules about multiple header field values.  Although not a comma-
+   separated list, this header field name may be present multiple times,
+   and MUST NOT be combined into a single header line using the usual
+   rules described in Section 7.3.
+
+
+
+
+
+
+
+Rosenberg, et. al.          Standards Track                   [Page 165]
+
+RFC 3261            SIP: Session Initiation Protocol           June 2002
+
+
+   In the example below, there are no quotes around the Digest
+   parameter:
+
+      Authorization: Digest username="Alice", realm="atlanta.com",
+       nonce="84a4cc6f3082121f32b42a2187831a9e",
+       response="7587245234b3434cc3412213e5f113a5432"
+
+20.8 Call-ID
+
+   The Call-ID header field uniquely identifies a particular invitation
+   or all registrations of a particular client.  A single multimedia
+   conference can give rise to several calls with different Call-IDs,
+   for example, if a user invites a single individual several times to
+   the same (long-running) conference.  Call-IDs are case-sensitive and
+   are simply compared byte-by-byte.
+
+   The compact form of the Call-ID header field is i.
+
+   Examples:
+
+      Call-ID: f81d4fae-7dec-11d0-a765-00a0c91e6bf6@biloxi.com
+      i:f81d4fae-7dec-11d0-a765-00a0c91e6bf6@192.0.2.4
+
+20.9 Call-Info
+
+   The Call-Info header field provides additional information about the
+   caller or callee, depending on whether it is found in a request or
+   response.  The purpose of the URI is described by the "purpose"
+   parameter.  The "icon" parameter designates an image suitable as an
+   iconic representation of the caller or callee.  The "info" parameter
+   describes the caller or callee in general, for example, through a web
+   page.  The "card" parameter provides a business card, for example, in
+   vCard [36] or LDIF [37] formats.  Additional tokens can be registered
+   using IANA and the procedures in Section 27.
+
+   Use of the Call-Info header field can pose a security risk.  If a
+   callee fetches the URIs provided by a malicious caller, the callee
+   may be at risk for displaying inappropriate or offensive content,
+   dangerous or illegal content, and so on.  Therefore, it is
+   RECOMMENDED that a UA only render the information in the Call-Info
+   header field if it can verify the authenticity of the element that
+   originated the header field and trusts that element.  This need not
+   be the peer UA; a proxy can insert this header field into requests.
+
+   Example:
+
+   Call-Info: <http://wwww.example.com/alice/photo.jpg> ;purpose=icon,
+     <http://www.example.com/alice/> ;purpose=info
+
+
+
+Rosenberg, et. al.          Standards Track                   [Page 166]
+
+RFC 3261            SIP: Session Initiation Protocol           June 2002
+
+
+20.10 Contact
+
+   A Contact header field value provides a URI whose meaning depends on
+   the type of request or response it is in.
+
+   A Contact header field value can contain a display name, a URI with
+   URI parameters, and header parameters.
+
+   This document defines the Contact parameters "q" and "expires".
+   These parameters are only used when the Contact is present in a
+   REGISTER request or response, or in a 3xx response.  Additional
+   parameters may be defined in other specifications.
+
+   When the header field value contains a display name, the URI
+   including all URI parameters is enclosed in "<" and ">".  If no "<"
+   and ">" are present, all parameters after the URI are header
+   parameters, not URI parameters.  The display name can be tokens, or a
+   quoted string, if a larger character set is desired.
+
+   Even if the "display-name" is empty, the "name-addr" form MUST be
+   used if the "addr-spec" contains a comma, semicolon, or question
+   mark.  There may or may not be LWS between the display-name and the
+   "<".
+
+   These rules for parsing a display name, URI and URI parameters, and
+   header parameters also apply for the header fields To and From.
+
+      The Contact header field has a role similar to the Location header
+      field in HTTP.  However, the HTTP header field only allows one
+      address, unquoted.  Since URIs can contain commas and semicolons
+      as reserved characters, they can be mistaken for header or
+      parameter delimiters, respectively.
+
+   The compact form of the Contact header field is m (for "moved").
+
+   Examples:
+
+      Contact: "Mr. Watson" <sip:watson@worcester.bell-telephone.com>
+         ;q=0.7; expires=3600,
+         "Mr. Watson" <mailto:watson@bell-telephone.com> ;q=0.1
+      m: <sips:bob@192.0.2.4>;expires=60
+
+
+
+
+
+
+
+
+
+
+Rosenberg, et. al.          Standards Track                   [Page 167]
+
+RFC 3261            SIP: Session Initiation Protocol           June 2002
+
+
+20.11 Content-Disposition
+
+   The Content-Disposition header field describes how the message body
+   or, for multipart messages, a message body part is to be interpreted
+   by the UAC or UAS.  This SIP header field extends the MIME Content-
+   Type (RFC 2183 [18]).
+
+   Several new "disposition-types" of the Content-Disposition header are
+   defined by SIP.  The value "session" indicates that the body part
+   describes a session, for either calls or early (pre-call) media.  The
+   value "render" indicates that the body part should be displayed or
+   otherwise rendered to the user.  Note that the value "render" is used
+   rather than "inline" to avoid the connotation that the MIME body is
+   displayed as a part of the rendering of the entire message (since the
+   MIME bodies of SIP messages oftentimes are not displayed to users).
+   For backward-compatibility, if the Content-Disposition header field
+   is missing, the server SHOULD assume bodies of Content-Type
+   application/sdp are the disposition "session", while other content
+   types are "render".
+
+   The disposition type "icon" indicates that the body part contains an
+   image suitable as an iconic representation of the caller or callee
+   that could be rendered informationally by a user agent when a message
+   has been received, or persistently while a dialog takes place.  The
+   value "alert" indicates that the body part contains information, such
+   as an audio clip, that should be rendered by the user agent in an
+   attempt to alert the user to the receipt of a request, generally a
+   request that initiates a dialog; this alerting body could for example
+   be rendered as a ring tone for a phone call after a 180 Ringing
+   provisional response has been sent.
+
+   Any MIME body with a "disposition-type" that renders content to the
+   user should only be processed when a message has been properly
+   authenticated.
+
+   The handling parameter, handling-param, describes how the UAS should
+   react if it receives a message body whose content type or disposition
+   type it does not understand.  The parameter has defined values of
+   "optional" and "required".  If the handling parameter is missing, the
+   value "required" SHOULD be assumed.  The handling parameter is
+   described in RFC 3204 [19].
+
+   If this header field is missing, the MIME type determines the default
+   content disposition.  If there is none, "render" is assumed.
+
+   Example:
+
+      Content-Disposition: session
+
+
+
+Rosenberg, et. al.          Standards Track                   [Page 168]
+
+RFC 3261            SIP: Session Initiation Protocol           June 2002
+
+
+20.12 Content-Encoding
+
+   The Content-Encoding header field is used as a modifier to the
+   "media-type".  When present, its value indicates what additional
+   content codings have been applied to the entity-body, and thus what
+   decoding mechanisms MUST be applied in order to obtain the media-type
+   referenced by the Content-Type header field.  Content-Encoding is
+   primarily used to allow a body to be compressed without losing the
+   identity of its underlying media type.
+
+   If multiple encodings have been applied to an entity-body, the
+   content codings MUST be listed in the order in which they were
+   applied.
+
+   All content-coding values are case-insensitive.  IANA acts as a
+   registry for content-coding value tokens.  See [H3.5] for a
+   definition of the syntax for content-coding.
+
+   Clients MAY apply content encodings to the body in requests.  A
+   server MAY apply content encodings to the bodies in responses.  The
+   server MUST only use encodings listed in the Accept-Encoding header
+   field in the request.
+
+   The compact form of the Content-Encoding header field is e.
+   Examples:
+
+      Content-Encoding: gzip
+      e: tar
+
+20.13 Content-Language
+
+   See [H14.12]. Example:
+
+      Content-Language: fr
+
+20.14 Content-Length
+
+   The Content-Length header field indicates the size of the message-
+   body, in decimal number of octets, sent to the recipient.
+   Applications SHOULD use this field to indicate the size of the
+   message-body to be transferred, regardless of the media type of the
+   entity.  If a stream-based protocol (such as TCP) is used as
+   transport, the header field MUST be used.
+
+   The size of the message-body does not include the CRLF separating
+   header fields and body.  Any Content-Length greater than or equal to
+   zero is a valid value.  If no body is present in a message, then the
+   Content-Length header field value MUST be set to zero.
+
+
+
+Rosenberg, et. al.          Standards Track                   [Page 169]
+
+RFC 3261            SIP: Session Initiation Protocol           June 2002
+
+
+      The ability to omit Content-Length simplifies the creation of
+      cgi-like scripts that dynamically generate responses.
+
+   The compact form of the header field is l.
+
+   Examples:
+
+      Content-Length: 349
+      l: 173
+
+20.15 Content-Type
+
+   The Content-Type header field indicates the media type of the
+   message-body sent to the recipient.  The "media-type" element is
+   defined in [H3.7].  The Content-Type header field MUST be present if
+   the body is not empty.  If the body is empty, and a Content-Type
+   header field is present, it indicates that the body of the specific
+   type has zero length (for example, an empty audio file).
+
+   The compact form of the header field is c.
+
+   Examples:
+
+      Content-Type: application/sdp
+      c: text/html; charset=ISO-8859-4
+
+20.16 CSeq
+
+   A CSeq header field in a request contains a single decimal sequence
+   number and the request method.  The sequence number MUST be
+   expressible as a 32-bit unsigned integer.  The method part of CSeq is
+   case-sensitive.  The CSeq header field serves to order transactions
+   within a dialog, to provide a means to uniquely identify
+   transactions, and to differentiate between new requests and request
+   retransmissions.  Two CSeq header fields are considered equal if the
+   sequence number and the request method are identical.  Example:
+
+      CSeq: 4711 INVITE
+
+20.17 Date
+
+   The Date header field contains the date and time.  Unlike HTTP/1.1,
+   SIP only supports the most recent RFC 1123 [20] format for dates.  As
+   in [H3.3], SIP restricts the time zone in SIP-date to "GMT", while
+   RFC 1123 allows any time zone.  An RFC 1123 date is case-sensitive.
+
+   The Date header field reflects the time when the request or response
+   is first sent.
+
+
+
+Rosenberg, et. al.          Standards Track                   [Page 170]
+
+RFC 3261            SIP: Session Initiation Protocol           June 2002
+
+
+      The Date header field can be used by simple end systems without a
+      battery-backed clock to acquire a notion of current time.
+      However, in its GMT form, it requires clients to know their offset
+      from GMT.
+
+   Example:
+
+      Date: Sat, 13 Nov 2010 23:29:00 GMT
+
+20.18 Error-Info
+
+   The Error-Info header field provides a pointer to additional
+   information about the error status response.
+
+      SIP UACs have user interface capabilities ranging from pop-up
+      windows and audio on PC softclients to audio-only on "black"
+      phones or endpoints connected via gateways.  Rather than forcing a
+      server generating an error to choose between sending an error
+      status code with a detailed reason phrase and playing an audio
+      recording, the Error-Info header field allows both to be sent.
+      The UAC then has the choice of which error indicator to render to
+      the caller.
+
+   A UAC MAY treat a SIP or SIPS URI in an Error-Info header field as if
+   it were a Contact in a redirect and generate a new INVITE, resulting
+   in a recorded announcement session being established.  A non-SIP URI
+   MAY be rendered to the user.
+
+   Examples:
+
+      SIP/2.0 404 The number you have dialed is not in service
+      Error-Info: <sip:not-in-service-recording@atlanta.com>
+
+20.19 Expires
+
+   The Expires header field gives the relative time after which the
+   message (or content) expires.
+
+   The precise meaning of this is method dependent.
+
+   The expiration time in an INVITE does not affect the duration of the
+   actual session that may result from the invitation.  Session
+   description protocols may offer the ability to express time limits on
+   the session duration, however.
+
+   The value of this field is an integral number of seconds (in decimal)
+   between 0 and (2**32)-1, measured from the receipt of the request.
+
+
+
+
+Rosenberg, et. al.          Standards Track                   [Page 171]
+
+RFC 3261            SIP: Session Initiation Protocol           June 2002
+
+
+   Example:
+
+      Expires: 5
+
+20.20 From
+
+   The From header field indicates the initiator of the request.  This
+   may be different from the initiator of the dialog.  Requests sent by
+   the callee to the caller use the callee's address in the From header
+   field.
+
+   The optional "display-name" is meant to be rendered by a human user
+   interface.  A system SHOULD use the display name "Anonymous" if the
+   identity of the client is to remain hidden.  Even if the "display-
+   name" is empty, the "name-addr" form MUST be used if the "addr-spec"
+   contains a comma, question mark, or semicolon.  Syntax issues are
+   discussed in Section 7.3.1.
+
+   Two From header fields are equivalent if their URIs match, and their
+   parameters match. Extension parameters in one header field, not
+   present in the other are ignored for the purposes of comparison. This
+   means that the display name and presence or absence of angle brackets
+   do not affect matching.
+
+   See Section 20.10 for the rules for parsing a display name, URI and
+   URI parameters, and header field parameters.
+
+   The compact form of the From header field is f.
+
+   Examples:
+
+      From: "A. G. Bell" <sip:agb@bell-telephone.com> ;tag=a48s
+      From: sip:+12125551212@server.phone2net.com;tag=887s
+      f: Anonymous <sip:c8oqz84zk7z@privacy.org>;tag=hyh8
+
+20.21 In-Reply-To
+
+   The In-Reply-To header field enumerates the Call-IDs that this call
+   references or returns.  These Call-IDs may have been cached by the
+   client then included in this header field in a return call.
+
+      This allows automatic call distribution systems to route return
+      calls to the originator of the first call.  This also allows
+      callees to filter calls, so that only return calls for calls they
+      originated will be accepted.  This field is not a substitute for
+      request authentication.
+
+
+
+
+
+Rosenberg, et. al.          Standards Track                   [Page 172]
+
+RFC 3261            SIP: Session Initiation Protocol           June 2002
+
+
+   Example:
+
+      In-Reply-To: 70710@saturn.bell-tel.com, 17320@saturn.bell-tel.com
+
+20.22 Max-Forwards
+
+   The Max-Forwards header field must be used with any SIP method to
+   limit the number of proxies or gateways that can forward the request
+   to the next downstream server.  This can also be useful when the
+   client is attempting to trace a request chain that appears to be
+   failing or looping in mid-chain.
+
+   The Max-Forwards value is an integer in the range 0-255 indicating
+   the remaining number of times this request message is allowed to be
+   forwarded.  This count is decremented by each server that forwards
+   the request.  The recommended initial value is 70.
+
+   This header field should be inserted by elements that can not
+   otherwise guarantee loop detection.  For example, a B2BUA should
+   insert a Max-Forwards header field.
+
+   Example:
+
+      Max-Forwards: 6
+
+20.23 Min-Expires
+
+   The Min-Expires header field conveys the minimum refresh interval
+   supported for soft-state elements managed by that server.  This
+   includes Contact header fields that are stored by a registrar.  The
+   header field contains a decimal integer number of seconds from 0 to
+   (2**32)-1.  The use of the header field in a 423 (Interval Too Brief)
+   response is described in Sections 10.2.8, 10.3, and 21.4.17.
+
+   Example:
+
+      Min-Expires: 60
+
+20.24 MIME-Version
+
+   See [H19.4.1].
+
+   Example:
+
+      MIME-Version: 1.0
+
+
+
+
+
+
+Rosenberg, et. al.          Standards Track                   [Page 173]
+
+RFC 3261            SIP: Session Initiation Protocol           June 2002
+
+
+20.25 Organization
+
+   The Organization header field conveys the name of the organization to
+   which the SIP element issuing the request or response belongs.
+
+      The field MAY be used by client software to filter calls.
+
+   Example:
+
+      Organization: Boxes by Bob
+
+20.26 Priority
+
+   The Priority header field indicates the urgency of the request as
+   perceived by the client.  The Priority header field describes the
+   priority that the SIP request should have to the receiving human or
+   its agent.  For example, it may be factored into decisions about call
+   routing and acceptance.  For these decisions, a message containing no
+   Priority header field SHOULD be treated as if it specified a Priority
+   of "normal".  The Priority header field does not influence the use of
+   communications resources such as packet forwarding priority in
+   routers or access to circuits in PSTN gateways.  The header field can
+   have the values "non-urgent", "normal", "urgent", and "emergency",
+   but additional values can be defined elsewhere.  It is RECOMMENDED
+   that the value of "emergency" only be used when life, limb, or
+   property are in imminent danger.  Otherwise, there are no semantics
+   defined for this header field.
+
+      These are the values of RFC 2076 [38], with the addition of
+      "emergency".
+
+   Examples:
+
+      Subject: A tornado is heading our way!
+      Priority: emergency
+
+   or
+
+      Subject: Weekend plans
+      Priority: non-urgent
+
+20.27 Proxy-Authenticate
+
+   A Proxy-Authenticate header field value contains an authentication
+   challenge.
+
+   The use of this header field is defined in [H14.33].  See Section
+   22.3 for further details on its usage.
+
+
+
+Rosenberg, et. al.          Standards Track                   [Page 174]
+
+RFC 3261            SIP: Session Initiation Protocol           June 2002
+
+
+   Example:
+
+      Proxy-Authenticate: Digest realm="atlanta.com",
+       domain="sip:ss1.carrier.com", qop="auth",
+       nonce="f84f1cec41e6cbe5aea9c8e88d359",
+       opaque="", stale=FALSE, algorithm=MD5
+
+20.28 Proxy-Authorization
+
+   The Proxy-Authorization header field allows the client to identify
+   itself (or its user) to a proxy that requires authentication.  A
+   Proxy-Authorization field value consists of credentials containing
+   the authentication information of the user agent for the proxy and/or
+   realm of the resource being requested.
+
+   See Section 22.3 for a definition of the usage of this header field.
+
+   This header field, along with Authorization, breaks the general rules
+   about multiple header field names.  Although not a comma-separated
+   list, this header field name may be present multiple times, and MUST
+   NOT be combined into a single header line using the usual rules
+   described in Section 7.3.1.
+
+   Example:
+
+   Proxy-Authorization: Digest username="Alice", realm="atlanta.com",
+      nonce="c60f3082ee1212b402a21831ae",
+      response="245f23415f11432b3434341c022"
+
+20.29 Proxy-Require
+
+   The Proxy-Require header field is used to indicate proxy-sensitive
+   features that must be supported by the proxy.  See Section 20.32 for
+   more details on the mechanics of this message and a usage example.
+
+   Example:
+
+      Proxy-Require: foo
+
+20.30 Record-Route
+
+   The Record-Route header field is inserted by proxies in a request to
+   force future requests in the dialog to be routed through the proxy.
+
+   Examples of its use with the Route header field are described in
+   Sections 16.12.1.
+
+
+
+
+
+Rosenberg, et. al.          Standards Track                   [Page 175]
+
+RFC 3261            SIP: Session Initiation Protocol           June 2002
+
+
+   Example:
+
+      Record-Route: <sip:server10.biloxi.com;lr>,
+                    <sip:bigbox3.site3.atlanta.com;lr>
+
+20.31 Reply-To
+
+   The Reply-To header field contains a logical return URI that may be
+   different from the From header field.  For example, the URI MAY be
+   used to return missed calls or unestablished sessions.  If the user
+   wished to remain anonymous, the header field SHOULD either be omitted
+   from the request or populated in such a way that does not reveal any
+   private information.
+
+   Even if the "display-name" is empty, the "name-addr" form MUST be
+   used if the "addr-spec" contains a comma, question mark, or
+   semicolon.  Syntax issues are discussed in Section 7.3.1.
+
+   Example:
+
+      Reply-To: Bob <sip:bob@biloxi.com>
+
+20.32 Require
+
+   The Require header field is used by UACs to tell UASs about options
+   that the UAC expects the UAS to support in order to process the
+   request.  Although an optional header field, the Require MUST NOT be
+   ignored if it is present.
+
+   The Require header field contains a list of option tags, described in
+   Section 19.2.  Each option tag defines a SIP extension that MUST be
+   understood to process the request.  Frequently, this is used to
+   indicate that a specific set of extension header fields need to be
+   understood.  A UAC compliant to this specification MUST only include
+   option tags corresponding to standards-track RFCs.
+
+   Example:
+
+      Require: 100rel
+
+20.33 Retry-After
+
+   The Retry-After header field can be used with a 500 (Server Internal
+   Error) or 503 (Service Unavailable) response to indicate how long the
+   service is expected to be unavailable to the requesting client and
+   with a 404 (Not Found), 413 (Request Entity Too Large), 480
+   (Temporarily Unavailable), 486 (Busy Here), 600 (Busy), or 603
+
+
+
+
+Rosenberg, et. al.          Standards Track                   [Page 176]
+
+RFC 3261            SIP: Session Initiation Protocol           June 2002
+
+
+   (Decline) response to indicate when the called party anticipates
+   being available again.  The value of this field is a positive integer
+   number of seconds (in decimal) after the time of the response.
+
+   An optional comment can be used to indicate additional information
+   about the time of callback.  An optional "duration" parameter
+   indicates how long the called party will be reachable starting at the
+   initial time of availability.  If no duration parameter is given, the
+   service is assumed to be available indefinitely.
+
+   Examples:
+
+      Retry-After: 18000;duration=3600
+      Retry-After: 120 (I'm in a meeting)
+
+20.34 Route
+
+   The Route header field is used to force routing for a request through
+   the listed set of proxies.  Examples of the use of the Route header
+   field are in Section 16.12.1.
+
+   Example:
+
+      Route: <sip:bigbox3.site3.atlanta.com;lr>,
+             <sip:server10.biloxi.com;lr>
+
+20.35 Server
+
+   The Server header field contains information about the software used
+   by the UAS to handle the request.
+
+   Revealing the specific software version of the server might allow the
+   server to become more vulnerable to attacks against software that is
+   known to contain security holes.  Implementers SHOULD make the Server
+   header field a configurable option.
+
+   Example:
+
+      Server: HomeServer v2
+
+20.36 Subject
+
+   The Subject header field provides a summary or indicates the nature
+   of the call, allowing call filtering without having to parse the
+   session description.  The session description does not have to use
+   the same subject indication as the invitation.
+
+   The compact form of the Subject header field is s.
+
+
+
+Rosenberg, et. al.          Standards Track                   [Page 177]
+
+RFC 3261            SIP: Session Initiation Protocol           June 2002
+
+
+   Example:
+
+      Subject: Need more boxes
+      s: Tech Support
+
+20.37 Supported
+
+   The Supported header field enumerates all the extensions supported by
+   the UAC or UAS.
+
+   The Supported header field contains a list of option tags, described
+   in Section 19.2, that are understood by the UAC or UAS.  A UA
+   compliant to this specification MUST only include option tags
+   corresponding to standards-track RFCs.  If empty, it means that no
+   extensions are supported.
+
+   The compact form of the Supported header field is k.
+
+   Example:
+
+      Supported: 100rel
+
+20.38 Timestamp
+
+   The Timestamp header field describes when the UAC sent the request to
+   the UAS.
+
+   See Section 8.2.6 for details on how to generate a response to a
+   request that contains the header field.  Although there is no
+   normative behavior defined here that makes use of the header, it
+   allows for extensions or SIP applications to obtain RTT estimates.
+
+   Example:
+
+      Timestamp: 54
+
+20.39 To
+
+   The To header field specifies the logical recipient of the request.
+
+   The optional "display-name" is meant to be rendered by a human-user
+   interface.  The "tag" parameter serves as a general mechanism for
+   dialog identification.
+
+   See Section 19.3 for details of the "tag" parameter.
+
+
+
+
+
+
+Rosenberg, et. al.          Standards Track                   [Page 178]
+
+RFC 3261            SIP: Session Initiation Protocol           June 2002
+
+
+   Comparison of To header fields for equality is identical to
+   comparison of From header fields.  See Section 20.10 for the rules
+   for parsing a display name, URI and URI parameters, and header field
+   parameters.
+
+   The compact form of the To header field is t.
+
+   The following are examples of valid To header fields:
+
+      To: The Operator <sip:operator@cs.columbia.edu>;tag=287447
+      t: sip:+12125551212@server.phone2net.com
+
+20.40 Unsupported
+
+   The Unsupported header field lists the features not supported by the
+   UAS.  See Section 20.32 for motivation.
+
+   Example:
+
+      Unsupported: foo
+
+20.41 User-Agent
+
+   The User-Agent header field contains information about the UAC
+   originating the request.  The semantics of this header field are
+   defined in [H14.43].
+
+   Revealing the specific software version of the user agent might allow
+   the user agent to become more vulnerable to attacks against software
+   that is known to contain security holes.  Implementers SHOULD make
+   the User-Agent header field a configurable option.
+
+   Example:
+
+      User-Agent: Softphone Beta1.5
+
+20.42 Via
+
+   The Via header field indicates the path taken by the request so far
+   and indicates the path that should be followed in routing responses.
+   The branch ID parameter in the Via header field values serves as a
+   transaction identifier, and is used by proxies to detect loops.
+
+   A Via header field value contains the transport protocol used to send
+   the message, the client's host name or network address, and possibly
+   the port number at which it wishes to receive responses.  A Via
+   header field value can also contain parameters such as "maddr",
+   "ttl", "received", and "branch", whose meaning and use are described
+
+
+
+Rosenberg, et. al.          Standards Track                   [Page 179]
+
+RFC 3261            SIP: Session Initiation Protocol           June 2002
+
+
+   in other sections.  For implementations compliant to this
+   specification, the value of the branch parameter MUST start with the
+   magic cookie "z9hG4bK", as discussed in Section 8.1.1.7.
+
+   Transport protocols defined here are "UDP", "TCP", "TLS", and "SCTP".
+   "TLS" means TLS over TCP.  When a request is sent to a SIPS URI, the
+   protocol still indicates "SIP", and the transport protocol is TLS.
+
+Via: SIP/2.0/UDP erlang.bell-telephone.com:5060;branch=z9hG4bK87asdks7
+Via: SIP/2.0/UDP 192.0.2.1:5060 ;received=192.0.2.207
+     ;branch=z9hG4bK77asjd
+
+   The compact form of the Via header field is v.
+
+   In this example, the message originated from a multi-homed host with
+   two addresses, 192.0.2.1 and 192.0.2.207.  The sender guessed wrong
+   as to which network interface would be used.  Erlang.bell-
+   telephone.com noticed the mismatch and added a parameter to the
+   previous hop's Via header field value, containing the address that
+   the packet actually came from.
+
+   The host or network address and port number are not required to
+   follow the SIP URI syntax.  Specifically, LWS on either side of the
+   ":" or "/" is allowed, as shown here:
+
+      Via: SIP / 2.0 / UDP first.example.com: 4000;ttl=16
+        ;maddr=224.2.0.1 ;branch=z9hG4bKa7c6a8dlze.1
+
+   Even though this specification mandates that the branch parameter be
+   present in all requests, the BNF for the header field indicates that
+   it is optional.  This allows interoperation with RFC 2543 elements,
+   which did not have to insert the branch parameter.
+
+   Two Via header fields are equal if their sent-protocol and sent-by
+   fields are equal, both have the same set of parameters, and the
+   values of all parameters are equal.
+
+20.43 Warning
+
+   The Warning header field is used to carry additional information
+   about the status of a response.  Warning header field values are sent
+   with responses and contain a three-digit warning code, host name, and
+   warning text.
+
+   The "warn-text" should be in a natural language that is most likely
+   to be intelligible to the human user receiving the response.  This
+   decision can be based on any available knowledge, such as the
+   location of the user, the Accept-Language field in a request, or the
+
+
+
+Rosenberg, et. al.          Standards Track                   [Page 180]
+
+RFC 3261            SIP: Session Initiation Protocol           June 2002
+
+
+   Content-Language field in a response.  The default language is i-
+   default [21].
+
+   The currently-defined "warn-code"s are listed below, with a
+   recommended warn-text in English and a description of their meaning.
+   These warnings describe failures induced by the session description.
+   The first digit of warning codes beginning with "3" indicates
+   warnings specific to SIP.  Warnings 300 through 329 are reserved for
+   indicating problems with keywords in the session description, 330
+   through 339 are warnings related to basic network services requested
+   in the session description, 370 through 379 are warnings related to
+   quantitative QoS parameters requested in the session description, and
+   390 through 399 are miscellaneous warnings that do not fall into one
+   of the above categories.
+
+      300 Incompatible network protocol: One or more network protocols
+          contained in the session description are not available.
+
+      301 Incompatible network address formats: One or more network
+          address formats contained in the session description are not
+          available.
+
+      302 Incompatible transport protocol: One or more transport
+          protocols described in the session description are not
+          available.
+
+      303 Incompatible bandwidth units: One or more bandwidth
+          measurement units contained in the session description were
+          not understood.
+
+      304 Media type not available: One or more media types contained in
+          the session description are not available.
+
+      305 Incompatible media format: One or more media formats contained
+          in the session description are not available.
+
+      306 Attribute not understood: One or more of the media attributes
+          in the session description are not supported.
+
+      307 Session description parameter not understood: A parameter
+          other than those listed above was not understood.
+
+      330 Multicast not available: The site where the user is located
+          does not support multicast.
+
+      331 Unicast not available: The site where the user is located does
+          not support unicast communication (usually due to the presence
+          of a firewall).
+
+
+
+Rosenberg, et. al.          Standards Track                   [Page 181]
+
+RFC 3261            SIP: Session Initiation Protocol           June 2002
+
+
+      370 Insufficient bandwidth: The bandwidth specified in the session
+          description or defined by the media exceeds that known to be
+          available.
+
+      399 Miscellaneous warning: The warning text can include arbitrary
+          information to be presented to a human user or logged.  A
+          system receiving this warning MUST NOT take any automated
+          action.
+
+             1xx and 2xx have been taken by HTTP/1.1.
+
+   Additional "warn-code"s can be defined through IANA, as defined in
+   Section 27.2.
+
+   Examples:
+
+      Warning: 307 isi.edu "Session parameter 'foo' not understood"
+      Warning: 301 isi.edu "Incompatible network address type 'E.164'"
+
+20.44 WWW-Authenticate
+
+   A WWW-Authenticate header field value contains an authentication
+   challenge.  See Section 22.2 for further details on its usage.
+
+   Example:
+
+      WWW-Authenticate: Digest realm="atlanta.com",
+        domain="sip:boxesbybob.com", qop="auth",
+        nonce="f84f1cec41e6cbe5aea9c8e88d359",
+        opaque="", stale=FALSE, algorithm=MD5
+
+21 Response Codes
+
+   The response codes are consistent with, and extend, HTTP/1.1 response
+   codes.  Not all HTTP/1.1 response codes are appropriate, and only
+   those that are appropriate are given here.  Other HTTP/1.1 response
+   codes SHOULD NOT be used.  Also, SIP defines a new class, 6xx.
+
+21.1 Provisional 1xx
+
+   Provisional responses, also known as informational responses,
+   indicate that the server contacted is performing some further action
+   and does not yet have a definitive response.  A server sends a 1xx
+   response if it expects to take more than 200 ms to obtain a final
+   response.  Note that 1xx responses are not transmitted reliably.
+   They never cause the client to send an ACK.  Provisional (1xx)
+   responses MAY contain message bodies, including session descriptions.
+
+
+
+
+Rosenberg, et. al.          Standards Track                   [Page 182]
+
+RFC 3261            SIP: Session Initiation Protocol           June 2002
+
+
+21.1.1 100 Trying
+
+   This response indicates that the request has been received by the
+   next-hop server and that some unspecified action is being taken on
+   behalf of this call (for example, a database is being consulted).
+   This response, like all other provisional responses, stops
+   retransmissions of an INVITE by a UAC.  The 100 (Trying) response is
+   different from other provisional responses, in that it is never
+   forwarded upstream by a stateful proxy.
+
+21.1.2 180 Ringing
+
+   The UA receiving the INVITE is trying to alert the user.  This
+   response MAY be used to initiate local ringback.
+
+21.1.3 181 Call Is Being Forwarded
+
+   A server MAY use this status code to indicate that the call is being
+   forwarded to a different set of destinations.
+
+21.1.4 182 Queued
+
+   The called party is temporarily unavailable, but the server has
+   decided to queue the call rather than reject it.  When the callee
+   becomes available, it will return the appropriate final status
+   response.  The reason phrase MAY give further details about the
+   status of the call, for example, "5 calls queued; expected waiting
+   time is 15 minutes".  The server MAY issue several 182 (Queued)
+   responses to update the caller about the status of the queued call.
+
+21.1.5 183 Session Progress
+
+   The 183 (Session Progress) response is used to convey information
+   about the progress of the call that is not otherwise classified.  The
+   Reason-Phrase, header fields, or message body MAY be used to convey
+   more details about the call progress.
+
+21.2 Successful 2xx
+
+   The request was successful.
+
+21.2.1 200 OK
+
+   The request has succeeded.  The information returned with the
+   response depends on the method used in the request.
+
+
+
+
+
+
+Rosenberg, et. al.          Standards Track                   [Page 183]
+
+RFC 3261            SIP: Session Initiation Protocol           June 2002
+
+
+21.3 Redirection 3xx
+
+   3xx responses give information about the user's new location, or
+   about alternative services that might be able to satisfy the call.
+
+21.3.1 300 Multiple Choices
+
+   The address in the request resolved to several choices, each with its
+   own specific location, and the user (or UA) can select a preferred
+   communication end point and redirect its request to that location.
+
+   The response MAY include a message body containing a list of resource
+   characteristics and location(s) from which the user or UA can choose
+   the one most appropriate, if allowed by the Accept request header
+   field.  However, no MIME types have been defined for this message
+   body.
+
+   The choices SHOULD also be listed as Contact fields (Section 20.10).
+   Unlike HTTP, the SIP response MAY contain several Contact fields or a
+   list of addresses in a Contact field.  UAs MAY use the Contact header
+   field value for automatic redirection or MAY ask the user to confirm
+   a choice.  However, this specification does not define any standard
+   for such automatic selection.
+
+      This status response is appropriate if the callee can be reached
+      at several different locations and the server cannot or prefers
+      not to proxy the request.
+
+21.3.2 301 Moved Permanently
+
+   The user can no longer be found at the address in the Request-URI,
+   and the requesting client SHOULD retry at the new address given by
+   the Contact header field (Section 20.10).  The requestor SHOULD
+   update any local directories, address books, and user location caches
+   with this new value and redirect future requests to the address(es)
+   listed.
+
+21.3.3 302 Moved Temporarily
+
+   The requesting client SHOULD retry the request at the new address(es)
+   given by the Contact header field (Section 20.10).  The Request-URI
+   of the new request uses the value of the Contact header field in the
+   response.
+
+
+
+
+
+
+
+
+Rosenberg, et. al.          Standards Track                   [Page 184]
+
+RFC 3261            SIP: Session Initiation Protocol           June 2002
+
+
+   The duration of the validity of the Contact URI can be indicated
+   through an Expires (Section 20.19) header field or an expires
+   parameter in the Contact header field.  Both proxies and UAs MAY
+   cache this URI for the duration of the expiration time.  If there is
+   no explicit expiration time, the address is only valid once for
+   recursing, and MUST NOT be cached for future transactions.
+
+   If the URI cached from the Contact header field fails, the Request-
+   URI from the redirected request MAY be tried again a single time.
+
+      The temporary URI may have become out-of-date sooner than the
+      expiration time, and a new temporary URI may be available.
+
+21.3.4 305 Use Proxy
+
+   The requested resource MUST be accessed through the proxy given by
+   the Contact field.  The Contact field gives the URI of the proxy.
+   The recipient is expected to repeat this single request via the
+   proxy.  305 (Use Proxy) responses MUST only be generated by UASs.
+
+21.3.5 380 Alternative Service
+
+   The call was not successful, but alternative services are possible.
+
+   The alternative services are described in the message body of the
+   response.  Formats for such bodies are not defined here, and may be
+   the subject of future standardization.
+
+21.4 Request Failure 4xx
+
+   4xx responses are definite failure responses from a particular
+   server.  The client SHOULD NOT retry the same request without
+   modification (for example, adding appropriate authorization).
+   However, the same request to a different server might be successful.
+
+21.4.1 400 Bad Request
+
+   The request could not be understood due to malformed syntax.  The
+   Reason-Phrase SHOULD identify the syntax problem in more detail, for
+   example, "Missing Call-ID header field".
+
+21.4.2 401 Unauthorized
+
+   The request requires user authentication.  This response is issued by
+   UASs and registrars, while 407 (Proxy Authentication Required) is
+   used by proxy servers.
+
+
+
+
+
+Rosenberg, et. al.          Standards Track                   [Page 185]
+
+RFC 3261            SIP: Session Initiation Protocol           June 2002
+
+
+21.4.3 402 Payment Required
+
+   Reserved for future use.
+
+21.4.4 403 Forbidden
+
+   The server understood the request, but is refusing to fulfill it.
+   Authorization will not help, and the request SHOULD NOT be repeated.
+
+21.4.5 404 Not Found
+
+   The server has definitive information that the user does not exist at
+   the domain specified in the Request-URI.  This status is also
+   returned if the domain in the Request-URI does not match any of the
+   domains handled by the recipient of the request.
+
+21.4.6 405 Method Not Allowed
+
+   The method specified in the Request-Line is understood, but not
+   allowed for the address identified by the Request-URI.
+
+   The response MUST include an Allow header field containing a list of
+   valid methods for the indicated address.
+
+21.4.7 406 Not Acceptable
+
+   The resource identified by the request is only capable of generating
+   response entities that have content characteristics not acceptable
+   according to the Accept header field sent in the request.
+
+21.4.8 407 Proxy Authentication Required
+
+   This code is similar to 401 (Unauthorized), but indicates that the
+   client MUST first authenticate itself with the proxy.  SIP access
+   authentication is explained in Sections 26 and 22.3.
+
+   This status code can be used for applications where access to the
+   communication channel (for example, a telephony gateway) rather than
+   the callee requires authentication.
+
+21.4.9 408 Request Timeout
+
+   The server could not produce a response within a suitable amount of
+   time, for example, if it could not determine the location of the user
+   in time.  The client MAY repeat the request without modifications at
+   any later time.
+
+
+
+
+
+Rosenberg, et. al.          Standards Track                   [Page 186]
+
+RFC 3261            SIP: Session Initiation Protocol           June 2002
+
+
+21.4.10 410 Gone
+
+   The requested resource is no longer available at the server and no
+   forwarding address is known.  This condition is expected to be
+   considered permanent.  If the server does not know, or has no
+   facility to determine, whether or not the condition is permanent, the
+   status code 404 (Not Found) SHOULD be used instead.
+
+21.4.11 413 Request Entity Too Large
+
+   The server is refusing to process a request because the request
+   entity-body is larger than the server is willing or able to process.
+   The server MAY close the connection to prevent the client from
+   continuing the request.
+
+   If the condition is temporary, the server SHOULD include a Retry-
+   After header field to indicate that it is temporary and after what
+   time the client MAY try again.
+
+21.4.12 414 Request-URI Too Long
+
+   The server is refusing to service the request because the Request-URI
+   is longer than the server is willing to interpret.
+
+21.4.13 415 Unsupported Media Type
+
+   The server is refusing to service the request because the message
+   body of the request is in a format not supported by the server for
+   the requested method.  The server MUST return a list of acceptable
+   formats using the Accept, Accept-Encoding, or Accept-Language header
+   field, depending on the specific problem with the content.  UAC
+   processing of this response is described in Section 8.1.3.5.
+
+21.4.14 416 Unsupported URI Scheme
+
+   The server cannot process the request because the scheme of the URI
+   in the Request-URI is unknown to the server.  Client processing of
+   this response is described in Section 8.1.3.5.
+
+21.4.15 420 Bad Extension
+
+   The server did not understand the protocol extension specified in a
+   Proxy-Require (Section 20.29) or Require (Section 20.32) header
+   field.  The server MUST include a list of the unsupported extensions
+   in an Unsupported header field in the response.  UAC processing of
+   this response is described in Section 8.1.3.5.
+
+
+
+
+
+Rosenberg, et. al.          Standards Track                   [Page 187]
+
+RFC 3261            SIP: Session Initiation Protocol           June 2002
+
+
+21.4.16 421 Extension Required
+
+   The UAS needs a particular extension to process the request, but this
+   extension is not listed in a Supported header field in the request.
+   Responses with this status code MUST contain a Require header field
+   listing the required extensions.
+
+   A UAS SHOULD NOT use this response unless it truly cannot provide any
+   useful service to the client.  Instead, if a desirable extension is
+   not listed in the Supported header field, servers SHOULD process the
+   request using baseline SIP capabilities and any extensions supported
+   by the client.
+
+21.4.17 423 Interval Too Brief
+
+   The server is rejecting the request because the expiration time of
+   the resource refreshed by the request is too short.  This response
+   can be used by a registrar to reject a registration whose Contact
+   header field expiration time was too small.  The use of this response
+   and the related Min-Expires header field are described in Sections
+   10.2.8, 10.3, and 20.23.
+
+21.4.18 480 Temporarily Unavailable
+
+   The callee's end system was contacted successfully but the callee is
+   currently unavailable (for example, is not logged in, logged in but
+   in a state that precludes communication with the callee, or has
+   activated the "do not disturb" feature).  The response MAY indicate a
+   better time to call in the Retry-After header field.  The user could
+   also be available elsewhere (unbeknownst to this server).  The reason
+   phrase SHOULD indicate a more precise cause as to why the callee is
+   unavailable.  This value SHOULD be settable by the UA.  Status 486
+   (Busy Here) MAY be used to more precisely indicate a particular
+   reason for the call failure.
+
+   This status is also returned by a redirect or proxy server that
+   recognizes the user identified by the Request-URI, but does not
+   currently have a valid forwarding location for that user.
+
+21.4.19 481 Call/Transaction Does Not Exist
+
+   This status indicates that the UAS received a request that does not
+   match any existing dialog or transaction.
+
+21.4.20 482 Loop Detected
+
+   The server has detected a loop (Section 16.3 Item 4).
+
+
+
+
+Rosenberg, et. al.          Standards Track                   [Page 188]
+
+RFC 3261            SIP: Session Initiation Protocol           June 2002
+
+
+21.4.21 483 Too Many Hops
+
+   The server received a request that contains a Max-Forwards (Section
+   20.22) header field with the value zero.
+
+21.4.22 484 Address Incomplete
+
+   The server received a request with a Request-URI that was incomplete.
+   Additional information SHOULD be provided in the reason phrase.
+
+      This status code allows overlapped dialing.  With overlapped
+      dialing, the client does not know the length of the dialing
+      string.  It sends strings of increasing lengths, prompting the
+      user for more input, until it no longer receives a 484 (Address
+      Incomplete) status response.
+
+21.4.23 485 Ambiguous
+
+   The Request-URI was ambiguous.  The response MAY contain a listing of
+   possible unambiguous addresses in Contact header fields.  Revealing
+   alternatives can infringe on privacy of the user or the organization.
+   It MUST be possible to configure a server to respond with status 404
+   (Not Found) or to suppress the listing of possible choices for
+   ambiguous Request-URIs.
+
+   Example response to a request with the Request-URI
+   sip:lee@example.com:
+
+      SIP/2.0 485 Ambiguous
+      Contact: Carol Lee <sip:carol.lee@example.com>
+      Contact: Ping Lee <sip:p.lee@example.com>
+      Contact: Lee M. Foote <sips:lee.foote@example.com>
+
+      Some email and voice mail systems provide this functionality.  A
+      status code separate from 3xx is used since the semantics are
+      different: for 300, it is assumed that the same person or service
+      will be reached by the choices provided.  While an automated
+      choice or sequential search makes sense for a 3xx response, user
+      intervention is required for a 485 (Ambiguous) response.
+
+21.4.24 486 Busy Here
+
+   The callee's end system was contacted successfully, but the callee is
+   currently not willing or able to take additional calls at this end
+   system.  The response MAY indicate a better time to call in the
+   Retry-After header field.  The user could also be available
+
+
+
+
+
+Rosenberg, et. al.          Standards Track                   [Page 189]
+
+RFC 3261            SIP: Session Initiation Protocol           June 2002
+
+
+   elsewhere, such as through a voice mail service.  Status 600 (Busy
+   Everywhere) SHOULD be used if the client knows that no other end
+   system will be able to accept this call.
+
+21.4.25 487 Request Terminated
+
+   The request was terminated by a BYE or CANCEL request.  This response
+   is never returned for a CANCEL request itself.
+
+21.4.26 488 Not Acceptable Here
+
+   The response has the same meaning as 606 (Not Acceptable), but only
+   applies to the specific resource addressed by the Request-URI and the
+   request may succeed elsewhere.
+
+   A message body containing a description of media capabilities MAY be
+   present in the response, which is formatted according to the Accept
+   header field in the INVITE (or application/sdp if not present), the
+   same as a message body in a 200 (OK) response to an OPTIONS request.
+
+21.4.27 491 Request Pending
+
+   The request was received by a UAS that had a pending request within
+   the same dialog.  Section 14.2 describes how such "glare" situations
+   are resolved.
+
+21.4.28 493 Undecipherable
+
+   The request was received by a UAS that contained an encrypted MIME
+   body for which the recipient does not possess or will not provide an
+   appropriate decryption key.  This response MAY have a single body
+   containing an appropriate public key that should be used to encrypt
+   MIME bodies sent to this UA.  Details of the usage of this response
+   code can be found in Section 23.2.
+
+21.5 Server Failure 5xx
+
+   5xx responses are failure responses given when a server itself has
+   erred.
+
+21.5.1 500 Server Internal Error
+
+   The server encountered an unexpected condition that prevented it from
+   fulfilling the request.  The client MAY display the specific error
+   condition and MAY retry the request after several seconds.
+
+   If the condition is temporary, the server MAY indicate when the
+   client may retry the request using the Retry-After header field.
+
+
+
+Rosenberg, et. al.          Standards Track                   [Page 190]
+
+RFC 3261            SIP: Session Initiation Protocol           June 2002
+
+
+21.5.2 501 Not Implemented
+
+   The server does not support the functionality required to fulfill the
+   request.  This is the appropriate response when a UAS does not
+   recognize the request method and is not capable of supporting it for
+   any user.  (Proxies forward all requests regardless of method.)
+
+   Note that a 405 (Method Not Allowed) is sent when the server
+   recognizes the request method, but that method is not allowed or
+   supported.
+
+21.5.3 502 Bad Gateway
+
+   The server, while acting as a gateway or proxy, received an invalid
+   response from the downstream server it accessed in attempting to
+   fulfill the request.
+
+21.5.4 503 Service Unavailable
+
+   The server is temporarily unable to process the request due to a
+   temporary overloading or maintenance of the server.  The server MAY
+   indicate when the client should retry the request in a Retry-After
+   header field.  If no Retry-After is given, the client MUST act as if
+   it had received a 500 (Server Internal Error) response.
+
+   A client (proxy or UAC) receiving a 503 (Service Unavailable) SHOULD
+   attempt to forward the request to an alternate server.  It SHOULD NOT
+   forward any other requests to that server for the duration specified
+   in the Retry-After header field, if present.
+
+   Servers MAY refuse the connection or drop the request instead of
+   responding with 503 (Service Unavailable).
+
+21.5.5 504 Server Time-out
+
+   The server did not receive a timely response from an external server
+   it accessed in attempting to process the request.  408 (Request
+   Timeout) should be used instead if there was no response within the
+   period specified in the Expires header field from the upstream
+   server.
+
+21.5.6 505 Version Not Supported
+
+   The server does not support, or refuses to support, the SIP protocol
+   version that was used in the request.  The server is indicating that
+   it is unable or unwilling to complete the request using the same
+   major version as the client, other than with this error message.
+
+
+
+
+Rosenberg, et. al.          Standards Track                   [Page 191]
+
+RFC 3261            SIP: Session Initiation Protocol           June 2002
+
+
+21.5.7 513 Message Too Large
+
+   The server was unable to process the request since the message length
+   exceeded its capabilities.
+
+21.6 Global Failures 6xx
+
+   6xx responses indicate that a server has definitive information about
+   a particular user, not just the particular instance indicated in the
+   Request-URI.
+
+21.6.1 600 Busy Everywhere
+
+   The callee's end system was contacted successfully but the callee is
+   busy and does not wish to take the call at this time.  The response
+   MAY indicate a better time to call in the Retry-After header field.
+   If the callee does not wish to reveal the reason for declining the
+   call, the callee uses status code 603 (Decline) instead.  This status
+   response is returned only if the client knows that no other end point
+   (such as a voice mail system) will answer the request.  Otherwise,
+   486 (Busy Here) should be returned.
+
+21.6.2 603 Decline
+
+   The callee's machine was successfully contacted but the user
+   explicitly does not wish to or cannot participate.  The response MAY
+   indicate a better time to call in the Retry-After header field.  This
+   status response is returned only if the client knows that no other
+   end point will answer the request.
+
+21.6.3 604 Does Not Exist Anywhere
+
+   The server has authoritative information that the user indicated in
+   the Request-URI does not exist anywhere.
+
+21.6.4 606 Not Acceptable
+
+   The user's agent was contacted successfully but some aspects of the
+   session description such as the requested media, bandwidth, or
+   addressing style were not acceptable.
+
+   A 606 (Not Acceptable) response means that the user wishes to
+   communicate, but cannot adequately support the session described.
+   The 606 (Not Acceptable) response MAY contain a list of reasons in a
+   Warning header field describing why the session described cannot be
+   supported.  Warning reason codes are listed in Section 20.43.
+
+
+
+
+
+Rosenberg, et. al.          Standards Track                   [Page 192]
+
+RFC 3261            SIP: Session Initiation Protocol           June 2002
+
+
+   A message body containing a description of media capabilities MAY be
+   present in the response, which is formatted according to the Accept
+   header field in the INVITE (or application/sdp if not present), the
+   same as a message body in a 200 (OK) response to an OPTIONS request.
+
+   It is hoped that negotiation will not frequently be needed, and when
+   a new user is being invited to join an already existing conference,
+   negotiation may not be possible.  It is up to the invitation
+   initiator to decide whether or not to act on a 606 (Not Acceptable)
+   response.
+
+   This status response is returned only if the client knows that no
+   other end point will answer the request.
+
+22 Usage of HTTP Authentication
+
+   SIP provides a stateless, challenge-based mechanism for
+   authentication that is based on authentication in HTTP.  Any time
+   that a proxy server or UA receives a request (with the exceptions
+   given in Section 22.1), it MAY challenge the initiator of the request
+   to provide assurance of its identity.  Once the originator has been
+   identified, the recipient of the request SHOULD ascertain whether or
+   not this user is authorized to make the request in question.  No
+   authorization systems are recommended or discussed in this document.
+
+   The "Digest" authentication mechanism described in this section
+   provides message authentication and replay protection only, without
+   message integrity or confidentiality.  Protective measures above and
+   beyond those provided by Digest need to be taken to prevent active
+   attackers from modifying SIP requests and responses.
+
+   Note that due to its weak security, the usage of "Basic"
+   authentication has been deprecated.  Servers MUST NOT accept
+   credentials using the "Basic" authorization scheme, and servers also
+   MUST NOT challenge with "Basic".  This is a change from RFC 2543.
+
+22.1 Framework
+
+   The framework for SIP authentication closely parallels that of HTTP
+   (RFC 2617 [17]).  In particular, the BNF for auth-scheme, auth-param,
+   challenge, realm, realm-value, and credentials is identical (although
+   the usage of "Basic" as a scheme is not permitted).  In SIP, a UAS
+   uses the 401 (Unauthorized) response to challenge the identity of a
+   UAC.  Additionally, registrars and redirect servers MAY make use of
+   401 (Unauthorized) responses for authentication, but proxies MUST
+   NOT, and instead MAY use the 407 (Proxy Authentication Required)
+
+
+
+
+
+Rosenberg, et. al.          Standards Track                   [Page 193]
+
+RFC 3261            SIP: Session Initiation Protocol           June 2002
+
+
+   response.  The requirements for inclusion of the Proxy-Authenticate,
+   Proxy-Authorization, WWW-Authenticate, and Authorization in the
+   various messages are identical to those described in RFC 2617 [17].
+
+   Since SIP does not have the concept of a canonical root URL, the
+   notion of protection spaces is interpreted differently in SIP.  The
+   realm string alone defines the protection domain.  This is a change
+   from RFC 2543, in which the Request-URI and the realm together
+   defined the protection domain.
+
+      This previous definition of protection domain caused some amount
+      of confusion since the Request-URI sent by the UAC and the
+      Request-URI received by the challenging server might be different,
+      and indeed the final form of the Request-URI might not be known to
+      the UAC.  Also, the previous definition depended on the presence
+      of a SIP URI in the Request-URI and seemed to rule out alternative
+      URI schemes (for example, the tel URL).
+
+   Operators of user agents or proxy servers that will authenticate
+   received requests MUST adhere to the following guidelines for
+   creation of a realm string for their server:
+
+      o  Realm strings MUST be globally unique.  It is RECOMMENDED that
+         a realm string contain a hostname or domain name, following the
+         recommendation in Section 3.2.1 of RFC 2617 [17].
+
+      o  Realm strings SHOULD present a human-readable identifier that
+         can be rendered to a user.
+
+   For example:
+
+      INVITE sip:bob@biloxi.com SIP/2.0
+      Authorization: Digest realm="biloxi.com", <...>
+
+   Generally, SIP authentication is meaningful for a specific realm, a
+   protection domain.  Thus, for Digest authentication, each such
+   protection domain has its own set of usernames and passwords.  If a
+   server does not require authentication for a particular request, it
+   MAY accept a default username, "anonymous", which has no password
+   (password of "").  Similarly, UACs representing many users, such as
+   PSTN gateways, MAY have their own device-specific username and
+   password, rather than accounts for particular users, for their realm.
+
+   While a server can legitimately challenge most SIP requests, there
+   are two requests defined by this document that require special
+   handling for authentication: ACK and CANCEL.
+
+
+
+
+
+Rosenberg, et. al.          Standards Track                   [Page 194]
+
+RFC 3261            SIP: Session Initiation Protocol           June 2002
+
+
+   Under an authentication scheme that uses responses to carry values
+   used to compute nonces (such as Digest), some problems come up for
+   any requests that take no response, including ACK.  For this reason,
+   any credentials in the INVITE that were accepted by a server MUST be
+   accepted by that server for the ACK.  UACs creating an ACK message
+   will duplicate all of the Authorization and Proxy-Authorization
+   header field values that appeared in the INVITE to which the ACK
+   corresponds.  Servers MUST NOT attempt to challenge an ACK.
+
+   Although the CANCEL method does take a response (a 2xx), servers MUST
+   NOT attempt to challenge CANCEL requests since these requests cannot
+   be resubmitted.  Generally, a CANCEL request SHOULD be accepted by a
+   server if it comes from the same hop that sent the request being
+   canceled (provided that some sort of transport or network layer
+   security association, as described in Section 26.2.1, is in place).
+
+   When a UAC receives a challenge, it SHOULD render to the user the
+   contents of the "realm" parameter in the challenge (which appears in
+   either a WWW-Authenticate header field or Proxy-Authenticate header
+   field) if the UAC device does not already know of a credential for
+   the realm in question.  A service provider that pre-configures UAs
+   with credentials for its realm should be aware that users will not
+   have the opportunity to present their own credentials for this realm
+   when challenged at a pre-configured device.
+
+   Finally, note that even if a UAC can locate credentials that are
+   associated with the proper realm, the potential exists that these
+   credentials may no longer be valid or that the challenging server
+   will not accept these credentials for whatever reason (especially
+   when "anonymous" with no password is submitted).  In this instance a
+   server may repeat its challenge, or it may respond with a 403
+   Forbidden.  A UAC MUST NOT re-attempt requests with the credentials
+   that have just been rejected (though the request may be retried if
+   the nonce was stale).
+
+22.2 User-to-User Authentication
+
+   When a UAS receives a request from a UAC, the UAS MAY authenticate
+   the originator before the request is processed.  If no credentials
+   (in the Authorization header field) are provided in the request, the
+   UAS can challenge the originator to provide credentials by rejecting
+   the request with a 401 (Unauthorized) status code.
+
+   The WWW-Authenticate response-header field MUST be included in 401
+   (Unauthorized) response messages.  The field value consists of at
+   least one challenge that indicates the authentication scheme(s) and
+   parameters applicable to the realm.
+
+
+
+
+Rosenberg, et. al.          Standards Track                   [Page 195]
+
+RFC 3261            SIP: Session Initiation Protocol           June 2002
+
+
+   An example of the WWW-Authenticate header field in a 401 challenge
+   is:
+
+      WWW-Authenticate: Digest
+              realm="biloxi.com",
+              qop="auth,auth-int",
+              nonce="dcd98b7102dd2f0e8b11d0f600bfb0c093",
+              opaque="5ccc069c403ebaf9f0171e9517f40e41"
+
+   When the originating UAC receives the 401 (Unauthorized), it SHOULD,
+   if it is able, re-originate the request with the proper credentials.
+   The UAC may require input from the originating user before
+   proceeding.  Once authentication credentials have been supplied
+   (either directly by the user, or discovered in an internal keyring),
+   UAs SHOULD cache the credentials for a given value of the To header
+   field and "realm" and attempt to re-use these values on the next
+   request for that destination.  UAs MAY cache credentials in any way
+   they would like.
+
+   If no credentials for a realm can be located, UACs MAY attempt to
+   retry the request with a username of "anonymous" and no password (a
+   password of "").
+
+   Once credentials have been located, any UA that wishes to
+   authenticate itself with a UAS or registrar -- usually, but not
+   necessarily, after receiving a 401 (Unauthorized) response -- MAY do
+   so by including an Authorization header field with the request.  The
+   Authorization field value consists of credentials containing the
+   authentication information of the UA for the realm of the resource
+   being requested as well as parameters required in support of
+   authentication and replay protection.
+
+   An example of the Authorization header field is:
+
+      Authorization: Digest username="bob",
+              realm="biloxi.com",
+              nonce="dcd98b7102dd2f0e8b11d0f600bfb0c093",
+              uri="sip:bob@biloxi.com",
+              qop=auth,
+              nc=00000001,
+              cnonce="0a4f113b",
+              response="6629fae49393a05397450978507c4ef1",
+              opaque="5ccc069c403ebaf9f0171e9517f40e41"
+
+   When a UAC resubmits a request with its credentials after receiving a
+   401 (Unauthorized) or 407 (Proxy Authentication Required) response,
+   it MUST increment the CSeq header field value as it would normally
+   when sending an updated request.
+
+
+
+Rosenberg, et. al.          Standards Track                   [Page 196]
+
+RFC 3261            SIP: Session Initiation Protocol           June 2002
+
+
+22.3 Proxy-to-User Authentication
+
+   Similarly, when a UAC sends a request to a proxy server, the proxy
+   server MAY authenticate the originator before the request is
+   processed.  If no credentials (in the Proxy-Authorization header
+   field) are provided in the request, the proxy can challenge the
+   originator to provide credentials by rejecting the request with a 407
+   (Proxy Authentication Required) status code.  The proxy MUST populate
+   the 407 (Proxy Authentication Required) message with a Proxy-
+   Authenticate header field value applicable to the proxy for the
+   requested resource.
+
+   The use of Proxy-Authenticate and Proxy-Authorization parallel that
+   described in [17], with one difference.  Proxies MUST NOT add values
+   to the Proxy-Authorization header field.  All 407 (Proxy
+   Authentication Required) responses MUST be forwarded upstream toward
+   the UAC following the procedures for any other response.  It is the
+   UAC's responsibility to add the Proxy-Authorization header field
+   value containing credentials for the realm of the proxy that has
+   asked for authentication.
+
+      If a proxy were to resubmit a request adding a Proxy-Authorization
+      header field value, it would need to increment the CSeq in the new
+      request.  However, this would cause the UAC that submitted the
+      original request to discard a response from the UAS, as the CSeq
+      value would be different.
+
+   When the originating UAC receives the 407 (Proxy Authentication
+   Required) it SHOULD, if it is able, re-originate the request with the
+   proper credentials.  It should follow the same procedures for the
+   display of the "realm" parameter that are given above for responding
+   to 401.
+
+   If no credentials for a realm can be located, UACs MAY attempt to
+   retry the request with a username of "anonymous" and no password (a
+   password of "").
+
+   The UAC SHOULD also cache the credentials used in the re-originated
+   request.
+
+   The following rule is RECOMMENDED for proxy credential caching:
+
+   If a UA receives a Proxy-Authenticate header field value in a 401/407
+   response to a request with a particular Call-ID, it should
+   incorporate credentials for that realm in all subsequent requests
+   that contain the same Call-ID.  These credentials MUST NOT be cached
+   across dialogs; however, if a UA is configured with the realm of its
+   local outbound proxy, when one exists, then the UA MAY cache
+
+
+
+Rosenberg, et. al.          Standards Track                   [Page 197]
+
+RFC 3261            SIP: Session Initiation Protocol           June 2002
+
+
+   credentials for that realm across dialogs.  Note that this does mean
+   a future request in a dialog could contain credentials that are not
+   needed by any proxy along the Route header path.
+
+   Any UA that wishes to authenticate itself to a proxy server --
+   usually, but not necessarily, after receiving a 407 (Proxy
+   Authentication Required) response -- MAY do so by including a Proxy-
+   Authorization header field value with the request.  The Proxy-
+   Authorization request-header field allows the client to identify
+   itself (or its user) to a proxy that requires authentication.  The
+   Proxy-Authorization header field value consists of credentials
+   containing the authentication information of the UA for the proxy
+   and/or realm of the resource being requested.
+
+   A Proxy-Authorization header field value applies only to the proxy
+   whose realm is identified in the "realm" parameter (this proxy may
+   previously have demanded authentication using the Proxy-Authenticate
+   field).  When multiple proxies are used in a chain, a Proxy-
+   Authorization header field value MUST NOT be consumed by any proxy
+   whose realm does not match the "realm" parameter specified in that
+   value.
+
+   Note that if an authentication scheme that does not support realms is
+   used in the Proxy-Authorization header field, a proxy server MUST
+   attempt to parse all Proxy-Authorization header field values to
+   determine whether one of them has what the proxy server considers to
+   be valid credentials.  Because this is potentially very time-
+   consuming in large networks, proxy servers SHOULD use an
+   authentication scheme that supports realms in the Proxy-Authorization
+   header field.
+
+   If a request is forked (as described in Section 16.7), various proxy
+   servers and/or UAs may wish to challenge the UAC.  In this case, the
+   forking proxy server is responsible for aggregating these challenges
+   into a single response.  Each WWW-Authenticate and Proxy-Authenticate
+   value received in responses to the forked request MUST be placed into
+   the single response that is sent by the forking proxy to the UA; the
+   ordering of these header field values is not significant.
+
+      When a proxy server issues a challenge in response to a request,
+      it will not proxy the request until the UAC has retried the
+      request with valid credentials.  A forking proxy may forward a
+      request simultaneously to multiple proxy servers that require
+      authentication, each of which in turn will not forward the request
+      until the originating UAC has authenticated itself in their
+      respective realm.  If the UAC does not provide credentials for
+
+
+
+
+
+Rosenberg, et. al.          Standards Track                   [Page 198]
+
+RFC 3261            SIP: Session Initiation Protocol           June 2002
+
+
+      each challenge, the proxy servers that issued the challenges will
+      not forward requests to the UA where the destination user might be
+      located, and therefore, the virtues of forking are largely lost.
+
+   When resubmitting its request in response to a 401 (Unauthorized) or
+   407 (Proxy Authentication Required) that contains multiple
+   challenges, a UAC MAY include an Authorization value for each WWW-
+   Authenticate value and a Proxy-Authorization value for each Proxy-
+   Authenticate value for which the UAC wishes to supply a credential.
+   As noted above, multiple credentials in a request SHOULD be
+   differentiated by the "realm" parameter.
+
+   It is possible for multiple challenges associated with the same realm
+   to appear in the same 401 (Unauthorized) or 407 (Proxy Authentication
+   Required).  This can occur, for example, when multiple proxies within
+   the same administrative domain, which use a common realm, are reached
+   by a forking request.  When it retries a request, a UAC MAY therefore
+   supply multiple credentials in Authorization or Proxy-Authorization
+   header fields with the same "realm" parameter value.  The same
+   credentials SHOULD be used for the same realm.
+
+22.4 The Digest Authentication Scheme
+
+   This section describes the modifications and clarifications required
+   to apply the HTTP Digest authentication scheme to SIP.  The SIP
+   scheme usage is almost completely identical to that for HTTP [17].
+
+   Since RFC 2543 is based on HTTP Digest as defined in RFC 2069 [39],
+   SIP servers supporting RFC 2617 MUST ensure they are backwards
+   compatible with RFC 2069.  Procedures for this backwards
+   compatibility are specified in RFC 2617.  Note, however, that SIP
+   servers MUST NOT accept or request Basic authentication.
+
+   The rules for Digest authentication follow those defined in [17],
+   with "HTTP/1.1" replaced by "SIP/2.0" in addition to the following
+   differences:
+
+      1.  The URI included in the challenge has the following BNF:
+
+          URI  =  SIP-URI / SIPS-URI
+
+      2.  The BNF in RFC 2617 has an error in that the 'uri' parameter
+          of the Authorization header field for HTTP Digest
+
+
+
+
+
+
+
+
+Rosenberg, et. al.          Standards Track                   [Page 199]
+
+RFC 3261            SIP: Session Initiation Protocol           June 2002
+
+
+          authentication is not enclosed in quotation marks.  (The
+          example in Section 3.5 of RFC 2617 is correct.)  For SIP, the
+          'uri' MUST be enclosed in quotation marks.
+
+      3.  The BNF for digest-uri-value is:
+
+          digest-uri-value  =  Request-URI ; as defined in Section 25
+
+      4.  The example procedure for choosing a nonce based on Etag does
+          not work for SIP.
+
+      5.  The text in RFC 2617 [17] regarding cache operation does not
+          apply to SIP.
+
+      6.  RFC 2617 [17] requires that a server check that the URI in the
+          request line and the URI included in the Authorization header
+          field point to the same resource.  In a SIP context, these two
+          URIs may refer to different users, due to forwarding at some
+          proxy.  Therefore, in SIP, a server MAY check that the
+          Request-URI in the Authorization header field value
+          corresponds to a user for whom the server is willing to accept
+          forwarded or direct requests, but it is not necessarily a
+          failure if the two fields are not equivalent.
+
+      7.  As a clarification to the calculation of the A2 value for
+          message integrity assurance in the Digest authentication
+          scheme, implementers should assume, when the entity-body is
+          empty (that is, when SIP messages have no body) that the hash
+          of the entity-body resolves to the MD5 hash of an empty
+          string, or:
+
+             H(entity-body) = MD5("") =
+          "d41d8cd98f00b204e9800998ecf8427e"
+
+      8.  RFC 2617 notes that a cnonce value MUST NOT be sent in an
+          Authorization (and by extension Proxy-Authorization) header
+          field if no qop directive has been sent.  Therefore, any
+          algorithms that have a dependency on the cnonce (including
+          "MD5-Sess") require that the qop directive be sent.  Use of
+          the "qop" parameter is optional in RFC 2617 for the purposes
+          of backwards compatibility with RFC 2069; since RFC 2543 was
+          based on RFC 2069, the "qop" parameter must unfortunately
+          remain optional for clients and servers to receive.  However,
+          servers MUST always send a "qop" parameter in WWW-Authenticate
+          and Proxy-Authenticate header field values.  If a client
+          receives a "qop" parameter in a challenge header field, it
+          MUST send the "qop" parameter in any resulting authorization
+          header field.
+
+
+
+Rosenberg, et. al.          Standards Track                   [Page 200]
+
+RFC 3261            SIP: Session Initiation Protocol           June 2002
+
+
+   RFC 2543 did not allow usage of the Authentication-Info header field
+   (it effectively used RFC 2069).  However, we now allow usage of this
+   header field, since it provides integrity checks over the bodies and
+   provides mutual authentication.  RFC 2617 [17] defines mechanisms for
+   backwards compatibility using the qop attribute in the request.
+   These mechanisms MUST be used by a server to determine if the client
+   supports the new mechanisms in RFC 2617 that were not specified in
+   RFC 2069.
+
+23 S/MIME
+
+   SIP messages carry MIME bodies and the MIME standard includes
+   mechanisms for securing MIME contents to ensure both integrity and
+   confidentiality (including the 'multipart/signed' and
+   'application/pkcs7-mime' MIME types, see RFC 1847 [22], RFC 2630 [23]
+   and RFC 2633 [24]).  Implementers should note, however, that there
+   may be rare network intermediaries (not typical proxy servers) that
+   rely on viewing or modifying the bodies of SIP messages (especially
+   SDP), and that secure MIME may prevent these sorts of intermediaries
+   from functioning.
+
+      This applies particularly to certain types of firewalls.
+
+      The PGP mechanism for encrypting the header fields and bodies of
+      SIP messages described in RFC 2543 has been deprecated.
+
+23.1 S/MIME Certificates
+
+   The certificates that are used to identify an end-user for the
+   purposes of S/MIME differ from those used by servers in one important
+   respect - rather than asserting that the identity of the holder
+   corresponds to a particular hostname, these certificates assert that
+   the holder is identified by an end-user address.  This address is
+   composed of the concatenation of the "userinfo" "@" and "domainname"
+   portions of a SIP or SIPS URI (in other words, an email address of
+   the form "bob@biloxi.com"), most commonly corresponding to a user's
+   address-of-record.
+
+   These certificates are also associated with keys that are used to
+   sign or encrypt bodies of SIP messages.  Bodies are signed with the
+   private key of the sender (who may include their public key with the
+   message as appropriate), but bodies are encrypted with the public key
+   of the intended recipient.  Obviously, senders must have
+   foreknowledge of the public key of recipients in order to encrypt
+   message bodies.  Public keys can be stored within a UA on a virtual
+   keyring.
+
+
+
+
+
+Rosenberg, et. al.          Standards Track                   [Page 201]
+
+RFC 3261            SIP: Session Initiation Protocol           June 2002
+
+
+   Each user agent that supports S/MIME MUST contain a keyring
+   specifically for end-users' certificates.  This keyring should map
+   between addresses of record and corresponding certificates.  Over
+   time, users SHOULD use the same certificate when they populate the
+   originating URI of signaling (the From header field) with the same
+   address-of-record.
+
+   Any mechanisms depending on the existence of end-user certificates
+   are seriously limited in that there is virtually no consolidated
+   authority today that provides certificates for end-user applications.
+   However, users SHOULD acquire certificates from known public
+   certificate authorities.  As an alternative, users MAY create self-
+   signed certificates.  The implications of self-signed certificates
+   are explored further in Section 26.4.2.  Implementations may also use
+   pre-configured certificates in deployments in which a previous trust
+   relationship exists between all SIP entities.
+
+   Above and beyond the problem of acquiring an end-user certificate,
+   there are few well-known centralized directories that distribute
+   end-user certificates.  However, the holder of a certificate SHOULD
+   publish their certificate in any public directories as appropriate.
+   Similarly, UACs SHOULD support a mechanism for importing (manually or
+   automatically) certificates discovered in public directories
+   corresponding to the target URIs of SIP requests.
+
+23.2 S/MIME Key Exchange
+
+   SIP itself can also be used as a means to distribute public keys in
+   the following manner.
+
+   Whenever the CMS SignedData message is used in S/MIME for SIP, it
+   MUST contain the certificate bearing the public key necessary to
+   verify the signature.
+
+   When a UAC sends a request containing an S/MIME body that initiates a
+   dialog, or sends a non-INVITE request outside the context of a
+   dialog, the UAC SHOULD structure the body as an S/MIME
+   'multipart/signed' CMS SignedData body.  If the desired CMS service
+   is EnvelopedData (and the public key of the target user is known),
+   the UAC SHOULD send the EnvelopedData message encapsulated within a
+   SignedData message.
+
+   When a UAS receives a request containing an S/MIME CMS body that
+   includes a certificate, the UAS SHOULD first validate the
+   certificate, if possible, with any available root certificates for
+   certificate authorities.  The UAS SHOULD also determine the subject
+   of the certificate (for S/MIME, the SubjectAltName will contain the
+   appropriate identity) and compare this value to the From header field
+
+
+
+Rosenberg, et. al.          Standards Track                   [Page 202]
+
+RFC 3261            SIP: Session Initiation Protocol           June 2002
+
+
+   of the request.  If the certificate cannot be verified, because it is
+   self-signed, or signed by no known authority, or if it is verifiable
+   but its subject does not correspond to the From header field of
+   request, the UAS MUST notify its user of the status of the
+   certificate (including the subject of the certificate, its signer,
+   and any key fingerprint information) and request explicit permission
+   before proceeding.  If the certificate was successfully verified and
+   the subject of the certificate corresponds to the From header field
+   of the SIP request, or if the user (after notification) explicitly
+   authorizes the use of the certificate, the UAS SHOULD add this
+   certificate to a local keyring, indexed by the address-of-record of
+   the holder of the certificate.
+
+   When a UAS sends a response containing an S/MIME body that answers
+   the first request in a dialog, or a response to a non-INVITE request
+   outside the context of a dialog, the UAS SHOULD structure the body as
+   an S/MIME 'multipart/signed' CMS SignedData body.  If the desired CMS
+   service is EnvelopedData, the UAS SHOULD send the EnvelopedData
+   message encapsulated within a SignedData message.
+
+   When a UAC receives a response containing an S/MIME CMS body that
+   includes a certificate, the UAC SHOULD first validate the
+   certificate, if possible, with any appropriate root certificate.  The
+   UAC SHOULD also determine the subject of the certificate and compare
+   this value to the To field of the response; although the two may very
+   well be different, and this is not necessarily indicative of a
+   security breach.  If the certificate cannot be verified because it is
+   self-signed, or signed by no known authority, the UAC MUST notify its
+   user of the status of the certificate (including the subject of the
+   certificate, its signator, and any key fingerprint information) and
+   request explicit permission before proceeding.  If the certificate
+   was successfully verified, and the subject of the certificate
+   corresponds to the To header field in the response, or if the user
+   (after notification) explicitly authorizes the use of the
+   certificate, the UAC SHOULD add this certificate to a local keyring,
+   indexed by the address-of-record of the holder of the certificate.
+   If the UAC had not transmitted its own certificate to the UAS in any
+   previous transaction, it SHOULD use a CMS SignedData body for its
+   next request or response.
+
+   On future occasions, when the UA receives requests or responses that
+   contain a From header field corresponding to a value in its keyring,
+   the UA SHOULD compare the certificate offered in these messages with
+   the existing certificate in its keyring.  If there is a discrepancy,
+   the UA MUST notify its user of a change of the certificate
+   (preferably in terms that indicate that this is a potential security
+   breach) and acquire the user's permission before continuing to
+
+
+
+
+Rosenberg, et. al.          Standards Track                   [Page 203]
+
+RFC 3261            SIP: Session Initiation Protocol           June 2002
+
+
+   process the signaling.  If the user authorizes this certificate, it
+   SHOULD be added to the keyring alongside any previous value(s) for
+   this address-of-record.
+
+   Note well however, that this key exchange mechanism does not
+   guarantee the secure exchange of keys when self-signed certificates,
+   or certificates signed by an obscure authority, are used - it is
+   vulnerable to well-known attacks.  In the opinion of the authors,
+   however, the security it provides is proverbially better than
+   nothing; it is in fact comparable to the widely used SSH application.
+   These limitations are explored in greater detail in Section 26.4.2.
+
+   If a UA receives an S/MIME body that has been encrypted with a public
+   key unknown to the recipient, it MUST reject the request with a 493
+   (Undecipherable) response.  This response SHOULD contain a valid
+   certificate for the respondent (corresponding, if possible, to any
+   address of record given in the To header field of the rejected
+   request) within a MIME body with a 'certs-only' "smime-type"
+   parameter.
+
+   A 493 (Undecipherable) sent without any certificate indicates that
+   the respondent cannot or will not utilize S/MIME encrypted messages,
+   though they may still support S/MIME signatures.
+
+   Note that a user agent that receives a request containing an S/MIME
+   body that is not optional (with a Content-Disposition header
+   "handling" parameter of "required") MUST reject the request with a
+   415 Unsupported Media Type response if the MIME type is not
+   understood.  A user agent that receives such a response when S/MIME
+   is sent SHOULD notify its user that the remote device does not
+   support S/MIME, and it MAY subsequently resend the request without
+   S/MIME, if appropriate; however, this 415 response may constitute a
+   downgrade attack.
+
+   If a user agent sends an S/MIME body in a request, but receives a
+   response that contains a MIME body that is not secured, the UAC
+   SHOULD notify its user that the session could not be secured.
+   However, if a user agent that supports S/MIME receives a request with
+   an unsecured body, it SHOULD NOT respond with a secured body, but if
+   it expects S/MIME from the sender (for example, because the sender's
+   From header field value corresponds to an identity on its keychain),
+   the UAS SHOULD notify its user that the session could not be secured.
+
+   A number of conditions that arise in the previous text call for the
+   notification of the user when an anomalous certificate-management
+   event occurs.  Users might well ask what they should do under these
+   circumstances.  First and foremost, an unexpected change in a
+   certificate, or an absence of security when security is expected, are
+
+
+
+Rosenberg, et. al.          Standards Track                   [Page 204]
+
+RFC 3261            SIP: Session Initiation Protocol           June 2002
+
+
+   causes for caution but not necessarily indications that an attack is
+   in progress.  Users might abort any connection attempt or refuse a
+   connection request they have received; in telephony parlance, they
+   could hang up and call back.  Users may wish to find an alternate
+   means to contact the other party and confirm that their key has
+   legitimately changed.  Note that users are sometimes compelled to
+   change their certificates, for example when they suspect that the
+   secrecy of their private key has been compromised.  When their
+   private key is no longer private, users must legitimately generate a
+   new key and re-establish trust with any users that held their old
+   key.
+
+   Finally, if during the course of a dialog a UA receives a certificate
+   in a CMS SignedData message that does not correspond with the
+   certificates previously exchanged during a dialog, the UA MUST notify
+   its user of the change, preferably in terms that indicate that this
+   is a potential security breach.
+
+23.3 Securing MIME bodies
+
+   There are two types of secure MIME bodies that are of interest to
+   SIP: use of these bodies should follow the S/MIME specification [24]
+   with a few variations.
+
+      o  "multipart/signed" MUST be used only with CMS detached
+         signatures.
+
+            This allows backwards compatibility with non-S/MIME-
+            compliant recipients.
+
+      o  S/MIME bodies SHOULD have a Content-Disposition header field,
+         and the value of the "handling" parameter SHOULD be "required."
+
+      o  If a UAC has no certificate on its keyring associated with the
+         address-of-record to which it wants to send a request, it
+         cannot send an encrypted "application/pkcs7-mime" MIME message.
+         UACs MAY send an initial request such as an OPTIONS message
+         with a CMS detached signature in order to solicit the
+         certificate of the remote side (the signature SHOULD be over a
+         "message/sip" body of the type described in Section 23.4).
+
+            Note that future standardization work on S/MIME may define
+            non-certificate based keys.
+
+      o  Senders of S/MIME bodies SHOULD use the "SMIMECapabilities"
+         (see Section 2.5.2 of [24]) attribute to express their
+         capabilities and preferences for further communications.  Note
+         especially that senders MAY use the "preferSignedData"
+
+
+
+Rosenberg, et. al.          Standards Track                   [Page 205]
+
+RFC 3261            SIP: Session Initiation Protocol           June 2002
+
+
+         capability to encourage receivers to respond with CMS
+         SignedData messages (for example, when sending an OPTIONS
+         request as described above).
+
+      o  S/MIME implementations MUST at a minimum support SHA1 as a
+         digital signature algorithm, and 3DES as an encryption
+         algorithm.  All other signature and encryption algorithms MAY
+         be supported.  Implementations can negotiate support for these
+         algorithms with the "SMIMECapabilities" attribute.
+
+      o  Each S/MIME body in a SIP message SHOULD be signed with only
+         one certificate.  If a UA receives a message with multiple
+         signatures, the outermost signature should be treated as the
+         single certificate for this body.  Parallel signatures SHOULD
+         NOT be used.
+
+         The following is an example of an encrypted S/MIME SDP body
+         within a SIP message:
+
+        INVITE sip:bob@biloxi.com SIP/2.0
+        Via: SIP/2.0/UDP pc33.atlanta.com;branch=z9hG4bKnashds8
+        To: Bob <sip:bob@biloxi.com>
+        From: Alice <sip:alice@atlanta.com>;tag=1928301774
+        Call-ID: a84b4c76e66710
+        CSeq: 314159 INVITE
+        Max-Forwards: 70
+        Contact: <sip:alice@pc33.atlanta.com>
+        Content-Type: application/pkcs7-mime; smime-type=enveloped-data;
+             name=smime.p7m
+        Content-Disposition: attachment; filename=smime.p7m
+           handling=required
+
+      *******************************************************
+      * Content-Type: application/sdp                       *
+      *                                                     *
+      * v=0                                                 *
+      * o=alice 53655765 2353687637 IN IP4 pc33.atlanta.com *
+      * s=-                                                 *
+      * t=0 0                                               *
+      * c=IN IP4 pc33.atlanta.com                           *
+      * m=audio 3456 RTP/AVP 0 1 3 99                       *
+      * a=rtpmap:0 PCMU/8000                                *
+      *******************************************************
+
+
+
+
+
+
+
+
+Rosenberg, et. al.          Standards Track                   [Page 206]
+
+RFC 3261            SIP: Session Initiation Protocol           June 2002
+
+
+23.4 SIP Header Privacy and Integrity using S/MIME: Tunneling SIP
+
+   As a means of providing some degree of end-to-end authentication,
+   integrity or confidentiality for SIP header fields, S/MIME can
+   encapsulate entire SIP messages within MIME bodies of type
+   "message/sip" and then apply MIME security to these bodies in the
+   same manner as typical SIP bodies.  These encapsulated SIP requests
+   and responses do not constitute a separate dialog or transaction,
+   they are a copy of the "outer" message that is used to verify
+   integrity or to supply additional information.
+
+   If a UAS receives a request that contains a tunneled "message/sip"
+   S/MIME body, it SHOULD include a tunneled "message/sip" body in the
+   response with the same smime-type.
+
+   Any traditional MIME bodies (such as SDP) SHOULD be attached to the
+   "inner" message so that they can also benefit from S/MIME security.
+   Note that "message/sip" bodies can be sent as a part of a MIME
+   "multipart/mixed" body if any unsecured MIME types should also be
+   transmitted in a request.
+
+23.4.1 Integrity and Confidentiality Properties of SIP Headers
+
+   When the S/MIME integrity or confidentiality mechanisms are used,
+   there may be discrepancies between the values in the "inner" message
+   and values in the "outer" message.  The rules for handling any such
+   differences for all of the header fields described in this document
+   are given in this section.
+
+   Note that for the purposes of loose timestamping, all SIP messages
+   that tunnel "message/sip" SHOULD contain a Date header in both the
+   "inner" and "outer" headers.
+
+23.4.1.1 Integrity
+
+   Whenever integrity checks are performed, the integrity of a header
+   field should be determined by matching the value of the header field
+   in the signed body with that in the "outer" messages using the
+   comparison rules of SIP as described in 20.
+
+   Header fields that can be legitimately modified by proxy servers are:
+   Request-URI, Via, Record-Route, Route, Max-Forwards, and Proxy-
+   Authorization.  If these header fields are not intact end-to-end,
+   implementations SHOULD NOT consider this a breach of security.
+   Changes to any other header fields defined in this document
+   constitute an integrity violation; users MUST be notified of a
+   discrepancy.
+
+
+
+
+Rosenberg, et. al.          Standards Track                   [Page 207]
+
+RFC 3261            SIP: Session Initiation Protocol           June 2002
+
+
+23.4.1.2 Confidentiality
+
+   When messages are encrypted, header fields may be included in the
+   encrypted body that are not present in the "outer" message.
+
+   Some header fields must always have a plaintext version because they
+   are required header fields in requests and responses - these include:
+
+   To, From, Call-ID, CSeq, Contact.  While it is probably not useful to
+   provide an encrypted alternative for the Call-ID, CSeq, or Contact,
+   providing an alternative to the information in the "outer" To or From
+   is permitted.  Note that the values in an encrypted body are not used
+   for the purposes of identifying transactions or dialogs - they are
+   merely informational.  If the From header field in an encrypted body
+   differs from the value in the "outer" message, the value within the
+   encrypted body SHOULD be displayed to the user, but MUST NOT be used
+   in the "outer" header fields of any future messages.
+
+   Primarily, a user agent will want to encrypt header fields that have
+   an end-to-end semantic, including: Subject, Reply-To, Organization,
+   Accept, Accept-Encoding, Accept-Language, Alert-Info, Error-Info,
+   Authentication-Info, Expires, In-Reply-To, Require, Supported,
+   Unsupported, Retry-After, User-Agent, Server, and Warning.  If any of
+   these header fields are present in an encrypted body, they should be
+   used instead of any "outer" header fields, whether this entails
+   displaying the header field values to users or setting internal
+   states in the UA.  They SHOULD NOT however be used in the "outer"
+   headers of any future messages.
+
+   If present, the Date header field MUST always be the same in the
+   "inner" and "outer" headers.
+
+   Since MIME bodies are attached to the "inner" message,
+   implementations will usually encrypt MIME-specific header fields,
+   including: MIME-Version, Content-Type, Content-Length, Content-
+   Language, Content-Encoding and Content-Disposition.  The "outer"
+   message will have the proper MIME header fields for S/MIME bodies.
+   These header fields (and any MIME bodies they preface) should be
+   treated as normal MIME header fields and bodies received in a SIP
+   message.
+
+   It is not particularly useful to encrypt the following header fields:
+   Min-Expires, Timestamp, Authorization, Priority, and WWW-
+   Authenticate.  This category also includes those header fields that
+   can be changed by proxy servers (described in the preceding section).
+   UAs SHOULD never include these in an "inner" message if they are not
+
+
+
+
+
+Rosenberg, et. al.          Standards Track                   [Page 208]
+
+RFC 3261            SIP: Session Initiation Protocol           June 2002
+
+
+   included in the "outer" message.  UAs that receive any of these
+   header fields in an encrypted body SHOULD ignore the encrypted
+   values.
+
+   Note that extensions to SIP may define additional header fields; the
+   authors of these extensions should describe the integrity and
+   confidentiality properties of such header fields.  If a SIP UA
+   encounters an unknown header field with an integrity violation, it
+   MUST ignore the header field.
+
+23.4.2 Tunneling Integrity and Authentication
+
+   Tunneling SIP messages within S/MIME bodies can provide integrity for
+   SIP header fields if the header fields that the sender wishes to
+   secure are replicated in a "message/sip" MIME body signed with a CMS
+   detached signature.
+
+   Provided that the "message/sip" body contains at least the
+   fundamental dialog identifiers (To, From, Call-ID, CSeq), then a
+   signed MIME body can provide limited authentication.  At the very
+   least, if the certificate used to sign the body is unknown to the
+   recipient and cannot be verified, the signature can be used to
+   ascertain that a later request in a dialog was transmitted by the
+   same certificate-holder that initiated the dialog.  If the recipient
+   of the signed MIME body has some stronger incentive to trust the
+   certificate (they were able to validate it, they acquired it from a
+   trusted repository, or they have used it frequently) then the
+   signature can be taken as a stronger assertion of the identity of the
+   subject of the certificate.
+
+   In order to eliminate possible confusions about the addition or
+   subtraction of entire header fields, senders SHOULD replicate all
+   header fields from the request within the signed body.  Any message
+   bodies that require integrity protection MUST be attached to the
+   "inner" message.
+
+   If a Date header is present in a message with a signed body, the
+   recipient SHOULD compare the header field value with its own internal
+   clock, if applicable.  If a significant time discrepancy is detected
+   (on the order of an hour or more), the user agent SHOULD alert the
+   user to the anomaly, and note that it is a potential security breach.
+
+   If an integrity violation in a message is detected by its recipient,
+   the message MAY be rejected with a 403 (Forbidden) response if it is
+   a request, or any existing dialog MAY be terminated.  UAs SHOULD
+   notify users of this circumstance and request explicit guidance on
+   how to proceed.
+
+
+
+
+Rosenberg, et. al.          Standards Track                   [Page 209]
+
+RFC 3261            SIP: Session Initiation Protocol           June 2002
+
+
+   The following is an example of the use of a tunneled "message/sip"
+   body:
+
+      INVITE sip:bob@biloxi.com SIP/2.0
+      Via: SIP/2.0/UDP pc33.atlanta.com;branch=z9hG4bKnashds8
+      To: Bob <sip:bob@biloxi.com>
+      From: Alice <sip:alice@atlanta.com>;tag=1928301774
+      Call-ID: a84b4c76e66710
+      CSeq: 314159 INVITE
+      Max-Forwards: 70
+      Date: Thu, 21 Feb 2002 13:02:03 GMT
+      Contact: <sip:alice@pc33.atlanta.com>
+      Content-Type: multipart/signed;
+        protocol="application/pkcs7-signature";
+        micalg=sha1; boundary=boundary42
+      Content-Length: 568
+
+      --boundary42
+      Content-Type: message/sip
+
+      INVITE sip:bob@biloxi.com SIP/2.0
+      Via: SIP/2.0/UDP pc33.atlanta.com;branch=z9hG4bKnashds8
+      To: Bob <bob@biloxi.com>
+      From: Alice <alice@atlanta.com>;tag=1928301774
+      Call-ID: a84b4c76e66710
+      CSeq: 314159 INVITE
+      Max-Forwards: 70
+      Date: Thu, 21 Feb 2002 13:02:03 GMT
+      Contact: <sip:alice@pc33.atlanta.com>
+      Content-Type: application/sdp
+      Content-Length: 147
+
+      v=0
+      o=UserA 2890844526 2890844526 IN IP4 here.com
+      s=Session SDP
+      c=IN IP4 pc33.atlanta.com
+      t=0 0
+      m=audio 49172 RTP/AVP 0
+      a=rtpmap:0 PCMU/8000
+
+      --boundary42
+      Content-Type: application/pkcs7-signature; name=smime.p7s
+      Content-Transfer-Encoding: base64
+      Content-Disposition: attachment; filename=smime.p7s;
+         handling=required
+
+
+
+
+
+
+Rosenberg, et. al.          Standards Track                   [Page 210]
+
+RFC 3261            SIP: Session Initiation Protocol           June 2002
+
+
+      ghyHhHUujhJhjH77n8HHGTrfvbnj756tbB9HG4VQpfyF467GhIGfHfYT6
+      4VQpfyF467GhIGfHfYT6jH77n8HHGghyHhHUujhJh756tbB9HGTrfvbnj
+      n8HHGTrfvhJhjH776tbB9HG4VQbnj7567GhIGfHfYT6ghyHhHUujpfyF4
+      7GhIGfHfYT64VQbnj756
+
+      --boundary42-
+
+23.4.3 Tunneling Encryption
+
+   It may also be desirable to use this mechanism to encrypt a
+   "message/sip" MIME body within a CMS EnvelopedData message S/MIME
+   body, but in practice, most header fields are of at least some use to
+   the network; the general use of encryption with S/MIME is to secure
+   message bodies like SDP rather than message headers.  Some
+   informational header fields, such as the Subject or Organization
+   could perhaps warrant end-to-end security.  Headers defined by future
+   SIP applications might also require obfuscation.
+
+   Another possible application of encrypting header fields is selective
+   anonymity.  A request could be constructed with a From header field
+   that contains no personal information (for example,
+   sip:anonymous@anonymizer.invalid).  However, a second From header
+   field containing the genuine address-of-record of the originator
+   could be encrypted within a "message/sip" MIME body where it will
+   only be visible to the endpoints of a dialog.
+
+      Note that if this mechanism is used for anonymity, the From header
+      field will no longer be usable by the recipient of a message as an
+      index to their certificate keychain for retrieving the proper
+      S/MIME key to associated with the sender.  The message must first
+      be decrypted, and the "inner" From header field MUST be used as an
+      index.
+
+   In order to provide end-to-end integrity, encrypted "message/sip"
+   MIME bodies SHOULD be signed by the sender.  This creates a
+   "multipart/signed" MIME body that contains an encrypted body and a
+   signature, both of type "application/pkcs7-mime".
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+Rosenberg, et. al.          Standards Track                   [Page 211]
+
+RFC 3261            SIP: Session Initiation Protocol           June 2002
+
+
+   In the following example, of an encrypted and signed message, the
+   text boxed in asterisks ("*") is encrypted:
+
+        INVITE sip:bob@biloxi.com SIP/2.0
+        Via: SIP/2.0/UDP pc33.atlanta.com;branch=z9hG4bKnashds8
+        To: Bob <sip:bob@biloxi.com>
+        From: Anonymous <sip:anonymous@atlanta.com>;tag=1928301774
+        Call-ID: a84b4c76e66710
+        CSeq: 314159 INVITE
+        Max-Forwards: 70
+        Date: Thu, 21 Feb 2002 13:02:03 GMT
+        Contact: <sip:pc33.atlanta.com>
+        Content-Type: multipart/signed;
+          protocol="application/pkcs7-signature";
+          micalg=sha1; boundary=boundary42
+        Content-Length: 568
+
+        --boundary42
+        Content-Type: application/pkcs7-mime; smime-type=enveloped-data;
+             name=smime.p7m
+        Content-Transfer-Encoding: base64
+        Content-Disposition: attachment; filename=smime.p7m
+           handling=required
+        Content-Length: 231
+
+      ***********************************************************
+      * Content-Type: message/sip                               *
+      *                                                         *
+      * INVITE sip:bob@biloxi.com SIP/2.0                       *
+      * Via: SIP/2.0/UDP pc33.atlanta.com;branch=z9hG4bKnashds8 *
+      * To: Bob <bob@biloxi.com>                                *
+      * From: Alice <alice@atlanta.com>;tag=1928301774          *
+      * Call-ID: a84b4c76e66710                                 *
+      * CSeq: 314159 INVITE                                     *
+      * Max-Forwards: 70                                        *
+      * Date: Thu, 21 Feb 2002 13:02:03 GMT                     *
+      * Contact: <sip:alice@pc33.atlanta.com>                   *
+      *                                                         *
+      * Content-Type: application/sdp                           *
+      *                                                         *
+      * v=0                                                     *
+      * o=alice 53655765 2353687637 IN IP4 pc33.atlanta.com     *
+      * s=Session SDP                                           *
+      * t=0 0                                                   *
+      * c=IN IP4 pc33.atlanta.com                               *
+      * m=audio 3456 RTP/AVP 0 1 3 99                           *
+      * a=rtpmap:0 PCMU/8000                                    *
+      ***********************************************************
+
+
+
+Rosenberg, et. al.          Standards Track                   [Page 212]
+
+RFC 3261            SIP: Session Initiation Protocol           June 2002
+
+
+        --boundary42
+        Content-Type: application/pkcs7-signature; name=smime.p7s
+        Content-Transfer-Encoding: base64
+        Content-Disposition: attachment; filename=smime.p7s;
+           handling=required
+
+        ghyHhHUujhJhjH77n8HHGTrfvbnj756tbB9HG4VQpfyF467GhIGfHfYT6
+        4VQpfyF467GhIGfHfYT6jH77n8HHGghyHhHUujhJh756tbB9HGTrfvbnj
+        n8HHGTrfvhJhjH776tbB9HG4VQbnj7567GhIGfHfYT6ghyHhHUujpfyF4
+        7GhIGfHfYT64VQbnj756
+
+        --boundary42-
+
+24 Examples
+
+   In the following examples, we often omit the message body and the
+   corresponding Content-Length and Content-Type header fields for
+   brevity.
+
+24.1 Registration
+
+   Bob registers on start-up.  The message flow is shown in Figure 9.
+   Note that the authentication usually required for registration is not
+   shown for simplicity.
+
+                  biloxi.com         Bob's
+                   registrar       softphone
+                      |                |
+                      |   REGISTER F1  |
+                      |<---------------|
+                      |    200 OK F2   |
+                      |--------------->|
+
+                  Figure 9: SIP Registration Example
+
+   F1 REGISTER Bob -> Registrar
+
+       REGISTER sip:registrar.biloxi.com SIP/2.0
+       Via: SIP/2.0/UDP bobspc.biloxi.com:5060;branch=z9hG4bKnashds7
+       Max-Forwards: 70
+       To: Bob <sip:bob@biloxi.com>
+       From: Bob <sip:bob@biloxi.com>;tag=456248
+       Call-ID: 843817637684230@998sdasdh09
+       CSeq: 1826 REGISTER
+       Contact: <sip:bob@192.0.2.4>
+       Expires: 7200
+       Content-Length: 0
+
+
+
+
+Rosenberg, et. al.          Standards Track                   [Page 213]
+
+RFC 3261            SIP: Session Initiation Protocol           June 2002
+
+
+   The registration expires after two hours.  The registrar responds
+   with a 200 OK:
+
+   F2 200 OK Registrar -> Bob
+
+        SIP/2.0 200 OK
+        Via: SIP/2.0/UDP bobspc.biloxi.com:5060;branch=z9hG4bKnashds7
+         ;received=192.0.2.4
+        To: Bob <sip:bob@biloxi.com>;tag=2493k59kd
+        From: Bob <sip:bob@biloxi.com>;tag=456248
+        Call-ID: 843817637684230@998sdasdh09
+        CSeq: 1826 REGISTER
+        Contact: <sip:bob@192.0.2.4>
+        Expires: 7200
+        Content-Length: 0
+
+24.2 Session Setup
+
+   This example contains the full details of the example session setup
+   in Section 4.  The message flow is shown in Figure 1.  Note that
+   these flows show the minimum required set of header fields - some
+   other header fields such as Allow and Supported would normally be
+   present.
+
+F1 INVITE Alice -> atlanta.com proxy
+
+INVITE sip:bob@biloxi.com SIP/2.0
+Via: SIP/2.0/UDP pc33.atlanta.com;branch=z9hG4bKnashds8
+Max-Forwards: 70
+To: Bob <sip:bob@biloxi.com>
+From: Alice <sip:alice@atlanta.com>;tag=1928301774
+Call-ID: a84b4c76e66710
+CSeq: 314159 INVITE
+Contact: <sip:alice@pc33.atlanta.com>
+Content-Type: application/sdp
+Content-Length: 142
+
+(Alice's SDP not shown)
+
+
+
+
+
+
+
+
+
+
+
+
+
+Rosenberg, et. al.          Standards Track                   [Page 214]
+
+RFC 3261            SIP: Session Initiation Protocol           June 2002
+
+
+F2 100 Trying atlanta.com proxy -> Alice
+
+SIP/2.0 100 Trying
+Via: SIP/2.0/UDP pc33.atlanta.com;branch=z9hG4bKnashds8
+ ;received=192.0.2.1
+To: Bob <sip:bob@biloxi.com>
+From: Alice <sip:alice@atlanta.com>;tag=1928301774
+Call-ID: a84b4c76e66710
+CSeq: 314159 INVITE
+Content-Length: 0
+
+F3 INVITE atlanta.com proxy -> biloxi.com proxy
+
+INVITE sip:bob@biloxi.com SIP/2.0
+Via: SIP/2.0/UDP bigbox3.site3.atlanta.com;branch=z9hG4bK77ef4c2312983.1
+Via: SIP/2.0/UDP pc33.atlanta.com;branch=z9hG4bKnashds8
+ ;received=192.0.2.1
+Max-Forwards: 69
+To: Bob <sip:bob@biloxi.com>
+From: Alice <sip:alice@atlanta.com>;tag=1928301774
+Call-ID: a84b4c76e66710
+CSeq: 314159 INVITE
+Contact: <sip:alice@pc33.atlanta.com>
+Content-Type: application/sdp
+Content-Length: 142
+
+(Alice's SDP not shown)
+
+F4 100 Trying biloxi.com proxy -> atlanta.com proxy
+
+SIP/2.0 100 Trying
+Via: SIP/2.0/UDP bigbox3.site3.atlanta.com;branch=z9hG4bK77ef4c2312983.1
+ ;received=192.0.2.2
+Via: SIP/2.0/UDP pc33.atlanta.com;branch=z9hG4bKnashds8
+ ;received=192.0.2.1
+To: Bob <sip:bob@biloxi.com>
+From: Alice <sip:alice@atlanta.com>;tag=1928301774
+Call-ID: a84b4c76e66710
+CSeq: 314159 INVITE
+Content-Length: 0
+
+
+
+
+
+
+
+
+
+
+
+Rosenberg, et. al.          Standards Track                   [Page 215]
+
+RFC 3261            SIP: Session Initiation Protocol           June 2002
+
+
+F5 INVITE biloxi.com proxy -> Bob
+
+INVITE sip:bob@192.0.2.4 SIP/2.0
+Via: SIP/2.0/UDP server10.biloxi.com;branch=z9hG4bK4b43c2ff8.1
+Via: SIP/2.0/UDP bigbox3.site3.atlanta.com;branch=z9hG4bK77ef4c2312983.1
+ ;received=192.0.2.2
+Via: SIP/2.0/UDP pc33.atlanta.com;branch=z9hG4bKnashds8
+ ;received=192.0.2.1
+Max-Forwards: 68
+To: Bob <sip:bob@biloxi.com>
+From: Alice <sip:alice@atlanta.com>;tag=1928301774
+Call-ID: a84b4c76e66710
+CSeq: 314159 INVITE
+Contact: <sip:alice@pc33.atlanta.com>
+Content-Type: application/sdp
+Content-Length: 142
+
+(Alice's SDP not shown)
+
+F6 180 Ringing Bob -> biloxi.com proxy
+
+SIP/2.0 180 Ringing
+Via: SIP/2.0/UDP server10.biloxi.com;branch=z9hG4bK4b43c2ff8.1
+ ;received=192.0.2.3
+Via: SIP/2.0/UDP bigbox3.site3.atlanta.com;branch=z9hG4bK77ef4c2312983.1
+ ;received=192.0.2.2
+Via: SIP/2.0/UDP pc33.atlanta.com;branch=z9hG4bKnashds8
+ ;received=192.0.2.1
+To: Bob <sip:bob@biloxi.com>;tag=a6c85cf
+From: Alice <sip:alice@atlanta.com>;tag=1928301774
+Call-ID: a84b4c76e66710
+Contact: <sip:bob@192.0.2.4>
+CSeq: 314159 INVITE
+Content-Length: 0
+
+F7 180 Ringing biloxi.com proxy -> atlanta.com proxy
+
+SIP/2.0 180 Ringing
+Via: SIP/2.0/UDP bigbox3.site3.atlanta.com;branch=z9hG4bK77ef4c2312983.1
+ ;received=192.0.2.2
+Via: SIP/2.0/UDP pc33.atlanta.com;branch=z9hG4bKnashds8
+ ;received=192.0.2.1
+To: Bob <sip:bob@biloxi.com>;tag=a6c85cf
+From: Alice <sip:alice@atlanta.com>;tag=1928301774
+Call-ID: a84b4c76e66710
+Contact: <sip:bob@192.0.2.4>
+CSeq: 314159 INVITE
+Content-Length: 0
+
+
+
+Rosenberg, et. al.          Standards Track                   [Page 216]
+
+RFC 3261            SIP: Session Initiation Protocol           June 2002
+
+
+F8 180 Ringing atlanta.com proxy -> Alice
+
+SIP/2.0 180 Ringing
+Via: SIP/2.0/UDP pc33.atlanta.com;branch=z9hG4bKnashds8
+ ;received=192.0.2.1
+To: Bob <sip:bob@biloxi.com>;tag=a6c85cf
+From: Alice <sip:alice@atlanta.com>;tag=1928301774
+Call-ID: a84b4c76e66710
+Contact: <sip:bob@192.0.2.4>
+CSeq: 314159 INVITE
+Content-Length: 0
+
+F9 200 OK Bob -> biloxi.com proxy
+
+SIP/2.0 200 OK
+Via: SIP/2.0/UDP server10.biloxi.com;branch=z9hG4bK4b43c2ff8.1
+ ;received=192.0.2.3
+Via: SIP/2.0/UDP bigbox3.site3.atlanta.com;branch=z9hG4bK77ef4c2312983.1
+ ;received=192.0.2.2
+Via: SIP/2.0/UDP pc33.atlanta.com;branch=z9hG4bKnashds8
+ ;received=192.0.2.1
+To: Bob <sip:bob@biloxi.com>;tag=a6c85cf
+From: Alice <sip:alice@atlanta.com>;tag=1928301774
+Call-ID: a84b4c76e66710
+CSeq: 314159 INVITE
+Contact: <sip:bob@192.0.2.4>
+Content-Type: application/sdp
+Content-Length: 131
+
+(Bob's SDP not shown)
+
+F10 200 OK biloxi.com proxy -> atlanta.com proxy
+
+SIP/2.0 200 OK
+Via: SIP/2.0/UDP bigbox3.site3.atlanta.com;branch=z9hG4bK77ef4c2312983.1
+ ;received=192.0.2.2
+Via: SIP/2.0/UDP pc33.atlanta.com;branch=z9hG4bKnashds8
+ ;received=192.0.2.1
+To: Bob <sip:bob@biloxi.com>;tag=a6c85cf
+From: Alice <sip:alice@atlanta.com>;tag=1928301774
+Call-ID: a84b4c76e66710
+CSeq: 314159 INVITE
+Contact: <sip:bob@192.0.2.4>
+Content-Type: application/sdp
+Content-Length: 131
+
+(Bob's SDP not shown)
+
+
+
+
+Rosenberg, et. al.          Standards Track                   [Page 217]
+
+RFC 3261            SIP: Session Initiation Protocol           June 2002
+
+
+F11 200 OK atlanta.com proxy -> Alice
+
+SIP/2.0 200 OK
+Via: SIP/2.0/UDP pc33.atlanta.com;branch=z9hG4bKnashds8
+ ;received=192.0.2.1
+To: Bob <sip:bob@biloxi.com>;tag=a6c85cf
+From: Alice <sip:alice@atlanta.com>;tag=1928301774
+Call-ID: a84b4c76e66710
+CSeq: 314159 INVITE
+Contact: <sip:bob@192.0.2.4>
+Content-Type: application/sdp
+Content-Length: 131
+
+(Bob's SDP not shown)
+
+F12 ACK Alice -> Bob
+
+ACK sip:bob@192.0.2.4 SIP/2.0
+Via: SIP/2.0/UDP pc33.atlanta.com;branch=z9hG4bKnashds9
+Max-Forwards: 70
+To: Bob <sip:bob@biloxi.com>;tag=a6c85cf
+From: Alice <sip:alice@atlanta.com>;tag=1928301774
+Call-ID: a84b4c76e66710
+CSeq: 314159 ACK
+Content-Length: 0
+
+   The media session between Alice and Bob is now established.
+
+   Bob hangs up first.  Note that Bob's SIP phone maintains its own CSeq
+   numbering space, which, in this example, begins with 231.  Since Bob
+   is making the request, the To and From URIs and tags have been
+   swapped.
+
+F13 BYE Bob -> Alice
+
+BYE sip:alice@pc33.atlanta.com SIP/2.0
+Via: SIP/2.0/UDP 192.0.2.4;branch=z9hG4bKnashds10
+Max-Forwards: 70
+From: Bob <sip:bob@biloxi.com>;tag=a6c85cf
+To: Alice <sip:alice@atlanta.com>;tag=1928301774
+Call-ID: a84b4c76e66710
+CSeq: 231 BYE
+Content-Length: 0
+
+
+
+
+
+
+
+
+Rosenberg, et. al.          Standards Track                   [Page 218]
+
+RFC 3261            SIP: Session Initiation Protocol           June 2002
+
+
+F14 200 OK Alice -> Bob
+
+SIP/2.0 200 OK
+Via: SIP/2.0/UDP 192.0.2.4;branch=z9hG4bKnashds10
+From: Bob <sip:bob@biloxi.com>;tag=a6c85cf
+To: Alice <sip:alice@atlanta.com>;tag=1928301774
+Call-ID: a84b4c76e66710
+CSeq: 231 BYE
+Content-Length: 0
+
+   The SIP Call Flows document [40] contains further examples of SIP
+   messages.
+
+25  Augmented BNF for the SIP Protocol
+
+   All of the mechanisms specified in this document are described in
+   both prose and an augmented Backus-Naur Form (BNF) defined in RFC
+   2234 [10].  Section 6.1 of RFC 2234 defines a set of core rules that
+   are used by this specification, and not repeated here.  Implementers
+   need to be familiar with the notation and content of RFC 2234 in
+   order to understand this specification.  Certain basic rules are in
+   uppercase, such as SP, LWS, HTAB, CRLF, DIGIT, ALPHA, etc.  Angle
+   brackets are used within definitions to clarify the use of rule
+   names.
+
+   The use of square brackets is redundant syntactically.  It is used as
+   a semantic hint that the specific parameter is optional to use.
+
+25.1 Basic Rules
+
+   The following rules are used throughout this specification to
+   describe basic parsing constructs.  The US-ASCII coded character set
+   is defined by ANSI X3.4-1986.
+
+      alphanum  =  ALPHA / DIGIT
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+Rosenberg, et. al.          Standards Track                   [Page 219]
+
+RFC 3261            SIP: Session Initiation Protocol           June 2002
+
+
+   Several rules are incorporated from RFC 2396 [5] but are updated to
+   make them compliant with RFC 2234 [10].  These include:
+
+      reserved    =  ";" / "/" / "?" / ":" / "@" / "&" / "=" / "+"
+                     / "$" / ","
+      unreserved  =  alphanum / mark
+      mark        =  "-" / "_" / "." / "!" / "~" / "*" / "'"
+                     / "(" / ")"
+      escaped     =  "%" HEXDIG HEXDIG
+
+   SIP header field values can be folded onto multiple lines if the
+   continuation line begins with a space or horizontal tab.  All linear
+   white space, including folding, has the same semantics as SP.  A
+   recipient MAY replace any linear white space with a single SP before
+   interpreting the field value or forwarding the message downstream.
+   This is intended to behave exactly as HTTP/1.1 as described in RFC
+   2616 [8].  The SWS construct is used when linear white space is
+   optional, generally between tokens and separators.
+
+      LWS  =  [*WSP CRLF] 1*WSP ; linear whitespace
+      SWS  =  [LWS] ; sep whitespace
+
+   To separate the header name from the rest of value, a colon is used,
+   which, by the above rule, allows whitespace before, but no line
+   break, and whitespace after, including a linebreak.  The HCOLON
+   defines this construct.
+
+      HCOLON  =  *( SP / HTAB ) ":" SWS
+
+   The TEXT-UTF8 rule is only used for descriptive field contents and
+   values that are not intended to be interpreted by the message parser.
+   Words of *TEXT-UTF8 contain characters from the UTF-8 charset (RFC
+   2279 [7]).  The TEXT-UTF8-TRIM rule is used for descriptive field
+   contents that are n t quoted strings, where leading and trailing LWS
+   is not meaningful.  In this regard, SIP differs from HTTP, which uses
+   the ISO 8859-1 character set.
+
+      TEXT-UTF8-TRIM  =  1*TEXT-UTF8char *(*LWS TEXT-UTF8char)
+      TEXT-UTF8char   =  %x21-7E / UTF8-NONASCII
+      UTF8-NONASCII   =  %xC0-DF 1UTF8-CONT
+                      /  %xE0-EF 2UTF8-CONT
+                      /  %xF0-F7 3UTF8-CONT
+                      /  %xF8-Fb 4UTF8-CONT
+                      /  %xFC-FD 5UTF8-CONT
+      UTF8-CONT       =  %x80-BF
+
+
+
+
+
+
+Rosenberg, et. al.          Standards Track                   [Page 220]
+
+RFC 3261            SIP: Session Initiation Protocol           June 2002
+
+
+   A CRLF is allowed in the definition of TEXT-UTF8-TRIM only as part of
+   a header field continuation.  It is expected that the folding LWS
+   will be replaced with a single SP before interpretation of the TEXT-
+   UTF8-TRIM value.
+
+   Hexadecimal numeric characters are used in several protocol elements.
+   Some elements (authentication) force hex alphas to be lower case.
+
+      LHEX  =  DIGIT / %x61-66 ;lowercase a-f
+
+   Many SIP header field values consist of words separated by LWS or
+   special characters.  Unless otherwise stated, tokens are case-
+   insensitive.  These special characters MUST be in a quoted string to
+   be used within a parameter value.  The word construct is used in
+   Call-ID to allow most separators to be used.
+
+      token       =  1*(alphanum / "-" / "." / "!" / "%" / "*"
+                     / "_" / "+" / "`" / "'" / "~" )
+      separators  =  "(" / ")" / "<" / ">" / "@" /
+                     "," / ";" / ":" / "\" / DQUOTE /
+                     "/" / "[" / "]" / "?" / "=" /
+                     "{" / "}" / SP / HTAB
+      word        =  1*(alphanum / "-" / "." / "!" / "%" / "*" /
+                     "_" / "+" / "`" / "'" / "~" /
+                     "(" / ")" / "<" / ">" /
+                     ":" / "\" / DQUOTE /
+                     "/" / "[" / "]" / "?" /
+                     "{" / "}" )
+
+   When tokens are used or separators are used between elements,
+   whitespace is often allowed before or after these characters:
+
+      STAR    =  SWS "*" SWS ; asterisk
+      SLASH   =  SWS "/" SWS ; slash
+      EQUAL   =  SWS "=" SWS ; equal
+      LPAREN  =  SWS "(" SWS ; left parenthesis
+      RPAREN  =  SWS ")" SWS ; right parenthesis
+      RAQUOT  =  ">" SWS ; right angle quote
+      LAQUOT  =  SWS "<"; left angle quote
+      COMMA   =  SWS "," SWS ; comma
+      SEMI    =  SWS ";" SWS ; semicolon
+      COLON   =  SWS ":" SWS ; colon
+      LDQUOT  =  SWS DQUOTE; open double quotation mark
+      RDQUOT  =  DQUOTE SWS ; close double quotation mark
+
+
+
+
+
+
+
+Rosenberg, et. al.          Standards Track                   [Page 221]
+
+RFC 3261            SIP: Session Initiation Protocol           June 2002
+
+
+   Comments can be included in some SIP header fields by surrounding the
+   comment text with parentheses.  Comments are only allowed in fields
+   containing "comment" as part of their field value definition.  In all
+   other fields, parentheses are considered part of the field value.
+
+      comment  =  LPAREN *(ctext / quoted-pair / comment) RPAREN
+      ctext    =  %x21-27 / %x2A-5B / %x5D-7E / UTF8-NONASCII
+                  / LWS
+
+   ctext includes all chars except left and right parens and backslash.
+   A string of text is parsed as a single word if it is quoted using
+   double-quote marks.  In quoted strings, quotation marks (") and
+   backslashes (\) need to be escaped.
+
+      quoted-string  =  SWS DQUOTE *(qdtext / quoted-pair ) DQUOTE
+      qdtext         =  LWS / %x21 / %x23-5B / %x5D-7E
+                        / UTF8-NONASCII
+
+   The backslash character ("\") MAY be used as a single-character
+   quoting mechanism only within quoted-string and comment constructs.
+   Unlike HTTP/1.1, the characters CR and LF cannot be escaped by this
+   mechanism to avoid conflict with line folding and header separation.
+
+quoted-pair  =  "\" (%x00-09 / %x0B-0C
+                / %x0E-7F)
+
+SIP-URI          =  "sip:" [ userinfo ] hostport
+                    uri-parameters [ headers ]
+SIPS-URI         =  "sips:" [ userinfo ] hostport
+                    uri-parameters [ headers ]
+userinfo         =  ( user / telephone-subscriber ) [ ":" password ] "@"
+user             =  1*( unreserved / escaped / user-unreserved )
+user-unreserved  =  "&" / "=" / "+" / "$" / "," / ";" / "?" / "/"
+password         =  *( unreserved / escaped /
+                    "&" / "=" / "+" / "$" / "," )
+hostport         =  host [ ":" port ]
+host             =  hostname / IPv4address / IPv6reference
+hostname         =  *( domainlabel "." ) toplabel [ "." ]
+domainlabel      =  alphanum
+                    / alphanum *( alphanum / "-" ) alphanum
+toplabel         =  ALPHA / ALPHA *( alphanum / "-" ) alphanum
+
+
+
+
+
+
+
+
+
+
+Rosenberg, et. al.          Standards Track                   [Page 222]
+
+RFC 3261            SIP: Session Initiation Protocol           June 2002
+
+
+IPv4address    =  1*3DIGIT "." 1*3DIGIT "." 1*3DIGIT "." 1*3DIGIT
+IPv6reference  =  "[" IPv6address "]"
+IPv6address    =  hexpart [ ":" IPv4address ]
+hexpart        =  hexseq / hexseq "::" [ hexseq ] / "::" [ hexseq ]
+hexseq         =  hex4 *( ":" hex4)
+hex4           =  1*4HEXDIG
+port           =  1*DIGIT
+
+   The BNF for telephone-subscriber can be found in RFC 2806 [9].  Note,
+   however, that any characters allowed there that are not allowed in
+   the user part of the SIP URI MUST be escaped.
+
+uri-parameters    =  *( ";" uri-parameter)
+uri-parameter     =  transport-param / user-param / method-param
+                     / ttl-param / maddr-param / lr-param / other-param
+transport-param   =  "transport="
+                     ( "udp" / "tcp" / "sctp" / "tls"
+                     / other-transport)
+other-transport   =  token
+user-param        =  "user=" ( "phone" / "ip" / other-user)
+other-user        =  token
+method-param      =  "method=" Method
+ttl-param         =  "ttl=" ttl
+maddr-param       =  "maddr=" host
+lr-param          =  "lr"
+other-param       =  pname [ "=" pvalue ]
+pname             =  1*paramchar
+pvalue            =  1*paramchar
+paramchar         =  param-unreserved / unreserved / escaped
+param-unreserved  =  "[" / "]" / "/" / ":" / "&" / "+" / "$"
+
+headers         =  "?" header *( "&" header )
+header          =  hname "=" hvalue
+hname           =  1*( hnv-unreserved / unreserved / escaped )
+hvalue          =  *( hnv-unreserved / unreserved / escaped )
+hnv-unreserved  =  "[" / "]" / "/" / "?" / ":" / "+" / "$"
+
+SIP-message    =  Request / Response
+Request        =  Request-Line
+                  *( message-header )
+                  CRLF
+                  [ message-body ]
+Request-Line   =  Method SP Request-URI SP SIP-Version CRLF
+Request-URI    =  SIP-URI / SIPS-URI / absoluteURI
+absoluteURI    =  scheme ":" ( hier-part / opaque-part )
+hier-part      =  ( net-path / abs-path ) [ "?" query ]
+net-path       =  "//" authority [ abs-path ]
+abs-path       =  "/" path-segments
+
+
+
+Rosenberg, et. al.          Standards Track                   [Page 223]
+
+RFC 3261            SIP: Session Initiation Protocol           June 2002
+
+
+opaque-part    =  uric-no-slash *uric
+uric           =  reserved / unreserved / escaped
+uric-no-slash  =  unreserved / escaped / ";" / "?" / ":" / "@"
+                  / "&" / "=" / "+" / "$" / ","
+path-segments  =  segment *( "/" segment )
+segment        =  *pchar *( ";" param )
+param          =  *pchar
+pchar          =  unreserved / escaped /
+                  ":" / "@" / "&" / "=" / "+" / "$" / ","
+scheme         =  ALPHA *( ALPHA / DIGIT / "+" / "-" / "." )
+authority      =  srvr / reg-name
+srvr           =  [ [ userinfo "@" ] hostport ]
+reg-name       =  1*( unreserved / escaped / "$" / ","
+                  / ";" / ":" / "@" / "&" / "=" / "+" )
+query          =  *uric
+SIP-Version    =  "SIP" "/" 1*DIGIT "." 1*DIGIT
+
+message-header  =  (Accept
+                /  Accept-Encoding
+                /  Accept-Language
+                /  Alert-Info
+                /  Allow
+                /  Authentication-Info
+                /  Authorization
+                /  Call-ID
+                /  Call-Info
+                /  Contact
+                /  Content-Disposition
+                /  Content-Encoding
+                /  Content-Language
+                /  Content-Length
+                /  Content-Type
+                /  CSeq
+                /  Date
+                /  Error-Info
+                /  Expires
+                /  From
+                /  In-Reply-To
+                /  Max-Forwards
+                /  MIME-Version
+                /  Min-Expires
+                /  Organization
+                /  Priority
+                /  Proxy-Authenticate
+                /  Proxy-Authorization
+                /  Proxy-Require
+                /  Record-Route
+                /  Reply-To
+
+
+
+Rosenberg, et. al.          Standards Track                   [Page 224]
+
+RFC 3261            SIP: Session Initiation Protocol           June 2002
+
+
+                /  Require
+                /  Retry-After
+                /  Route
+                /  Server
+                /  Subject
+                /  Supported
+                /  Timestamp
+                /  To
+                /  Unsupported
+                /  User-Agent
+                /  Via
+                /  Warning
+                /  WWW-Authenticate
+                /  extension-header) CRLF
+
+INVITEm           =  %x49.4E.56.49.54.45 ; INVITE in caps
+ACKm              =  %x41.43.4B ; ACK in caps
+OPTIONSm          =  %x4F.50.54.49.4F.4E.53 ; OPTIONS in caps
+BYEm              =  %x42.59.45 ; BYE in caps
+CANCELm           =  %x43.41.4E.43.45.4C ; CANCEL in caps
+REGISTERm         =  %x52.45.47.49.53.54.45.52 ; REGISTER in caps
+Method            =  INVITEm / ACKm / OPTIONSm / BYEm
+                     / CANCELm / REGISTERm
+                     / extension-method
+extension-method  =  token
+Response          =  Status-Line
+                     *( message-header )
+                     CRLF
+                     [ message-body ]
+
+Status-Line     =  SIP-Version SP Status-Code SP Reason-Phrase CRLF
+Status-Code     =  Informational
+               /   Redirection
+               /   Success
+               /   Client-Error
+               /   Server-Error
+               /   Global-Failure
+               /   extension-code
+extension-code  =  3DIGIT
+Reason-Phrase   =  *(reserved / unreserved / escaped
+                   / UTF8-NONASCII / UTF8-CONT / SP / HTAB)
+
+Informational  =  "100"  ;  Trying
+              /   "180"  ;  Ringing
+              /   "181"  ;  Call Is Being Forwarded
+              /   "182"  ;  Queued
+              /   "183"  ;  Session Progress
+
+
+
+
+Rosenberg, et. al.          Standards Track                   [Page 225]
+
+RFC 3261            SIP: Session Initiation Protocol           June 2002
+
+
+Success  =  "200"  ;  OK
+
+Redirection  =  "300"  ;  Multiple Choices
+            /   "301"  ;  Moved Permanently
+            /   "302"  ;  Moved Temporarily
+            /   "305"  ;  Use Proxy
+            /   "380"  ;  Alternative Service
+
+Client-Error  =  "400"  ;  Bad Request
+             /   "401"  ;  Unauthorized
+             /   "402"  ;  Payment Required
+             /   "403"  ;  Forbidden
+             /   "404"  ;  Not Found
+             /   "405"  ;  Method Not Allowed
+             /   "406"  ;  Not Acceptable
+             /   "407"  ;  Proxy Authentication Required
+             /   "408"  ;  Request Timeout
+             /   "410"  ;  Gone
+             /   "413"  ;  Request Entity Too Large
+             /   "414"  ;  Request-URI Too Large
+             /   "415"  ;  Unsupported Media Type
+             /   "416"  ;  Unsupported URI Scheme
+             /   "420"  ;  Bad Extension
+             /   "421"  ;  Extension Required
+             /   "423"  ;  Interval Too Brief
+             /   "480"  ;  Temporarily not available
+             /   "481"  ;  Call Leg/Transaction Does Not Exist
+             /   "482"  ;  Loop Detected
+             /   "483"  ;  Too Many Hops
+             /   "484"  ;  Address Incomplete
+             /   "485"  ;  Ambiguous
+             /   "486"  ;  Busy Here
+             /   "487"  ;  Request Terminated
+             /   "488"  ;  Not Acceptable Here
+             /   "491"  ;  Request Pending
+             /   "493"  ;  Undecipherable
+
+Server-Error  =  "500"  ;  Internal Server Error
+             /   "501"  ;  Not Implemented
+             /   "502"  ;  Bad Gateway
+             /   "503"  ;  Service Unavailable
+             /   "504"  ;  Server Time-out
+             /   "505"  ;  SIP Version not supported
+             /   "513"  ;  Message Too Large
+
+
+
+
+
+
+
+Rosenberg, et. al.          Standards Track                   [Page 226]
+
+RFC 3261            SIP: Session Initiation Protocol           June 2002
+
+
+Global-Failure  =  "600"  ;  Busy Everywhere
+               /   "603"  ;  Decline
+               /   "604"  ;  Does not exist anywhere
+               /   "606"  ;  Not Acceptable
+
+Accept         =  "Accept" HCOLON
+                   [ accept-range *(COMMA accept-range) ]
+accept-range   =  media-range *(SEMI accept-param)
+media-range    =  ( "*/*"
+                  / ( m-type SLASH "*" )
+                  / ( m-type SLASH m-subtype )
+                  ) *( SEMI m-parameter )
+accept-param   =  ("q" EQUAL qvalue) / generic-param
+qvalue         =  ( "0" [ "." 0*3DIGIT ] )
+                  / ( "1" [ "." 0*3("0") ] )
+generic-param  =  token [ EQUAL gen-value ]
+gen-value      =  token / host / quoted-string
+
+Accept-Encoding  =  "Accept-Encoding" HCOLON
+                     [ encoding *(COMMA encoding) ]
+encoding         =  codings *(SEMI accept-param)
+codings          =  content-coding / "*"
+content-coding   =  token
+
+Accept-Language  =  "Accept-Language" HCOLON
+                     [ language *(COMMA language) ]
+language         =  language-range *(SEMI accept-param)
+language-range   =  ( ( 1*8ALPHA *( "-" 1*8ALPHA ) ) / "*" )
+
+Alert-Info   =  "Alert-Info" HCOLON alert-param *(COMMA alert-param)
+alert-param  =  LAQUOT absoluteURI RAQUOT *( SEMI generic-param )
+
+Allow  =  "Allow" HCOLON [Method *(COMMA Method)]
+
+Authorization     =  "Authorization" HCOLON credentials
+credentials       =  ("Digest" LWS digest-response)
+                     / other-response
+digest-response   =  dig-resp *(COMMA dig-resp)
+dig-resp          =  username / realm / nonce / digest-uri
+                      / dresponse / algorithm / cnonce
+                      / opaque / message-qop
+                      / nonce-count / auth-param
+username          =  "username" EQUAL username-value
+username-value    =  quoted-string
+digest-uri        =  "uri" EQUAL LDQUOT digest-uri-value RDQUOT
+digest-uri-value  =  rquest-uri ; Equal to request-uri as specified
+                     by HTTP/1.1
+message-qop       =  "qop" EQUAL qop-value
+
+
+
+Rosenberg, et. al.          Standards Track                   [Page 227]
+
+RFC 3261            SIP: Session Initiation Protocol           June 2002
+
+
+cnonce            =  "cnonce" EQUAL cnonce-value
+cnonce-value      =  nonce-value
+nonce-count       =  "nc" EQUAL nc-value
+nc-value          =  8LHEX
+dresponse         =  "response" EQUAL request-digest
+request-digest    =  LDQUOT 32LHEX RDQUOT
+auth-param        =  auth-param-name EQUAL
+                     ( token / quoted-string )
+auth-param-name   =  token
+other-response    =  auth-scheme LWS auth-param
+                     *(COMMA auth-param)
+auth-scheme       =  token
+
+Authentication-Info  =  "Authentication-Info" HCOLON ainfo
+                        *(COMMA ainfo)
+ainfo                =  nextnonce / message-qop
+                         / response-auth / cnonce
+                         / nonce-count
+nextnonce            =  "nextnonce" EQUAL nonce-value
+response-auth        =  "rspauth" EQUAL response-digest
+response-digest      =  LDQUOT *LHEX RDQUOT
+
+Call-ID  =  ( "Call-ID" / "i" ) HCOLON callid
+callid   =  word [ "@" word ]
+
+Call-Info   =  "Call-Info" HCOLON info *(COMMA info)
+info        =  LAQUOT absoluteURI RAQUOT *( SEMI info-param)
+info-param  =  ( "purpose" EQUAL ( "icon" / "info"
+               / "card" / token ) ) / generic-param
+
+Contact        =  ("Contact" / "m" ) HCOLON
+                  ( STAR / (contact-param *(COMMA contact-param)))
+contact-param  =  (name-addr / addr-spec) *(SEMI contact-params)
+name-addr      =  [ display-name ] LAQUOT addr-spec RAQUOT
+addr-spec      =  SIP-URI / SIPS-URI / absoluteURI
+display-name   =  *(token LWS)/ quoted-string
+
+contact-params     =  c-p-q / c-p-expires
+                      / contact-extension
+c-p-q              =  "q" EQUAL qvalue
+c-p-expires        =  "expires" EQUAL delta-seconds
+contact-extension  =  generic-param
+delta-seconds      =  1*DIGIT
+
+Content-Disposition   =  "Content-Disposition" HCOLON
+                         disp-type *( SEMI disp-param )
+disp-type             =  "render" / "session" / "icon" / "alert"
+                         / disp-extension-token
+
+
+
+Rosenberg, et. al.          Standards Track                   [Page 228]
+
+RFC 3261            SIP: Session Initiation Protocol           June 2002
+
+
+disp-param            =  handling-param / generic-param
+handling-param        =  "handling" EQUAL
+                         ( "optional" / "required"
+                         / other-handling )
+other-handling        =  token
+disp-extension-token  =  token
+
+Content-Encoding  =  ( "Content-Encoding" / "e" ) HCOLON
+                     content-coding *(COMMA content-coding)
+
+Content-Language  =  "Content-Language" HCOLON
+                     language-tag *(COMMA language-tag)
+language-tag      =  primary-tag *( "-" subtag )
+primary-tag       =  1*8ALPHA
+subtag            =  1*8ALPHA
+
+Content-Length  =  ( "Content-Length" / "l" ) HCOLON 1*DIGIT
+Content-Type     =  ( "Content-Type" / "c" ) HCOLON media-type
+media-type       =  m-type SLASH m-subtype *(SEMI m-parameter)
+m-type           =  discrete-type / composite-type
+discrete-type    =  "text" / "image" / "audio" / "video"
+                    / "application" / extension-token
+composite-type   =  "message" / "multipart" / extension-token
+extension-token  =  ietf-token / x-token
+ietf-token       =  token
+x-token          =  "x-" token
+m-subtype        =  extension-token / iana-token
+iana-token       =  token
+m-parameter      =  m-attribute EQUAL m-value
+m-attribute      =  token
+m-value          =  token / quoted-string
+
+CSeq  =  "CSeq" HCOLON 1*DIGIT LWS Method
+
+Date          =  "Date" HCOLON SIP-date
+SIP-date      =  rfc1123-date
+rfc1123-date  =  wkday "," SP date1 SP time SP "GMT"
+date1         =  2DIGIT SP month SP 4DIGIT
+                 ; day month year (e.g., 02 Jun 1982)
+time          =  2DIGIT ":" 2DIGIT ":" 2DIGIT
+                 ; 00:00:00 - 23:59:59
+wkday         =  "Mon" / "Tue" / "Wed"
+                 / "Thu" / "Fri" / "Sat" / "Sun"
+month         =  "Jan" / "Feb" / "Mar" / "Apr"
+                 / "May" / "Jun" / "Jul" / "Aug"
+                 / "Sep" / "Oct" / "Nov" / "Dec"
+
+Error-Info  =  "Error-Info" HCOLON error-uri *(COMMA error-uri)
+
+
+
+Rosenberg, et. al.          Standards Track                   [Page 229]
+
+RFC 3261            SIP: Session Initiation Protocol           June 2002
+
+
+error-uri   =  LAQUOT absoluteURI RAQUOT *( SEMI generic-param )
+
+Expires     =  "Expires" HCOLON delta-seconds
+From        =  ( "From" / "f" ) HCOLON from-spec
+from-spec   =  ( name-addr / addr-spec )
+               *( SEMI from-param )
+from-param  =  tag-param / generic-param
+tag-param   =  "tag" EQUAL token
+
+In-Reply-To  =  "In-Reply-To" HCOLON callid *(COMMA callid)
+
+Max-Forwards  =  "Max-Forwards" HCOLON 1*DIGIT
+
+MIME-Version  =  "MIME-Version" HCOLON 1*DIGIT "." 1*DIGIT
+
+Min-Expires  =  "Min-Expires" HCOLON delta-seconds
+
+Organization  =  "Organization" HCOLON [TEXT-UTF8-TRIM]
+
+Priority        =  "Priority" HCOLON priority-value
+priority-value  =  "emergency" / "urgent" / "normal"
+                   / "non-urgent" / other-priority
+other-priority  =  token
+
+Proxy-Authenticate  =  "Proxy-Authenticate" HCOLON challenge
+challenge           =  ("Digest" LWS digest-cln *(COMMA digest-cln))
+                       / other-challenge
+other-challenge     =  auth-scheme LWS auth-param
+                       *(COMMA auth-param)
+digest-cln          =  realm / domain / nonce
+                        / opaque / stale / algorithm
+                        / qop-options / auth-param
+realm               =  "realm" EQUAL realm-value
+realm-value         =  quoted-string
+domain              =  "domain" EQUAL LDQUOT URI
+                       *( 1*SP URI ) RDQUOT
+URI                 =  absoluteURI / abs-path
+nonce               =  "nonce" EQUAL nonce-value
+nonce-value         =  quoted-string
+opaque              =  "opaque" EQUAL quoted-string
+stale               =  "stale" EQUAL ( "true" / "false" )
+algorithm           =  "algorithm" EQUAL ( "MD5" / "MD5-sess"
+                       / token )
+qop-options         =  "qop" EQUAL LDQUOT qop-value
+                       *("," qop-value) RDQUOT
+qop-value           =  "auth" / "auth-int" / token
+
+Proxy-Authorization  =  "Proxy-Authorization" HCOLON credentials
+
+
+
+Rosenberg, et. al.          Standards Track                   [Page 230]
+
+RFC 3261            SIP: Session Initiation Protocol           June 2002
+
+
+Proxy-Require  =  "Proxy-Require" HCOLON option-tag
+                  *(COMMA option-tag)
+option-tag     =  token
+
+Record-Route  =  "Record-Route" HCOLON rec-route *(COMMA rec-route)
+rec-route     =  name-addr *( SEMI rr-param )
+rr-param      =  generic-param
+
+Reply-To      =  "Reply-To" HCOLON rplyto-spec
+rplyto-spec   =  ( name-addr / addr-spec )
+                 *( SEMI rplyto-param )
+rplyto-param  =  generic-param
+Require       =  "Require" HCOLON option-tag *(COMMA option-tag)
+
+Retry-After  =  "Retry-After" HCOLON delta-seconds
+                [ comment ] *( SEMI retry-param )
+
+retry-param  =  ("duration" EQUAL delta-seconds)
+                / generic-param
+
+Route        =  "Route" HCOLON route-param *(COMMA route-param)
+route-param  =  name-addr *( SEMI rr-param )
+
+Server           =  "Server" HCOLON server-val *(LWS server-val)
+server-val       =  product / comment
+product          =  token [SLASH product-version]
+product-version  =  token
+
+Subject  =  ( "Subject" / "s" ) HCOLON [TEXT-UTF8-TRIM]
+
+Supported  =  ( "Supported" / "k" ) HCOLON
+              [option-tag *(COMMA option-tag)]
+
+Timestamp  =  "Timestamp" HCOLON 1*(DIGIT)
+               [ "." *(DIGIT) ] [ LWS delay ]
+delay      =  *(DIGIT) [ "." *(DIGIT) ]
+
+To        =  ( "To" / "t" ) HCOLON ( name-addr
+             / addr-spec ) *( SEMI to-param )
+to-param  =  tag-param / generic-param
+
+Unsupported  =  "Unsupported" HCOLON option-tag *(COMMA option-tag)
+User-Agent  =  "User-Agent" HCOLON server-val *(LWS server-val)
+
+
+
+
+
+
+
+
+Rosenberg, et. al.          Standards Track                   [Page 231]
+
+RFC 3261            SIP: Session Initiation Protocol           June 2002
+
+
+Via               =  ( "Via" / "v" ) HCOLON via-parm *(COMMA via-parm)
+via-parm          =  sent-protocol LWS sent-by *( SEMI via-params )
+via-params        =  via-ttl / via-maddr
+                     / via-received / via-branch
+                     / via-extension
+via-ttl           =  "ttl" EQUAL ttl
+via-maddr         =  "maddr" EQUAL host
+via-received      =  "received" EQUAL (IPv4address / IPv6address)
+via-branch        =  "branch" EQUAL token
+via-extension     =  generic-param
+sent-protocol     =  protocol-name SLASH protocol-version
+                     SLASH transport
+protocol-name     =  "SIP" / token
+protocol-version  =  token
+transport         =  "UDP" / "TCP" / "TLS" / "SCTP"
+                     / other-transport
+sent-by           =  host [ COLON port ]
+ttl               =  1*3DIGIT ; 0 to 255
+
+Warning        =  "Warning" HCOLON warning-value *(COMMA warning-value)
+warning-value  =  warn-code SP warn-agent SP warn-text
+warn-code      =  3DIGIT
+warn-agent     =  hostport / pseudonym
+                  ;  the name or pseudonym of the server adding
+                  ;  the Warning header, for use in debugging
+warn-text      =  quoted-string
+pseudonym      =  token
+
+WWW-Authenticate  =  "WWW-Authenticate" HCOLON challenge
+
+extension-header  =  header-name HCOLON header-value
+header-name       =  token
+header-value      =  *(TEXT-UTF8char / UTF8-CONT / LWS)
+message-body  =  *OCTET
+
+26 Security Considerations: Threat Model and Security Usage
+   Recommendations
+
+   SIP is not an easy protocol to secure.  Its use of intermediaries,
+   its multi-faceted trust relationships, its expected usage between
+   elements with no trust at all, and its user-to-user operation make
+   security far from trivial.  Security solutions are needed that are
+   deployable today, without extensive coordination, in a wide variety
+   of environments and usages.  In order to meet these diverse needs,
+   several distinct mechanisms applicable to different aspects and
+   usages of SIP will be required.
+
+
+
+
+
+Rosenberg, et. al.          Standards Track                   [Page 232]
+
+RFC 3261            SIP: Session Initiation Protocol           June 2002
+
+
+   Note that the security of SIP signaling itself has no bearing on the
+   security of protocols used in concert with SIP such as RTP, or with
+   the security implications of any specific bodies SIP might carry
+   (although MIME security plays a substantial role in securing SIP).
+   Any media associated with a session can be encrypted end-to-end
+   independently of any associated SIP signaling.  Media encryption is
+   outside the scope of this document.
+
+   The considerations that follow first examine a set of classic threat
+   models that broadly identify the security needs of SIP.  The set of
+   security services required to address these threats is then detailed,
+   followed by an explanation of several security mechanisms that can be
+   used to provide these services.  Next, the requirements for
+   implementers of SIP are enumerated, along with exemplary deployments
+   in which these security mechanisms could be used to improve the
+   security of SIP.  Some notes on privacy conclude this section.
+
+26.1 Attacks and Threat Models
+
+   This section details some threats that should be common to most
+   deployments of SIP.  These threats have been chosen specifically to
+   illustrate each of the security services that SIP requires.
+
+   The following examples by no means provide an exhaustive list of the
+   threats against SIP; rather, these are "classic" threats that
+   demonstrate the need for particular security services that can
+   potentially prevent whole categories of threats.
+
+   These attacks assume an environment in which attackers can
+   potentially read any packet on the network - it is anticipated that
+   SIP will frequently be used on the public Internet.  Attackers on the
+   network may be able to modify packets (perhaps at some compromised
+   intermediary).  Attackers may wish to steal services, eavesdrop on
+   communications, or disrupt sessions.
+
+26.1.1 Registration Hijacking
+
+   The SIP registration mechanism allows a user agent to identify itself
+   to a registrar as a device at which a user (designated by an address
+   of record) is located.  A registrar assesses the identity asserted in
+   the From header field of a REGISTER message to determine whether this
+   request can modify the contact addresses associated with the
+   address-of-record in the To header field.  While these two fields are
+   frequently the same, there are many valid deployments in which a
+   third-party may register contacts on a user's behalf.
+
+
+
+
+
+
+Rosenberg, et. al.          Standards Track                   [Page 233]
+
+RFC 3261            SIP: Session Initiation Protocol           June 2002
+
+
+   The From header field of a SIP request, however, can be modified
+   arbitrarily by the owner of a UA, and this opens the door to
+   malicious registrations.  An attacker that successfully impersonates
+   a party authorized to change contacts associated with an address-of-
+   record could, for example, de-register all existing contacts for a
+   URI and then register their own device as the appropriate contact
+   address, thereby directing all requests for the affected user to the
+   attacker's device.
+
+   This threat belongs to a family of threats that rely on the absence
+   of cryptographic assurance of a request's originator.  Any SIP UAS
+   that represents a valuable service (a gateway that interworks SIP
+   requests with traditional telephone calls, for example) might want to
+   control access to its resources by authenticating requests that it
+   receives.  Even end-user UAs, for example SIP phones, have an
+   interest in ascertaining the identities of originators of requests.
+
+   This threat demonstrates the need for security services that enable
+   SIP entities to authenticate the originators of requests.
+
+26.1.2 Impersonating a Server
+
+   The domain to which a request is destined is generally specified in
+   the Request-URI.  UAs commonly contact a server in this domain
+   directly in order to deliver a request.  However, there is always a
+   possibility that an attacker could impersonate the remote server, and
+   that the UA's request could be intercepted by some other party.
+
+   For example, consider a case in which a redirect server at one
+   domain, chicago.com, impersonates a redirect server at another
+   domain, biloxi.com.  A user agent sends a request to biloxi.com, but
+   the redirect server at chicago.com answers with a forged response
+   that has appropriate SIP header fields for a response from
+   biloxi.com.  The forged contact addresses in the redirection response
+   could direct the originating UA to inappropriate or insecure
+   resources, or simply prevent requests for biloxi.com from succeeding.
+
+   This family of threats has a vast membership, many of which are
+   critical.  As a converse to the registration hijacking threat,
+   consider the case in which a registration sent to biloxi.com is
+   intercepted by chicago.com, which replies to the intercepted
+   registration with a forged 301 (Moved Permanently) response.  This
+   response might seem to come from biloxi.com yet designate chicago.com
+   as the appropriate registrar.  All future REGISTER requests from the
+   originating UA would then go to chicago.com.
+
+   Prevention of this threat requires a means by which UAs can
+   authenticate the servers to whom they send requests.
+
+
+
+Rosenberg, et. al.          Standards Track                   [Page 234]
+
+RFC 3261            SIP: Session Initiation Protocol           June 2002
+
+
+26.1.3 Tampering with Message Bodies
+
+   As a matter of course, SIP UAs route requests through trusted proxy
+   servers.  Regardless of how that trust is established (authentication
+   of proxies is discussed elsewhere in this section), a UA may trust a
+   proxy server to route a request, but not to inspect or possibly
+   modify the bodies contained in that request.
+
+   Consider a UA that is using SIP message bodies to communicate session
+   encryption keys for a media session.  Although it trusts the proxy
+   server of the domain it is contacting to deliver signaling properly,
+   it may not want the administrators of that domain to be capable of
+   decrypting any subsequent media session.  Worse yet, if the proxy
+   server were actively malicious, it could modify the session key,
+   either acting as a man-in-the-middle, or perhaps changing the
+   security characteristics requested by the originating UA.
+
+   This family of threats applies not only to session keys, but to most
+   conceivable forms of content carried end-to-end in SIP.  These might
+   include MIME bodies that should be rendered to the user, SDP, or
+   encapsulated telephony signals, among others.  Attackers might
+   attempt to modify SDP bodies, for example, in order to point RTP
+   media streams to a wiretapping device in order to eavesdrop on
+   subsequent voice communications.
+
+   Also note that some header fields in SIP are meaningful end-to-end,
+   for example, Subject.  UAs might be protective of these header fields
+   as well as bodies (a malicious intermediary changing the Subject
+   header field might make an important request appear to be spam, for
+   example).  However, since many header fields are legitimately
+   inspected or altered by proxy servers as a request is routed, not all
+   header fields should be secured end-to-end.
+
+   For these reasons, the UA might want to secure SIP message bodies,
+   and in some limited cases header fields, end-to-end.  The security
+   services required for bodies include confidentiality, integrity, and
+   authentication.  These end-to-end services should be independent of
+   the means used to secure interactions with intermediaries such as
+   proxy servers.
+
+26.1.4 Tearing Down Sessions
+
+   Once a dialog has been established by initial messaging, subsequent
+   requests can be sent that modify the state of the dialog and/or
+   session.  It is critical that principals in a session can be certain
+   that such requests are not forged by attackers.
+
+
+
+
+
+Rosenberg, et. al.          Standards Track                   [Page 235]
+
+RFC 3261            SIP: Session Initiation Protocol           June 2002
+
+
+   Consider a case in which a third-party attacker captures some initial
+   messages in a dialog shared by two parties in order to learn the
+   parameters of the session (To tag, From tag, and so forth) and then
+   inserts a BYE request into the session.  The attacker could opt to
+   forge the request such that it seemed to come from either
+   participant.  Once the BYE is received by its target, the session
+   will be torn down prematurely.
+
+   Similar mid-session threats include the transmission of forged re-
+   INVITEs that alter the session (possibly to reduce session security
+   or redirect media streams as part of a wiretapping attack).
+
+   The most effective countermeasure to this threat is the
+   authentication of the sender of the BYE.  In this instance, the
+   recipient needs only know that the BYE came from the same party with
+   whom the corresponding dialog was established (as opposed to
+   ascertaining the absolute identity of the sender).  Also, if the
+   attacker is unable to learn the parameters of the session due to
+   confidentiality, it would not be possible to forge the BYE.  However,
+   some intermediaries (like proxy servers) will need to inspect those
+   parameters as the session is established.
+
+26.1.5 Denial of Service and Amplification
+
+   Denial-of-service attacks focus on rendering a particular network
+   element unavailable, usually by directing an excessive amount of
+   network traffic at its interfaces.  A distributed denial-of-service
+   attack allows one network user to cause multiple network hosts to
+   flood a target host with a large amount of network traffic.
+
+   In many architectures, SIP proxy servers face the public Internet in
+   order to accept requests from worldwide IP endpoints.  SIP creates a
+   number of potential opportunities for distributed denial-of-service
+   attacks that must be recognized and addressed by the implementers and
+   operators of SIP systems.
+
+   Attackers can create bogus requests that contain a falsified source
+   IP address and a corresponding Via header field that identify a
+   targeted host as the originator of the request and then send this
+   request to a large number of SIP network elements, thereby using
+   hapless SIP UAs or proxies to generate denial-of-service traffic
+   aimed at the target.
+
+   Similarly, attackers might use falsified Route header field values in
+   a request that identify the target host and then send such messages
+   to forking proxies that will amplify messaging sent to the target.
+
+
+
+
+
+Rosenberg, et. al.          Standards Track                   [Page 236]
+
+RFC 3261            SIP: Session Initiation Protocol           June 2002
+
+
+   Record-Route could be used to similar effect when the attacker is
+   certain that the SIP dialog initiated by the request will result in
+   numerous transactions originating in the backwards direction.
+
+   A number of denial-of-service attacks open up if REGISTER requests
+   are not properly authenticated and authorized by registrars.
+   Attackers could de-register some or all users in an administrative
+   domain, thereby preventing these users from being invited to new
+   sessions.  An attacker could also register a large number of contacts
+   designating the same host for a given address-of-record in order to
+   use the registrar and any associated proxy servers as amplifiers in a
+   denial-of-service attack.  Attackers might also attempt to deplete
+   available memory and disk resources of a registrar by registering
+   huge numbers of bindings.
+
+   The use of multicast to transmit SIP requests can greatly increase
+   the potential for denial-of-service attacks.
+
+   These problems demonstrate a general need to define architectures
+   that minimize the risks of denial-of-service, and the need to be
+   mindful in recommendations for security mechanisms of this class of
+   attacks.
+
+26.2 Security Mechanisms
+
+   From the threats described above, we gather that the fundamental
+   security services required for the SIP protocol are: preserving the
+   confidentiality and integrity of messaging, preventing replay attacks
+   or message spoofing, providing for the authentication and privacy of
+   the participants in a session, and preventing denial-of-service
+   attacks.  Bodies within SIP messages separately require the security
+   services of confidentiality, integrity, and authentication.
+
+   Rather than defining new security mechanisms specific to SIP, SIP
+   reuses wherever possible existing security models derived from the
+   HTTP and SMTP space.
+
+   Full encryption of messages provides the best means to preserve the
+   confidentiality of signaling - it can also guarantee that messages
+   are not modified by any malicious intermediaries.  However, SIP
+   requests and responses cannot be naively encrypted end-to-end in
+   their entirety because message fields such as the Request-URI, Route,
+   and Via need to be visible to proxies in most network architectures
+   so that SIP requests are routed correctly.  Note that proxy servers
+   need to modify some features of messages as well (such as adding Via
+   header field values) in order for SIP to function.  Proxy servers
+   must therefore be trusted, to some degree, by SIP UAs.  To this
+   purpose, low-layer security mechanisms for SIP are recommended, which
+
+
+
+Rosenberg, et. al.          Standards Track                   [Page 237]
+
+RFC 3261            SIP: Session Initiation Protocol           June 2002
+
+
+   encrypt the entire SIP requests or responses on the wire on a hop-
+   by-hop basis, and that allow endpoints to verify the identity of
+   proxy servers to whom they send requests.
+
+   SIP entities also have a need to identify one another in a secure
+   fashion.  When a SIP endpoint asserts the identity of its user to a
+   peer UA or to a proxy server, that identity should in some way be
+   verifiable.  A cryptographic authentication mechanism is provided in
+   SIP to address this requirement.
+
+   An independent security mechanism for SIP message bodies supplies an
+   alternative means of end-to-end mutual authentication, as well as
+   providing a limit on the degree to which user agents must trust
+   intermediaries.
+
+26.2.1 Transport and Network Layer Security
+
+   Transport or network layer security encrypts signaling traffic,
+   guaranteeing message confidentiality and integrity.
+
+   Oftentimes, certificates are used in the establishment of lower-layer
+   security, and these certificates can also be used to provide a means
+   of authentication in many architectures.
+
+   Two popular alternatives for providing security at the transport and
+   network layer are, respectively, TLS [25] and IPSec [26].
+
+   IPSec is a set of network-layer protocol tools that collectively can
+   be used as a secure replacement for traditional IP (Internet
+   Protocol).  IPSec is most commonly used in architectures in which a
+   set of hosts or administrative domains have an existing trust
+   relationship with one another.  IPSec is usually implemented at the
+   operating system level in a host, or on a security gateway that
+   provides confidentiality and integrity for all traffic it receives
+   from a particular interface (as in a VPN architecture).  IPSec can
+   also be used on a hop-by-hop basis.
+
+   In many architectures IPSec does not require integration with SIP
+   applications; IPSec is perhaps best suited to deployments in which
+   adding security directly to SIP hosts would be arduous.  UAs that
+   have a pre-shared keying relationship with their first-hop proxy
+   server are also good candidates to use IPSec.  Any deployment of
+   IPSec for SIP would require an IPSec profile describing the protocol
+   tools that would be required to secure SIP.  No such profile is given
+   in this document.
+
+
+
+
+
+
+Rosenberg, et. al.          Standards Track                   [Page 238]
+
+RFC 3261            SIP: Session Initiation Protocol           June 2002
+
+
+   TLS provides transport-layer security over connection-oriented
+   protocols (for the purposes of this document, TCP); "tls" (signifying
+   TLS over TCP) can be specified as the desired transport protocol
+   within a Via header field value or a SIP-URI.  TLS is most suited to
+   architectures in which hop-by-hop security is required between hosts
+   with no pre-existing trust association.  For example, Alice trusts
+   her local proxy server, which after a certificate exchange decides to
+   trust Bob's local proxy server, which Bob trusts, hence Bob and Alice
+   can communicate securely.
+
+   TLS must be tightly coupled with a SIP application.  Note that
+   transport mechanisms are specified on a hop-by-hop basis in SIP, thus
+   a UA that sends requests over TLS to a proxy server has no assurance
+   that TLS will be used end-to-end.
+
+   The TLS_RSA_WITH_AES_128_CBC_SHA ciphersuite [6] MUST be supported at
+   a minimum by implementers when TLS is used in a SIP application.  For
+   purposes of backwards compatibility, proxy servers, redirect servers,
+   and registrars SHOULD support TLS_RSA_WITH_3DES_EDE_CBC_SHA.
+   Implementers MAY also support any other ciphersuite.
+
+26.2.2 SIPS URI Scheme
+
+   The SIPS URI scheme adheres to the syntax of the SIP URI (described
+   in 19), although the scheme string is "sips" rather than "sip".  The
+   semantics of SIPS are very different from the SIP URI, however.  SIPS
+   allows resources to specify that they should be reached securely.
+
+   A SIPS URI can be used as an address-of-record for a particular user
+   - the URI by which the user is canonically known (on their business
+   cards, in the From header field of their requests, in the To header
+   field of REGISTER requests).  When used as the Request-URI of a
+   request, the SIPS scheme signifies that each hop over which the
+   request is forwarded, until the request reaches the SIP entity
+   responsible for the domain portion of the Request-URI, must be
+   secured with TLS; once it reaches the domain in question it is
+   handled in accordance with local security and routing policy, quite
+   possibly using TLS for any last hop to a UAS.  When used by the
+   originator of a request (as would be the case if they employed a SIPS
+   URI as the address-of-record of the target), SIPS dictates that the
+   entire request path to the target domain be so secured.
+
+   The SIPS scheme is applicable to many of the other ways in which SIP
+   URIs are used in SIP today in addition to the Request-URI, including
+   in addresses-of-record, contact addresses (the contents of Contact
+   headers, including those of REGISTER methods), and Route headers.  In
+   each instance, the SIPS URI scheme allows these existing fields to
+
+
+
+
+Rosenberg, et. al.          Standards Track                   [Page 239]
+
+RFC 3261            SIP: Session Initiation Protocol           June 2002
+
+
+   designate secure resources.  The manner in which a SIPS URI is
+   dereferenced in any of these contexts has its own security properties
+   which are detailed in [4].
+
+   The use of SIPS in particular entails that mutual TLS authentication
+   SHOULD be employed, as SHOULD the ciphersuite
+   TLS_RSA_WITH_AES_128_CBC_SHA.  Certificates received in the
+   authentication process SHOULD be validated with root certificates
+   held by the client; failure to validate a certificate SHOULD result
+   in the failure of the request.
+
+      Note that in the SIPS URI scheme, transport is independent of TLS,
+      and thus "sips:alice@atlanta.com;transport=tcp" and
+      "sips:alice@atlanta.com;transport=sctp" are both valid (although
+      note that UDP is not a valid transport for SIPS).  The use of
+      "transport=tls" has consequently been deprecated, partly because
+      it was specific to a single hop of the request.  This is a change
+      since RFC 2543.
+
+   Users that distribute a SIPS URI as an address-of-record may elect to
+   operate devices that refuse requests over insecure transports.
+
+26.2.3 HTTP Authentication
+
+   SIP provides a challenge capability, based on HTTP authentication,
+   that relies on the 401 and 407 response codes as well as header
+   fields for carrying challenges and credentials.  Without significant
+   modification, the reuse of the HTTP Digest authentication scheme in
+   SIP allows for replay protection and one-way authentication.
+
+   The usage of Digest authentication in SIP is detailed in Section 22.
+
+26.2.4 S/MIME
+
+   As is discussed above, encrypting entire SIP messages end-to-end for
+   the purpose of confidentiality is not appropriate because network
+   intermediaries (like proxy servers) need to view certain header
+   fields in order to route messages correctly, and if these
+   intermediaries are excluded from security associations, then SIP
+   messages will essentially be non-routable.
+
+   However, S/MIME allows SIP UAs to encrypt MIME bodies within SIP,
+   securing these bodies end-to-end without affecting message headers.
+   S/MIME can provide end-to-end confidentiality and integrity for
+   message bodies, as well as mutual authentication.  It is also
+   possible to use S/MIME to provide a form of integrity and
+   confidentiality for SIP header fields through SIP message tunneling.
+
+
+
+
+Rosenberg, et. al.          Standards Track                   [Page 240]
+
+RFC 3261            SIP: Session Initiation Protocol           June 2002
+
+
+   The usage of S/MIME in SIP is detailed in Section 23.
+
+26.3 Implementing Security Mechanisms
+
+26.3.1 Requirements for Implementers of SIP
+
+   Proxy servers, redirect servers, and registrars MUST implement TLS,
+   and MUST support both mutual and one-way authentication.  It is
+   strongly RECOMMENDED that UAs be capable initiating TLS; UAs MAY also
+   be capable of acting as a TLS server.  Proxy servers, redirect
+   servers, and registrars SHOULD possess a site certificate whose
+   subject corresponds to their canonical hostname.  UAs MAY have
+   certificates of their own for mutual authentication with TLS, but no
+   provisions are set forth in this document for their use.  All SIP
+   elements that support TLS MUST have a mechanism for validating
+   certificates received during TLS negotiation; this entails possession
+   of one or more root certificates issued by certificate authorities
+   (preferably well-known distributors of site certificates comparable
+   to those that issue root certificates for web browsers).
+
+   All SIP elements that support TLS MUST also support the SIPS URI
+   scheme.
+
+   Proxy servers, redirect servers, registrars, and UAs MAY also
+   implement IPSec or other lower-layer security protocols.
+
+   When a UA attempts to contact a proxy server, redirect server, or
+   registrar, the UAC SHOULD initiate a TLS connection over which it
+   will send SIP messages.  In some architectures, UASs MAY receive
+   requests over such TLS connections as well.
+
+   Proxy servers, redirect servers, registrars, and UAs MUST implement
+   Digest Authorization, encompassing all of the aspects required in 22.
+   Proxy servers, redirect servers, and registrars SHOULD be configured
+   with at least one Digest realm, and at least one "realm" string
+   supported by a given server SHOULD correspond to the server's
+   hostname or domainname.
+
+   UAs MAY support the signing and encrypting of MIME bodies, and
+   transference of credentials with S/MIME as described in Section 23.
+   If a UA holds one or more root certificates of certificate
+   authorities in order to validate certificates for TLS or IPSec, it
+   SHOULD be capable of reusing these to verify S/MIME certificates, as
+   appropriate.  A UA MAY hold root certificates specifically for
+   validating S/MIME certificates.
+
+
+
+
+
+
+Rosenberg, et. al.          Standards Track                   [Page 241]
+
+RFC 3261            SIP: Session Initiation Protocol           June 2002
+
+
+      Note that is it anticipated that future security extensions may
+      upgrade the normative strength associated with S/MIME as S/MIME
+      implementations appear and the problem space becomes better
+      understood.
+
+26.3.2 Security Solutions
+
+   The operation of these security mechanisms in concert can follow the
+   existing web and email security models to some degree.  At a high
+   level, UAs authenticate themselves to servers (proxy servers,
+   redirect servers, and registrars) with a Digest username and
+   password; servers authenticate themselves to UAs one hop away, or to
+   another server one hop away (and vice versa), with a site certificate
+   delivered by TLS.
+
+   On a peer-to-peer level, UAs trust the network to authenticate one
+   another ordinarily; however, S/MIME can also be used to provide
+   direct authentication when the network does not, or if the network
+   itself is not trusted.
+
+   The following is an illustrative example in which these security
+   mechanisms are used by various UAs and servers to prevent the sorts
+   of threats described in Section 26.1.  While implementers and network
+   administrators MAY follow the normative guidelines given in the
+   remainder of this section, these are provided only as example
+   implementations.
+
+26.3.2.1 Registration
+
+   When a UA comes online and registers with its local administrative
+   domain, it SHOULD establish a TLS connection with its registrar
+   (Section 10 describes how the UA reaches its registrar).  The
+   registrar SHOULD offer a certificate to the UA, and the site
+   identified by the certificate MUST correspond with the domain in
+   which the UA intends to register; for example, if the UA intends to
+   register the address-of-record 'alice@atlanta.com', the site
+   certificate must identify a host within the atlanta.com domain (such
+   as sip.atlanta.com).  When it receives the TLS Certificate message,
+   the UA SHOULD verify the certificate and inspect the site identified
+   by the certificate.  If the certificate is invalid, revoked, or if it
+   does not identify the appropriate party, the UA MUST NOT send the
+   REGISTER message and otherwise proceed with the registration.
+
+      When a valid certificate has been provided by the registrar, the
+      UA knows that the registrar is not an attacker who might redirect
+      the UA, steal passwords, or attempt any similar attacks.
+
+
+
+
+
+Rosenberg, et. al.          Standards Track                   [Page 242]
+
+RFC 3261            SIP: Session Initiation Protocol           June 2002
+
+
+   The UA then creates a REGISTER request that SHOULD be addressed to a
+   Request-URI corresponding to the site certificate received from the
+   registrar.  When the UA sends the REGISTER request over the existing
+   TLS connection, the registrar SHOULD challenge the request with a 401
+   (Proxy Authentication Required) response.  The "realm" parameter
+   within the Proxy-Authenticate header field of the response SHOULD
+   correspond to the domain previously given by the site certificate.
+   When the UAC receives the challenge, it SHOULD either prompt the user
+   for credentials or take an appropriate credential from a keyring
+   corresponding to the "realm" parameter in the challenge.  The
+   username of this credential SHOULD correspond with the "userinfo"
+   portion of the URI in the To header field of the REGISTER request.
+   Once the Digest credentials have been inserted into an appropriate
+   Proxy-Authorization header field, the REGISTER should be resubmitted
+   to the registrar.
+
+      Since the registrar requires the user agent to authenticate
+      itself, it would be difficult for an attacker to forge REGISTER
+      requests for the user's address-of-record.  Also note that since
+      the REGISTER is sent over a confidential TLS connection, attackers
+      will not be able to intercept the REGISTER to record credentials
+      for any possible replay attack.
+
+   Once the registration has been accepted by the registrar, the UA
+   SHOULD leave this TLS connection open provided that the registrar
+   also acts as the proxy server to which requests are sent for users in
+   this administrative domain.  The existing TLS connection will be
+   reused to deliver incoming requests to the UA that has just completed
+   registration.
+
+      Because the UA has already authenticated the server on the other
+      side of the TLS connection, all requests that come over this
+      connection are known to have passed through the proxy server -
+      attackers cannot create spoofed requests that appear to have been
+      sent through that proxy server.
+
+26.3.2.2 Interdomain Requests
+
+   Now let's say that Alice's UA would like to initiate a session with a
+   user in a remote administrative domain, namely "bob@biloxi.com".  We
+   will also say that the local administrative domain (atlanta.com) has
+   a local outbound proxy.
+
+   The proxy server that handles inbound requests for an administrative
+   domain MAY also act as a local outbound proxy; for simplicity's sake
+   we'll assume this to be the case for atlanta.com (otherwise the user
+   agent would initiate a new TLS connection to a separate server at
+   this point).  Assuming that the client has completed the registration
+
+
+
+Rosenberg, et. al.          Standards Track                   [Page 243]
+
+RFC 3261            SIP: Session Initiation Protocol           June 2002
+
+
+   process described in the preceding section, it SHOULD reuse the TLS
+   connection to the local proxy server when it sends an INVITE request
+   to another user.  The UA SHOULD reuse cached credentials in the
+   INVITE to avoid prompting the user unnecessarily.
+
+   When the local outbound proxy server has validated the credentials
+   presented by the UA in the INVITE, it SHOULD inspect the Request-URI
+   to determine how the message should be routed (see [4]).  If the
+   "domainname" portion of the Request-URI had corresponded to the local
+   domain (atlanta.com) rather than biloxi.com, then the proxy server
+   would have consulted its location service to determine how best to
+   reach the requested user.
+
+      Had "alice@atlanta.com" been attempting to contact, say,
+      "alex@atlanta.com", the local proxy would have proxied to the
+      request to the TLS connection Alex had established with the
+      registrar when he registered.  Since Alex would receive this
+      request over his authenticated channel, he would be assured that
+      Alice's request had been authorized by the proxy server of the
+      local administrative domain.
+
+   However, in this instance the Request-URI designates a remote domain.
+   The local outbound proxy server at atlanta.com SHOULD therefore
+   establish a TLS connection with the remote proxy server at
+   biloxi.com.  Since both of the participants in this TLS connection
+   are servers that possess site certificates, mutual TLS authentication
+   SHOULD occur.  Each side of the connection SHOULD verify and inspect
+   the certificate of the other, noting the domain name that appears in
+   the certificate for comparison with the header fields of SIP
+   messages.  The atlanta.com proxy server, for example, SHOULD verify
+   at this stage that the certificate received from the remote side
+   corresponds with the biloxi.com domain.  Once it has done so, and TLS
+   negotiation has completed, resulting in a secure channel between the
+   two proxies, the atlanta.com proxy can forward the INVITE request to
+   biloxi.com.
+
+   The proxy server at biloxi.com SHOULD inspect the certificate of the
+   proxy server at atlanta.com in turn and compare the domain asserted
+   by the certificate with the "domainname" portion of the From header
+   field in the INVITE request.  The biloxi proxy MAY have a strict
+   security policy that requires it to reject requests that do not match
+   the administrative domain from which they have been proxied.
+
+      Such security policies could be instituted to prevent the SIP
+      equivalent of SMTP 'open relays' that are frequently exploited to
+      generate spam.
+
+
+
+
+
+Rosenberg, et. al.          Standards Track                   [Page 244]
+
+RFC 3261            SIP: Session Initiation Protocol           June 2002
+
+
+   This policy, however, only guarantees that the request came from the
+   domain it ascribes to itself; it does not allow biloxi.com to
+   ascertain how atlanta.com authenticated Alice.  Only if biloxi.com
+   has some other way of knowing atlanta.com's authentication policies
+   could it possibly ascertain how Alice proved her identity.
+   biloxi.com might then institute an even stricter policy that forbids
+   requests that come from domains that are not known administratively
+   to share a common authentication policy with biloxi.com.
+
+   Once the INVITE has been approved by the biloxi proxy, the proxy
+   server SHOULD identify the existing TLS channel, if any, associated
+   with the user targeted by this request (in this case
+   "bob@biloxi.com").  The INVITE should be proxied through this channel
+   to Bob.  Since the request is received over a TLS connection that had
+   previously been authenticated as the biloxi proxy, Bob knows that the
+   From header field was not tampered with and that atlanta.com has
+   validated Alice, although not necessarily whether or not to trust
+   Alice's identity.
+
+   Before they forward the request, both proxy servers SHOULD add a
+   Record-Route header field to the request so that all future requests
+   in this dialog will pass through the proxy servers.  The proxy
+   servers can thereby continue to provide security services for the
+   lifetime of this dialog.  If the proxy servers do not add themselves
+   to the Record-Route, future messages will pass directly end-to-end
+   between Alice and Bob without any security services (unless the two
+   parties agree on some independent end-to-end security such as
+   S/MIME).  In this respect the SIP trapezoid model can provide a nice
+   structure where conventions of agreement between the site proxies can
+   provide a reasonably secure channel between Alice and Bob.
+
+      An attacker preying on this architecture would, for example, be
+      unable to forge a BYE request and insert it into the signaling
+      stream between Bob and Alice because the attacker has no way of
+      ascertaining the parameters of the session and also because the
+      integrity mechanism transitively protects the traffic between
+      Alice and Bob.
+
+26.3.2.3 Peer-to-Peer Requests
+
+   Alternatively, consider a UA asserting the identity
+   "carol@chicago.com" that has no local outbound proxy.  When Carol
+   wishes to send an INVITE to "bob@biloxi.com", her UA SHOULD initiate
+   a TLS connection with the biloxi proxy directly (using the mechanism
+   described in [4] to determine how to best to reach the given
+   Request-URI).  When her UA receives a certificate from the biloxi
+   proxy, it SHOULD be verified normally before she passes her INVITE
+   across the TLS connection.  However, Carol has no means of proving
+
+
+
+Rosenberg, et. al.          Standards Track                   [Page 245]
+
+RFC 3261            SIP: Session Initiation Protocol           June 2002
+
+
+   her identity to the biloxi proxy, but she does have a CMS-detached
+   signature over a "message/sip" body in the INVITE.  It is unlikely in
+   this instance that Carol would have any credentials in the biloxi.com
+   realm, since she has no formal association with biloxi.com.  The
+   biloxi proxy MAY also have a strict policy that precludes it from
+   even bothering to challenge requests that do not have biloxi.com in
+   the "domainname" portion of the From header field - it treats these
+   users as unauthenticated.
+
+   The biloxi proxy has a policy for Bob that all non-authenticated
+   requests should be redirected to the appropriate contact address
+   registered against 'bob@biloxi.com', namely <sip:bob@192.0.2.4>.
+   Carol receives the redirection response over the TLS connection she
+   established with the biloxi proxy, so she trusts the veracity of the
+   contact address.
+
+   Carol SHOULD then establish a TCP connection with the designated
+   address and send a new INVITE with a Request-URI containing the
+   received contact address (recomputing the signature in the body as
+   the request is readied).  Bob receives this INVITE on an insecure
+   interface, but his UA inspects and, in this instance, recognizes the
+   From header field of the request and subsequently matches a locally
+   cached certificate with the one presented in the signature of the
+   body of the INVITE.  He replies in similar fashion, authenticating
+   himself to Carol, and a secure dialog begins.
+
+      Sometimes firewalls or NATs in an administrative domain could
+      preclude the establishment of a direct TCP connection to a UA.  In
+      these cases, proxy servers could also potentially relay requests
+      to UAs in a way that has no trust implications (for example,
+      forgoing an existing TLS connection and forwarding the request
+      over cleartext TCP) as local policy dictates.
+
+26.3.2.4 DoS Protection
+
+   In order to minimize the risk of a denial-of-service attack against
+   architectures using these security solutions, implementers should
+   take note of the following guidelines.
+
+   When the host on which a SIP proxy server is operating is routable
+   from the public Internet, it SHOULD be deployed in an administrative
+   domain with defensive operational policies (blocking source-routed
+   traffic, preferably filtering ping traffic).  Both TLS and IPSec can
+   also make use of bastion hosts at the edges of administrative domains
+   that participate in the security associations to aggregate secure
+   tunnels and sockets.  These bastion hosts can also take the brunt of
+   denial-of-service attacks, ensuring that SIP hosts within the
+   administrative domain are not encumbered with superfluous messaging.
+
+
+
+Rosenberg, et. al.          Standards Track                   [Page 246]
+
+RFC 3261            SIP: Session Initiation Protocol           June 2002
+
+
+   No matter what security solutions are deployed, floods of messages
+   directed at proxy servers can lock up proxy server resources and
+   prevent desirable traffic from reaching its destination.  There is a
+   computational expense associated with processing a SIP transaction at
+   a proxy server, and that expense is greater for stateful proxy
+   servers than it is for stateless proxy servers.  Therefore, stateful
+   proxies are more susceptible to flooding than stateless proxy
+   servers.
+
+   UAs and proxy servers SHOULD challenge questionable requests with
+   only a single 401 (Unauthorized) or 407 (Proxy Authentication
+   Required), forgoing the normal response retransmission algorithm, and
+   thus behaving statelessly towards unauthenticated requests.
+
+      Retransmitting the 401 (Unauthorized) or 407 (Proxy Authentication
+      Required) status response amplifies the problem of an attacker
+      using a falsified header field value (such as Via) to direct
+      traffic to a third party.
+
+   In summary, the mutual authentication of proxy servers through
+   mechanisms such as TLS significantly reduces the potential for rogue
+   intermediaries to introduce falsified requests or responses that can
+   deny service.  This commensurately makes it harder for attackers to
+   make innocent SIP nodes into agents of amplification.
+
+26.4 Limitations
+
+   Although these security mechanisms, when applied in a judicious
+   manner, can thwart many threats, there are limitations in the scope
+   of the mechanisms that must be understood by implementers and network
+   operators.
+
+26.4.1 HTTP Digest
+
+   One of the primary limitations of using HTTP Digest in SIP is that
+   the integrity mechanisms in Digest do not work very well for SIP.
+   Specifically, they offer protection of the Request-URI and the method
+   of a message, but not for any of the header fields that UAs would
+   most likely wish to secure.
+
+   The existing replay protection mechanisms described in RFC 2617 also
+   have some limitations for SIP.  The next-nonce mechanism, for
+   example, does not support pipelined requests.  The nonce-count
+   mechanism should be used for replay protection.
+
+   Another limitation of HTTP Digest is the scope of realms.  Digest is
+   valuable when a user wants to authenticate themselves to a resource
+   with which they have a pre-existing association, like a service
+
+
+
+Rosenberg, et. al.          Standards Track                   [Page 247]
+
+RFC 3261            SIP: Session Initiation Protocol           June 2002
+
+
+   provider of which the user is a customer (which is quite a common
+   scenario and thus Digest provides an extremely useful function).  By
+   way of contrast, the scope of TLS is interdomain or multirealm, since
+   certificates are often globally verifiable, so that the UA can
+   authenticate the server with no pre-existing association.
+
+26.4.2 S/MIME
+
+   The largest outstanding defect with the S/MIME mechanism is the lack
+   of a prevalent public key infrastructure for end users.  If self-
+   signed certificates (or certificates that cannot be verified by one
+   of the participants in a dialog) are used, the SIP-based key exchange
+   mechanism described in Section 23.2 is susceptible to a man-in-the-
+   middle attack with which an attacker can potentially inspect and
+   modify S/MIME bodies.  The attacker needs to intercept the first
+   exchange of keys between the two parties in a dialog, remove the
+   existing CMS-detached signatures from the request and response, and
+   insert a different CMS-detached signature containing a certificate
+   supplied by the attacker (but which seems to be a certificate for the
+   proper address-of-record).  Each party will think they have exchanged
+   keys with the other, when in fact each has the public key of the
+   attacker.
+
+   It is important to note that the attacker can only leverage this
+   vulnerability on the first exchange of keys between two parties - on
+   subsequent occasions, the alteration of the key would be noticeable
+   to the UAs.  It would also be difficult for the attacker to remain in
+   the path of all future dialogs between the two parties over time (as
+   potentially days, weeks, or years pass).
+
+   SSH is susceptible to the same man-in-the-middle attack on the first
+   exchange of keys; however, it is widely acknowledged that while SSH
+   is not perfect, it does improve the security of connections.  The use
+   of key fingerprints could provide some assistance to SIP, just as it
+   does for SSH.  For example, if two parties use SIP to establish a
+   voice communications session, each could read off the fingerprint of
+   the key they received from the other, which could be compared against
+   the original.  It would certainly be more difficult for the man-in-
+   the-middle to emulate the voices of the participants than their
+   signaling (a practice that was used with the Clipper chip-based
+   secure telephone).
+
+   The S/MIME mechanism allows UAs to send encrypted requests without
+   preamble if they possess a certificate for the destination address-
+   of-record on their keyring.  However, it is possible that any
+   particular device registered for an address-of-record will not hold
+   the certificate that has been previously employed by the device's
+   current user, and that it will therefore be unable to process an
+
+
+
+Rosenberg, et. al.          Standards Track                   [Page 248]
+
+RFC 3261            SIP: Session Initiation Protocol           June 2002
+
+
+   encrypted request properly, which could lead to some avoidable error
+   signaling.  This is especially likely when an encrypted request is
+   forked.
+
+   The keys associated with S/MIME are most useful when associated with
+   a particular user (an address-of-record) rather than a device (a UA).
+   When users move between devices, it may be difficult to transport
+   private keys securely between UAs; how such keys might be acquired by
+   a device is outside the scope of this document.
+
+   Another, more prosaic difficulty with the S/MIME mechanism is that it
+   can result in very large messages, especially when the SIP tunneling
+   mechanism described in Section 23.4 is used.  For that reason, it is
+   RECOMMENDED that TCP should be used as a transport protocol when
+   S/MIME tunneling is employed.
+
+26.4.3 TLS
+
+   The most commonly voiced concern about TLS is that it cannot run over
+   UDP; TLS requires a connection-oriented underlying transport
+   protocol, which for the purposes of this document means TCP.
+
+   It may also be arduous for a local outbound proxy server and/or
+   registrar to maintain many simultaneous long-lived TLS connections
+   with numerous UAs.  This introduces some valid scalability concerns,
+   especially for intensive ciphersuites.  Maintaining redundancy of
+   long-lived TLS connections, especially when a UA is solely
+   responsible for their establishment, could also be cumbersome.
+
+   TLS only allows SIP entities to authenticate servers to which they
+   are adjacent; TLS offers strictly hop-by-hop security.  Neither TLS,
+   nor any other mechanism specified in this document, allows clients to
+   authenticate proxy servers to whom they cannot form a direct TCP
+   connection.
+
+26.4.4 SIPS URIs
+
+   Actually using TLS on every segment of a request path entails that
+   the terminating UAS must be reachable over TLS (perhaps registering
+   with a SIPS URI as a contact address).  This is the preferred use of
+   SIPS.  Many valid architectures, however, use TLS to secure part of
+   the request path, but rely on some other mechanism for the final hop
+   to a UAS, for example.  Thus SIPS cannot guarantee that TLS usage
+   will be truly end-to-end.  Note that since many UAs will not accept
+   incoming TLS connections, even those UAs that do support TLS may be
+   required to maintain persistent TLS connections as described in the
+   TLS limitations section above in order to receive requests over TLS
+   as a UAS.
+
+
+
+Rosenberg, et. al.          Standards Track                   [Page 249]
+
+RFC 3261            SIP: Session Initiation Protocol           June 2002
+
+
+   Location services are not required to provide a SIPS binding for a
+   SIPS Request-URI.  Although location services are commonly populated
+   by user registrations (as described in Section 10.2.1), various other
+   protocols and interfaces could conceivably supply contact addresses
+   for an AOR, and these tools are free to map SIPS URIs to SIP URIs as
+   appropriate.  When queried for bindings, a location service returns
+   its contact addresses without regard for whether it received a
+   request with a SIPS Request-URI.  If a redirect server is accessing
+   the location service, it is up to the entity that processes the
+   Contact header field of a redirection to determine the propriety of
+   the contact addresses.
+
+   Ensuring that TLS will be used for all of the request segments up to
+   the target domain is somewhat complex.  It is possible that
+   cryptographically authenticated proxy servers along the way that are
+   non-compliant or compromised may choose to disregard the forwarding
+   rules associated with SIPS (and the general forwarding rules in
+   Section 16.6).  Such malicious intermediaries could, for example,
+   retarget a request from a SIPS URI to a SIP URI in an attempt to
+   downgrade security.
+
+   Alternatively, an intermediary might legitimately retarget a request
+   from a SIP to a SIPS URI.  Recipients of a request whose Request-URI
+   uses the SIPS URI scheme thus cannot assume on the basis of the
+   Request-URI alone that SIPS was used for the entire request path
+   (from the client onwards).
+
+   To address these concerns, it is RECOMMENDED that recipients of a
+   request whose Request-URI contains a SIP or SIPS URI inspect the To
+   header field value to see if it contains a SIPS URI (though note that
+   it does not constitute a breach of security if this URI has the same
+   scheme but is not equivalent to the URI in the To header field).
+   Although clients may choose to populate the Request-URI and To header
+   field of a request differently, when SIPS is used this disparity
+   could be interpreted as a possible security violation, and the
+   request could consequently be rejected by its recipient.  Recipients
+   MAY also inspect the Via header chain in order to double-check
+   whether or not TLS was used for the entire request path until the
+   local administrative domain was reached.  S/MIME may also be used by
+   the originating UAC to help ensure that the original form of the To
+   header field is carried end-to-end.
+
+   If the UAS has reason to believe that the scheme of the Request-URI
+   has been improperly modified in transit, the UA SHOULD notify its
+   user of a potential security breach.
+
+
+
+
+
+
+Rosenberg, et. al.          Standards Track                   [Page 250]
+
+RFC 3261            SIP: Session Initiation Protocol           June 2002
+
+
+   As a further measure to prevent downgrade attacks, entities that
+   accept only SIPS requests MAY also refuse connections on insecure
+   ports.
+
+   End users will undoubtedly discern the difference between SIPS and
+   SIP URIs, and they may manually edit them in response to stimuli.
+   This can either benefit or degrade security.  For example, if an
+   attacker corrupts a DNS cache, inserting a fake record set that
+   effectively removes all SIPS records for a proxy server, then any
+   SIPS requests that traverse this proxy server may fail.  When a user,
+   however, sees that repeated calls to a SIPS AOR are failing, they
+   could on some devices manually convert the scheme from SIPS to SIP
+   and retry.  Of course, there are some safeguards against this (if the
+   destination UA is truly paranoid it could refuse all non-SIPS
+   requests), but it is a limitation worth noting.  On the bright side,
+   users might also divine that 'SIPS' would be valid even when they are
+   presented only with a SIP URI.
+
+26.5 Privacy
+
+   SIP messages frequently contain sensitive information about their
+   senders - not just what they have to say, but with whom they
+   communicate, when they communicate and for how long, and from where
+   they participate in sessions.  Many applications and their users
+   require that this sort of private information be hidden from any
+   parties that do not need to know it.
+
+   Note that there are also less direct ways in which private
+   information can be divulged.  If a user or service chooses to be
+   reachable at an address that is guessable from the person's name and
+   organizational affiliation (which describes most addresses-of-
+   record), the traditional method of ensuring privacy by having an
+   unlisted "phone number" is compromised.  A user location service can
+   infringe on the privacy of the recipient of a session invitation by
+   divulging their specific whereabouts to the caller; an implementation
+   consequently SHOULD be able to restrict, on a per-user basis, what
+   kind of location and availability information is given out to certain
+   classes of callers.  This is a whole class of problem that is
+   expected to be studied further in ongoing SIP work.
+
+   In some cases, users may want to conceal personal information in
+   header fields that convey identity.  This can apply not only to the
+   From and related headers representing the originator of the request,
+   but also the To - it may not be appropriate to convey to the final
+   destination a speed-dialing nickname, or an unexpanded identifier for
+   a group of targets, either of which would be removed from the
+   Request-URI as the request is routed, but not changed in the To
+
+
+
+
+Rosenberg, et. al.          Standards Track                   [Page 251]
+
+RFC 3261            SIP: Session Initiation Protocol           June 2002
+
+
+   header field if the two were initially identical.  Thus it MAY be
+   desirable for privacy reasons to create a To header field that
+   differs from the Request-URI.
+
+27 IANA Considerations
+
+   All method names, header field names, status codes, and option tags
+   used in SIP applications are registered with IANA through
+   instructions in an IANA Considerations section in an RFC.
+
+   The specification instructs the IANA to create four new sub-
+   registries under http://www.iana.org/assignments/sip-parameters:
+   Option Tags, Warning Codes (warn-codes), Methods and Response Codes,
+   added to the sub-registry of Header Fields that is already present
+   there.
+
+27.1 Option Tags
+
+   This specification establishes the Option Tags sub-registry under
+   http://www.iana.org/assignments/sip-parameters.
+
+   Option tags are used in header fields such as Require, Supported,
+   Proxy-Require, and Unsupported in support of SIP compatibility
+   mechanisms for extensions (Section 19.2).  The option tag itself is a
+   string that is associated with a particular SIP option (that is, an
+   extension).  It identifies the option to SIP endpoints.
+
+   Option tags are registered by the IANA when they are published in
+   standards track RFCs.  The IANA Considerations section of the RFC
+   must include the following information, which appears in the IANA
+   registry along with the RFC number of the publication.
+
+      o  Name of the option tag.  The name MAY be of any length, but
+         SHOULD be no more than twenty characters long.  The name MUST
+         consist of alphanum (Section 25) characters only.
+
+      o  Descriptive text that describes the extension.
+
+27.2 Warn-Codes
+
+   This specification establishes the Warn-codes sub-registry under
+   http://www.iana.org/assignments/sip-parameters and initiates its
+   population with the warn-codes listed in Section 20.43.  Additional
+   warn-codes are registered by RFC publication.
+
+
+
+
+
+
+
+Rosenberg, et. al.          Standards Track                   [Page 252]
+
+RFC 3261            SIP: Session Initiation Protocol           June 2002
+
+
+   The descriptive text for the table of warn-codes is:
+
+   Warning codes provide information supplemental to the status code in
+   SIP response messages when the failure of the transaction results
+   from a Session Description Protocol (SDP) (RFC 2327 [1]) problem.
+
+   The "warn-code" consists of three digits.  A first digit of "3"
+   indicates warnings specific to SIP.  Until a future specification
+   describes uses of warn-codes other than 3xx, only 3xx warn-codes may
+   be registered.
+
+   Warnings 300 through 329 are reserved for indicating problems with
+   keywords in the session description, 330 through 339 are warnings
+   related to basic network services requested in the session
+   description, 370 through 379 are warnings related to quantitative QoS
+   parameters requested in the session description, and 390 through 399
+   are miscellaneous warnings that do not fall into one of the above
+   categories.
+
+27.3 Header Field Names
+
+   This obsoletes the IANA instructions about the header sub-registry
+   under http://www.iana.org/assignments/sip-parameters.
+
+   The following information needs to be provided in an RFC publication
+   in order to register a new header field name:
+
+      o  The RFC number in which the header is registered;
+
+      o  the name of the header field being registered;
+
+      o  a compact form version for that header field, if one is
+         defined;
+
+   Some common and widely used header fields MAY be assigned one-letter
+   compact forms (Section 7.3.3).  Compact forms can only be assigned
+   after SIP working group review, followed by RFC publication.
+
+27.4 Method and Response Codes
+
+   This specification establishes the Method and Response-Code sub-
+   registries under http://www.iana.org/assignments/sip-parameters and
+   initiates their population as follows.  The initial Methods table is:
+
+
+
+
+
+
+
+
+Rosenberg, et. al.          Standards Track                   [Page 253]
+
+RFC 3261            SIP: Session Initiation Protocol           June 2002
+
+
+         INVITE                   [RFC3261]
+         ACK                      [RFC3261]
+         BYE                      [RFC3261]
+         CANCEL                   [RFC3261]
+         REGISTER                 [RFC3261]
+         OPTIONS                  [RFC3261]
+         INFO                     [RFC2976]
+
+   The response code table is initially populated from Section 21, the
+   portions labeled Informational, Success, Redirection, Client-Error,
+   Server-Error, and Global-Failure.  The table has the following
+   format:
+
+      Type (e.g., Informational)
+            Number    Default Reason Phrase         [RFC3261]
+
+   The following information needs to be provided in an RFC publication
+   in order to register a new response code or method:
+
+      o  The RFC number in which the method or response code is
+         registered;
+
+      o  the number of the response code or name of the method being
+         registered;
+
+      o  the default reason phrase for that response code, if
+         applicable;
+
+27.5 The "message/sip" MIME type.
+
+   This document registers the "message/sip" MIME media type in order to
+   allow SIP messages to be tunneled as bodies within SIP, primarily for
+   end-to-end security purposes.  This media type is defined by the
+   following information:
+
+      Media type name: message
+      Media subtype name: sip
+      Required parameters: none
+
+      Optional parameters: version
+         version: The SIP-Version number of the enclosed message (e.g.,
+         "2.0").  If not present, the version defaults to "2.0".
+      Encoding scheme: SIP messages consist of an 8-bit header
+         optionally followed by a binary MIME data object.  As such, SIP
+         messages must be treated as binary.  Under normal circumstances
+         SIP messages are transported over binary-capable transports, no
+         special encodings are needed.
+
+
+
+
+Rosenberg, et. al.          Standards Track                   [Page 254]
+
+RFC 3261            SIP: Session Initiation Protocol           June 2002
+
+
+      Security considerations: see below
+         Motivation and examples of this usage as a security mechanism
+         in concert with S/MIME are given in 23.4.
+
+27.6 New Content-Disposition Parameter Registrations
+
+   This document also registers four new Content-Disposition header
+   "disposition-types": alert, icon, session and render.  The authors
+   request that these values be recorded in the IANA registry for
+   Content-Dispositions.
+
+   Descriptions of these "disposition-types", including motivation and
+   examples, are given in Section 20.11.
+
+   Short descriptions suitable for the IANA registry are:
+
+      alert     the body is a custom ring tone to alert the user
+      icon      the body is displayed as an icon to the user
+      render    the body should be displayed to the user
+      session   the body describes a communications session, for
+                example, as RFC 2327 SDP body
+
+28 Changes From RFC 2543
+
+   This RFC revises RFC 2543.  It is mostly backwards compatible with
+   RFC 2543.  The changes described here fix many errors discovered in
+   RFC 2543 and provide information on scenarios not detailed in RFC
+   2543.  The protocol has been presented in a more cleanly layered
+   model here.
+
+   We break the differences into functional behavior that is a
+   substantial change from RFC 2543, which has impact on
+   interoperability or correct operation in some cases, and functional
+   behavior that is different from RFC 2543 but not a potential source
+   of interoperability problems.  There have been countless
+   clarifications as well, which are not documented here.
+
+28.1 Major Functional Changes
+
+   o  When a UAC wishes to terminate a call before it has been answered,
+      it sends CANCEL.  If the original INVITE still returns a 2xx, the
+      UAC then sends BYE.  BYE can only be sent on an existing call leg
+      (now called a dialog in this RFC), whereas it could be sent at any
+      time in RFC 2543.
+
+   o  The SIP BNF was converted to be RFC 2234 compliant.
+
+
+
+
+
+Rosenberg, et. al.          Standards Track                   [Page 255]
+
+RFC 3261            SIP: Session Initiation Protocol           June 2002
+
+
+   o  SIP URL BNF was made more general, allowing a greater set of
+      characters in the user part.  Furthermore, comparison rules were
+      simplified to be primarily case-insensitive, and detailed handling
+      of comparison in the presence of parameters was described.  The
+      most substantial change is that a URI with a parameter with the
+      default value does not match a URI without that parameter.
+
+   o  Removed Via hiding.  It had serious trust issues, since it relied
+      on the next hop to perform the obfuscation process.  Instead, Via
+      hiding can be done as a local implementation choice in stateful
+      proxies, and thus is no longer documented.
+
+   o  In RFC 2543, CANCEL and INVITE transactions were intermingled.
+      They are separated now.  When a user sends an INVITE and then a
+      CANCEL, the INVITE transaction still terminates normally.  A UAS
+      needs to respond to the original INVITE request with a 487
+      response.
+
+   o  Similarly, CANCEL and BYE transactions were intermingled; RFC 2543
+      allowed the UAS not to send a response to INVITE when a BYE was
+      received.  That is disallowed here.  The original INVITE needs a
+      response.
+
+   o  In RFC 2543, UAs needed to support only UDP.  In this RFC, UAs
+      need to support both UDP and TCP.
+
+   o  In RFC 2543, a forking proxy only passed up one challenge from
+      downstream elements in the event of multiple challenges.  In this
+      RFC, proxies are supposed to collect all challenges and place them
+      into the forwarded response.
+
+   o  In Digest credentials, the URI needs to be quoted; this is unclear
+      from RFC 2617 and RFC 2069 which are both inconsistent on it.
+
+   o  SDP processing has been split off into a separate specification
+      [13], and more fully specified as a formal offer/answer exchange
+      process that is effectively tunneled through SIP.  SDP is allowed
+      in INVITE/200 or 200/ACK for baseline SIP implementations; RFC
+      2543 alluded to the ability to use it in INVITE, 200, and ACK in a
+      single transaction, but this was not well specified.  More complex
+      SDP usages are allowed in extensions.
+
+
+
+
+
+
+
+
+
+
+Rosenberg, et. al.          Standards Track                   [Page 256]
+
+RFC 3261            SIP: Session Initiation Protocol           June 2002
+
+
+   o  Added full support for IPv6 in URIs and in the Via header field.
+      Support for IPv6 in Via has required that its header field
+      parameters allow the square bracket and colon characters.  These
+      characters were previously not permitted.  In theory, this could
+      cause interop problems with older implementations.  However, we
+      have observed that most implementations accept any non-control
+      ASCII character in these parameters.
+
+   o  DNS SRV procedure is now documented in a separate specification
+      [4].  This procedure uses both SRV and NAPTR resource records and
+      no longer combines data from across SRV records as described in
+      RFC 2543.
+
+   o  Loop detection has been made optional, supplanted by a mandatory
+      usage of Max-Forwards.  The loop detection procedure in RFC 2543
+      had a serious bug which would report "spirals" as an error
+      condition when it was not.  The optional loop detection procedure
+      is more fully and correctly specified here.
+
+   o  Usage of tags is now mandatory (they were optional in RFC 2543),
+      as they are now the fundamental building blocks of dialog
+      identification.
+
+   o  Added the Supported header field, allowing for clients to indicate
+      what extensions are supported to a server, which can apply those
+      extensions to the response, and indicate their usage with a
+      Require in the response.
+
+   o  Extension parameters were missing from the BNF for several header
+      fields, and they have been added.
+
+   o  Handling of Route and Record-Route construction was very
+      underspecified in RFC 2543, and also not the right approach.  It
+      has been substantially reworked in this specification (and made
+      vastly simpler), and this is arguably the largest change.
+      Backwards compatibility is still provided for deployments that do
+      not use "pre-loaded routes", where the initial request has a set
+      of Route header field values obtained in some way outside of
+      Record-Route.  In those situations, the new mechanism is not
+      interoperable.
+
+   o  In RFC 2543, lines in a message could be terminated with CR, LF,
+      or CRLF.  This specification only allows CRLF.
+
+
+
+
+
+
+
+
+Rosenberg, et. al.          Standards Track                   [Page 257]
+
+RFC 3261            SIP: Session Initiation Protocol           June 2002
+
+
+   o  Usage of Route in CANCEL and ACK was not well defined in RFC 2543.
+      It is now well specified; if a request had a Route header field,
+      its CANCEL or ACK for a non-2xx response to the request need to
+      carry the same Route header field values.  ACKs for 2xx responses
+      use the Route values learned from the Record-Route of the 2xx
+      responses.
+
+   o  RFC 2543 allowed multiple requests in a single UDP packet.  This
+      usage has been removed.
+
+   o  Usage of absolute time in the Expires header field and parameter
+      has been removed.  It caused interoperability problems in elements
+      that were not time synchronized, a common occurrence.  Relative
+      times are used instead.
+
+   o  The branch parameter of the Via header field value is now
+      mandatory for all elements to use.  It now plays the role of a
+      unique transaction identifier.  This avoids the complex and bug-
+      laden transaction identification rules from RFC 2543.  A magic
+      cookie is used in the parameter value to determine if the previous
+      hop has made the parameter globally unique, and comparison falls
+      back to the old rules when it is not present.  Thus,
+      interoperability is assured.
+
+   o  In RFC 2543, closure of a TCP connection was made equivalent to a
+      CANCEL.  This was nearly impossible to implement (and wrong) for
+      TCP connections between proxies.  This has been eliminated, so
+      that there is no coupling between TCP connection state and SIP
+      processing.
+
+   o  RFC 2543 was silent on whether a UA could initiate a new
+      transaction to a peer while another was in progress.  That is now
+      specified here.  It is allowed for non-INVITE requests, disallowed
+      for INVITE.
+
+   o  PGP was removed.  It was not sufficiently specified, and not
+      compatible with the more complete PGP MIME.  It was replaced with
+      S/MIME.
+
+   o  Added the "sips" URI scheme for end-to-end TLS.  This scheme is
+      not backwards compatible with RFC 2543.  Existing elements that
+      receive a request with a SIPS URI scheme in the Request-URI will
+      likely reject the request.  This is actually a feature; it ensures
+      that a call to a SIPS URI is only delivered if all path hops can
+      be secured.
+
+
+
+
+
+
+Rosenberg, et. al.          Standards Track                   [Page 258]
+
+RFC 3261            SIP: Session Initiation Protocol           June 2002
+
+
+   o  Additional security features were added with TLS, and these are
+      described in a much larger and complete security considerations
+      section.
+
+   o  In RFC 2543, a proxy was not required to forward provisional
+      responses from 101 to 199 upstream.  This was changed to MUST.
+      This is important, since many subsequent features depend on
+      delivery of all provisional responses from 101 to 199.
+
+   o  Little was said about the 503 response code in RFC 2543.  It has
+      since found substantial use in indicating failure or overload
+      conditions in proxies.  This requires somewhat special treatment.
+      Specifically, receipt of a 503 should trigger an attempt to
+      contact the next element in the result of a DNS SRV lookup.  Also,
+      503 response is only forwarded upstream by a proxy under certain
+      conditions.
+
+   o  RFC 2543 defined, but did no sufficiently specify, a mechanism for
+      UA authentication of a server.  That has been removed.  Instead,
+      the mutual authentication procedures of RFC 2617 are allowed.
+
+   o  A UA cannot send a BYE for a call until it has received an ACK for
+      the initial INVITE.  This was allowed in RFC 2543 but leads to a
+      potential race condition.
+
+   o  A UA or proxy cannot send CANCEL for a transaction until it gets a
+      provisional response for the request.  This was allowed in RFC
+      2543 but leads to potential race conditions.
+
+   o  The action parameter in registrations has been deprecated.  It was
+      insufficient for any useful services, and caused conflicts when
+      application processing was applied in proxies.
+
+   o  RFC 2543 had a number of special cases for multicast.  For
+      example, certain responses were suppressed, timers were adjusted,
+      and so on.  Multicast now plays a more limited role, and the
+      protocol operation is unaffected by usage of multicast as opposed
+      to unicast.  The limitations as a result of that are documented.
+
+   o  Basic authentication has been removed entirely and its usage
+      forbidden.
+
+
+
+
+
+
+
+
+
+
+Rosenberg, et. al.          Standards Track                   [Page 259]
+
+RFC 3261            SIP: Session Initiation Protocol           June 2002
+
+
+   o  Proxies no longer forward a 6xx immediately on receiving it.
+      Instead, they CANCEL pending branches immediately.  This avoids a
+      potential race condition that would result in a UAC getting a 6xx
+      followed by a 2xx.  In all cases except this race condition, the
+      result will be the same - the 6xx is forwarded upstream.
+
+   o  RFC 2543 did not address the problem of request merging.  This
+      occurs when a request forks at a proxy and later rejoins at an
+      element.  Handling of merging is done only at a UA, and procedures
+      are defined for rejecting all but the first request.
+
+28.2 Minor Functional Changes
+
+   o  Added the Alert-Info, Error-Info, and Call-Info header fields for
+      optional content presentation to users.
+
+   o  Added the Content-Language, Content-Disposition and MIME-Version
+      header fields.
+
+   o  Added a "glare handling" mechanism to deal with the case where
+      both parties send each other a re-INVITE simultaneously.  It uses
+      the new 491 (Request Pending) error code.
+
+   o  Added the In-Reply-To and Reply-To header fields for supporting
+      the return of missed calls or messages at a later time.
+
+   o  Added TLS and SCTP as valid SIP transports.
+
+   o  There were a variety of mechanisms described for handling failures
+      at any time during a call; those are now generally unified.  BYE
+      is sent to terminate.
+
+   o  RFC 2543 mandated retransmission of INVITE responses over TCP, but
+      noted it was really only needed for 2xx.  That was an artifact of
+      insufficient protocol layering.  With a more coherent transaction
+      layer defined here, that is no longer needed.  Only 2xx responses
+      to INVITEs are retransmitted over TCP.
+
+   o  Client and server transaction machines are now driven based on
+      timeouts rather than retransmit counts.  This allows the state
+      machines to be properly specified for TCP and UDP.
+
+   o  The Date header field is used in REGISTER responses to provide a
+      simple means for auto-configuration of dates in user agents.
+
+   o  Allowed a registrar to reject registrations with expirations that
+      are too short in duration.  Defined the 423 response code and the
+      Min-Expires for this purpose.
+
+
+
+Rosenberg, et. al.          Standards Track                   [Page 260]
+
+RFC 3261            SIP: Session Initiation Protocol           June 2002
+
+
+29 Normative References
+
+   [1]  Handley, M. and V. Jacobson, "SDP: Session Description
+        Protocol", RFC 2327, April 1998.
+
+   [2]  Bradner, S., "Key words for use in RFCs to Indicate Requirement
+        Levels", BCP 14, RFC 2119, March 1997.
+
+   [3]  Resnick, P., "Internet Message Format", RFC 2822, April 2001.
+
+   [4]  Rosenberg, J. and H. Schulzrinne, "SIP: Locating SIP Servers",
+        RFC 3263, June 2002.
+
+   [5]  Berners-Lee, T., Fielding, R. and L. Masinter, "Uniform Resource
+        Identifiers (URI): Generic Syntax", RFC 2396, August 1998.
+
+   [6]  Chown, P., "Advanced Encryption Standard (AES) Ciphersuites for
+        Transport Layer Security (TLS)", RFC 3268, June 2002.
+
+   [7]  Yergeau, F., "UTF-8, a transformation format of ISO 10646", RFC
+        2279, January 1998.
+
+   [8]  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.
+
+   [9]  Vaha-Sipila, A., "URLs for Telephone Calls", RFC 2806, April
+        2000.
+
+   [10] Crocker, D. and P. Overell, "Augmented BNF for Syntax
+        Specifications: ABNF", RFC 2234, November 1997.
+
+   [11] Freed, F. and N. Borenstein, "Multipurpose Internet Mail
+        Extensions (MIME) Part Two: Media Types", RFC 2046, November
+        1996.
+
+   [12] Eastlake, D., Crocker, S. and J. Schiller, "Randomness
+        Recommendations for Security", RFC 1750, December 1994.
+
+   [13] Rosenberg, J. and H. Schulzrinne, "An Offer/Answer Model with
+        SDP", RFC 3264, June 2002.
+
+   [14] Postel, J., "User Datagram Protocol", STD 6, RFC 768, August
+        1980.
+
+   [15] Postel, J., "DoD Standard Transmission Control Protocol", RFC
+        761, January 1980.
+
+
+
+
+Rosenberg, et. al.          Standards Track                   [Page 261]
+
+RFC 3261            SIP: Session Initiation Protocol           June 2002
+
+
+   [16] Stewart, R., Xie, Q., Morneault, K., Sharp, C., Schwarzbauer,
+        H., Taylor, T., Rytina, I., Kalla, M., Zhang, L. and V. Paxson,
+        "Stream Control Transmission Protocol", RFC 2960, October 2000.
+
+   [17] Franks, J., Hallam-Baker, P., Hostetler, J., Lawrence, S.,
+        Leach, P., Luotonen, A. and L. Stewart, "HTTP authentication:
+        Basic and Digest Access Authentication", RFC 2617, June 1999.
+
+   [18] Troost, R., Dorner, S. and K. Moore, "Communicating Presentation
+        Information in Internet Messages: The Content-Disposition Header
+        Field", RFC 2183, August 1997.
+
+   [19] Zimmerer, E., Peterson, J., Vemuri, A., Ong, L., Audet, F.,
+        Watson, M. and M. Zonoun, "MIME media types for ISUP and QSIG
+        Objects", RFC 3204, December 2001.
+
+   [20] Braden, R., "Requirements for Internet Hosts - Application and
+        Support", STD 3, RFC 1123, October 1989.
+
+   [21] Alvestrand, H., "IETF Policy on Character Sets and Languages",
+        BCP 18, RFC 2277, January 1998.
+
+   [22] Galvin, J., Murphy, S., Crocker, S. and N. Freed, "Security
+        Multiparts for MIME: Multipart/Signed and Multipart/Encrypted",
+        RFC 1847, October 1995.
+
+   [23] Housley, R., "Cryptographic Message Syntax", RFC 2630, June
+        1999.
+
+   [24] Ramsdell B., "S/MIME Version 3 Message Specification", RFC 2633,
+        June 1999.
+
+   [25] Dierks, T. and C. Allen, "The TLS Protocol Version 1.0", RFC
+        2246, January 1999.
+
+   [26] Kent, S. and R. Atkinson, "Security Architecture for the
+        Internet Protocol", RFC 2401, November 1998.
+
+30 Informative References
+
+   [27] R. Pandya, "Emerging mobile and personal communication systems,"
+        IEEE Communications Magazine, Vol. 33, pp. 44--52, June 1995.
+
+   [28] Schulzrinne, H., Casner, S., Frederick, R. and V. Jacobson,
+        "RTP:  A Transport Protocol for Real-Time Applications", RFC
+        1889, January 1996.
+
+
+
+
+
+Rosenberg, et. al.          Standards Track                   [Page 262]
+
+RFC 3261            SIP: Session Initiation Protocol           June 2002
+
+
+   [29] Schulzrinne, H., Rao, R. and R. Lanphier, "Real Time Streaming
+        Protocol (RTSP)", RFC 2326, April 1998.
+
+   [30] Cuervo, F., Greene, N., Rayhan, A., Huitema, C., Rosen, B. and
+        J. Segers, "Megaco Protocol Version 1.0", RFC 3015, November
+        2000.
+
+   [31] Handley, M., Schulzrinne, H., Schooler, E. and J. Rosenberg,
+        "SIP: Session Initiation Protocol", RFC 2543, March 1999.
+
+   [32] Hoffman, P., Masinter, L. and J. Zawinski, "The mailto URL
+        scheme", RFC 2368, July 1998.
+
+   [33] E. M. Schooler, "A multicast user directory service for
+        synchronous rendezvous," Master's Thesis CS-TR-96-18, Department
+        of Computer Science, California Institute of Technology,
+        Pasadena, California, Aug. 1996.
+
+   [34] Donovan, S., "The SIP INFO Method", RFC 2976, October 2000.
+
+   [35] Rivest, R., "The MD5 Message-Digest Algorithm", RFC 1321, April
+        1992.
+
+   [36] Dawson, F. and T. Howes, "vCard MIME Directory Profile", RFC
+        2426, September 1998.
+
+   [37] Good, G., "The LDAP Data Interchange Format (LDIF) - Technical
+        Specification", RFC 2849, June 2000.
+
+   [38] Palme, J., "Common Internet Message Headers",  RFC 2076,
+        February 1997.
+
+   [39] Franks, J., Hallam-Baker, P., Hostetler, J., Leach, P.,
+        Luotonen, A., Sink, E. and L. Stewart, "An Extension to HTTP:
+        Digest Access Authentication", RFC 2069, January 1997.
+
+   [40] Johnston, A., Donovan, S., Sparks, R., Cunningham, C., Willis,
+        D., Rosenberg, J., Summers, K. and H. Schulzrinne, "SIP Call
+        Flow Examples", Work in Progress.
+
+   [41] E. M. Schooler, "Case study: multimedia conference control in a
+        packet-switched teleconferencing system," Journal of
+        Internetworking:  Research and Experience, Vol. 4, pp. 99--120,
+        June 1993.  ISI reprint series ISI/RS-93-359.
+
+
+
+
+
+
+
+Rosenberg, et. al.          Standards Track                   [Page 263]
+
+RFC 3261            SIP: Session Initiation Protocol           June 2002
+
+
+   [42] H. Schulzrinne, "Personal mobility for multimedia services in
+        the Internet," in European Workshop on Interactive Distributed
+        Multimedia Systems and Services (IDMS), (Berlin, Germany), Mar.
+        1996.
+
+   [43] Floyd, S., "Congestion Control Principles", RFC 2914, September
+        2000.
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+Rosenberg, et. al.          Standards Track                   [Page 264]
+
+RFC 3261            SIP: Session Initiation Protocol           June 2002
+
+
+A Table of Timer Values
+
+   Table 4 summarizes the meaning and defaults of the various timers
+   used by this specification.
+
+Timer    Value            Section               Meaning
+----------------------------------------------------------------------
+T1       500ms default    Section 17.1.1.1     RTT Estimate
+T2       4s               Section 17.1.2.2     The maximum retransmit
+                                               interval for non-INVITE
+                                               requests and INVITE
+                                               responses
+T4       5s               Section 17.1.2.2     Maximum duration a
+                                               message will
+                                               remain in the network
+Timer A  initially T1     Section 17.1.1.2     INVITE request retransmit
+                                               interval, for UDP only
+Timer B  64*T1            Section 17.1.1.2     INVITE transaction
+                                               timeout timer
+Timer C  > 3min           Section 16.6         proxy INVITE transaction
+                           bullet 11            timeout
+Timer D  > 32s for UDP    Section 17.1.1.2     Wait time for response
+         0s for TCP/SCTP                       retransmits
+Timer E  initially T1     Section 17.1.2.2     non-INVITE request
+                                               retransmit interval,
+                                               UDP only
+Timer F  64*T1            Section 17.1.2.2     non-INVITE transaction
+                                               timeout timer
+Timer G  initially T1     Section 17.2.1       INVITE response
+                                               retransmit interval
+Timer H  64*T1            Section 17.2.1       Wait time for
+                                               ACK receipt
+Timer I  T4 for UDP       Section 17.2.1       Wait time for
+         0s for TCP/SCTP                       ACK retransmits
+Timer J  64*T1 for UDP    Section 17.2.2       Wait time for
+         0s for TCP/SCTP                       non-INVITE request
+                                               retransmits
+Timer K  T4 for UDP       Section 17.1.2.2     Wait time for
+         0s for TCP/SCTP                       response retransmits
+
+                   Table 4: Summary of timers
+
+
+
+
+
+
+
+
+
+
+Rosenberg, et. al.          Standards Track                   [Page 265]
+
+RFC 3261            SIP: Session Initiation Protocol           June 2002
+
+
+Acknowledgments
+
+   We wish to thank the members of the IETF MMUSIC and SIP WGs for their
+   comments and suggestions.  Detailed comments were provided by Ofir
+   Arkin, Brian Bidulock, Jim Buller, Neil Deason, Dave Devanathan,
+   Keith Drage, Bill Fenner, Cedric Fluckiger, Yaron Goland, John
+   Hearty, Bernie Hoeneisen, Jo Hornsby, Phil Hoffer, Christian Huitema,
+   Hisham Khartabil, Jean Jervis, Gadi Karmi, Peter Kjellerstedt, Anders
+   Kristensen, Jonathan Lennox, Gethin Liddell, Allison Mankin, William
+   Marshall, Rohan Mahy, Keith Moore, Vern Paxson, Bob Penfield, Moshe
+   J. Sambol, Chip Sharp, Igor Slepchin, Eric Tremblay, and Rick
+   Workman.
+
+   Brian Rosen provided the compiled BNF.
+
+   Jean Mahoney provided technical writing assistance.
+
+   This work is based, inter alia, on [41,42].
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+Rosenberg, et. al.          Standards Track                   [Page 266]
+
+RFC 3261            SIP: Session Initiation Protocol           June 2002
+
+
+Authors' Addresses
+
+   Authors addresses are listed alphabetically for the editors, the
+   writers, and then the original authors of RFC 2543.  All listed
+   authors actively contributed large amounts of text to this document.
+
+   Jonathan Rosenberg
+   dynamicsoft
+   72 Eagle Rock Ave
+   East Hanover, NJ 07936
+   USA
+
+   EMail:  jdrosen@dynamicsoft.com
+
+
+   Henning Schulzrinne
+   Dept. of Computer Science
+   Columbia University
+   1214 Amsterdam Avenue
+   New York, NY 10027
+   USA
+
+   EMail:  schulzrinne@cs.columbia.edu
+
+
+   Gonzalo Camarillo
+   Ericsson
+   Advanced Signalling Research Lab.
+   FIN-02420 Jorvas
+   Finland
+
+   EMail:  Gonzalo.Camarillo@ericsson.com
+
+
+   Alan Johnston
+   WorldCom
+   100 South 4th Street
+   St. Louis, MO 63102
+   USA
+
+   EMail:  alan.johnston@wcom.com
+
+
+
+
+
+
+
+
+
+
+Rosenberg, et. al.          Standards Track                   [Page 267]
+
+RFC 3261            SIP: Session Initiation Protocol           June 2002
+
+
+   Jon Peterson
+   NeuStar, Inc
+   1800 Sutter Street, Suite 570
+   Concord, CA 94520
+   USA
+
+   EMail:  jon.peterson@neustar.com
+
+
+   Robert Sparks
+   dynamicsoft, Inc.
+   5100 Tennyson Parkway
+   Suite 1200
+   Plano, Texas 75024
+   USA
+
+   EMail:  rsparks@dynamicsoft.com
+
+
+   Mark Handley
+   International Computer Science Institute
+   1947 Center St, Suite 600
+   Berkeley, CA 94704
+   USA
+
+   EMail:  mjh@icir.org
+
+
+   Eve Schooler
+   AT&T Labs-Research
+   75 Willow Road
+   Menlo Park, CA 94025
+   USA
+
+   EMail: schooler@research.att.com
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+Rosenberg, et. al.          Standards Track                   [Page 268]
+
+RFC 3261            SIP: Session Initiation Protocol           June 2002
+
+
+Full Copyright Statement
+
+   Copyright (C) The Internet Society (2002).  All Rights Reserved.
+
+   This document and translations of it may be copied and furnished to
+   others, and derivative works that comment on or otherwise explain it
+   or assist in its implementation may be prepared, copied, published
+   and distributed, in whole or in part, without restriction of any
+   kind, provided that the above copyright notice and this paragraph are
+   included on all such copies and derivative works.  However, this
+   document itself may not be modified in any way, such as by removing
+   the copyright notice or references to the Internet Society or other
+   Internet organizations, except as needed for the purpose of
+   developing Internet standards in which case the procedures for
+   copyrights defined in the Internet Standards process must be
+   followed, or as required to translate it into languages other than
+   English.
+
+   The limited permissions granted above are perpetual and will not be
+   revoked by the Internet Society or its successors or assigns.
+
+   This document and the information contained herein is provided on an
+   "AS IS" basis and THE INTERNET SOCIETY AND THE INTERNET ENGINEERING
+   TASK FORCE DISCLAIMS ALL WARRANTIES, EXPRESS OR IMPLIED, INCLUDING
+   BUT NOT LIMITED TO ANY WARRANTY THAT THE USE OF THE INFORMATION
+   HEREIN WILL NOT INFRINGE ANY RIGHTS OR ANY IMPLIED WARRANTIES OF
+   MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE.
+
+Acknowledgement
+
+   Funding for the RFC Editor function is currently provided by the
+   Internet Society.
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+Rosenberg, et. al.          Standards Track                   [Page 269]
+