8565 lines
331 KiB
Plaintext
8565 lines
331 KiB
Plaintext
|
||
|
||
|
||
|
||
|
||
|
||
Network Working Group M. Handley
|
||
Request for Comments: 2543 ACIRI
|
||
Category: Standards Track H. Schulzrinne
|
||
Columbia U.
|
||
E. Schooler
|
||
Cal Tech
|
||
J. Rosenberg
|
||
Bell Labs
|
||
March 1999
|
||
|
||
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 (1999). All Rights Reserved.
|
||
|
||
IESG Note
|
||
|
||
The IESG intends to charter, in the near future, one or more working
|
||
groups to produce standards for "name lookup", where such names would
|
||
include electronic mail addresses and telephone numbers, and the
|
||
result of such a lookup would be a list of attributes and
|
||
characteristics of the user or terminal associated with the name.
|
||
Groups which are in need of a "name lookup" protocol should follow
|
||
the development of these new working groups rather than using SIP for
|
||
this function. In addition it is anticipated that SIP will migrate
|
||
towards using such protocols, and SIP implementors are advised to
|
||
monitor these efforts.
|
||
|
||
Abstract
|
||
|
||
The Session Initiation Protocol (SIP) is an application-layer control
|
||
(signaling) protocol for creating, modifying and terminating sessions
|
||
with one or more participants. These sessions include Internet
|
||
multimedia conferences, Internet telephone calls and multimedia
|
||
distribution. Members in a session can communicate via multicast or
|
||
via a mesh of unicast relations, or a combination of these.
|
||
|
||
|
||
|
||
|
||
|
||
|
||
Handley, et al. Standards Track [Page 1]
|
||
|
||
RFC 2543 SIP: Session Initiation Protocol March 1999
|
||
|
||
|
||
SIP invitations used to create sessions carry session descriptions
|
||
which allow participants to agree on a set of compatible media types.
|
||
SIP supports user mobility by proxying and redirecting requests to
|
||
the user's current location. Users can register their current
|
||
location. SIP is not tied to any particular conference control
|
||
protocol. SIP is designed to be independent of the lower-layer
|
||
transport protocol and can be extended with additional capabilities.
|
||
|
||
Table of Contents
|
||
|
||
1 Introduction ........................................ 7
|
||
1.1 Overview of SIP Functionality ....................... 7
|
||
1.2 Terminology ......................................... 8
|
||
1.3 Definitions ......................................... 9
|
||
1.4 Overview of SIP Operation ........................... 12
|
||
1.4.1 SIP Addressing ...................................... 12
|
||
1.4.2 Locating a SIP Server ............................... 13
|
||
1.4.3 SIP Transaction ..................................... 14
|
||
1.4.4 SIP Invitation ...................................... 15
|
||
1.4.5 Locating a User ..................................... 17
|
||
1.4.6 Changing an Existing Session ........................ 18
|
||
1.4.7 Registration Services ............................... 18
|
||
1.5 Protocol Properties ................................. 18
|
||
1.5.1 Minimal State ....................................... 18
|
||
1.5.2 Lower-Layer-Protocol Neutral ........................ 18
|
||
1.5.3 Text-Based .......................................... 20
|
||
2 SIP Uniform Resource Locators ....................... 20
|
||
3 SIP Message Overview ................................ 24
|
||
4 Request ............................................. 26
|
||
4.1 Request-Line ........................................ 26
|
||
4.2 Methods ............................................. 27
|
||
4.2.1 INVITE .............................................. 28
|
||
4.2.2 ACK ................................................. 29
|
||
4.2.3 OPTIONS ............................................. 29
|
||
4.2.4 BYE ................................................. 30
|
||
4.2.5 CANCEL .............................................. 30
|
||
4.2.6 REGISTER ............................................ 31
|
||
4.3 Request-URI ......................................... 34
|
||
4.3.1 SIP Version ......................................... 35
|
||
4.4 Option Tags ......................................... 35
|
||
4.4.1 Registering New Option Tags with IANA ............... 35
|
||
5 Response ............................................ 36
|
||
5.1 Status-Line ......................................... 36
|
||
5.1.1 Status Codes and Reason Phrases ..................... 37
|
||
6 Header Field Definitions ............................ 39
|
||
6.1 General Header Fields ............................... 41
|
||
6.2 Entity Header Fields ................................ 42
|
||
6.3 Request Header Fields ............................... 43
|
||
|
||
|
||
|
||
Handley, et al. Standards Track [Page 2]
|
||
|
||
RFC 2543 SIP: Session Initiation Protocol March 1999
|
||
|
||
|
||
6.4 Response Header Fields .............................. 43
|
||
6.5 End-to-end and Hop-by-hop Headers ................... 43
|
||
6.6 Header Field Format ................................. 43
|
||
6.7 Accept .............................................. 44
|
||
6.8 Accept-Encoding ..................................... 44
|
||
6.9 Accept-Language ..................................... 45
|
||
6.10 Allow ............................................... 45
|
||
6.11 Authorization ....................................... 45
|
||
6.12 Call-ID ............................................. 46
|
||
6.13 Contact ............................................. 47
|
||
6.14 Content-Encoding .................................... 50
|
||
6.15 Content-Length ...................................... 51
|
||
6.16 Content-Type ........................................ 51
|
||
6.17 CSeq ................................................ 52
|
||
6.18 Date ................................................ 53
|
||
6.19 Encryption .......................................... 54
|
||
6.20 Expires ............................................. 55
|
||
6.21 From ................................................ 56
|
||
6.22 Hide ................................................ 57
|
||
6.23 Max-Forwards ........................................ 59
|
||
6.24 Organization ........................................ 59
|
||
6.25 Priority ............................................ 60
|
||
6.26 Proxy-Authenticate .................................. 60
|
||
6.27 Proxy-Authorization ................................. 61
|
||
6.28 Proxy-Require ....................................... 61
|
||
6.29 Record-Route ........................................ 62
|
||
6.30 Require ............................................. 63
|
||
6.31 Response-Key ........................................ 63
|
||
6.32 Retry-After ......................................... 64
|
||
6.33 Route ............................................... 65
|
||
6.34 Server .............................................. 65
|
||
6.35 Subject ............................................. 65
|
||
6.36 Timestamp ........................................... 66
|
||
6.37 To .................................................. 66
|
||
6.38 Unsupported ......................................... 68
|
||
6.39 User-Agent .......................................... 68
|
||
6.40 Via ................................................. 68
|
||
6.40.1 Requests ............................................ 68
|
||
6.40.2 Receiver-tagged Via Header Fields ................... 69
|
||
6.40.3 Responses ........................................... 70
|
||
6.40.4 User Agent and Redirect Servers ..................... 70
|
||
6.40.5 Syntax .............................................. 71
|
||
6.41 Warning ............................................. 72
|
||
6.42 WWW-Authenticate .................................... 74
|
||
7 Status Code Definitions ............................. 75
|
||
7.1 Informational 1xx ................................... 75
|
||
7.1.1 100 Trying .......................................... 75
|
||
7.1.2 180 Ringing ......................................... 75
|
||
|
||
|
||
|
||
Handley, et al. Standards Track [Page 3]
|
||
|
||
RFC 2543 SIP: Session Initiation Protocol March 1999
|
||
|
||
|
||
7.1.3 181 Call Is Being Forwarded ......................... 75
|
||
7.1.4 182 Queued .......................................... 76
|
||
7.2 Successful 2xx ...................................... 76
|
||
7.2.1 200 OK .............................................. 76
|
||
7.3 Redirection 3xx ..................................... 76
|
||
7.3.1 300 Multiple Choices ................................ 77
|
||
7.3.2 301 Moved Permanently ............................... 77
|
||
7.3.3 302 Moved Temporarily ............................... 77
|
||
7.3.4 305 Use Proxy ....................................... 77
|
||
7.3.5 380 Alternative Service ............................. 78
|
||
7.4 Request Failure 4xx ................................. 78
|
||
7.4.1 400 Bad Request ..................................... 78
|
||
7.4.2 401 Unauthorized .................................... 78
|
||
7.4.3 402 Payment Required ................................ 78
|
||
7.4.4 403 Forbidden ....................................... 78
|
||
7.4.5 404 Not Found ....................................... 78
|
||
7.4.6 405 Method Not Allowed .............................. 78
|
||
7.4.7 406 Not Acceptable .................................. 79
|
||
7.4.8 407 Proxy Authentication Required ................... 79
|
||
7.4.9 408 Request Timeout ................................. 79
|
||
7.4.10 409 Conflict ........................................ 79
|
||
7.4.11 410 Gone ............................................ 79
|
||
7.4.12 411 Length Required ................................. 79
|
||
7.4.13 413 Request Entity Too Large ........................ 80
|
||
7.4.14 414 Request-URI Too Long ............................ 80
|
||
7.4.15 415 Unsupported Media Type .......................... 80
|
||
7.4.16 420 Bad Extension ................................... 80
|
||
7.4.17 480 Temporarily Unavailable ......................... 80
|
||
7.4.18 481 Call Leg/Transaction Does Not Exist ............. 81
|
||
7.4.19 482 Loop Detected ................................... 81
|
||
7.4.20 483 Too Many Hops ................................... 81
|
||
7.4.21 484 Address Incomplete .............................. 81
|
||
7.4.22 485 Ambiguous ....................................... 81
|
||
7.4.23 486 Busy Here ....................................... 82
|
||
7.5 Server Failure 5xx .................................. 82
|
||
7.5.1 500 Server Internal Error ........................... 82
|
||
7.5.2 501 Not Implemented ................................. 82
|
||
7.5.3 502 Bad Gateway ..................................... 82
|
||
7.5.4 503 Service Unavailable ............................. 83
|
||
7.5.5 504 Gateway Time-out ................................ 83
|
||
7.5.6 505 Version Not Supported ........................... 83
|
||
7.6 Global Failures 6xx ................................. 83
|
||
7.6.1 600 Busy Everywhere ................................. 83
|
||
7.6.2 603 Decline ......................................... 84
|
||
7.6.3 604 Does Not Exist Anywhere ......................... 84
|
||
7.6.4 606 Not Acceptable .................................. 84
|
||
8 SIP Message Body .................................... 84
|
||
8.1 Body Inclusion ...................................... 84
|
||
|
||
|
||
|
||
Handley, et al. Standards Track [Page 4]
|
||
|
||
RFC 2543 SIP: Session Initiation Protocol March 1999
|
||
|
||
|
||
8.2 Message Body Type ................................... 85
|
||
8.3 Message Body Length ................................. 85
|
||
9 Compact Form ........................................ 85
|
||
10 Behavior of SIP Clients and Servers ................. 86
|
||
10.1 General Remarks ..................................... 86
|
||
10.1.1 Requests ............................................ 86
|
||
10.1.2 Responses ........................................... 87
|
||
10.2 Source Addresses, Destination Addresses and
|
||
Connections ......................................... 88
|
||
10.2.1 Unicast UDP ......................................... 88
|
||
10.2.2 Multicast UDP ....................................... 88
|
||
10.3 TCP ................................................. 89
|
||
10.4 Reliability for BYE, CANCEL, OPTIONS, REGISTER
|
||
Requests ............................................ 90
|
||
10.4.1 UDP ................................................. 90
|
||
10.4.2 TCP ................................................. 91
|
||
10.5 Reliability for INVITE Requests ..................... 91
|
||
10.5.1 UDP ................................................. 92
|
||
10.5.2 TCP ................................................. 95
|
||
10.6 Reliability for ACK Requests ........................ 95
|
||
10.7 ICMP Handling ....................................... 95
|
||
11 Behavior of SIP User Agents ......................... 95
|
||
11.1 Caller Issues Initial INVITE Request ................ 96
|
||
11.2 Callee Issues Response .............................. 96
|
||
11.3 Caller Receives Response to Initial Request ......... 96
|
||
11.4 Caller or Callee Generate Subsequent Requests ....... 97
|
||
11.5 Receiving Subsequent Requests ....................... 97
|
||
12 Behavior of SIP Proxy and Redirect Servers .......... 97
|
||
12.1 Redirect Server ..................................... 97
|
||
12.2 User Agent Server ................................... 98
|
||
12.3 Proxy Server ........................................ 98
|
||
12.3.1 Proxying Requests ................................... 98
|
||
12.3.2 Proxying Responses .................................. 99
|
||
12.3.3 Stateless Proxy: Proxying Responses ................. 99
|
||
12.3.4 Stateful Proxy: Receiving Requests .................. 99
|
||
12.3.5 Stateful Proxy: Receiving ACKs ...................... 99
|
||
12.3.6 Stateful Proxy: Receiving Responses ................. 100
|
||
12.3.7 Stateless, Non-Forking Proxy ........................ 100
|
||
12.4 Forking Proxy ....................................... 100
|
||
13 Security Considerations ............................. 104
|
||
13.1 Confidentiality and Privacy: Encryption ............. 104
|
||
13.1.1 End-to-End Encryption ............................... 104
|
||
13.1.2 Privacy of SIP Responses ............................ 107
|
||
13.1.3 Encryption by Proxies ............................... 108
|
||
13.1.4 Hop-by-Hop Encryption ............................... 108
|
||
13.1.5 Via field encryption ................................ 108
|
||
13.2 Message Integrity and Access Control:
|
||
Authentication ...................................... 109
|
||
|
||
|
||
|
||
Handley, et al. Standards Track [Page 5]
|
||
|
||
RFC 2543 SIP: Session Initiation Protocol March 1999
|
||
|
||
|
||
13.2.1 Trusting responses .................................. 112
|
||
13.3 Callee Privacy ...................................... 113
|
||
13.4 Known Security Problems ............................. 113
|
||
14 SIP Authentication using HTTP Basic and Digest
|
||
Schemes ............................................. 113
|
||
14.1 Framework ........................................... 113
|
||
14.2 Basic Authentication ................................ 114
|
||
14.3 Digest Authentication ............................... 114
|
||
14.4 Proxy-Authentication ................................ 115
|
||
15 SIP Security Using PGP .............................. 115
|
||
15.1 PGP Authentication Scheme ........................... 115
|
||
15.1.1 The WWW-Authenticate Response Header ................ 116
|
||
15.1.2 The Authorization Request Header .................... 117
|
||
15.2 PGP Encryption Scheme ............................... 118
|
||
15.3 Response-Key Header Field for PGP ................... 119
|
||
16 Examples ............................................ 119
|
||
16.1 Registration ........................................ 119
|
||
16.2 Invitation to a Multicast Conference ................ 121
|
||
16.2.1 Request ............................................. 121
|
||
16.2.2 Response ............................................ 122
|
||
16.3 Two-party Call ...................................... 123
|
||
16.4 Terminating a Call .................................. 125
|
||
16.5 Forking Proxy ....................................... 126
|
||
16.6 Redirects ........................................... 130
|
||
16.7 Negotiation ......................................... 131
|
||
16.8 OPTIONS Request ..................................... 132
|
||
A Minimal Implementation .............................. 134
|
||
A.1 Client .............................................. 134
|
||
A.2 Server .............................................. 135
|
||
A.3 Header Processing ................................... 135
|
||
B Usage of the Session Description Protocol (SDP)...... 136
|
||
B.1 Configuring Media Streams ........................... 136
|
||
B.2 Setting SDP Values for Unicast ...................... 138
|
||
B.3 Multicast Operation ................................. 139
|
||
B.4 Delayed Media Streams ............................... 139
|
||
B.5 Putting Media Streams on Hold ....................... 139
|
||
B.6 Subject and SDP "s=" Line ........................... 140
|
||
B.7 The SDP "o=" Line ................................... 140
|
||
C Summary of Augmented BNF ............................ 141
|
||
C.1 Basic Rules ......................................... 143
|
||
D Using SRV DNS Records ............................... 146
|
||
E IANA Considerations ................................. 148
|
||
F Acknowledgments ..................................... 149
|
||
G Authors' Addresses .................................. 149
|
||
H Bibliography ........................................ 150
|
||
I Full Copyright Statement ............................ 153
|
||
|
||
|
||
|
||
|
||
|
||
Handley, et al. Standards Track [Page 6]
|
||
|
||
RFC 2543 SIP: Session Initiation Protocol March 1999
|
||
|
||
|
||
1 Introduction
|
||
|
||
1.1 Overview of SIP Functionality
|
||
|
||
The Session Initiation Protocol (SIP) is an application-layer control
|
||
protocol that can establish, modify and terminate multimedia sessions
|
||
or calls. These multimedia sessions include multimedia conferences,
|
||
distance learning, Internet telephony and similar applications. SIP
|
||
can invite both persons and "robots", such as a media storage
|
||
service. SIP can invite parties to both unicast and multicast
|
||
sessions; the initiator does not necessarily have to be a member of
|
||
the session to which it is inviting. Media and participants can be
|
||
added to an existing session.
|
||
|
||
SIP can be used to initiate sessions as well as invite members to
|
||
sessions that have been advertised and established by other means.
|
||
Sessions can be advertised using multicast protocols such as SAP,
|
||
electronic mail, news groups, web pages or directories (LDAP), among
|
||
others.
|
||
|
||
SIP transparently supports name mapping and redirection services,
|
||
allowing the implementation of ISDN and Intelligent Network telephony
|
||
subscriber services. These facilities also enable personal mobility.
|
||
In the parlance of telecommunications intelligent network services,
|
||
this is defined as: "Personal mobility is the ability of end users to
|
||
originate and receive calls and access subscribed telecommunication
|
||
services on any terminal in any location, and the ability of the
|
||
network to identify end users as they move. Personal mobility is
|
||
based on the use of a unique personal identity (i.e., personal
|
||
number)." [1]. Personal mobility complements terminal mobility, i.e.,
|
||
the ability to maintain communications when moving a single end
|
||
system from one subnet to another.
|
||
|
||
SIP supports five facets of establishing and terminating multimedia
|
||
communications:
|
||
|
||
User location: determination of the end system to be used for
|
||
communication;
|
||
|
||
User capabilities: determination of the media and media parameters to
|
||
be used;
|
||
|
||
User availability: determination of the willingness of the called
|
||
party to engage in communications;
|
||
|
||
Call setup: "ringing", establishment of call parameters at both
|
||
called and calling party;
|
||
|
||
|
||
|
||
|
||
Handley, et al. Standards Track [Page 7]
|
||
|
||
RFC 2543 SIP: Session Initiation Protocol March 1999
|
||
|
||
|
||
Call handling: including transfer and termination of calls.
|
||
|
||
SIP can also initiate multi-party calls using a multipoint control
|
||
unit (MCU) or fully-meshed interconnection instead of multicast.
|
||
Internet telephony gateways that connect Public Switched Telephone
|
||
Network (PSTN) parties can also use SIP to set up calls between them.
|
||
|
||
SIP is designed as part of the overall IETF multimedia data and
|
||
control architecture currently incorporating protocols such as RSVP
|
||
(RFC 2205 [2]) for reserving network resources, the real-time
|
||
transport protocol (RTP) (RFC 1889 [3]) for transporting real-time
|
||
data and providing QOS feedback, the real-time streaming protocol
|
||
(RTSP) (RFC 2326 [4]) for controlling delivery of streaming media,
|
||
the session announcement protocol (SAP) [5] for advertising
|
||
multimedia sessions via multicast and the session description
|
||
protocol (SDP) (RFC 2327 [6]) for describing multimedia sessions.
|
||
However, the functionality and operation of SIP does not depend on
|
||
any of these protocols.
|
||
|
||
SIP can also be used in conjunction with other call setup and
|
||
signaling protocols. In that mode, an end system uses SIP exchanges
|
||
to determine the appropriate end system address and protocol from a
|
||
given address that is protocol-independent. For example, SIP could be
|
||
used to determine that the party can be reached via H.323 [7], obtain
|
||
the H.245 [8] gateway and user address and then use H.225.0 [9] to
|
||
establish the call.
|
||
|
||
In another example, SIP might be used to determine that the callee is
|
||
reachable via the PSTN and indicate the phone number to be called,
|
||
possibly suggesting an Internet-to-PSTN gateway to be used.
|
||
|
||
SIP does not offer conference control services such as floor control
|
||
or voting and does not prescribe how a conference is to be managed,
|
||
but SIP can be used to introduce conference control protocols. SIP
|
||
does not allocate multicast addresses.
|
||
|
||
SIP can invite users to sessions with and without resource
|
||
reservation. SIP does not reserve resources, but can convey to the
|
||
invited system the information necessary to do this.
|
||
|
||
1.2 Terminology
|
||
|
||
In this document, the key words "MUST", "MUST NOT", "REQUIRED",
|
||
"SHALL", "SHALL NOT", "SHOULD", "SHOULD NOT", "RECOMMENDED", "MAY",
|
||
and "OPTIONAL" are to be interpreted as described in RFC 2119 [10]
|
||
and indicate requirement levels for compliant SIP implementations.
|
||
|
||
|
||
|
||
|
||
|
||
Handley, et al. Standards Track [Page 8]
|
||
|
||
RFC 2543 SIP: Session Initiation Protocol March 1999
|
||
|
||
|
||
1.3 Definitions
|
||
|
||
This specification uses a number of terms to refer to the roles
|
||
played by participants in SIP communications. The definitions of
|
||
client, server and proxy are similar to those used by the Hypertext
|
||
Transport Protocol (HTTP) (RFC 2068 [11]). The terms and generic
|
||
syntax of URI and URL are defined in RFC 2396 [12]. The following
|
||
terms have special significance for SIP.
|
||
|
||
Call: A call consists of all participants in a conference invited by
|
||
a common source. A SIP call is identified by a globally unique
|
||
call-id (Section 6.12). Thus, if a user is, for example, invited
|
||
to the same multicast session by several people, each of these
|
||
invitations will be a unique call. A point-to-point Internet
|
||
telephony conversation maps into a single SIP call. In a
|
||
multiparty conference unit (MCU) based call-in conference, each
|
||
participant uses a separate call to invite himself to the MCU.
|
||
|
||
Call leg: A call leg is identified by the combination of Call-ID, To
|
||
and From.
|
||
|
||
Client: An application program that sends SIP requests. Clients may
|
||
or may not interact directly with a human user. User agents and
|
||
proxies contain clients (and servers).
|
||
|
||
Conference: A multimedia session (see below), identified by a common
|
||
session description. A conference can have zero or more members
|
||
and includes the cases of a multicast conference, a full-mesh
|
||
conference and a two-party "telephone call", as well as
|
||
combinations of these. Any number of calls can be used to
|
||
create a conference.
|
||
|
||
Downstream: Requests sent in the direction from the caller to the
|
||
callee (i.e., 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.
|
||
|
||
Initiator, calling party, caller: The party initiating a conference
|
||
invitation. Note that the calling party does not have to be the
|
||
same as the one creating the conference.
|
||
|
||
Invitation: A request sent to a user (or service) requesting
|
||
participation in a session. A successful SIP invitation consists
|
||
of two transactions: an INVITE request followed by an ACK
|
||
request.
|
||
|
||
|
||
|
||
|
||
Handley, et al. Standards Track [Page 9]
|
||
|
||
RFC 2543 SIP: Session Initiation Protocol March 1999
|
||
|
||
|
||
Invitee, invited user, called party, callee: The person or service
|
||
that the calling party is trying to invite to a conference.
|
||
|
||
Isomorphic request or response: Two requests or responses are defined
|
||
to be isomorphic for the purposes of this document if they have
|
||
the same values for the Call-ID, To, From and CSeq header
|
||
fields. In addition, isomorphic requests have to have the same
|
||
Request-URI.
|
||
|
||
Location server: See location service.
|
||
|
||
Location service: A location service is used by a SIP redirect or
|
||
proxy server to obtain information about a callee's possible
|
||
location(s). Location services are offered by location servers.
|
||
Location servers MAY be co-located with a SIP server, but the
|
||
manner in which a SIP server requests location services is
|
||
beyond the scope of this document.
|
||
|
||
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 program that acts as both a
|
||
server and a client for the purpose of making requests on behalf
|
||
of other clients. Requests are serviced internally or by passing
|
||
them on, possibly after translation, to other servers. A proxy
|
||
interprets, and, if necessary, rewrites a request message before
|
||
forwarding it.
|
||
|
||
Redirect server: A redirect server is a server that accepts a SIP
|
||
request, maps the address into zero or more new addresses and
|
||
returns these addresses to the client. Unlike a proxy server ,
|
||
it does not initiate its own SIP request. Unlike a user agent
|
||
server , it does not accept calls.
|
||
|
||
Registrar: A registrar is a server that accepts REGISTER requests. A
|
||
registrar is typically co-located with a proxy or redirect
|
||
server and MAY offer location services.
|
||
|
||
|
||
|
||
|
||
|
||
|
||
Handley, et al. Standards Track [Page 10]
|
||
|
||
RFC 2543 SIP: Session Initiation Protocol March 1999
|
||
|
||
|
||
Ringback: Ringback is the signaling tone produced by the calling
|
||
client's application indicating that a called party is being
|
||
alerted (ringing).
|
||
|
||
Server: A server is an application program that accepts requests in
|
||
order to service requests and sends back responses to those
|
||
requests. Servers are either proxy, redirect or user agent
|
||
servers or registrars.
|
||
|
||
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 [6]) (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 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
|
||
sent from the server to the client. A transaction is identified
|
||
by the CSeq sequence number (Section 6.17) within a single call
|
||
leg. The ACK request has the same CSeq number as the
|
||
corresponding INVITE request, but comprises a transaction of its
|
||
own.
|
||
|
||
Upstream: Responses sent in the direction from the user agent server
|
||
to the user agent client.
|
||
|
||
URL-encoded: A character string encoded according to RFC 1738,
|
||
Section 2.2 [13].
|
||
|
||
User agent client (UAC), calling user agent: A user agent client is a
|
||
client application that initiates the SIP request.
|
||
|
||
User agent server (UAS), called user agent: A user agent server is a
|
||
server application that contacts the user when a SIP request is
|
||
received and that returns a response on behalf of the user. The
|
||
response accepts, rejects or redirects the request.
|
||
|
||
User agent (UA): An application which contains both a user agent
|
||
client and user agent server.
|
||
|
||
An application program MAY be capable of acting both as a client and
|
||
a server. For example, a typical multimedia conference control
|
||
application would act as a user agent client to initiate calls or to
|
||
|
||
|
||
|
||
Handley, et al. Standards Track [Page 11]
|
||
|
||
RFC 2543 SIP: Session Initiation Protocol March 1999
|
||
|
||
|
||
invite others to conferences and as a user agent server to accept
|
||
invitations. The properties of the different SIP server types are
|
||
summarized in Table 1.
|
||
|
||
|
||
property redirect proxy user agent registrar
|
||
server server server
|
||
__________________________________________________________________
|
||
also acts as a SIP client no yes no no
|
||
returns 1xx status yes yes yes yes
|
||
returns 2xx status no yes yes yes
|
||
returns 3xx status yes yes yes yes
|
||
returns 4xx status yes yes yes yes
|
||
returns 5xx status yes yes yes yes
|
||
returns 6xx status no yes yes yes
|
||
inserts Via header no yes no no
|
||
accepts ACK yes yes yes no
|
||
|
||
|
||
Table 1: Properties of the different SIP server types
|
||
|
||
|
||
1.4 Overview of SIP Operation
|
||
|
||
This section explains the basic protocol functionality and operation.
|
||
Callers and callees are identified by SIP addresses, described in
|
||
Section 1.4.1. When making a SIP call, a caller first locates the
|
||
appropriate server (Section 1.4.2) and then sends a SIP request
|
||
(Section 1.4.3). The most common SIP operation is the invitation
|
||
(Section 1.4.4). Instead of directly reaching the intended callee, a
|
||
SIP request may be redirected or may trigger a chain of new SIP
|
||
requests by proxies (Section 1.4.5). Users can register their
|
||
location(s) with SIP servers (Section 4.2.6).
|
||
|
||
1.4.1 SIP Addressing
|
||
|
||
The "objects" addressed by SIP are users at hosts, identified by a
|
||
SIP URL. The SIP URL takes a form similar to a mailto or telnet URL,
|
||
i.e., user@host. The user part is a user name or a telephone number.
|
||
The host part is either a domain name or a numeric network address.
|
||
See section 2 for a detailed discussion of SIP URL's.
|
||
|
||
A user's SIP address can be obtained out-of-band, can be learned via
|
||
existing media agents, can be included in some mailers' message
|
||
headers, or can be recorded during previous invitation interactions.
|
||
In many cases, a user's SIP URL can be guessed from their email
|
||
address.
|
||
|
||
|
||
|
||
|
||
Handley, et al. Standards Track [Page 12]
|
||
|
||
RFC 2543 SIP: Session Initiation Protocol March 1999
|
||
|
||
|
||
A SIP URL address can designate an individual (possibly located at
|
||
one of several end systems), the first available person from a group
|
||
of individuals or a whole group. The form of the address, for
|
||
example, sip:sales@example.com , is not sufficient, in general, to
|
||
determine the intent of the caller.
|
||
|
||
If a user or service chooses to be reachable at an address that is
|
||
guessable from the person's name and organizational affiliation, the
|
||
traditional method of ensuring privacy by having an unlisted "phone"
|
||
number is compromised. However, unlike traditional telephony, SIP
|
||
offers authentication and access control mechanisms and can avail
|
||
itself of lower-layer security mechanisms, so that client software
|
||
can reject unauthorized or undesired call attempts.
|
||
|
||
1.4.2 Locating a SIP Server
|
||
|
||
When a client wishes to send a request, the client either sends it to
|
||
a locally configured SIP proxy server (as in HTTP), independent of
|
||
the Request-URI, or sends it to the IP address and port corresponding
|
||
to the Request-URI.
|
||
|
||
For the latter case, the client must determine the protocol, port and
|
||
IP address of a server to which to send the request. A client SHOULD
|
||
follow the steps below to obtain this information, but MAY follow the
|
||
alternative, optional procedure defined in Appendix D. At each step,
|
||
unless stated otherwise, the client SHOULD try to contact a server at
|
||
the port number listed in the Request-URI. If no port number is
|
||
present in the Request-URI, the client uses port 5060. If the
|
||
Request-URI specifies a protocol (TCP or UDP), the client contacts
|
||
the server using that protocol. If no protocol is specified, the
|
||
client tries UDP (if UDP is supported). If the attempt fails, or if
|
||
the client doesn't support UDP but supports TCP, it then tries TCP.
|
||
|
||
A client SHOULD be able to interpret explicit network notifications
|
||
(such as ICMP messages) which indicate that a server is not
|
||
reachable, rather than relying solely on timeouts. (For socket-based
|
||
programs: For TCP, connect() returns ECONNREFUSED if the client could
|
||
not connect to a server at that address. For UDP, the socket needs to
|
||
be bound to the destination address using connect() rather than
|
||
sendto() or similar so that a second write() fails with ECONNREFUSED
|
||
if there is no server listening) If the client finds the server is
|
||
not reachable at a particular address, it SHOULD behave as if it had
|
||
received a 400-class error response to that request.
|
||
|
||
The client tries to find one or more addresses for the SIP server by
|
||
querying DNS. The procedure is as follows:
|
||
|
||
|
||
|
||
|
||
|
||
Handley, et al. Standards Track [Page 13]
|
||
|
||
RFC 2543 SIP: Session Initiation Protocol March 1999
|
||
|
||
|
||
1. If the host portion of the Request-URI is an IP address,
|
||
the client contacts the server at the given address.
|
||
Otherwise, the client proceeds to the next step.
|
||
|
||
2. The client queries the DNS server for address records for
|
||
the host portion of the Request-URI. If the DNS server
|
||
returns no address records, the client stops, as it has
|
||
been unable to locate a server. By address record, we mean
|
||
A RR's, AAAA RR's, or other similar address records, chosen
|
||
according to the client's network protocol capabilities.
|
||
|
||
|
||
There are no mandatory rules on how to select a host name
|
||
for a SIP server. Users are encouraged to name their SIP
|
||
servers using the sip.domainname (i.e., sip.example.com)
|
||
convention, as specified in RFC 2219 [16]. Users may only
|
||
know an email address instead of a full SIP URL for a
|
||
callee, however. In that case, implementations may be able
|
||
to increase the likelihood of reaching a SIP server for
|
||
that domain by constructing a SIP URL from that email
|
||
address by prefixing the host name with "sip.". In the
|
||
future, this mechanism is likely to become unnecessary as
|
||
better DNS techniques, such as the one in Appendix D,
|
||
become widely available.
|
||
|
||
A client MAY cache a successful DNS query result. A successful query
|
||
is one which contained records in the answer, and a server was
|
||
contacted at one of the addresses from the answer. When the client
|
||
wishes to send a request to the same host, it MUST start the search
|
||
as if it had just received this answer from the name server. The
|
||
client MUST follow the procedures in RFC1035 [15] regarding DNS cache
|
||
invalidation when the DNS time-to-live expires.
|
||
|
||
1.4.3 SIP Transaction
|
||
|
||
Once the host part has been resolved to a SIP server, the client
|
||
sends one or more SIP requests to that server and receives one or
|
||
more responses from the server. A request (and its retransmissions)
|
||
together with the responses triggered by that request make up a SIP
|
||
transaction. All responses to a request contain the same values in
|
||
the Call-ID, CSeq, To, and From fields (with the possible addition of
|
||
a tag in the To field (section 6.37)). This allows responses to be
|
||
matched with requests. The ACK request following an INVITE is not
|
||
part of the transaction since it may traverse a different set of
|
||
hosts.
|
||
|
||
|
||
|
||
|
||
|
||
|
||
Handley, et al. Standards Track [Page 14]
|
||
|
||
RFC 2543 SIP: Session Initiation Protocol March 1999
|
||
|
||
|
||
If TCP is used, request and responses within a single SIP transaction
|
||
are carried over the same TCP connection (see Section 10). Several
|
||
SIP requests from the same client to the same server MAY use the same
|
||
TCP connection or MAY use a new connection for each request.
|
||
|
||
If the client sent the request via unicast UDP, the response is sent
|
||
to the address contained in the next Via header field (Section 6.40)
|
||
of the response. If the request is sent via multicast UDP, the
|
||
response is directed to the same multicast address and destination
|
||
port. For UDP, reliability is achieved using retransmission (Section
|
||
10).
|
||
|
||
The SIP message format and operation is independent of the transport
|
||
protocol.
|
||
|
||
1.4.4 SIP Invitation
|
||
|
||
A successful SIP invitation consists of two requests, INVITE followed
|
||
by ACK. The INVITE (Section 4.2.1) request asks the callee to join a
|
||
particular conference or establish a two-party conversation. After
|
||
the callee has agreed to participate in the call, the caller confirms
|
||
that it has received that response by sending an ACK (Section 4.2.2)
|
||
request. If the caller no longer wants to participate in the call, it
|
||
sends a BYE request instead of an ACK.
|
||
|
||
The INVITE request typically contains a session description, for
|
||
example written in SDP (RFC 2327 [6]) format, that provides the
|
||
called party with enough information to join the session. For
|
||
multicast sessions, the session description enumerates the media
|
||
types and formats that are allowed to be distributed to that session.
|
||
For a unicast session, the session description enumerates the media
|
||
types and formats that the caller is willing to use and where it
|
||
wishes the media data to be sent. In either case, if the callee
|
||
wishes to accept the call, it responds to the invitation by returning
|
||
a similar description listing the media it wishes to use. For a
|
||
multicast session, the callee SHOULD only return a session
|
||
description if it is unable to receive the media indicated in the
|
||
caller's description or wants to receive data via unicast.
|
||
|
||
The protocol exchanges for the INVITE method are shown in Fig. 1 for
|
||
a proxy server and in Fig. 2 for a redirect server. (Note that the
|
||
messages shown in the figures have been abbreviated slightly.) In
|
||
Fig. 1, the proxy server accepts the INVITE request (step 1),
|
||
contacts the location service with all or parts of the address (step
|
||
2) and obtains a more precise location (step 3). The proxy server
|
||
then issues a SIP INVITE request to the address(es) returned by the
|
||
location service (step 4). The user agent server alerts the user
|
||
(step 5) and returns a success indication to the proxy server (step
|
||
|
||
|
||
|
||
Handley, et al. Standards Track [Page 15]
|
||
|
||
RFC 2543 SIP: Session Initiation Protocol March 1999
|
||
|
||
|
||
6). The proxy server then returns the success result to the original
|
||
caller (step 7). The receipt of this message is confirmed by the
|
||
caller using an ACK request, which is forwarded to the callee (steps
|
||
8 and 9). Note that an ACK can also be sent directly to the callee,
|
||
bypassing the proxy. All requests and responses have the same Call-
|
||
ID.
|
||
|
||
|
||
|
||
|
||
|
||
+....... cs.columbia.edu .......+
|
||
: :
|
||
: (~~~~~~~~~~) :
|
||
: ( location ) :
|
||
: ( service ) :
|
||
: (~~~~~~~~~~) :
|
||
: ^ | :
|
||
: | hgs@lab :
|
||
: 2| 3| :
|
||
: | | :
|
||
: henning | :
|
||
+.. cs.tu-berlin.de ..+ 1: INVITE : | | :
|
||
: : henning@cs.col: | \/ 4: INVITE 5: ring :
|
||
: cz@cs.tu-berlin.de ========================>(~~~~~~)=========>(~~~~~~) :
|
||
: <........................( )<.........( ) :
|
||
: : 7: 200 OK : ( )6: 200 OK ( ) :
|
||
: : : ( work ) ( lab ) :
|
||
: : 8: ACK : ( )9: ACK ( ) :
|
||
: ========================>(~~~~~~)=========>(~~~~~~) :
|
||
+.....................+ +...............................+
|
||
|
||
====> SIP request
|
||
....> SIP response
|
||
|
||
^
|
||
| non-SIP protocols
|
||
|
|
||
|
||
|
||
Figure 1: Example of SIP proxy server
|
||
|
||
|
||
|
||
The redirect server shown in Fig. 2 accepts the INVITE request (step
|
||
1), contacts the location service as before (steps 2 and 3) and,
|
||
instead of contacting the newly found address itself, returns the
|
||
address to the caller (step 4), which is then acknowledged via an ACK
|
||
|
||
|
||
|
||
Handley, et al. Standards Track [Page 16]
|
||
|
||
RFC 2543 SIP: Session Initiation Protocol March 1999
|
||
|
||
|
||
request (step 5). The caller issues a new request, with the same
|
||
call-ID but a higher CSeq, to the address returned by the first
|
||
server (step 6). In the example, the call succeeds (step 7). The
|
||
caller and callee complete the handshake with an ACK (step 8).
|
||
|
||
|
||
The next section discusses what happens if the location service
|
||
returns more than one possible alternative.
|
||
|
||
1.4.5 Locating a User
|
||
|
||
A callee may move between a number of different end systems over
|
||
time. These locations can be dynamically registered with the SIP
|
||
server (Sections 1.4.7, 4.2.6). A location server MAY also use one or
|
||
more other protocols, such as finger (RFC 1288 [17]), rwhois (RFC
|
||
2167 [18]), LDAP (RFC 1777 [19]), multicast-based protocols [20] or
|
||
operating-system dependent mechanisms to actively determine the end
|
||
system where a user might be reachable. A location server MAY return
|
||
several locations because the user is logged in at several hosts
|
||
simultaneously or because the location server has (temporarily)
|
||
inaccurate information. The SIP server combines the results to yield
|
||
a list of a zero or more locations.
|
||
|
||
The action taken on receiving a list of locations varies with the
|
||
type of SIP server. A SIP redirect server returns the list to the
|
||
client as Contact headers (Section 6.13). A SIP proxy server can
|
||
sequentially or in parallel try the addresses until the call is
|
||
successful (2xx response) or the callee has declined the call (6xx
|
||
response). With sequential attempts, a proxy server can implement an
|
||
"anycast" service.
|
||
|
||
If a proxy server forwards a SIP request, it MUST add itself to the
|
||
beginning of the list of forwarders noted in the Via (Section 6.40)
|
||
headers. The Via trace ensures that replies can take the same path
|
||
back, ensuring correct operation through compliant firewalls and
|
||
avoiding request loops. On the response path, each host MUST remove
|
||
its Via, so that routing internal information is hidden from the
|
||
callee and outside networks. A proxy server MUST check that it does
|
||
not generate a request to a host listed in the Via sent-by, via-
|
||
received or via-maddr parameters (Section 6.40). (Note: If a host has
|
||
several names or network addresses, this does not always work. Thus,
|
||
each host also checks if it is part of the Via list.)
|
||
|
||
A SIP invitation may traverse more than one SIP proxy server. If one
|
||
of these "forks" the request, i.e., issues more than one request in
|
||
response to receiving the invitation request, it is possible that a
|
||
client is reached, independently, by more than one copy of the
|
||
|
||
|
||
|
||
|
||
Handley, et al. Standards Track [Page 17]
|
||
|
||
RFC 2543 SIP: Session Initiation Protocol March 1999
|
||
|
||
|
||
invitation request. Each of these copies bears the same Call-ID. The
|
||
user agent MUST return the same status response returned in the first
|
||
response. Duplicate requests are not an error.
|
||
|
||
1.4.6 Changing an Existing Session
|
||
|
||
In some circumstances, it is desirable to change the parameters of an
|
||
existing session. This is done by re-issuing the INVITE, using the
|
||
same Call-ID, but a new or different body or header fields to convey
|
||
the new information. This re INVITE MUST have a higher CSeq than any
|
||
previous request from the client to the server.
|
||
|
||
For example, two parties may have been conversing and then want to
|
||
add a third party, switching to multicast for efficiency. One of the
|
||
participants invites the third party with the new multicast address
|
||
and simultaneously sends an INVITE to the second party, with the new
|
||
multicast session description, but with the old call identifier.
|
||
|
||
1.4.7 Registration Services
|
||
|
||
The REGISTER request allows a client to let a proxy or redirect
|
||
server know at which address(es) it can be reached. A client MAY also
|
||
use it to install call handling features at the server.
|
||
|
||
1.5 Protocol Properties
|
||
|
||
1.5.1 Minimal State
|
||
|
||
A single conference session or call involves one or more SIP
|
||
request-response transactions. Proxy servers do not have to keep
|
||
state for a particular call, however, they MAY maintain state for a
|
||
single SIP transaction, as discussed in Section 12. For efficiency, a
|
||
server MAY cache the results of location service requests.
|
||
|
||
1.5.2 Lower-Layer-Protocol Neutral
|
||
|
||
SIP makes minimal assumptions about the underlying transport and
|
||
network-layer protocols. The lower-layer can provide either a packet
|
||
or a byte stream service, with reliable or unreliable service.
|
||
|
||
In an Internet context, SIP is able to utilize both UDP and TCP as
|
||
transport protocols, among others. UDP allows the application to more
|
||
carefully control the timing of messages and their retransmission, to
|
||
perform parallel searches without requiring TCP connection state for
|
||
each outstanding request, and to use multicast. Routers can more
|
||
readily snoop SIP UDP packets. TCP allows easier passage through
|
||
existing firewalls.
|
||
|
||
|
||
|
||
|
||
Handley, et al. Standards Track [Page 18]
|
||
|
||
RFC 2543 SIP: Session Initiation Protocol March 1999
|
||
|
||
|
||
|
||
|
||
|
||
|
||
+....... cs.columbia.edu .......+
|
||
: :
|
||
: (~~~~~~~~~~) :
|
||
: ( location ) :
|
||
: ( service ) :
|
||
: (~~~~~~~~~~) :
|
||
: ^ | :
|
||
: | hgs@lab :
|
||
: 2| 3| :
|
||
: | | :
|
||
: henning| :
|
||
+.. cs.tu-berlin.de ..+ 1: INVITE : | | :
|
||
: : henning@cs.col: | \/ :
|
||
: cz@cs.tu-berlin.de =======================>(~~~~~~) :
|
||
: | ^ | <.......................( ) :
|
||
: | . | : 4: 302 Moved : ( ) :
|
||
: | . | : hgs@lab : ( work ) :
|
||
: | . | : : ( ) :
|
||
: | . | : 5: ACK : ( ) :
|
||
: | . | =======================>(~~~~~~) :
|
||
: | . | : : :
|
||
+.......|...|.........+ : :
|
||
| . | : :
|
||
| . | : :
|
||
| . | : :
|
||
| . | : :
|
||
| . | 6: INVITE hgs@lab.cs.columbia.edu (~~~~~~) :
|
||
| . ==================================================> ( ) :
|
||
| ..................................................... ( ) :
|
||
| 7: 200 OK : ( lab ) :
|
||
| : ( ) :
|
||
| 8: ACK : ( ) :
|
||
======================================================> (~~~~~~) :
|
||
+...............................+
|
||
|
||
====> SIP request
|
||
....> SIP response
|
||
|
||
^
|
||
| non-SIP protocols
|
||
|
|
||
|
||
|
||
|
||
|
||
Figure 2: Example of SIP redirect server
|
||
|
||
Handley, et al. Standards Track [Page 19]
|
||
|
||
RFC 2543 SIP: Session Initiation Protocol March 1999
|
||
|
||
|
||
When TCP is used, SIP can use one or more connections to attempt to
|
||
contact a user or to modify parameters of an existing conference.
|
||
Different SIP requests for the same SIP call MAY use different TCP
|
||
connections or a single persistent connection, as appropriate.
|
||
|
||
For concreteness, this document will only refer to Internet
|
||
protocols. However, SIP MAY also be used directly with protocols
|
||
such as ATM AAL5, IPX, frame relay or X.25. The necessary naming
|
||
conventions are beyond the scope of this document. User agents SHOULD
|
||
implement both UDP and TCP transport. Proxy, registrar, and redirect
|
||
servers MUST implement both UDP and TCP transport.
|
||
|
||
1.5.3 Text-Based
|
||
|
||
SIP is text-based, using ISO 10646 in UTF-8 encoding throughout. This
|
||
allows easy implementation in languages such as Java, Tcl and Perl,
|
||
allows easy debugging, and most importantly, makes SIP flexible and
|
||
extensible. As SIP is used for initiating multimedia conferences
|
||
rather than delivering media data, it is believed that the additional
|
||
overhead of using a text-based protocol is not significant.
|
||
|
||
2 SIP Uniform Resource Locators
|
||
|
||
SIP URLs are used within SIP messages to indicate the originator
|
||
(From), current destination (Request-URI) and final recipient (To) of
|
||
a SIP request, and to specify redirection addresses (Contact). A SIP
|
||
URL can also be embedded in web pages or other hyperlinks to indicate
|
||
that a particular user or service can be called via SIP. When used as
|
||
a hyperlink, the SIP URL indicates the use of the INVITE method.
|
||
|
||
The SIP URL scheme is defined to allow setting SIP request-header
|
||
fields and the SIP message-body.
|
||
|
||
|
||
This corresponds to the use of mailto: URLs. It makes it
|
||
possible, for example, to specify the subject, urgency or
|
||
media types of calls initiated through a web page or as
|
||
part of an email message.
|
||
|
||
A SIP URL follows the guidelines of RFC 2396 [12] and has the syntax
|
||
shown in Fig. 3. The syntax is described using Augmented Backus-Naur
|
||
Form (See Section C). Note that reserved characters have to be
|
||
escaped and that the "set of characters 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" [12].
|
||
|
||
|
||
|
||
|
||
|
||
Handley, et al. Standards Track [Page 20]
|
||
|
||
RFC 2543 SIP: Session Initiation Protocol March 1999
|
||
|
||
|
||
|
||
|
||
SIP-URL = "sip:" [ userinfo "@" ] hostport
|
||
url-parameters [ headers ]
|
||
userinfo = user [ ":" password ]
|
||
user = *( unreserved | escaped
|
||
| "&" | "=" | "+" | "$" | "," )
|
||
password = *( unreserved | escaped
|
||
| "&" | "=" | "+" | "$" | "," )
|
||
hostport = host [ ":" port ]
|
||
host = hostname | IPv4address
|
||
hostname = *( domainlabel "." ) toplabel [ "." ]
|
||
domainlabel = alphanum | alphanum *( alphanum | "-" ) alphanum
|
||
toplabel = alpha | alpha *( alphanum | "-" ) alphanum
|
||
IPv4address = 1*digit "." 1*digit "." 1*digit "." 1*digit
|
||
port = *digit
|
||
url-parameters = *( ";" url-parameter )
|
||
url-parameter = transport-param | user-param | method-param
|
||
| ttl-param | maddr-param | other-param
|
||
transport-param = "transport=" ( "udp" | "tcp" )
|
||
ttl-param = "ttl=" ttl
|
||
ttl = 1*3DIGIT ; 0 to 255
|
||
maddr-param = "maddr=" host
|
||
user-param = "user=" ( "phone" | "ip" )
|
||
method-param = "method=" Method
|
||
tag-param = "tag=" UUID
|
||
UUID = 1*( hex | "-" )
|
||
other-param = ( token | ( token "=" ( token | quoted-string )))
|
||
headers = "?" header *( "&" header )
|
||
header = hname "=" hvalue
|
||
hname = 1*uric
|
||
hvalue = *uric
|
||
uric = reserved | unreserved | escaped
|
||
reserved = ";" | "/" | "?" | ":" | "@" | "&" | "=" | "+" |
|
||
"$" | ","
|
||
digits = 1*DIGIT
|
||
|
||
|
||
Figure 3: SIP URL syntax
|
||
|
||
|
||
|
||
The URI character classes referenced above are described in Appendix
|
||
C.
|
||
|
||
The components of the SIP URI have the following meanings.
|
||
|
||
|
||
|
||
|
||
|
||
Handley, et al. Standards Track [Page 21]
|
||
|
||
RFC 2543 SIP: Session Initiation Protocol March 1999
|
||
|
||
|
||
|
||
|
||
telephone-subscriber = global-phone-number | local-phone-number
|
||
global-phone-number = "+" 1*phonedigit [isdn-subaddress]
|
||
[post-dial]
|
||
local-phone-number = 1*(phonedigit | dtmf-digit |
|
||
pause-character) [isdn-subaddress]
|
||
[post-dial]
|
||
isdn-subaddress = ";isub=" 1*phonedigit
|
||
post-dial = ";postd=" 1*(phonedigit | dtmf-digit
|
||
| pause-character)
|
||
phonedigit = DIGIT | visual-separator
|
||
visual-separator = "-" | "."
|
||
pause-character = one-second-pause | wait-for-dial-tone
|
||
one-second-pause = "p"
|
||
wait-for-dial-tone = "w"
|
||
dtmf-digit = "*" | "#" | "A" | "B" | "C" | "D"
|
||
|
||
Figure 4: SIP URL syntax; telephone subscriber
|
||
|
||
user: If the host is an Internet telephony gateway, the user field
|
||
MAY also encode a telephone number using the notation of
|
||
telephone-subscriber (Fig. 4). The telephone number is a special
|
||
case of a user name and cannot be distinguished by a BNF. Thus,
|
||
a URL parameter, user, is added to distinguish telephone numbers
|
||
from user names. The phone identifier is to be used when
|
||
connecting to a telephony gateway. Even without this parameter,
|
||
recipients of SIP URLs MAY interpret the pre-@ part as a phone
|
||
number if local restrictions on the name space for user name
|
||
allow it.
|
||
|
||
password: The SIP scheme MAY use the format "user:password" in the
|
||
userinfo field. The use of passwords in the userinfo 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.
|
||
|
||
host: The mailto: URL and RFC 822 email addresses require that
|
||
numeric host addresses ("host numbers") are enclosed in square
|
||
brackets (presumably, since host names might be numeric), while
|
||
host numbers without brackets are used for all other URLs. The
|
||
SIP URL requires the latter form, without brackets.
|
||
|
||
The issue of IPv6 literal addresses in URLs is being looked at
|
||
elsewhere in the IETF. SIP implementers are advised to keep up to
|
||
date on that activity.
|
||
|
||
|
||
|
||
|
||
Handley, et al. Standards Track [Page 22]
|
||
|
||
RFC 2543 SIP: Session Initiation Protocol March 1999
|
||
|
||
|
||
port: The port number to send a request to. If not present, the
|
||
procedures outlined in Section 1.4.2 are used to determine the
|
||
port number to send a request to.
|
||
|
||
URL parameters: SIP URLs can define specific parameters of the
|
||
request. URL parameters are added after the host component and
|
||
are separated by semi-colons. The transport parameter determines
|
||
the the transport mechanism (UDP or TCP). UDP is to be assumed
|
||
when no explicit transport parameter is included. The maddr
|
||
parameter provides the server address to be contacted for this
|
||
user, overriding the address supplied in the host field. This
|
||
address is typically a multicast address, but could also be the
|
||
address of a backup server. 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. The user parameter was described above. For example, to
|
||
specify to call j.doe@big.com using multicast to 239.255.255.1
|
||
with a ttl of 15, the following URL would be used:
|
||
|
||
|
||
sip:j.doe@big.com;maddr=239.255.255.1;ttl=15
|
||
|
||
|
||
|
||
The transport, maddr, and ttl parameters MUST NOT be used in the From
|
||
and To header fields and the Request-URI; they are ignored if
|
||
present.
|
||
|
||
Headers: Headers of the SIP request can be defined with the "?"
|
||
mechanism within a SIP URL. The special hname "body" indicates
|
||
that the associated hvalue is the message-body of the SIP INVITE
|
||
request. Headers MUST NOT be used in the From and To header
|
||
fields and the Request-URI; they are ignored if present. hname
|
||
and hvalue are encodings of a SIP header name and value,
|
||
respectively. All URL reserved characters in the header names
|
||
and values MUST be escaped.
|
||
|
||
Method: The method of the SIP request can be specified with the
|
||
method parameter. This parameter MUST NOT be used in the From
|
||
and To header fields and the Request-URI; they are ignored if
|
||
present.
|
||
|
||
Table 2 summarizes where the components of the SIP URL can be used
|
||
and what default values they assume if not present.
|
||
|
||
|
||
Examples of SIP URLs are:
|
||
|
||
|
||
|
||
|
||
Handley, et al. Standards Track [Page 23]
|
||
|
||
RFC 2543 SIP: Session Initiation Protocol March 1999
|
||
|
||
|
||
|
||
default Req.-URI To From Contact external
|
||
user -- x x x x x
|
||
password -- x x x x
|
||
host mandatory x x x x x
|
||
port 5060 x x x x x
|
||
user-param ip x x x x x
|
||
method INVITE x x
|
||
maddr-param -- x x
|
||
ttl-param 1 x x
|
||
transp.-param -- x x
|
||
headers -- x x
|
||
|
||
|
||
Table 2: Use and default values of URL components for SIP headers,
|
||
Request-URI and references
|
||
|
||
sip:j.doe@big.com
|
||
sip:j.doe:secret@big.com;transport=tcp
|
||
sip:j.doe@big.com?subject=project
|
||
sip:+1-212-555-1212:1234@gateway.com;user=phone
|
||
sip:1212@gateway.com
|
||
sip:alice@10.1.2.3
|
||
sip:alice@example.com
|
||
sip:alice%40example.com@gateway.com
|
||
sip:alice@registrar.com;method=REGISTER
|
||
|
||
|
||
|
||
Within a SIP message, URLs are used to indicate the source and
|
||
intended destination of a request, redirection addresses and the
|
||
current destination of a request. Normally all these fields will
|
||
contain SIP URLs.
|
||
|
||
SIP URLs are case-insensitive, so that for example the two URLs
|
||
sip:j.doe@example.com and SIP:J.Doe@Example.com are equivalent. All
|
||
URL parameters are included when comparing SIP URLs for equality.
|
||
|
||
SIP header fields MAY contain non-SIP URLs. As an example, if a call
|
||
from a telephone is relayed to the Internet via SIP, the SIP From
|
||
header field might contain a phone URL.
|
||
|
||
3 SIP Message Overview
|
||
|
||
SIP is a text-based protocol and uses the ISO 10646 character set in
|
||
UTF-8 encoding (RFC 2279 [21]). Senders MUST terminate lines with a
|
||
CRLF, but receivers MUST also interpret CR and LF by themselves as
|
||
line terminators.
|
||
|
||
|
||
|
||
Handley, et al. Standards Track [Page 24]
|
||
|
||
RFC 2543 SIP: Session Initiation Protocol March 1999
|
||
|
||
|
||
Except for the above difference in character sets, much of the
|
||
message syntax is and header fields are 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 2068 [11]).
|
||
In addition, we describe SIP in both prose and an augmented Backus-
|
||
Naur form (ABNF). See section C for an overview of ABNF.
|
||
|
||
Note, however, that SIP is not an extension of HTTP.
|
||
|
||
Unlike HTTP, SIP MAY use UDP. When sent over TCP or UDP, multiple SIP
|
||
transactions can be carried in a single TCP connection or UDP
|
||
datagram. UDP datagrams, including all headers, SHOULD NOT be larger
|
||
than the path maximum transmission unit (MTU) if the MTU is known, or
|
||
1500 bytes if the MTU is unknown.
|
||
|
||
|
||
The 1500 bytes accommodates encapsulation within the
|
||
"typical" ethernet MTU without IP fragmentation. Recent
|
||
studies [22] indicate that an MTU of 1500 bytes is a
|
||
reasonable assumption. The next lower common MTU values are
|
||
1006 bytes for SLIP and 296 for low-delay PPP (RFC 1191
|
||
[23]). Thus, another reasonable value would be a message
|
||
size of 950 bytes, to accommodate packet headers within the
|
||
SLIP MTU without fragmentation.
|
||
|
||
A SIP message is either a request from a client to a server, or a
|
||
response from a server to a client.
|
||
|
||
|
||
|
||
SIP-message = Request | Response
|
||
|
||
|
||
Both Request (section 4) and Response (section 5) messages use the
|
||
generic-message format of RFC 822 [24] for transferring entities (the
|
||
body of the message). Both types of messages consist of a start-line,
|
||
one or more header fields (also known as "headers"), an empty line
|
||
(i.e., a line with nothing preceding the carriage-return line-feed
|
||
(CRLF)) indicating the end of the header fields, and an optional
|
||
message-body. To avoid confusion with similar-named headers in HTTP,
|
||
we refer to the headers describing the message body as entity
|
||
headers. These components are described in detail in the upcoming
|
||
sections.
|
||
|
||
|
||
|
||
generic-message = start-line
|
||
*message-header
|
||
|
||
|
||
|
||
Handley, et al. Standards Track [Page 25]
|
||
|
||
RFC 2543 SIP: Session Initiation Protocol March 1999
|
||
|
||
|
||
CRLF
|
||
[ message-body ]
|
||
|
||
start-line = Request-Line | ;Section 4.1
|
||
Status-Line ;Section 5.1
|
||
|
||
|
||
|
||
|
||
message-header = ( general-header
|
||
| request-header
|
||
| response-header
|
||
| entity-header )
|
||
|
||
|
||
|
||
In the interest of robustness, any leading empty line(s) MUST be
|
||
ignored. In other words, if the Request or Response message begins
|
||
with one or more CRLF, CR, or LFs, these characters MUST be ignored.
|
||
|
||
4 Request
|
||
|
||
The Request message format is shown below:
|
||
|
||
|
||
|
||
Request = Request-Line ; Section 4.1
|
||
*( general-header
|
||
| request-header
|
||
| entity-header )
|
||
CRLF
|
||
[ message-body ] ; Section 8
|
||
|
||
|
||
4.1 Request-Line
|
||
|
||
The Request-Line begins with a method token, followed by the
|
||
Request-URI and the protocol version, and ending with CRLF. The
|
||
elements are separated by SP characters. No CR or LF are allowed
|
||
except in the final CRLF sequence.
|
||
|
||
|
||
|
||
Request-Line = Method SP Request-URI SP SIP-Version CRLF
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
Handley, et al. Standards Track [Page 26]
|
||
|
||
RFC 2543 SIP: Session Initiation Protocol March 1999
|
||
|
||
|
||
|
||
|
||
general-header = Accept ; Section 6.7
|
||
| Accept-Encoding ; Section 6.8
|
||
| Accept-Language ; Section 6.9
|
||
| Call-ID ; Section 6.12
|
||
| Contact ; Section 6.13
|
||
| CSeq ; Section 6.17
|
||
| Date ; Section 6.18
|
||
| Encryption ; Section 6.19
|
||
| Expires ; Section 6.20
|
||
| From ; Section 6.21
|
||
| Record-Route ; Section 6.29
|
||
| Timestamp ; Section 6.36
|
||
| To ; Section 6.37
|
||
| Via ; Section 6.40
|
||
entity-header = Content-Encoding ; Section 6.14
|
||
| Content-Length ; Section 6.15
|
||
| Content-Type ; Section 6.16
|
||
request-header = Authorization ; Section 6.11
|
||
| Contact ; Section 6.13
|
||
| Hide ; Section 6.22
|
||
| Max-Forwards ; Section 6.23
|
||
| Organization ; Section 6.24
|
||
| Priority ; Section 6.25
|
||
| Proxy-Authorization ; Section 6.27
|
||
| Proxy-Require ; Section 6.28
|
||
| Route ; Section 6.33
|
||
| Require ; Section 6.30
|
||
| Response-Key ; Section 6.31
|
||
| Subject ; Section 6.35
|
||
| User-Agent ; Section 6.39
|
||
response-header = Allow ; Section 6.10
|
||
| Proxy-Authenticate ; Section 6.26
|
||
| Retry-After ; Section 6.32
|
||
| Server ; Section 6.34
|
||
| Unsupported ; Section 6.38
|
||
| Warning ; Section 6.41
|
||
| WWW-Authenticate ; Section 6.42
|
||
|
||
|
||
Table 3: SIP headers
|
||
|
||
4.2 Methods
|
||
|
||
The methods are defined below. Methods that are not supported by a
|
||
proxy or redirect server are treated by that server as if they were
|
||
an OPTIONS method and forwarded accordingly. Methods that are not
|
||
|
||
|
||
|
||
Handley, et al. Standards Track [Page 27]
|
||
|
||
RFC 2543 SIP: Session Initiation Protocol March 1999
|
||
|
||
|
||
supported by a user agent server or registrar cause a 501 (Not
|
||
Implemented) response to be returned (Section 7). As in HTTP, the
|
||
Method token is case-sensitive.
|
||
|
||
|
||
|
||
Method = "INVITE" | "ACK" | "OPTIONS" | "BYE"
|
||
| "CANCEL" | "REGISTER"
|
||
|
||
|
||
4.2.1 INVITE
|
||
|
||
The INVITE method indicates that the user or service is being invited
|
||
to participate in a session. The message body contains a description
|
||
of the session to which the callee is being invited. For two-party
|
||
calls, the caller indicates the type of media it is able to receive
|
||
and possibly the media it is willing to send as well as their
|
||
parameters such as network destination. A success response MUST
|
||
indicate in its message body which media the callee wishes to receive
|
||
and MAY indicate the media the callee is going to send.
|
||
|
||
|
||
Not all session description formats have the ability to
|
||
indicate sending media.
|
||
|
||
A server MAY automatically respond to an invitation for a conference
|
||
the user is already participating in, identified either by the SIP
|
||
Call-ID or a globally unique identifier within the session
|
||
description, with a 200 (OK) response.
|
||
|
||
If a user agent receives an INVITE request for an existing call leg
|
||
with a higher CSeq sequence number than any previous INVITE for the
|
||
same Call-ID, 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. It MUST also
|
||
inspect any other header fields for changes. If there is a change,
|
||
the user agent MUST update any internal state or information
|
||
generated as a result of that header. If the session description has
|
||
changed, the user agent server 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.)
|
||
|
||
This method MUST be supported by SIP proxy, redirect and user agent
|
||
servers as well as clients.
|
||
|
||
|
||
|
||
|
||
|
||
Handley, et al. Standards Track [Page 28]
|
||
|
||
RFC 2543 SIP: Session Initiation Protocol March 1999
|
||
|
||
|
||
4.2.2 ACK
|
||
|
||
The ACK request confirms that the client has received a final
|
||
response to an INVITE request. (ACK is used only with INVITE
|
||
requests.) 2xx responses are acknowledged by client user agents, all
|
||
other final responses by the first proxy or client user agent to
|
||
receive the response. The Via is always initialized to the host that
|
||
originates the ACK request, i.e., the client user agent after a 2xx
|
||
response or the first proxy to receive a non-2xx final response. The
|
||
ACK request is forwarded as the corresponding INVITE request, based
|
||
on its Request-URI. See Section 10 for details.
|
||
|
||
The ACK request MAY contain a message body with the final session
|
||
description to be used by the callee. If the ACK message body is
|
||
empty, the callee uses the session description in the INVITE request.
|
||
|
||
A proxy server receiving an ACK request after having sent a 3xx, 4xx,
|
||
5xx, or 6xx response must make a determination about whether the ACK
|
||
is for it, or for some user agent or proxy server further downstream.
|
||
This determination is made by examining the tag in the To field. If
|
||
the tag in the ACK To header field matches the tag in the To header
|
||
field of the response, and the From, CSeq and Call-ID header fields
|
||
in the response match those in the ACK, the ACK is meant for the
|
||
proxy server. Otherwise, the ACK SHOULD be proxied downstream as any
|
||
other request.
|
||
|
||
|
||
It is possible for a user agent client or proxy server to
|
||
receive multiple 3xx, 4xx, 5xx, and 6xx responses to a
|
||
request along a single branch. This can happen under
|
||
various error conditions, typically when a forking proxy
|
||
transitions from stateful to stateless before receiving all
|
||
responses. The various responses will all be identical,
|
||
except for the tag in the To field, which is different for
|
||
each one. It can therefore be used as a means to
|
||
disambiguate them.
|
||
|
||
This method MUST be supported by SIP proxy, redirect and user agent
|
||
servers as well as clients.
|
||
|
||
4.2.3 OPTIONS
|
||
|
||
The server is being queried as to its capabilities. A server that
|
||
believes it can contact the user, such as a user agent where the user
|
||
is logged in and has been recently active, MAY respond to this
|
||
request with a capability set. A called user agent MAY return a
|
||
status reflecting how it would have responded to an invitation, e.g.,
|
||
|
||
|
||
|
||
|
||
Handley, et al. Standards Track [Page 29]
|
||
|
||
RFC 2543 SIP: Session Initiation Protocol March 1999
|
||
|
||
|
||
600 (Busy). Such a server SHOULD return an Allow header field
|
||
indicating the methods that it supports. Proxy and redirect servers
|
||
simply forward the request without indicating their capabilities.
|
||
|
||
This method MUST be supported by SIP proxy, redirect and user agent
|
||
servers, registrars and clients.
|
||
|
||
4.2.4 BYE
|
||
|
||
The user agent client uses BYE to indicate to the server that it
|
||
wishes to release the call. A BYE request is forwarded like an INVITE
|
||
request and MAY be issued by either caller or callee. A party to a
|
||
call SHOULD issue a BYE request before releasing a call ("hanging
|
||
up"). A party receiving a BYE request MUST cease transmitting media
|
||
streams specifically directed at the party issuing the BYE request.
|
||
|
||
If the INVITE request contained a Contact header, the callee SHOULD
|
||
send a BYE request to that address rather than the From address.
|
||
|
||
This method MUST be supported by proxy servers and SHOULD be
|
||
supported by redirect and user agent SIP servers.
|
||
|
||
4.2.5 CANCEL
|
||
|
||
The CANCEL request cancels a pending request with the same Call-ID,
|
||
To, From and CSeq (sequence number only) header field values, but
|
||
does not affect a completed request. (A request is considered
|
||
completed if the server has returned a final status response.)
|
||
|
||
A user agent client or proxy client MAY issue a CANCEL request at any
|
||
time. A proxy, in particular, MAY choose to send a CANCEL to
|
||
destinations that have not yet returned a final response after it has
|
||
received a 2xx or 6xx response for one or more of the parallel-search
|
||
requests. A proxy that receives a CANCEL request forwards the request
|
||
to all destinations with pending requests.
|
||
|
||
The Call-ID, To, the numeric part of CSeq and From headers in the
|
||
CANCEL request are identical to those in the original request. This
|
||
allows a CANCEL request to be matched with the request it cancels.
|
||
However, to allow the client to distinguish responses to the CANCEL
|
||
from those to the original request, the CSeq Method component is set
|
||
to CANCEL. The Via header field is initialized to the proxy issuing
|
||
the CANCEL request. (Thus, responses to this CANCEL request only
|
||
reach the issuing proxy.)
|
||
|
||
Once a user agent server has received a CANCEL, it MUST NOT issue a
|
||
2xx response for the cancelled original request.
|
||
|
||
|
||
|
||
|
||
Handley, et al. Standards Track [Page 30]
|
||
|
||
RFC 2543 SIP: Session Initiation Protocol March 1999
|
||
|
||
|
||
A redirect or user agent server receiving a CANCEL request responds
|
||
with a status of 200 (OK) if the transaction exists and a status of
|
||
481 (Transaction Does Not Exist) if not, but takes no further action.
|
||
In particular, any existing call is unaffected.
|
||
|
||
|
||
The BYE request cannot be used to cancel branches of a
|
||
parallel search, since several branches may, through
|
||
intermediate proxies, find the same user agent server and
|
||
then terminate the call. To terminate a call instead of
|
||
just pending searches, the UAC must use BYE instead of or
|
||
in addition to CANCEL. While CANCEL can terminate any
|
||
pending request other than ACK or CANCEL, it is typically
|
||
useful only for INVITE. 200 responses to INVITE and 200
|
||
responses to CANCEL are distinguished by the method in the
|
||
Cseq header field, so there is no ambiguity.
|
||
|
||
This method MUST be supported by proxy servers and SHOULD be
|
||
supported by all other SIP server types.
|
||
|
||
4.2.6 REGISTER
|
||
|
||
A client uses the REGISTER method to register the address listed in
|
||
the To header field with a SIP server.
|
||
|
||
A user agent MAY register with a local server on startup by sending a
|
||
REGISTER request to the well-known "all SIP servers" multicast
|
||
address "sip.mcast.net" (224.0.1.75). This request SHOULD be scoped
|
||
to ensure it is not forwarded beyond the boundaries of the
|
||
administrative system. This MAY be done with either TTL or
|
||
administrative scopes [25], depending on what is implemented in the
|
||
network. SIP user agents MAY listen to that address and use it to
|
||
become aware of the location of other local users [20]; however, they
|
||
do not respond to the request. A user agent MAY also be configured
|
||
with the address of a registrar server to which it sends a REGISTER
|
||
request upon startup.
|
||
|
||
Requests are processed in the order received. Clients SHOULD avoid
|
||
sending a new registration (as opposed to a retransmission) until
|
||
they have received the response from the server for the previous one.
|
||
|
||
|
||
Clients may register from different locations, by necessity
|
||
using different Call-ID values. Thus, the CSeq value cannot
|
||
be used to enforce ordering. Since registrations are
|
||
additive, ordering is less of a problem than if each
|
||
REGISTER request completely replaced all earlier ones.
|
||
|
||
|
||
|
||
|
||
Handley, et al. Standards Track [Page 31]
|
||
|
||
RFC 2543 SIP: Session Initiation Protocol March 1999
|
||
|
||
|
||
The meaning of the REGISTER request-header fields is defined as
|
||
follows. We define "address-of-record" as the SIP address that the
|
||
registry knows the registrand, typically of the form "user@domain"
|
||
rather than "user@host". In third-party registration, the entity
|
||
issuing the request is different from the entity being registered.
|
||
|
||
To: The To header field contains the address-of-record whose
|
||
registration is to be created or updated.
|
||
|
||
From: The From header field contains the address-of-record of the
|
||
person responsible for the registration. For first-party
|
||
registration, it is identical to the To header field value.
|
||
|
||
Request-URI: The Request-URI names the destination of the
|
||
registration request, i.e., the domain of the registrar. The
|
||
user name MUST be empty. Generally, the domains in the Request-
|
||
URI and the To header field have the same value; however, it is
|
||
possible to register as a "visitor", while maintaining one's
|
||
name. For example, a traveler sip:alice@acme.com (To) might
|
||
register under the Request-URI sip:atlanta.hiayh.org , with the
|
||
former as the To header field and the latter as the Request-URI.
|
||
The REGISTER request is no longer forwarded once it has reached
|
||
the server whose authoritative domain is the one listed in the
|
||
Request-URI.
|
||
|
||
Call-ID: All registrations from a client SHOULD use the same Call-ID
|
||
header value, at least within the same reboot cycle.
|
||
|
||
Cseq: Registrations with the same Call-ID MUST have increasing CSeq
|
||
header values. However, the server does not reject out-of-order
|
||
requests.
|
||
|
||
Contact: The request MAY contain a Contact header field; future non-
|
||
REGISTER requests for the URI given in the To header field
|
||
SHOULD be directed to the address(es) given in the Contact
|
||
header.
|
||
|
||
If the request does not contain a Contact header, the registration
|
||
remains unchanged.
|
||
|
||
This is useful to obtain the current list of registrations
|
||
in the response. Registrations using SIP URIs that differ
|
||
in one or more of host, port, transport-param or maddr-
|
||
param (see Figure 3) from an existing registration are
|
||
added to the list of registrations. Other URI types are
|
||
compared according to the standard URI equivalency rules
|
||
for the URI schema. If the URIs are equivalent to that of
|
||
an existing registration, the new registration replaces the
|
||
|
||
|
||
|
||
Handley, et al. Standards Track [Page 32]
|
||
|
||
RFC 2543 SIP: Session Initiation Protocol March 1999
|
||
|
||
|
||
old one if it has a higher q value or, for the same value
|
||
of q, if the ttl value is higher. All current registrations
|
||
MUST share the same action value. Registrations that have
|
||
a different action than current registrations for the same
|
||
user MUST be rejected with status of 409 (Conflict).
|
||
|
||
A proxy server ignores the q parameter when processing non-REGISTER
|
||
requests, while a redirect server simply returns that parameter in
|
||
its Contact response header field.
|
||
|
||
|
||
Having the proxy server interpret the q parameter is not
|
||
sufficient to guide proxy behavior, as it is not clear, for
|
||
example, how long it is supposed to wait between trying
|
||
addresses.
|
||
|
||
If the registration is changed while a user agent or proxy server
|
||
processes an invitation, the new information SHOULD be used.
|
||
|
||
|
||
This allows a service known as "directed pick-up". In the
|
||
telephone network, directed pickup permits a user at a
|
||
remote station who hears his own phone ringing to pick up
|
||
at that station, dial an access code, and be connected to
|
||
the calling user as if he had answered his own phone.
|
||
|
||
A server MAY choose any duration for the registration lifetime.
|
||
Registrations not refreshed after this amount of time SHOULD be
|
||
silently discarded. Responses to a registration SHOULD include an
|
||
Expires header (Section 6.20) or expires Contact parameters (Section
|
||
6.13), indicating the time at which the server will drop the
|
||
registration. If none is present, one hour is assumed. Clients MAY
|
||
request a registration lifetime by indicating the time in an Expires
|
||
header in the request. A server SHOULD NOT use a higher lifetime than
|
||
the one requested, but MAY use a lower one. A single address (if
|
||
host-independent) MAY be registered from several different clients.
|
||
|
||
A client cancels an existing registration by sending a REGISTER
|
||
request with an expiration time (Expires) of zero seconds for a
|
||
particular Contact or the wildcard Contact designated by a "*" for
|
||
all registrations. Registrations are matched based on the user, host,
|
||
port and maddr parameters.
|
||
|
||
The server SHOULD return the current list of registrations in the 200
|
||
response as Contact header fields.
|
||
|
||
It is particularly important that REGISTER requests are authenticated
|
||
since they allow to redirect future requests (see Section 13.2).
|
||
|
||
|
||
|
||
Handley, et al. Standards Track [Page 33]
|
||
|
||
RFC 2543 SIP: Session Initiation Protocol March 1999
|
||
|
||
|
||
Beyond its use as a simple location service, this method is
|
||
needed if there are several SIP servers on a single host.
|
||
In that case, only one of the servers can use the default
|
||
port number.
|
||
|
||
|
||
Support of this method is RECOMMENDED.
|
||
|
||
4.3 Request-URI
|
||
|
||
The Request-URI is a SIP URL as described in Section 2 or a general
|
||
URI. It indicates the user or service to which this request is being
|
||
addressed. Unlike the To field, the Request-URI MAY be re-written by
|
||
proxies.
|
||
|
||
When used as a Request-URI, a SIP-URL MUST NOT contain the
|
||
transport-param, maddr-param, ttl-param, or headers elements. A
|
||
server that receives a SIP-URL with these elements removes them
|
||
before further processing.
|
||
|
||
|
||
Typically, the UAC sets the Request-URI and To to the same
|
||
SIP URL, presumed to remain unchanged over long time
|
||
periods. However, if the UAC has cached a more direct path
|
||
to the callee, e.g., from the Contact header field of a
|
||
response to a previous request, the To would still contain
|
||
the long-term, "public" address, while the Request-URI
|
||
would be set to the cached address.
|
||
|
||
Proxy and redirect servers MAY use the information in the Request-URI
|
||
and request header fields to handle the request and possibly rewrite
|
||
the Request-URI. For example, a request addressed to the generic
|
||
address sip:sales@acme.com is proxied to the particular person, e.g.,
|
||
sip:bob@ny.acme.com , with the To field remaining as
|
||
sip:sales@acme.com. At ny.acme.com , Bob then designates Alice as
|
||
the temporary substitute.
|
||
|
||
The host part of the Request-URI typically agrees with one of the
|
||
host names of the receiving server. If it does not, the server SHOULD
|
||
proxy the request to the address indicated or return a 404 (Not
|
||
Found) response if it is unwilling or unable to do so. For example,
|
||
the Request-URI and server host name can disagree in the case of a
|
||
firewall proxy that handles outgoing calls. This mode of operation is
|
||
similar to that of HTTP proxies.
|
||
|
||
If a SIP server receives a request with a URI indicating a scheme
|
||
other than SIP which that server does not understand, the server MUST
|
||
return a 400 (Bad Request) response. It MUST do this even if the To
|
||
|
||
|
||
|
||
Handley, et al. Standards Track [Page 34]
|
||
|
||
RFC 2543 SIP: Session Initiation Protocol March 1999
|
||
|
||
|
||
header field contains a scheme it does understand. This is because
|
||
proxies are responsible for processing the Request-URI; the To field
|
||
is of end-to-end significance.
|
||
|
||
4.3.1 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".
|
||
|
||
4.4 Option Tags
|
||
|
||
Option tags are unique identifiers used to designate new options in
|
||
SIP. These tags are used in Require (Section 6.30) and Unsupported
|
||
(Section 6.38) fields.
|
||
|
||
Syntax:
|
||
|
||
|
||
option-tag = token
|
||
|
||
|
||
See Section C for a definition of token. The creator of a new SIP
|
||
option MUST either prefix the option with their reverse domain name
|
||
or register the new option with the Internet Assigned Numbers
|
||
Authority (IANA). For example, "com.foo.mynewfeature" is an apt name
|
||
for a feature whose inventor can be reached at "foo.com". Individual
|
||
organizations are then responsible for ensuring that option names
|
||
don't collide. Options registered with IANA have the prefix
|
||
"org.iana.sip.", options described in RFCs have the prefix
|
||
"org.ietf.rfc.N", where N is the RFC number. Option tags are case-
|
||
insensitive.
|
||
|
||
4.4.1 Registering New Option Tags with IANA
|
||
|
||
When registering a new SIP option, the following information MUST be
|
||
provided:
|
||
|
||
o Name and description of option. The name MAY be of any
|
||
length, but SHOULD be no more than twenty characters long. The
|
||
name MUST consist of alphanum (See Figure 3) characters only;
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
Handley, et al. Standards Track [Page 35]
|
||
|
||
RFC 2543 SIP: Session Initiation Protocol March 1999
|
||
|
||
|
||
o Indication of who has change control over the option (for
|
||
example, IETF, ISO, ITU-T, other international standardization
|
||
bodies, a consortium or a particular company or group of
|
||
companies);
|
||
|
||
o A reference to a further description, if available, for
|
||
example (in order of preference) an RFC, a published paper, a
|
||
patent filing, a technical report, documented source code or a
|
||
computer manual;
|
||
|
||
o Contact information (postal and email address);
|
||
|
||
Registrations should be sent to iana@iana.org
|
||
|
||
|
||
This procedure has been borrowed from RTSP [4] and the RTP
|
||
AVP [26].
|
||
|
||
5 Response
|
||
|
||
After receiving and interpreting a request message, the recipient
|
||
responds with a SIP response message. The response message format is
|
||
shown below:
|
||
|
||
|
||
|
||
Response = Status-Line ; Section 5.1
|
||
*( general-header
|
||
| response-header
|
||
| entity-header )
|
||
CRLF
|
||
[ message-body ] ; Section 8
|
||
|
||
|
||
SIP's structure of responses is similar to [H6], but is defined
|
||
explicitly here.
|
||
|
||
5.1 Status-Line
|
||
|
||
The first line of a Response message is the Status-Line, consisting
|
||
of the protocol version (Section 4.3.1) followed by a numeric
|
||
Status-Code and its associated textual phrase, with each element
|
||
separated by SP characters. No CR or LF is allowed except in the
|
||
final CRLF sequence.
|
||
|
||
|
||
|
||
Status-Line = SIP-version SP Status-Code SP Reason-Phrase CRLF
|
||
|
||
|
||
|
||
Handley, et al. Standards Track [Page 36]
|
||
|
||
RFC 2543 SIP: Session Initiation Protocol March 1999
|
||
|
||
|
||
5.1.1 Status Codes and Reason Phrases
|
||
|
||
The Status-Code is a 3-digit integer result code that indicates the
|
||
outcome of the attempt to understand and satisfy the 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. The client is not
|
||
required to examine or display the Reason-Phrase.
|
||
|
||
|
||
|
||
Status-Code = Informational ;Fig. 5
|
||
| Success ;Fig. 5
|
||
| Redirection ;Fig. 6
|
||
| Client-Error ;Fig. 7
|
||
| Server-Error ;Fig. 8
|
||
| Global-Failure ;Fig. 9
|
||
| extension-code
|
||
extension-code = 3DIGIT
|
||
Reason-Phrase = *<TEXT-UTF8, excluding CR, LF>
|
||
|
||
|
||
We provide an overview of the Status-Code below, and provide full
|
||
definitions in Section 7. The first digit of the Status-Code defines
|
||
the class of response. The last two digits do not have any
|
||
categorization role. SIP/2.0 allows 6 values for the first digit:
|
||
|
||
1xx: Informational -- 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.
|
||
|
||
Figures 5 through 9 present the individual values of the numeric
|
||
response codes, and an example set of corresponding reason phrases
|
||
for SIP/2.0. These reason phrases are only recommended; they may be
|
||
replaced by local equivalents without affecting the protocol. Note
|
||
|
||
|
||
|
||
Handley, et al. Standards Track [Page 37]
|
||
|
||
RFC 2543 SIP: Session Initiation Protocol March 1999
|
||
|
||
|
||
that SIP adopts many HTTP/1.1 response codes. SIP/2.0 adds response
|
||
codes in the range starting at x80 to avoid conflicts with newly
|
||
defined HTTP response codes, and adds a new class, 6xx, of response
|
||
codes.
|
||
|
||
SIP response codes are extensible. SIP applications are not required
|
||
to understand the meaning of all registered response codes, though
|
||
such understanding is obviously desirable. However, applications MUST
|
||
understand the class of any response code, as indicated by the first
|
||
digit, and treat any unrecognized response as being equivalent to the
|
||
x00 response code of that class, with the exception that an
|
||
unrecognized response MUST NOT be cached. For example, if a client
|
||
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. In
|
||
such cases, user agents SHOULD present to the user the message body
|
||
returned with the response, since that message body is likely to
|
||
include human-readable information which will explain the unusual
|
||
status.
|
||
|
||
|
||
|
||
Informational = "100" ; Trying
|
||
| "180" ; Ringing
|
||
| "181" ; Call Is Being Forwarded
|
||
| "182" ; Queued
|
||
Success = "200" ; OK
|
||
|
||
|
||
Figure 5: Informational and success status codes
|
||
|
||
|
||
|
||
|
||
|
||
Redirection = "300" ; Multiple Choices
|
||
| "301" ; Moved Permanently
|
||
| "302" ; Moved Temporarily
|
||
| "303" ; See Other
|
||
| "305" ; Use Proxy
|
||
| "380" ; Alternative Service
|
||
|
||
|
||
Figure 6: Redirection status codes
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
Handley, et al. Standards Track [Page 38]
|
||
|
||
RFC 2543 SIP: Session Initiation Protocol March 1999
|
||
|
||
|
||
|
||
|
||
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
|
||
| "409" ; Conflict
|
||
| "410" ; Gone
|
||
| "411" ; Length Required
|
||
| "413" ; Request Entity Too Large
|
||
| "414" ; Request-URI Too Large
|
||
| "415" ; Unsupported Media Type
|
||
| "420" ; Bad Extension
|
||
| "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
|
||
|
||
|
||
Figure 7: Client error status codes
|
||
|
||
|
||
Server-Error = "500" ; Internal Server Error
|
||
| "501" ; Not Implemented
|
||
| "502" ; Bad Gateway
|
||
| "503" ; Service Unavailable
|
||
| "504" ; Gateway Time-out
|
||
| "505" ; SIP Version not supported
|
||
|
||
|
||
Figure 8: Server error status codes
|
||
|
||
|
||
6 Header Field Definitions
|
||
|
||
SIP header fields are similar to HTTP header fields in both syntax
|
||
and semantics. In particular, SIP header fields follow the syntax for
|
||
message-header as described in [H4.2]. The rules for extending header
|
||
fields over multiple lines, and use of multiple message-header fields
|
||
with the same field-name, described in [H4.2] also apply to SIP. The
|
||
|
||
|
||
|
||
Handley, et al. Standards Track [Page 39]
|
||
|
||
RFC 2543 SIP: Session Initiation Protocol March 1999
|
||
|
||
|
||
|
||
|
||
Global-Failure | "600" ; Busy Everywhere
|
||
| "603" ; Decline
|
||
| "604" ; Does not exist anywhere
|
||
| "606" ; Not Acceptable
|
||
|
||
|
||
Figure 9: Global failure status codes
|
||
|
||
|
||
rules in [H4.2] regarding ordering of header fields apply to SIP,
|
||
with the exception of Via fields, see below, whose order matters.
|
||
Additionally, header fields which are hop-by-hop MUST appear before
|
||
any header fields which are end-to-end. Proxies SHOULD NOT reorder
|
||
header fields. Proxies add Via header fields and MAY add other hop-
|
||
by-hop header fields. They can modify certain header fields, such as
|
||
Max-Forwards (Section 6.23) and "fix up" the Via header fields with
|
||
"received" parameters as described in Section 6.40.1. Proxies MUST
|
||
NOT alter any fields that are authenticated (see Section 13.2).
|
||
|
||
The header fields required, optional and not applicable for each
|
||
method are listed in Table 4 and Table 5. The table uses "o" to
|
||
indicate optional, "m" mandatory and "-" for not applicable. A "*"
|
||
indicates that the header fields are needed only if message body is
|
||
not empty. See sections 6.15, 6.16 and 8 for details.
|
||
|
||
The "where" column describes the request and response types with
|
||
which the header field can be used. "R" refers to header fields that
|
||
can be used in requests (that is, request and general header fields).
|
||
"r" designates a response or general-header field as applicable to
|
||
all responses, while a list of numeric values indicates the status
|
||
codes with which the header field can be used. "g" and "e" designate
|
||
general (Section 6.1) and entity header (Section 6.2) fields,
|
||
respectively. If a header field is marked "c", it is copied from the
|
||
request to the response.
|
||
|
||
The "enc." column describes whether this message header field MAY be
|
||
encrypted end-to-end. A "n" designates fields that MUST NOT be
|
||
encrypted, while "c" designates fields that SHOULD be encrypted if
|
||
encryption is used.
|
||
|
||
The "e-e" column has a value of "e" for end-to-end and a value of "h"
|
||
for hop-by-hop header fields.
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
Handley, et al. Standards Track [Page 40]
|
||
|
||
RFC 2543 SIP: Session Initiation Protocol March 1999
|
||
|
||
|
||
|
||
where enc. e-e ACK BYE CAN INV OPT REG
|
||
__________________________________________________________
|
||
Accept R e - - - o o o
|
||
Accept 415 e - - - o o o
|
||
Accept-Encoding R e - - - o o o
|
||
Accept-Encoding 415 e - - - o o o
|
||
Accept-Language R e - o o o o o
|
||
Accept-Language 415 e - o o o o o
|
||
Allow 200 e - - - - m -
|
||
Allow 405 e o o o o o o
|
||
Authorization R e o o o o o o
|
||
Call-ID gc n e m m m m m m
|
||
Contact R e o - - o o o
|
||
Contact 1xx e - - - o o -
|
||
Contact 2xx e - - - o o o
|
||
Contact 3xx e - o - o o o
|
||
Contact 485 e - o - o o o
|
||
Content-Encoding e e o - - o o o
|
||
Content-Length e e o - - o o o
|
||
Content-Type e e * - - * * *
|
||
CSeq gc n e m m m m m m
|
||
Date g e o o o o o o
|
||
Encryption g n e o o o o o o
|
||
Expires g e - - - o - o
|
||
From gc n e m m m m m m
|
||
Hide R n h o o o o o o
|
||
Max-Forwards R n e o o o o o o
|
||
Organization g c h - - - o o o
|
||
|
||
|
||
Table 4: Summary of header fields, A--O
|
||
|
||
Other header fields can be added as required; a server MUST ignore
|
||
header fields not defined in this specification that it does not
|
||
understand. A proxy MUST NOT remove or modify header fields not
|
||
defined in this specification that it does not understand. A compact
|
||
form of these header fields is also defined in Section 9 for use over
|
||
UDP when the request has to fit into a single packet and size is an
|
||
issue.
|
||
|
||
Table 6 in Appendix A lists those header fields that different client
|
||
and server types MUST be able to parse.
|
||
|
||
6.1 General Header Fields
|
||
|
||
General header fields apply to both request and response messages.
|
||
The "general-header" field names can be extended reliably only in
|
||
combination with a change in the protocol version. However, new or
|
||
|
||
|
||
Handley, et al. Standards Track [Page 41]
|
||
|
||
RFC 2543 SIP: Session Initiation Protocol March 1999
|
||
|
||
|
||
|
||
where enc. e-e ACK BYE CAN INV OPT REG
|
||
___________________________________________________________________
|
||
Proxy-Authenticate 407 n h o o o o o o
|
||
Proxy-Authorization R n h o o o o o o
|
||
Proxy-Require R n h o o o o o o
|
||
Priority R c e - - - o - -
|
||
Require R e o o o o o o
|
||
Retry-After R c e - - - - - o
|
||
Retry-After 404,480,486 c e o o o o o o
|
||
503 c e o o o o o o
|
||
600,603 c e o o o o o o
|
||
Response-Key R c e - o o o o o
|
||
Record-Route R h o o o o o o
|
||
Record-Route 2xx h o o o o o o
|
||
Route R h o o o o o o
|
||
Server r c e o o o o o o
|
||
Subject R c e - - - o - -
|
||
Timestamp g e o o o o o o
|
||
To gc(1) n e m m m m m m
|
||
Unsupported 420 e o o o o o o
|
||
User-Agent g c e o o o o o o
|
||
Via gc(2) n e m m m m m m
|
||
Warning r e o o o o o o
|
||
WWW-Authenticate 401 c e o o o o o o
|
||
|
||
|
||
Table 5: Summary of header fields, P--Z; (1): copied with possible
|
||
addition of tag; (2): UAS removes first Via header field
|
||
|
||
experimental header fields MAY be given the semantics of general
|
||
header fields if all parties in the communication recognize them to
|
||
be "general-header" fields. Unrecognized header fields are treated as
|
||
"entity-header" fields.
|
||
|
||
6.2 Entity Header Fields
|
||
|
||
The "entity-header" fields define meta-information about the
|
||
message-body or, if no body is present, about the resource identified
|
||
by the request. The term "entity header" is an HTTP 1.1 term where
|
||
the response body can contain a transformed version of the message
|
||
body. The original message body is referred to as the "entity". We
|
||
retain the same terminology for header fields but usually refer to
|
||
the "message body" rather then the entity as the two are the same in
|
||
SIP.
|
||
|
||
|
||
|
||
|
||
|
||
|
||
Handley, et al. Standards Track [Page 42]
|
||
|
||
RFC 2543 SIP: Session Initiation Protocol March 1999
|
||
|
||
|
||
6.3 Request Header Fields
|
||
|
||
The "request-header" fields allow the client to pass additional
|
||
information about the request, and about the client itself, to the
|
||
server. These fields act as request modifiers, with semantics
|
||
equivalent to the parameters of a programming language method
|
||
invocation.
|
||
|
||
The "request-header" field names can be extended reliably only in
|
||
combination with a change in the protocol version. However, new or
|
||
experimental header fields MAY be given the semantics of "request-
|
||
header" fields if all parties in the communication recognize them to
|
||
be request-header fields. Unrecognized header fields are treated as
|
||
"entity-header" fields.
|
||
|
||
6.4 Response Header Fields
|
||
|
||
The "response-header" fields allow the server to pass additional
|
||
information about the response which cannot be placed in the Status-
|
||
Line. These header fields give information about the server and about
|
||
further access to the resource identified by the Request-URI.
|
||
|
||
Response-header field names can be extended reliably only in
|
||
combination with a change in the protocol version. However, new or
|
||
experimental header fields MAY be given the semantics of "response-
|
||
header" fields if all parties in the communication recognize them to
|
||
be "response-header" fields. Unrecognized header fields are treated
|
||
as "entity-header" fields.
|
||
|
||
6.5 End-to-end and Hop-by-hop Headers
|
||
|
||
End-to-end headers MUST be transmitted unmodified across all proxies,
|
||
while hop-by-hop headers MAY be modified or added by proxies.
|
||
|
||
6.6 Header Field Format
|
||
|
||
Header fields ("general-header", "request-header", "response-header",
|
||
and "entity-header") follow the same generic header format as that
|
||
given in Section 3.1 of RFC 822 [24]. Each header field consists of a
|
||
name followed by a colon (":") and the field value. Field names are
|
||
case-insensitive. The field value MAY be preceded by any amount of
|
||
leading white space (LWS), though a single space (SP) is preferred.
|
||
Header fields can be extended over multiple lines by preceding each
|
||
extra line with at least one SP or horizontal tab (HT). Applications
|
||
MUST follow HTTP "common form" when generating these constructs,
|
||
since there might exist some implementations that fail to accept
|
||
anything beyond the common forms.
|
||
|
||
|
||
|
||
|
||
Handley, et al. Standards Track [Page 43]
|
||
|
||
RFC 2543 SIP: Session Initiation Protocol March 1999
|
||
|
||
|
||
message-header = field-name ":" [ field-value ] CRLF
|
||
field-name = token
|
||
field-value = *( field-content | LWS )
|
||
field-content = < the OCTETs making up the field-value
|
||
and consisting of either *TEXT-UTF8
|
||
or combinations of token,
|
||
separators, and quoted-string>
|
||
|
||
|
||
The relative order of header fields with different field names is not
|
||
significant. Multiple header fields 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 (i.e., #(values)).
|
||
It MUST be possible to combine the multiple header fields 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 order in which header fields with the same
|
||
field-name are received is therefore significant to the
|
||
interpretation of the combined field value, and thus a proxy MUST NOT
|
||
change the order of these field values when a message is forwarded.
|
||
|
||
Field names are not case-sensitive, although their values may be.
|
||
|
||
6.7 Accept
|
||
|
||
The Accept header follows the syntax defined in [H14.1]. The
|
||
semantics are also identical, with the exception that if no Accept
|
||
header is present, the server SHOULD assume a default value of
|
||
application/sdp.
|
||
|
||
This request-header field is used only with the INVITE, OPTIONS and
|
||
REGISTER request methods to indicate what media types are acceptable
|
||
in the response.
|
||
|
||
Example:
|
||
|
||
|
||
Accept: application/sdp;level=1, application/x-private, text/html
|
||
|
||
|
||
|
||
6.8 Accept-Encoding
|
||
|
||
The Accept-Encoding request-header field is similar to Accept, but
|
||
restricts the content-codings [H3.4.1] that are acceptable in the
|
||
response. See [H14.3]. The syntax of this header is defined in
|
||
[H14.3]. The semantics in SIP are identical to those defined in
|
||
[H14.3].
|
||
|
||
|
||
|
||
Handley, et al. Standards Track [Page 44]
|
||
|
||
RFC 2543 SIP: Session Initiation Protocol March 1999
|
||
|
||
|
||
6.9 Accept-Language
|
||
|
||
The Accept-Language header follows the syntax defined in [H14.4]. The
|
||
rules for ordering the languages based on the q parameter apply to
|
||
SIP as well. When used in SIP, the Accept-Language request-header
|
||
field can be used to allow the client to indicate to the server in
|
||
which language it would prefer to receive reason phrases, session
|
||
descriptions or status responses carried as message bodies. A proxy
|
||
MAY use this field to help select the destination for the call, for
|
||
example, a human operator conversant in a language spoken by the
|
||
caller.
|
||
|
||
Example:
|
||
|
||
|
||
Accept-Language: da, en-gb;q=0.8, en;q=0.7
|
||
|
||
|
||
6.10 Allow
|
||
|
||
The Allow entity-header field lists the set of methods supported by
|
||
the resource identified by the Request-URI. The purpose of this field
|
||
is strictly to inform the recipient of valid methods associated with
|
||
the resource. An Allow header field MUST be present in a 405 (Method
|
||
Not Allowed) response and SHOULD be present in an OPTIONS response.
|
||
|
||
|
||
|
||
Allow = "Allow" ":" 1#Method
|
||
|
||
|
||
6.11 Authorization
|
||
|
||
A user agent that wishes to authenticate itself with a server --
|
||
usually, but not necessarily, after receiving a 401 response -- MAY
|
||
do so by including an Authorization request-header field with the
|
||
request. The Authorization field value consists of credentials
|
||
containing the authentication information of the user agent for the
|
||
realm of the resource being requested.
|
||
|
||
Section 13.2 overviews the use of the Authorization header, and
|
||
section 15 describes the syntax and semantics when used with PGP
|
||
based authentication.
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
Handley, et al. Standards Track [Page 45]
|
||
|
||
RFC 2543 SIP: Session Initiation Protocol March 1999
|
||
|
||
|
||
6.12 Call-ID
|
||
|
||
The Call-ID general-header field uniquely identifies a particular
|
||
invitation or all registrations of a particular client. Note that a
|
||
single multimedia conference can give rise to several calls with
|
||
different Call-IDs, e.g., if a user invites a single individual
|
||
several times to the same (long-running) conference.
|
||
|
||
For an INVITE request, a callee user agent server SHOULD NOT alert
|
||
the user if the user has responded previously to the Call-ID in the
|
||
INVITE request. If the user is already a member of the conference and
|
||
the conference parameters contained in the session description have
|
||
not changed, a callee user agent server MAY silently accept the call,
|
||
regardless of the Call-ID. An invitation for an existing Call-ID or
|
||
session can change the parameters of the conference. A client
|
||
application MAY decide to simply indicate to the user that the
|
||
conference parameters have been changed and accept the invitation
|
||
automatically or it MAY require user confirmation.
|
||
|
||
A user may be invited to the same conference or call using several
|
||
different Call-IDs. If desired, the client MAY use identifiers within
|
||
the session description to detect this duplication. For example, SDP
|
||
contains a session id and version number in the origin (o) field.
|
||
|
||
The REGISTER and OPTIONS methods use the Call-ID value to
|
||
unambiguously match requests and responses. All REGISTER requests
|
||
issued by a single client SHOULD use the same Call-ID, at least
|
||
within the same boot cycle.
|
||
|
||
|
||
Since the Call-ID is generated by and for SIP, there is no
|
||
reason to deal with the complexity of URL-encoding and
|
||
case-ignoring string comparison.
|
||
|
||
|
||
|
||
Call-ID = ( "Call-ID" | "i" ) ":" local-id "@" host
|
||
local-id = 1*uric
|
||
|
||
|
||
"host" SHOULD be either a fully qualified domain name or a globally
|
||
routable IP address. If this is the case, the "local-id" SHOULD be an
|
||
identifier consisting of URI characters that is unique within "host".
|
||
Use of cryptographically random identifiers [27] is RECOMMENDED. If,
|
||
however, host is not an FQDN or globally routable IP address (such as
|
||
a net 10 address), the local-id MUST be globally unique, as opposed
|
||
|
||
|
||
|
||
|
||
|
||
Handley, et al. Standards Track [Page 46]
|
||
|
||
RFC 2543 SIP: Session Initiation Protocol March 1999
|
||
|
||
|
||
to unique within host. These rules guarantee overall global
|
||
uniqueness of the Call-ID. The value for Call-ID MUST NOT be reused
|
||
for a different call. Call-IDs are case-sensitive.
|
||
|
||
|
||
Using cryptographically random identifiers provides some
|
||
protection against session hijacking. Call-ID, To and From
|
||
are needed to identify a call leg. The distinction between
|
||
call and call leg matters in calls with third-party
|
||
control.
|
||
|
||
For systems which have tight bandwidth constraints, many of the
|
||
mandatory SIP headers have a compact form, as discussed in Section 9.
|
||
These are alternate names for the headers which occupy less space in
|
||
the message. In the case of Call-ID, the compact form is i.
|
||
|
||
For example, both of the following are valid:
|
||
|
||
Call-ID: f81d4fae-7dec-11d0-a765-00a0c91e6bf6@foo.bar.com
|
||
|
||
|
||
or
|
||
|
||
i:f81d4fae-7dec-11d0-a765-00a0c91e6bf6@foo.bar.com
|
||
|
||
|
||
|
||
6.13 Contact
|
||
|
||
The Contact general-header field can appear in INVITE, ACK, and
|
||
REGISTER requests, and in 1xx, 2xx, 3xx, and 485 responses. In
|
||
general, it provides a URL where the user can be reached for further
|
||
communications.
|
||
|
||
INVITE and ACK requests: INVITE and ACK requests MAY contain Contact
|
||
headers indicating from which location the request is
|
||
originating.
|
||
|
||
|
||
This allows the callee to send future requests, such as
|
||
BYE, directly to the caller instead of through a series of
|
||
proxies. The Via header is not sufficient since the
|
||
desired address may be that of a proxy.
|
||
|
||
INVITE 2xx responses: A user agent server sending a definitive,
|
||
positive response (2xx) MAY insert a Contact response header
|
||
field indicating the SIP address under which it is reachable
|
||
most directly for future SIP requests, such as ACK, within the
|
||
|
||
|
||
|
||
Handley, et al. Standards Track [Page 47]
|
||
|
||
RFC 2543 SIP: Session Initiation Protocol March 1999
|
||
|
||
|
||
same Call-ID. The Contact header field contains the address of
|
||
the server itself or that of a proxy, e.g., if the host is
|
||
behind a firewall. The value of this Contact header is copied
|
||
into the Request-URI of subsequent requests for this call if the
|
||
response did not also contain a Record-Route header. If the
|
||
response also contains a Record-Route header field, the address
|
||
in the Contact header field is added as the last item in the
|
||
Route header field. See Section 6.29 for details.
|
||
|
||
|
||
The Contact value SHOULD NOT be cached across calls, as it
|
||
may not represent the most desirable location for a
|
||
particular destination address.
|
||
|
||
INVITE 1xx responses: A UAS sending a provisional response (1xx) MAY
|
||
insert a Contact response header. It has the same semantics in a
|
||
1xx response as a 2xx INVITE response. Note that CANCEL requests
|
||
MUST NOT be sent to that address, but rather follow the same
|
||
path as the original request.
|
||
|
||
REGISTER requests: REGISTER requests MAY contain a Contact header
|
||
field indicating at which locations the user is reachable. The
|
||
REGISTER request defines a wildcard Contact field, "*", which
|
||
MUST only be used with Expires: 0 to remove all registrations
|
||
for a particular user. An optional "expires" parameter indicates
|
||
the desired expiration time of the registration. If a Contact
|
||
entry does not have an "expires" parameter, the Expires header
|
||
field is used as the default value. If neither of these
|
||
mechanisms is used, SIP URIs are assumed to expire after one
|
||
hour. Other URI schemes have no expiration times.
|
||
|
||
REGISTER 2xx responses: A REGISTER response MAY return all locations
|
||
at which the user is currently reachable. An optional "expires"
|
||
parameter indicates the expiration time of the registration. If
|
||
a Contact entry does not have an "expires" parameter, the value
|
||
of the Expires header field indicates the expiration time. If
|
||
neither mechanism is used, the expiration time specified in the
|
||
request, explicitly or by default, is used.
|
||
|
||
3xx and 485 responses: The Contact response-header field can be used
|
||
with a 3xx or 485 (Ambiguous) response codes to indicate one or
|
||
more alternate addresses to try. It can appear in responses to
|
||
BYE, INVITE and OPTIONS methods. The Contact header field
|
||
contains URIs giving the new locations or user names to try, or
|
||
may simply specify additional transport parameters. A 300
|
||
(Multiple Choices), 301 (Moved Permanently), 302 (Moved
|
||
Temporarily) or 485 (Ambiguous) response SHOULD contain a
|
||
Contact field containing URIs of new addresses to be tried. A
|
||
|
||
|
||
|
||
Handley, et al. Standards Track [Page 48]
|
||
|
||
RFC 2543 SIP: Session Initiation Protocol March 1999
|
||
|
||
|
||
301 or 302 response may also give the same location and username
|
||
that was being tried 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. The
|
||
client copies the "user", "password", "host", "port" and "user-
|
||
param" elements of the Contact URI into the Request-URI of the
|
||
redirected request and directs the request to the address
|
||
specified by the "maddr" and "port" parameters, using the
|
||
transport protocol given in the "transport" parameter. If
|
||
"maddr" is a multicast address, the value of "ttl" is used as
|
||
the time-to-live value.
|
||
|
||
Note that the Contact header field MAY also refer to a different
|
||
entity than the one originally called. For example, a SIP call
|
||
connected to GSTN gateway may need to deliver a special information
|
||
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
|
||
URLs. For example, it could contain URL's for phones, fax, or irc (if
|
||
they were defined) or a mailto: (RFC 2368, [28]) URL.
|
||
|
||
The following parameters are defined. Additional parameters may be
|
||
defined in other specifications.
|
||
|
||
q: The "qvalue" indicates the relative preference among the locations
|
||
given. "qvalue" values are decimal numbers from 0 to 1, with
|
||
higher values indicating higher preference.
|
||
|
||
action: The "action" parameter is used only when registering with the
|
||
REGISTER request. It indicates whether the client wishes that
|
||
the server proxy or redirect future requests intended for the
|
||
client. If this parameter is not specified the action taken
|
||
depends on server configuration. In its response, the registrar
|
||
SHOULD indicate the mode used. This parameter is ignored for
|
||
other requests.
|
||
|
||
expires: The "expires" parameter indicates how long the URI is valid.
|
||
The parameter is either a number indicating seconds or a quoted
|
||
string containing a SIP-date. If this parameter is not provided,
|
||
the value of the Expires header field determines how long the
|
||
URI is valid. Implementations MAY treat values larger than
|
||
2**32-1 (4294967295 seconds or 136 years) as equivalent to
|
||
2**32-1.
|
||
|
||
|
||
|
||
Contact = ( "Contact" | "m" ) ":"
|
||
("*" | (1# (( name-addr | addr-spec )
|
||
[ *( ";" contact-params ) ] [ comment ] )))
|
||
|
||
name-addr = [ display-name ] "<" addr-spec ">"
|
||
addr-spec = SIP-URL | URI
|
||
display-name = *token | quoted-string
|
||
|
||
contact-params = "q" "=" qvalue
|
||
| "action" "=" "proxy" | "redirect"
|
||
| "expires" "=" delta-seconds | <"> SIP-date <">
|
||
| extension-attribute
|
||
|
||
extension-attribute = extension-name [ "=" extension-value ]
|
||
|
||
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 current syntax corresponds to that for the To and From
|
||
header, which also allows the use of display names.
|
||
|
||
Example:
|
||
|
||
|
||
Contact: "Mr. Watson" <sip:watson@worcester.bell-telephone.com>
|
||
;q=0.7; expires=3600,
|
||
"Mr. Watson" <mailto:watson@bell-telephone.com> ;q=0.1
|
||
|
||
|
||
|
||
6.14 Content-Encoding
|
||
|
||
|
||
|
||
Content-Encoding = ( "Content-Encoding" | "e" ) ":"
|
||
1#content-coding
|
||
|
||
|
||
The Content-Encoding entity-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, the content
|
||
codings MUST be listed in the order in which they were applied.
|
||
|
||
All content-coding values are case-insensitive. The Internet Assigned
|
||
Numbers Authority (IANA) acts as a registry for content-coding value
|
||
tokens. See [3.5] for a definition of the syntax for content-coding.
|
||
|
||
Clients MAY apply content encodings to the body in requests. If the
|
||
server is not capable of decoding the body, or does not recognize any
|
||
of the content-coding values, it MUST send a 415 "Unsupported Media
|
||
Type" response, listing acceptable encodings in the Accept-Encoding
|
||
|
||
|
||
|
||
Handley, et al. Standards Track [Page 50]
|
||
|
||
RFC 2543 SIP: Session Initiation Protocol March 1999
|
||
|
||
|
||
header. A server MAY apply content encodings to the bodies in
|
||
responses. The server MUST only use encodings listed in the Accept-
|
||
Encoding header in the request.
|
||
|
||
6.15 Content-Length
|
||
|
||
The Content-Length entity-header field indicates the size of the
|
||
message-body, in decimal number of octets, sent to the recipient.
|
||
|
||
|
||
|
||
Content-Length = ( "Content-Length" | "l" ) ":" 1*DIGIT
|
||
|
||
|
||
An example is
|
||
|
||
Content-Length: 3495
|
||
|
||
|
||
|
||
Applications SHOULD use this field to indicate the size of the
|
||
message-body to be transferred, regardless of the media type of the
|
||
entity. 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 MUST be set to zero. If a server receives a UDP request
|
||
without Content-Length, it MUST assume that the request encompasses
|
||
the remainder of the packet. If a server receives a UDP request with
|
||
a Content-Length, but the value is larger than the size of the body
|
||
sent in the request, the client SHOULD generate a 400 class response.
|
||
If there is additional data in the UDP packet after the last byte of
|
||
the body has been read, the server MUST treat the remaining data as a
|
||
separate message. This allows several messages to be placed in a
|
||
single UDP packet.
|
||
|
||
If a response does not contain a Content-Length, the client assumes
|
||
that it encompasses the remainder of the UDP packet or the data until
|
||
the TCP connection is closed, as applicable. Section 8 describes how
|
||
to determine the length of the message body.
|
||
|
||
6.16 Content-Type
|
||
|
||
The Content-Type entity-header field indicates the media type of the
|
||
message-body sent to the recipient. The "media-type" element is
|
||
defined in [H3.7].
|
||
|
||
|
||
|
||
Content-Type = ( "Content-Type" | "c" ) ":" media-type
|
||
|
||
|
||
|
||
Handley, et al. Standards Track [Page 51]
|
||
|
||
RFC 2543 SIP: Session Initiation Protocol March 1999
|
||
|
||
|
||
Examples of this header field are
|
||
|
||
Content-Type: application/sdp
|
||
Content-Type: text/html; charset=ISO-8859-4
|
||
|
||
|
||
|
||
6.17 CSeq
|
||
|
||
Clients MUST add the CSeq (command sequence) general-header field to
|
||
every request. A CSeq header field in a request contains the request
|
||
method and a single decimal sequence number chosen by the requesting
|
||
client, unique within a single value of Call-ID. The sequence number
|
||
MUST be expressible as a 32-bit unsigned integer. The initial value
|
||
of the sequence number is arbitrary, but MUST be less than 2**31.
|
||
Consecutive requests that differ in request method, headers or body,
|
||
but have the same Call-ID MUST contain strictly monotonically
|
||
increasing and contiguous sequence numbers; sequence numbers do not
|
||
wrap around. Retransmissions of the same request carry the same
|
||
sequence number, but an INVITE with a different message body or
|
||
different header fields (a "re-invitation") acquires a new, higher
|
||
sequence number. A server MUST echo the CSeq value from the request
|
||
in its response. If the Method value is missing in the received CSeq
|
||
header field, the server fills it in appropriately.
|
||
|
||
The ACK and CANCEL requests MUST contain the same CSeq value as the
|
||
INVITE request that it refers to, while a BYE request cancelling an
|
||
invitation MUST have a higher sequence number. A BYE request with a
|
||
CSeq that is not higher should cause a 400 response to be generated.
|
||
|
||
A user agent server MUST remember the highest sequence number for any
|
||
INVITE request with the same Call-ID value. The server MUST respond
|
||
to, and then discard, any INVITE request with a lower sequence
|
||
number.
|
||
|
||
All requests spawned in a parallel search have the same CSeq value as
|
||
the request triggering the parallel search.
|
||
|
||
|
||
|
||
CSeq = "CSeq" ":" 1*DIGIT Method
|
||
|
||
|
||
|
||
Strictly speaking, CSeq header fields are needed for any
|
||
SIP request that can be cancelled by a BYE or CANCEL
|
||
request or where a client can issue several requests for
|
||
the same Call-ID in close succession. Without a sequence
|
||
|
||
|
||
|
||
Handley, et al. Standards Track [Page 52]
|
||
|
||
RFC 2543 SIP: Session Initiation Protocol March 1999
|
||
|
||
|
||
number, the response to an INVITE could be mistaken for the
|
||
response to the cancellation (BYE or CANCEL). Also, if the
|
||
network duplicates packets or if an ACK is delayed until
|
||
the server has sent an additional response, the client
|
||
could interpret an old response as the response to a re-
|
||
invitation issued shortly thereafter. Using CSeq also makes
|
||
it easy for the server to distinguish different versions of
|
||
an invitation, without comparing the message body.
|
||
|
||
The Method value allows the client to distinguish the response to an
|
||
INVITE request from that of a CANCEL response. CANCEL requests can be
|
||
generated by proxies; if they were to increase the sequence number,
|
||
it might conflict with a later request issued by the user agent for
|
||
the same call.
|
||
|
||
With a length of 32 bits, a server 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 to use a time-based initial sequence
|
||
number, if the client desires. A client could, for example, choose
|
||
the 31 most significant bits of a 32-bit second clock as an initial
|
||
sequence number.
|
||
|
||
Forked requests MUST have the same CSeq as there would be ambiguity
|
||
otherwise between these forked requests and later BYE issued by the
|
||
client user agent.
|
||
|
||
Example:
|
||
|
||
|
||
CSeq: 4711 INVITE
|
||
|
||
|
||
|
||
6.18 Date
|
||
|
||
Date is a general-header field. Its syntax is:
|
||
|
||
|
||
|
||
SIP-date = rfc1123-date
|
||
|
||
|
||
See [H14.19] for a definition of rfc1123-date. Note that unlike
|
||
HTTP/1.1, SIP only supports the most recent RFC1123 [29] formatting
|
||
for dates.
|
||
|
||
|
||
|
||
|
||
Handley, et al. Standards Track [Page 53]
|
||
|
||
RFC 2543 SIP: Session Initiation Protocol March 1999
|
||
|
||
|
||
The Date header field reflects the time when the request or response
|
||
is first sent. Thus, retransmissions have the same Date header field
|
||
value as the original.
|
||
|
||
|
||
The Date header field can be used by simple end systems
|
||
without a battery-backed clock to acquire a notion of
|
||
current time.
|
||
|
||
6.19 Encryption
|
||
|
||
The Encryption general-header field specifies that the content has
|
||
been encrypted. Section 13 describes the overall SIP security
|
||
architecture and algorithms. This header field is intended for end-
|
||
to-end encryption of requests and responses. Requests are encrypted
|
||
based on the public key belonging to the entity named in the To
|
||
header field. Responses are encrypted based on the public key
|
||
conveyed in the Response-Key header field. Note that the public keys
|
||
themselves may not be used for the encryption. This depends on the
|
||
particular algorithms used.
|
||
|
||
For any encrypted message, at least the message body and possibly
|
||
other message header fields are encrypted. An application receiving a
|
||
request or response containing an Encryption header field decrypts
|
||
the body and then concatenates the plaintext to the request line and
|
||
headers of the original message. Message headers in the decrypted
|
||
part completely replace those with the same field name in the
|
||
plaintext part. (Note: If only the body of the message is to be
|
||
encrypted, the body has to be prefixed with CRLF to allow proper
|
||
concatenation.) Note that the request method and Request-URI cannot
|
||
be encrypted.
|
||
|
||
|
||
Encryption only provides privacy; the recipient has no
|
||
guarantee that the request or response came from the party
|
||
listed in the From message header, only that the sender
|
||
used the recipient's public key. However, proxies will not
|
||
be able to modify the request or response.
|
||
|
||
|
||
|
||
Encryption = "Encryption" ":" encryption-scheme 1*SP
|
||
#encryption-params
|
||
encryption-scheme = token
|
||
encryption-params = token "=" ( token | quoted-string )
|
||
|
||
The token indicates the form of encryption used; it is
|
||
described in section 13.
|
||
|
||
|
||
|
||
Handley, et al. Standards Track [Page 54]
|
||
|
||
RFC 2543 SIP: Session Initiation Protocol March 1999
|
||
|
||
|
||
The example in Figure 10 shows a message encrypted with ASCII-armored
|
||
PGP that was generated by applying "pgp -ea" to the payload to be
|
||
encrypted.
|
||
|
||
|
||
INVITE sip:watson@boston.bell-telephone.com SIP/2.0
|
||
Via: SIP/2.0/UDP 169.130.12.5
|
||
From: <sip:a.g.bell@bell-telephone.com>
|
||
To: T. A. Watson <sip:watson@bell-telephone.com>
|
||
Call-ID: 187602141351@worcester.bell-telephone.com
|
||
Content-Length: 885
|
||
Encryption: PGP version=2.6.2,encoding=ascii
|
||
|
||
hQEMAxkp5GPd+j5xAQf/ZDIfGD/PDOM1wayvwdQAKgGgjmZWe+MTy9NEX8O25Red
|
||
h0/pyrd/+DV5C2BYs7yzSOSXaj1C/tTK/4do6rtjhP8QA3vbDdVdaFciwEVAcuXs
|
||
ODxlNAVqyDi1RqFC28BJIvQ5KfEkPuACKTK7WlRSBc7vNPEA3nyqZGBTwhxRSbIR
|
||
RuFEsHSVojdCam4htcqxGnFwD9sksqs6LIyCFaiTAhWtwcCaN437G7mUYzy2KLcA
|
||
zPVGq1VQg83b99zPzIxRdlZ+K7+bAnu8Rtu+ohOCMLV3TPXbyp+err1YiThCZHIu
|
||
X9dOVj3CMjCP66RSHa/ea0wYTRRNYA/G+kdP8DSUcqYAAAE/hZPX6nFIqk7AVnf6
|
||
IpWHUPTelNUJpzUp5Ou+q/5P7ZAsn+cSAuF2YWtVjCf+SQmBR13p2EYYWHoxlA2/
|
||
GgKADYe4M3JSwOtqwU8zUJF3FIfk7vsxmSqtUQrRQaiIhqNyG7KxJt4YjWnEjF5E
|
||
WUIPhvyGFMJaeQXIyGRYZAYvKKklyAJcm29zLACxU5alX4M25lHQd9FR9Zmq6Jed
|
||
wbWvia6cAIfsvlZ9JGocmQYF7pcuz5pnczqP+/yvRqFJtDGD/v3s++G2R+ViVYJO
|
||
z/lxGUZaM4IWBCf+4DUjNanZM0oxAE28NjaIZ0rrldDQmO8V9FtPKdHxkqA5iJP+
|
||
6vGOFti1Ak4kmEz0vM/Nsv7kkubTFhRl05OiJIGr9S1UhenlZv9l6RuXsOY/EwH2
|
||
z8X9N4MhMyXEVuC9rt8/AUhmVQ==
|
||
=bOW+
|
||
|
||
|
||
|
||
Figure 10: PGP Encryption Example
|
||
|
||
|
||
|
||
Since proxies can base their forwarding decision on any combination
|
||
of SIP header fields, there is no guarantee that an encrypted request
|
||
"hiding" header fields will reach the same destination as an
|
||
otherwise identical un-encrypted request.
|
||
|
||
6.20 Expires
|
||
|
||
The Expires entity-header field gives the date and time after which
|
||
the message content expires.
|
||
|
||
This header field is currently defined only for the REGISTER and
|
||
INVITE methods. For REGISTER, it is a request and response-header
|
||
field. In a REGISTER request, the client indicates how long it wishes
|
||
the registration to be valid. In the response, the server indicates
|
||
|
||
|
||
|
||
Handley, et al. Standards Track [Page 55]
|
||
|
||
RFC 2543 SIP: Session Initiation Protocol March 1999
|
||
|
||
|
||
the earliest expiration time of all registrations. The server MAY
|
||
choose a shorter time interval than that requested by the client, but
|
||
SHOULD NOT choose a longer one.
|
||
|
||
For INVITE requests, it is a request and response-header field. In a
|
||
request, the caller can limit the validity of an invitation, for
|
||
example, if a client wants to limit the time duration of a search or
|
||
a conference invitation. A user interface MAY take this as a hint to
|
||
leave the invitation window on the screen even if the user is not
|
||
currently at the workstation. This also limits the duration of a
|
||
search. If the request expires before the search completes, the proxy
|
||
returns a 408 (Request Timeout) status. In a 302 (Moved Temporarily)
|
||
response, a server can advise the client of the maximal duration of
|
||
the redirection.
|
||
|
||
The value of this field can be either a SIP-date or an integer number
|
||
of seconds (in decimal), measured from the receipt of the request.
|
||
The latter approach is preferable for short durations, as it does not
|
||
depend on clients and servers sharing a synchronized clock.
|
||
Implementations MAY treat values larger than 2**32-1 (4294967295 or
|
||
136 years) as equivalent to 2**32-1.
|
||
|
||
|
||
|
||
Expires = "Expires" ":" ( SIP-date | delta-seconds )
|
||
|
||
|
||
Two examples of its use are
|
||
|
||
Expires: Thu, 01 Dec 1994 16:00:00 GMT
|
||
Expires: 5
|
||
|
||
|
||
|
||
6.21 From
|
||
|
||
Requests and responses MUST contain a From general-header field,
|
||
indicating the initiator of the request. The From field MAY contain
|
||
the "tag" parameter. The server copies the From header field from the
|
||
request to the response. 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.
|
||
|
||
The SIP-URL MUST NOT contain the "transport-param", "maddr-param",
|
||
"ttl-param", or "headers" elements. A server that receives a SIP-URL
|
||
with these elements removes them before further processing.
|
||
|
||
|
||
|
||
|
||
|
||
Handley, et al. Standards Track [Page 56]
|
||
|
||
RFC 2543 SIP: Session Initiation Protocol March 1999
|
||
|
||
|
||
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.
|
||
|
||
|
||
|
||
From = ( "From" | "f" ) ":" ( name-addr | addr-spec )
|
||
*( ";" addr-params )
|
||
addr-params = tag-param
|
||
tag-param = "tag=" UUID
|
||
UUID = 1*( hex | "-" )
|
||
|
||
|
||
Examples:
|
||
|
||
|
||
From: "A. G. Bell" <sip:agb@bell-telephone.com>
|
||
From: sip:+12125551212@server.phone2net.com
|
||
From: Anonymous <sip:c8oqz84zk7z@privacy.org>
|
||
|
||
|
||
|
||
The "tag" MAY appear in the From field of a request. It MUST be
|
||
present when it is possible that two instances of a user sharing a
|
||
SIP address can make call invitations with the same Call-ID.
|
||
|
||
The "tag" value MUST be globally unique and cryptographically random
|
||
with at least 32 bits of randomness. A single user maintains the same
|
||
tag throughout the call identified by the Call-ID.
|
||
|
||
|
||
Call-ID, To and From are needed to identify a call leg.
|
||
The distinction between call and call leg matters in calls
|
||
with multiple responses to a forked request. The format is
|
||
similar to the equivalent RFC 822 [24] header, but with a
|
||
URI instead of just an email address.
|
||
|
||
6.22 Hide
|
||
|
||
A client uses the Hide request header field to indicate that it wants
|
||
the path comprised of the Via header fields (Section 6.40) to be
|
||
hidden from subsequent proxies and user agents. It can take two
|
||
forms: Hide: route and Hide: hop. Hide header fields are typically
|
||
added by the client user agent, but MAY be added by any proxy along
|
||
the path.
|
||
|
||
|
||
|
||
|
||
|
||
|
||
Handley, et al. Standards Track [Page 57]
|
||
|
||
RFC 2543 SIP: Session Initiation Protocol March 1999
|
||
|
||
|
||
If a request contains the "Hide: route" header field, all following
|
||
proxies SHOULD hide their previous hop. If a request contains the
|
||
"Hide: hop" header field, only the next proxy SHOULD hide the
|
||
previous hop and then remove the Hide option unless it also wants to
|
||
remain anonymous.
|
||
|
||
A server hides the previous hop by encrypting the "host" and "port"
|
||
parts of the top-most Via header field with an algorithm of its
|
||
choice. Servers SHOULD add additional "salt" to the "host" and "port"
|
||
information prior to encryption to prevent malicious downstream
|
||
proxies from guessing earlier parts of the path based on seeing
|
||
identical encrypted Via headers. Hidden Via fields are marked with
|
||
the "hidden" Via option, as described in Section 6.40.
|
||
|
||
A server that is capable of hiding Via headers MUST attempt to
|
||
decrypt all Via headers marked as "hidden" to perform loop detection.
|
||
Servers that are not capable of hiding can ignore hidden Via fields
|
||
in their loop detection algorithm.
|
||
|
||
|
||
If hidden headers were not marked, a proxy would have to
|
||
decrypt all headers to detect loops, just in case one was
|
||
encrypted, as the Hide: Hop option may have been removed
|
||
along the way.
|
||
|
||
A host MUST NOT add such a "Hide: hop" header field unless it can
|
||
guarantee it will only send a request for this destination to the
|
||
same next hop. The reason for this is that it is possible that the
|
||
request will loop back through this same hop from a downstream proxy.
|
||
The loop will be detected by the next hop if the choice of next hop
|
||
is fixed, but could loop an arbitrary number of times otherwise.
|
||
|
||
A client requesting "Hide: route" can only rely on keeping the
|
||
request path private if it sends the request to a trusted proxy.
|
||
Hiding the route of a SIP request is of limited value if the request
|
||
results in data packets being exchanged directly between the calling
|
||
and called user agent.
|
||
|
||
The use of Hide header fields is discouraged unless path privacy is
|
||
truly needed; Hide fields impose extra processing costs and
|
||
restrictions for proxies and can cause requests to generate 482 (Loop
|
||
Detected) responses that could otherwise be avoided.
|
||
|
||
The encryption of Via header fields is described in more detail in
|
||
Section 13.
|
||
|
||
The Hide header field has the following syntax:
|
||
|
||
|
||
|
||
|
||
Handley, et al. Standards Track [Page 58]
|
||
|
||
RFC 2543 SIP: Session Initiation Protocol March 1999
|
||
|
||
|
||
Hide = "Hide" ":" ( "route" | "hop" )
|
||
|
||
|
||
6.23 Max-Forwards
|
||
|
||
The Max-Forwards request-header field may 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 which appears to be
|
||
failing or looping in mid-chain.
|
||
|
||
|
||
|
||
Max-Forwards = "Max-Forwards" ":" 1*DIGIT
|
||
|
||
|
||
The Max-Forwards value is a decimal integer indicating the remaining
|
||
number of times this request message is allowed to be forwarded.
|
||
|
||
Each proxy or gateway recipient of a request containing a Max-
|
||
Forwards header field MUST check and update its value prior to
|
||
forwarding the request. If the received value is zero (0), the
|
||
recipient MUST NOT forward the request. Instead, for the OPTIONS and
|
||
REGISTER methods, it MUST respond as the final recipient. For all
|
||
other methods, the server returns 483 (Too many hops).
|
||
|
||
If the received Max-Forwards value is greater than zero, then the
|
||
forwarded message MUST contain an updated Max-Forwards field with a
|
||
value decremented by one (1).
|
||
|
||
Example:
|
||
|
||
Max-Forwards: 6
|
||
|
||
|
||
|
||
6.24 Organization
|
||
|
||
The Organization general-header field conveys the name of the
|
||
organization to which the entity issuing the request or response
|
||
belongs. It MAY also be inserted by proxies at the boundary of an
|
||
organization.
|
||
|
||
|
||
The field MAY be used by client software to filter calls.
|
||
|
||
|
||
|
||
|
||
|
||
|
||
Handley, et al. Standards Track [Page 59]
|
||
|
||
RFC 2543 SIP: Session Initiation Protocol March 1999
|
||
|
||
|
||
Organization = "Organization" ":" *TEXT-UTF8
|
||
|
||
|
||
6.25 Priority
|
||
|
||
The Priority request-header field indicates the urgency of the
|
||
request as perceived by the client.
|
||
|
||
|
||
|
||
Priority = "Priority" ":" priority-value
|
||
priority-value = "emergency" | "urgent" | "normal"
|
||
| "non-urgent"
|
||
|
||
|
||
It is RECOMMENDED that the value of "emergency" only be used when
|
||
life, limb or property are in imminent danger.
|
||
|
||
Examples:
|
||
|
||
|
||
Subject: A tornado is heading our way!
|
||
Priority: emergency
|
||
|
||
Subject: Weekend plans
|
||
Priority: non-urgent
|
||
|
||
|
||
|
||
|
||
These are the values of RFC 2076 [30], with the addition of
|
||
"emergency".
|
||
|
||
6.26 Proxy-Authenticate
|
||
|
||
The Proxy-Authenticate response-header field MUST be included as part
|
||
of a 407 (Proxy Authentication Required) response. The field value
|
||
consists of a challenge that indicates the authentication scheme and
|
||
parameters applicable to the proxy for this Request-URI.
|
||
|
||
Unlike its usage within HTTP, the Proxy-Authenticate header MUST be
|
||
passed upstream in the response to the UAC. In SIP, only UAC's can
|
||
authenticate themselves to proxies.
|
||
|
||
The syntax for this header is defined in [H14.33]. See 14 for further
|
||
details on its usage.
|
||
|
||
|
||
|
||
|
||
|
||
Handley, et al. Standards Track [Page 60]
|
||
|
||
RFC 2543 SIP: Session Initiation Protocol March 1999
|
||
|
||
|
||
A client SHOULD cache the credentials used for a particular proxy
|
||
server and realm for the next request to that server. Credentials
|
||
are, in general, valid for a specific value of the Request-URI at a
|
||
particular proxy server. If a client contacts a proxy server that has
|
||
required authentication in the past, but the client does not have
|
||
credentials for the particular Request-URI, it MAY attempt to use the
|
||
most-recently used credential. The server responds with 401
|
||
(Unauthorized) if the client guessed wrong.
|
||
|
||
|
||
This suggested caching behavior is motivated by proxies
|
||
restricting phone calls to authenticated users. It seems
|
||
likely that in most cases, all destinations require the
|
||
same password. Note that end-to-end authentication is
|
||
likely to be destination-specific.
|
||
|
||
6.27 Proxy-Authorization
|
||
|
||
The Proxy-Authorization request-header field allows the client to
|
||
identify itself (or its user) to a proxy which requires
|
||
authentication. The 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.
|
||
|
||
Unlike Authorization, the Proxy-Authorization header field applies
|
||
only to the next outbound proxy that demanded authentication using
|
||
the Proxy- Authenticate field. When multiple proxies are used in a
|
||
chain, the Proxy-Authorization header field is consumed by the first
|
||
outbound proxy that was expecting to receive credentials. A proxy MAY
|
||
relay the credentials from the client request to the next proxy if
|
||
that is the mechanism by which the proxies cooperatively authenticate
|
||
a given request.
|
||
|
||
See [H14.34] for a definition of the syntax, and section 14 for a
|
||
discussion of its usage.
|
||
|
||
6.28 Proxy-Require
|
||
|
||
The Proxy-Require header field is used to indicate proxy-sensitive
|
||
features that MUST be supported by the proxy. Any Proxy-Require
|
||
header field features that are not supported by the proxy MUST be
|
||
negatively acknowledged by the proxy to the client if not supported.
|
||
Proxy servers treat this field identically to the Require field.
|
||
|
||
See Section 6.30 for more details on the mechanics of this message
|
||
and a usage example.
|
||
|
||
|
||
|
||
|
||
|
||
Handley, et al. Standards Track [Page 61]
|
||
|
||
RFC 2543 SIP: Session Initiation Protocol March 1999
|
||
|
||
|
||
6.29 Record-Route
|
||
|
||
The Record-Route request and response header field is added to a
|
||
request by any proxy that insists on being in the path of subsequent
|
||
requests for the same call leg. It contains a globally reachable
|
||
Request-URI that identifies the proxy server. Each proxy server adds
|
||
its Request-URI to the beginning of the list.
|
||
|
||
The server copies the Record-Route header field unchanged into the
|
||
response. (Record-Route is only relevant for 2xx responses.)
|
||
|
||
The calling user agent client copies the Record-Route header into a
|
||
Route header field of subsequent requests within the same call leg,
|
||
reversing the order of requests, so that the first entry is closest
|
||
to the user agent client. If the response contained a Contact header
|
||
field, the calling user agent adds its content as the last Route
|
||
header. Unless this would cause a loop, any client MUST send any
|
||
subsequent requests for this call leg to the first Request-URI in the
|
||
Route request header field and remove that entry.
|
||
|
||
The calling user agent MUST NOT use the Record-Route header field in
|
||
requests that contain Route header fields.
|
||
|
||
|
||
Some proxies, such as those controlling firewalls or in an
|
||
automatic call distribution (ACD) system, need to maintain
|
||
call state and thus need to receive any BYE and ACK packets
|
||
for the call.
|
||
|
||
The Record-Route header field has the following syntax:
|
||
|
||
|
||
Record-Route = "Record-Route" ":" 1# name-addr
|
||
|
||
|
||
Proxy servers SHOULD use the "maddr" URL parameter containing their
|
||
address to ensure that subsequent requests are guaranteed to reach
|
||
exactly the same server.
|
||
|
||
Example for a request that has traversed the hosts ieee.org and
|
||
bell-telephone.com , in that order:
|
||
|
||
Record-Route: <sip:a.g.bell@bell-telephone.com>,
|
||
<sip:a.bell@ieee.org>
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
Handley, et al. Standards Track [Page 62]
|
||
|
||
RFC 2543 SIP: Session Initiation Protocol March 1999
|
||
|
||
|
||
6.30 Require
|
||
|
||
The Require request-header field is used by clients to tell user
|
||
agent servers about options that the client expects the server to
|
||
support in order to properly process the request. If a server does
|
||
not understand the option, it MUST respond by returning status code
|
||
420 (Bad Extension) and list those options it does not understand in
|
||
the Unsupported header.
|
||
|
||
|
||
|
||
Require = "Require" ":" 1#option-tag
|
||
|
||
|
||
Example:
|
||
|
||
C->S: INVITE sip:watson@bell-telephone.com SIP/2.0
|
||
Require: com.example.billing
|
||
Payment: sheep_skins, conch_shells
|
||
|
||
S->C: SIP/2.0 420 Bad Extension
|
||
Unsupported: com.example.billing
|
||
|
||
|
||
|
||
This is to make sure 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.
|
||
|
||
Proxy and redirect servers MUST ignore features that are not
|
||
understood. If a particular extension requires that intermediate
|
||
devices support it, the extension MUST be tagged in the Proxy-Require
|
||
field as well (see Section 6.28).
|
||
|
||
6.31 Response-Key
|
||
|
||
The Response-Key request-header field can be used by a client to
|
||
request the key that the called user agent SHOULD use to encrypt the
|
||
response with. The syntax is:
|
||
|
||
|
||
|
||
|
||
|
||
Handley, et al. Standards Track [Page 63]
|
||
|
||
RFC 2543 SIP: Session Initiation Protocol March 1999
|
||
|
||
|
||
Response-Key = "Response-Key" ":" key-scheme 1*SP #key-param
|
||
key-scheme = token
|
||
key-param = token "=" ( token | quoted-string )
|
||
|
||
|
||
The "key-scheme" gives the type of encryption to be used for the
|
||
response. Section 13 describes security schemes.
|
||
|
||
If the client insists that the server return an encrypted response,
|
||
it includes a
|
||
|
||
Require: org.ietf.sip.encrypt-response
|
||
|
||
header field in its request. If the server cannot encrypt for
|
||
whatever reason, it MUST follow normal Require header field
|
||
procedures and return a 420 (Bad Extension) response. If this Require
|
||
header field is not present, a server SHOULD still encrypt if it can.
|
||
|
||
6.32 Retry-After
|
||
|
||
The Retry-After general-header field can be used with a 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),
|
||
600 (Busy), or 603 (Decline) response to indicate when the called
|
||
party anticipates being available again. The value of this field can
|
||
be either an SIP-date or an integer number of seconds (in decimal)
|
||
after the time of the response.
|
||
|
||
A REGISTER request MAY include this header field when deleting
|
||
registrations with "Contact: * ;expires: 0". The Retry-After value
|
||
then indicates when the user might again be reachable. The registrar
|
||
MAY then include this information in responses to future calls.
|
||
|
||
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.
|
||
|
||
|
||
|
||
Retry-After = "Retry-After" ":" ( SIP-date | delta-seconds )
|
||
[ comment ] [ ";" "duration" "=" delta-seconds ]
|
||
|
||
|
||
Examples of its use are
|
||
|
||
Retry-After: Mon, 21 Jul 1997 18:48:34 GMT (I'm in a meeting)
|
||
|
||
|
||
|
||
Handley, et al. Standards Track [Page 64]
|
||
|
||
RFC 2543 SIP: Session Initiation Protocol March 1999
|
||
|
||
|
||
Retry-After: Mon, 01 Jan 9999 00:00:00 GMT
|
||
(Dear John: Don't call me back, ever)
|
||
Retry-After: Fri, 26 Sep 1997 21:00:00 GMT;duration=3600
|
||
Retry-After: 120
|
||
|
||
|
||
|
||
In the third example, the callee is reachable for one hour starting
|
||
at 21:00 GMT. In the last example, the delay is 2 minutes.
|
||
|
||
6.33 Route
|
||
|
||
The Route request-header field determines the route taken by a
|
||
request. Each host removes the first entry and then proxies the
|
||
request to the host listed in that entry, also using it as the
|
||
Request-URI. The operation is further described in Section 6.29.
|
||
|
||
The Route header field has the following syntax:
|
||
|
||
|
||
Route = "Route" ":" 1# name-addr
|
||
|
||
|
||
6.34 Server
|
||
|
||
The Server response-header field contains information about the
|
||
software used by the user agent server to handle the request. The
|
||
syntax for this field is defined in [H14.39].
|
||
|
||
6.35 Subject
|
||
|
||
This is intended to provide a summary, or to indicate the nature, of
|
||
the call, allowing call filtering without having to parse the session
|
||
description. (Also, the session description does not have to use the
|
||
same subject indication as the invitation.)
|
||
|
||
|
||
|
||
Subject = ( "Subject" | "s" ) ":" *TEXT-UTF8
|
||
|
||
|
||
Example:
|
||
|
||
|
||
Subject: Tune in - they are talking about your work!
|
||
|
||
|
||
|
||
|
||
|
||
|
||
Handley, et al. Standards Track [Page 65]
|
||
|
||
RFC 2543 SIP: Session Initiation Protocol March 1999
|
||
|
||
|
||
6.36 Timestamp
|
||
|
||
The timestamp general-header field describes when the client sent the
|
||
request to the server. The value of the timestamp is of significance
|
||
only to the client and it MAY use any timescale. The server MUST echo
|
||
the exact same value and MAY, if it has accurate information about
|
||
this, add a floating point number indicating the number of seconds
|
||
that have elapsed since it has received the request. The timestamp is
|
||
used by the client to compute the round-trip time to the server so
|
||
that it can adjust the timeout value for retransmissions.
|
||
|
||
|
||
|
||
Timestamp = "Timestamp" ":" *(DIGIT) [ "." *(DIGIT) ] [ delay ]
|
||
delay = *(DIGIT) [ "." *(DIGIT) ]
|
||
|
||
|
||
Note that there MUST NOT be any LWS between a DIGIT and the decimal
|
||
point.
|
||
|
||
6.37 To
|
||
|
||
The To general-header field specifies recipient of the request, with
|
||
the same SIP URL syntax as the From field.
|
||
|
||
|
||
|
||
To = ( "To" | "t" ) ":" ( name-addr | addr-spec )
|
||
*( ";" addr-params )
|
||
|
||
|
||
Requests and responses MUST contain a To general-header field,
|
||
indicating the desired recipient of the request. The optional
|
||
"display-name" is meant to be rendered by a human-user interface.
|
||
The UAS or redirect server copies the To header field into its
|
||
response, and MUST add a "tag" parameter if the request contained
|
||
more than one Via header field.
|
||
|
||
|
||
If there was more than one Via header field, the request
|
||
was handled by at least one proxy server. Since the
|
||
receiver cannot know whether any of the proxy servers
|
||
forked the request, it is safest to assume that they might
|
||
have.
|
||
|
||
The SIP-URL MUST NOT contain the "transport-param", "maddr-param",
|
||
"ttl-param", or "headers" elements. A server that receives a SIP-URL
|
||
with these elements removes them before further processing.
|
||
|
||
|
||
|
||
Handley, et al. Standards Track [Page 66]
|
||
|
||
RFC 2543 SIP: Session Initiation Protocol March 1999
|
||
|
||
|
||
The "tag" parameter serves as a general mechanism to distinguish
|
||
multiple instances of a user identified by a single SIP URL. As
|
||
proxies can fork requests, the same request can reach multiple
|
||
instances of a user (mobile and home phones, for example). As each
|
||
can respond, there needs to be a means to distinguish the responses
|
||
from each at the caller. The situation also arises with multicast
|
||
requests. The tag in the To header field serves to distinguish
|
||
responses at the UAC. It MUST be placed in the To field of the
|
||
response by each instance when there is a possibility that the
|
||
request was forked at an intermediate proxy. The "tag" MUST be added
|
||
by UAS, registrars and redirect servers, but MUST NOT be inserted
|
||
into responses forwarded upstream by proxies. The "tag" is added for
|
||
all definitive responses for all methods, and MAY be added for
|
||
informational responses from a UAS or redirect server. All subsequent
|
||
transactions between two entities MUST include the "tag" parameter,
|
||
as described in Section 11.
|
||
|
||
See Section 6.21 for details of the "tag" parameter.
|
||
|
||
The "tag" parameter in To headers is ignored when matching responses
|
||
to requests that did not contain a "tag" in their To header.
|
||
|
||
A SIP server returns a 400 (Bad Request) response if it receives a
|
||
request with a To header field containing a URI with a scheme it does
|
||
not recognize.
|
||
|
||
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.
|
||
|
||
The following are examples of valid To headers:
|
||
|
||
To: The Operator <sip:operator@cs.columbia.edu>;tag=287447
|
||
To: sip:+12125551212@server.phone2net.com
|
||
|
||
|
||
|
||
|
||
Call-ID, To and From are needed to identify a call leg.
|
||
The distinction between call and call leg matters in calls
|
||
with multiple responses from a forked request. The "tag" is
|
||
added to the To header field in the response to allow
|
||
forking of future requests for the same call by proxies,
|
||
while addressing only one of the possibly several
|
||
responding user agent servers. It also allows several
|
||
instances of the callee to send requests that can be
|
||
distinguished.
|
||
|
||
|
||
|
||
|
||
Handley, et al. Standards Track [Page 67]
|
||
|
||
RFC 2543 SIP: Session Initiation Protocol March 1999
|
||
|
||
|
||
6.38 Unsupported
|
||
|
||
The Unsupported response-header field lists the features not
|
||
supported by the server. See Section 6.30 for a usage example and
|
||
motivation.
|
||
|
||
Syntax:
|
||
|
||
|
||
|
||
Unsupported = "Unsupported" ":" 1#option-tag
|
||
|
||
|
||
6.39 User-Agent
|
||
|
||
The User-Agent general-header field contains information about the
|
||
client user agent originating the request. The syntax and semantics
|
||
are defined in [H14.42].
|
||
|
||
6.40 Via
|
||
|
||
The Via field indicates the path taken by the request so far. This
|
||
prevents request looping and ensures replies take the same path as
|
||
the requests, which assists in firewall traversal and other unusual
|
||
routing situations.
|
||
|
||
6.40.1 Requests
|
||
|
||
The client originating the request MUST insert into the request a Via
|
||
field containing its host name or network address and, if not the
|
||
default port number, the port number at which it wishes to receive
|
||
responses. (Note that this port number can differ from the UDP source
|
||
port number of the request.) A fully-qualified domain name is
|
||
RECOMMENDED. Each subsequent proxy server that sends the request
|
||
onwards MUST add its own additional Via field before any existing Via
|
||
fields. A proxy that receives a redirection (3xx) response and then
|
||
searches recursively, MUST use the same Via headers as on the
|
||
original proxied request.
|
||
|
||
A proxy SHOULD check the top-most Via header field to ensure that it
|
||
contains the sender's correct network address, as seen from that
|
||
proxy. If the sender's address is incorrect, the proxy MUST add an
|
||
additional "received" attribute, as described 6.40.2.
|
||
|
||
|
||
A host behind a network address translator (NAT) or
|
||
firewall may not be able to insert a network address into
|
||
the Via header that can be reached by the next hop beyond
|
||
|
||
|
||
|
||
Handley, et al. Standards Track [Page 68]
|
||
|
||
RFC 2543 SIP: Session Initiation Protocol March 1999
|
||
|
||
|
||
the NAT. Use of the received attribute allows SIP requests
|
||
to traverse NAT's which only modify the source IP address.
|
||
NAT's which modify port numbers, called Network Address
|
||
Port Translator's (NAPT) will not properly pass SIP when
|
||
transported on UDP, in which case an application layer
|
||
gateway is required. When run over TCP, SIP stands a better
|
||
chance of traversing NAT's, since its behavior is similar
|
||
to HTTP in this case (but of course on different ports).
|
||
|
||
A proxy sending a request to a multicast address MUST add the "maddr"
|
||
parameter to its Via header field, and SHOULD add the "ttl"
|
||
parameter. If a server receives a request which contained an "maddr"
|
||
parameter in the topmost Via field, it SHOULD send the response to
|
||
the multicast address listed in the "maddr" parameter.
|
||
|
||
If a proxy server receives a request which contains its own address
|
||
in the Via header value, it MUST respond with a 482 (Loop Detected)
|
||
status code.
|
||
|
||
A proxy server MUST NOT forward a request to a multicast group which
|
||
already appears in any of the Via headers.
|
||
|
||
|
||
This prevents a malfunctioning proxy server from causing
|
||
loops. Also, it cannot be guaranteed that a proxy server
|
||
can always detect that the address returned by a location
|
||
service refers to a host listed in the Via list, as a
|
||
single host may have aliases or several network interfaces.
|
||
|
||
6.40.2 Receiver-tagged Via Header Fields
|
||
|
||
Normally, every host that sends or forwards a SIP message adds a Via
|
||
field indicating the path traversed. However, it is possible that
|
||
Network Address Translators (NATs) changes the source address and
|
||
port of the request (e.g., from net-10 to a globally routable
|
||
address), in which case the Via header field cannot be relied on to
|
||
route replies. To prevent this, a proxy SHOULD check the top-most Via
|
||
header field to ensure that it contains the sender's correct network
|
||
address, as seen from that proxy. If the sender's address is
|
||
incorrect, the proxy MUST add a "received" parameter to the Via
|
||
header field inserted by the previous hop. Such a modified Via header
|
||
field is known as a receiver-tagged Via header field. An example is:
|
||
|
||
|
||
Via: SIP/2.0/UDP erlang.bell-telephone.com:5060
|
||
Via: SIP/2.0/UDP 10.0.0.1:5060 ;received=199.172.136.3
|
||
|
||
|
||
|
||
|
||
|
||
Handley, et al. Standards Track [Page 69]
|
||
|
||
RFC 2543 SIP: Session Initiation Protocol March 1999
|
||
|
||
|
||
In this example, the message originated from 10.0.0.1 and traversed a
|
||
NAT with the external address border.ieee.org (199.172.136.3) to
|
||
reach erlang.bell-telephone.com. The latter noticed the mismatch,
|
||
and added a parameter to the previous hop's Via header field,
|
||
containing the address that the packet actually came from. (Note that
|
||
the NAT border.ieee.org is not a SIP server.)
|
||
|
||
6.40.3 Responses
|
||
|
||
Via header fields in responses are processed by a proxy or UAC
|
||
according to the following rules:
|
||
|
||
1. The first Via header field should indicate the proxy or
|
||
client processing this response. If it does not, discard
|
||
the message. Otherwise, remove this Via field.
|
||
|
||
2. If there is no second Via header field, this response is
|
||
destined for this client. Otherwise, the processing depends
|
||
on whether the Via field contains a "maddr" parameter or is
|
||
a receiver-tagged field:
|
||
|
||
- If the second Via header field contains a "maddr"
|
||
parameter, send the response to the multicast address
|
||
listed there, using the port indicated in "sent-by", or
|
||
port 5060 if none is present. 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. For
|
||
robustness, responses MUST be sent to the address
|
||
indicated in the "maddr" parameter even if it is not a
|
||
multicast address.
|
||
|
||
- If the second Via header field does not contain a "maddr"
|
||
parameter and is a receiver-tagged field (Section
|
||
6.40.2), send the message to the address in the
|
||
"received" parameter, using the port indicated in the
|
||
"sent-by" value, or using port 5060 if none is present.
|
||
|
||
- If neither of the previous cases apply, send the message
|
||
to the address indicated by the "sent-by" value in the
|
||
second Via header field.
|
||
|
||
6.40.4 User Agent and Redirect Servers
|
||
|
||
A UAS or redirect server sends a response based on one of the
|
||
following rules:
|
||
|
||
o If the first Via header field in the request contains a
|
||
"maddr" parameter, send the response to the multicast address
|
||
|
||
|
||
|
||
Handley, et al. Standards Track [Page 70]
|
||
|
||
RFC 2543 SIP: Session Initiation Protocol March 1999
|
||
|
||
|
||
listed there, using the port indicated in "sent-by", or port
|
||
5060 if none is present. 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. For robustness, responses MUST
|
||
be sent to the address indicated in the "maddr" parameter even
|
||
if it is not a multicast address.
|
||
|
||
o If the address in the "sent-by" value of the first Via field
|
||
differs from the source address of the packet, send the
|
||
response to the actual packet source address, similar to the
|
||
treatment for receiver-tagged Via header fields (Section
|
||
6.40.2).
|
||
|
||
o If neither of these conditions is true, send the response to
|
||
the address contained in the "sent-by" value. If the request
|
||
was sent using TCP, use the existing TCP connection if
|
||
available.
|
||
|
||
6.40.5 Syntax
|
||
|
||
The format for a Via header field is shown in Fig. 11. The defaults
|
||
for "protocol-name" and "transport" are "SIP" and "UDP",
|
||
respectively. The "maddr" parameter, designating the multicast
|
||
address, and the "ttl" parameter, designating the time-to-live (TTL)
|
||
value, are included only if the request was sent via multicast. The
|
||
"received" parameter is added only for receiver-added Via fields
|
||
(Section 6.40.2). For reasons of privacy, a client or proxy may wish
|
||
to hide its Via information by encrypting it (see Section 6.22). The
|
||
"hidden" parameter is included if this header field was hidden by the
|
||
upstream proxy (see 6.22). Note that privacy of the proxy relies on
|
||
the cooperation of the next hop, as the next-hop proxy will, by
|
||
necessity, know the IP address and port number of the source host.
|
||
|
||
|
||
The "branch" parameter is included by every forking proxy. The token
|
||
MUST be unique for each distinct request generated when a proxy
|
||
forks. CANCEL requests MUST have the same branch value as the
|
||
corresponding forked request. When a response arrives at the proxy it
|
||
can use the branch value to figure out which branch the response
|
||
corresponds to. A proxy which generates a single request (non-
|
||
forking) MAY also insert the "branch" parameter. The identifier has
|
||
to be unique only within a set of isomorphic requests.
|
||
|
||
|
||
Via: SIP/2.0/UDP first.example.com:4000;ttl=16
|
||
;maddr=224.2.0.1 ;branch=a7c6a8dlze (Example)
|
||
Via: SIP/2.0/UDP adk8
|
||
|
||
|
||
|
||
|
||
Handley, et al. Standards Track [Page 71]
|
||
|
||
RFC 2543 SIP: Session Initiation Protocol March 1999
|
||
|
||
|
||
|
||
|
||
Via = ( "Via" | "v") ":" 1#( sent-protocol sent-by
|
||
*( ";" via-params ) [ comment ] )
|
||
via-params = via-hidden | via-ttl | via-maddr
|
||
| via-received | via-branch
|
||
via-hidden = "hidden"
|
||
via-ttl = "ttl" "=" ttl
|
||
via-maddr = "maddr" "=" maddr
|
||
via-received = "received" "=" host
|
||
via-branch = "branch" "=" token
|
||
sent-protocol = protocol-name "/" protocol-version "/" transport
|
||
protocol-name = "SIP" | token
|
||
protocol-version = token
|
||
transport = "UDP" | "TCP" | token
|
||
sent-by = ( host [ ":" port ] ) | ( concealed-host )
|
||
concealed-host = token
|
||
ttl = 1*3DIGIT ; 0 to 255
|
||
|
||
|
||
Figure 11: Syntax of Via header field
|
||
|
||
|
||
6.41 Warning
|
||
|
||
The Warning response-header field is used to carry additional
|
||
information about the status of a response. Warning headers are sent
|
||
with responses and have the following format:
|
||
|
||
|
||
|
||
Warning = "Warning" ":" 1#warning-value
|
||
warning-value = warn-code SP warn-agent SP warn-text
|
||
warn-code = 3DIGIT
|
||
warn-agent = ( host [ ":" port ] ) | pseudonym
|
||
; the name or pseudonym of the server adding
|
||
; the Warning header, for use in debugging
|
||
warn-text = quoted-string
|
||
|
||
|
||
A response MAY carry more than one Warning header.
|
||
|
||
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 cache or user, the Accept-Language field in a
|
||
request, or the Content-Language field in a response. The default
|
||
language is i-default [31].
|
||
|
||
|
||
|
||
Handley, et al. Standards Track [Page 72]
|
||
|
||
RFC 2543 SIP: Session Initiation Protocol March 1999
|
||
|
||
|
||
Any server MAY add Warning headers to a response. Proxy servers MUST
|
||
place additional Warning headers before any Authorization headers.
|
||
Within that constraint, Warning headers MUST be added after any
|
||
existing Warning headers not covered by a signature. A proxy server
|
||
MUST NOT delete any Warning header field that it received with a
|
||
response.
|
||
|
||
When multiple Warning headers are attached to a response, the user
|
||
agent SHOULD display as many of them as possible, in the order that
|
||
they appear in the response. If it is not possible to display all of
|
||
the warnings, the user agent first displays warnings that appear
|
||
early in the response.
|
||
|
||
The warn-code consists of three digits. A first digit of "3"
|
||
indicates warnings specific to SIP.
|
||
|
||
This is a list of the currently-defined "warn-code"s, each with a
|
||
recommended warn-text in English, and a description of its meaning.
|
||
Note that these warnings describe failures induced by the session
|
||
description.
|
||
|
||
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.
|
||
|
||
|
||
|
||
|
||
|
||
Handley, et al. Standards Track [Page 73]
|
||
|
||
RFC 2543 SIP: Session Initiation Protocol March 1999
|
||
|
||
|
||
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).
|
||
|
||
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, as in the example below, can be defined
|
||
through IANA.
|
||
|
||
Examples:
|
||
|
||
|
||
Warning: 307 isi.edu "Session parameter 'foo' not understood"
|
||
Warning: 301 isi.edu "Incompatible network address type 'E.164'"
|
||
|
||
|
||
|
||
6.42 WWW-Authenticate
|
||
|
||
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 Request-URI. See [H14.46] for a
|
||
definition of the syntax, and section 14 for an overview of usage.
|
||
|
||
The content of the "realm" parameter SHOULD be displayed to the user.
|
||
A user agent SHOULD cache the authorization credentials for a given
|
||
value of the destination (To header) and "realm" and attempt to re-
|
||
use these values on the next request for that destination.
|
||
|
||
|
||
|
||
|
||
Handley, et al. Standards Track [Page 74]
|
||
|
||
RFC 2543 SIP: Session Initiation Protocol March 1999
|
||
|
||
|
||
In addition to the "basic" and "digest" authentication schemes
|
||
defined in the specifications cited above, SIP defines a new scheme,
|
||
PGP (RFC 2015, [32]), Section 15. Other schemes, such as S/MIME, are
|
||
for further study.
|
||
|
||
7 Status Code Definitions
|
||
|
||
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. Response codes not defined by HTTP/1.1 have
|
||
codes x80 upwards to avoid clashes with future HTTP response codes.
|
||
Also, SIP defines a new class, 6xx. The default behavior for unknown
|
||
response codes is given for each category of codes.
|
||
|
||
7.1 Informational 1xx
|
||
|
||
Informational responses indicate that the server or proxy contacted
|
||
is performing some further action and does not yet have a definitive
|
||
response. The client SHOULD wait for a further response from the
|
||
server, and the server SHOULD send such a response without further
|
||
prompting. A server SHOULD send a 1xx response if it expects to take
|
||
more than 200 ms to obtain a final response. A server MAY issue zero
|
||
or more 1xx responses, with no restriction on their ordering or
|
||
uniqueness. Note that 1xx responses are not transmitted reliably,
|
||
that is, they do not cause the client to send an ACK. Servers are
|
||
free to retransmit informational responses and clients can inquire
|
||
about the current state of call processing by re-sending the request.
|
||
|
||
7.1.1 100 Trying
|
||
|
||
Some unspecified action is being taken on behalf of this call (e.g.,
|
||
a database is being consulted), but the user has not yet been
|
||
located.
|
||
|
||
7.1.2 180 Ringing
|
||
|
||
The called user agent has located a possible location where the user
|
||
has registered recently and is trying to alert the user.
|
||
|
||
7.1.3 181 Call Is Being Forwarded
|
||
|
||
A proxy server MAY use this status code to indicate that the call is
|
||
being forwarded to a different set of destinations.
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
Handley, et al. Standards Track [Page 75]
|
||
|
||
RFC 2543 SIP: Session Initiation Protocol March 1999
|
||
|
||
|
||
7.1.4 182 Queued
|
||
|
||
The called party is temporarily unavailable, but the callee 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, e.g., "5 calls queued; expected waiting time is 15
|
||
minutes". The server MAY issue several 182 responses to update the
|
||
caller about the status of the queued call.
|
||
|
||
7.2 Successful 2xx
|
||
|
||
The request was successful and MUST terminate a search.
|
||
|
||
7.2.1 200 OK
|
||
|
||
The request has succeeded. The information returned with the response
|
||
depends on the method used in the request, for example:
|
||
|
||
BYE: The call has been terminated. The message body is empty.
|
||
|
||
CANCEL: The search has been cancelled. The message body is empty.
|
||
|
||
INVITE: The callee has agreed to participate; the message body
|
||
indicates the callee's capabilities.
|
||
|
||
OPTIONS: The callee has agreed to share its capabilities, included in
|
||
the message body.
|
||
|
||
REGISTER: The registration has succeeded. The client treats the
|
||
message body according to its Content-Type.
|
||
|
||
7.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.
|
||
They SHOULD terminate an existing search, and MAY cause the initiator
|
||
to begin a new search if appropriate.
|
||
|
||
Any redirection (3xx) response MUST NOT suggest any of the addresses
|
||
in the Via (Section 6.40) path of the request in the Contact header
|
||
field. (Addresses match if their host and port number match.)
|
||
|
||
To avoid forwarding loops, a user agent client or proxy MUST check
|
||
whether the address returned by a redirect server equals an address
|
||
tried earlier.
|
||
|
||
|
||
|
||
|
||
|
||
Handley, et al. Standards Track [Page 76]
|
||
|
||
RFC 2543 SIP: Session Initiation Protocol March 1999
|
||
|
||
|
||
7.3.1 300 Multiple Choices
|
||
|
||
The address in the request resolved to several choices, each with its
|
||
own specific location, and the user (or user agent) can select a
|
||
preferred communication end point and redirect its request to that
|
||
location.
|
||
|
||
The response SHOULD include an entity containing a list of resource
|
||
characteristics and location(s) from which the user or user agent can
|
||
choose the one most appropriate, if allowed by the Accept request
|
||
header. The entity format is specified by the media type given in the
|
||
Content-Type header field. The choices SHOULD also be listed as
|
||
Contact fields (Section 6.13). Unlike HTTP, the SIP response MAY
|
||
contain several Contact fields or a list of addresses in a Contact
|
||
field. User agents 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.
|
||
|
||
7.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 6.13). The caller SHOULD update any
|
||
local directories, address books and user location caches with this
|
||
new value and redirect future requests to the address(es) listed.
|
||
|
||
7.3.3 302 Moved Temporarily
|
||
|
||
The requesting client SHOULD retry the request at the new address(es)
|
||
given by the Contact header field (Section 6.13). The duration of
|
||
the redirection can be indicated through an Expires (Section 6.20)
|
||
header. If there is no explicit expiration time, the address is only
|
||
valid for this call and MUST NOT be cached for future calls.
|
||
|
||
7.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 responses MUST only be generated by user agent servers.
|
||
|
||
|
||
|
||
|
||
|
||
Handley, et al. Standards Track [Page 77]
|
||
|
||
RFC 2543 SIP: Session Initiation Protocol March 1999
|
||
|
||
|
||
7.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.
|
||
|
||
7.4 Request Failure 4xx
|
||
|
||
4xx responses are definite failure responses from a particular
|
||
server. The client SHOULD NOT retry the same request without
|
||
modification (e.g., adding appropriate authorization). However, the
|
||
same request to a different server might be successful.
|
||
|
||
7.4.1 400 Bad Request
|
||
|
||
The request could not be understood due to malformed syntax.
|
||
|
||
7.4.2 401 Unauthorized
|
||
|
||
The request requires user authentication.
|
||
|
||
7.4.3 402 Payment Required
|
||
|
||
Reserved for future use.
|
||
|
||
7.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.
|
||
|
||
7.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.
|
||
|
||
7.4.6 405 Method Not Allowed
|
||
|
||
The method specified in the Request-Line is 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.
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
Handley, et al. Standards Track [Page 78]
|
||
|
||
RFC 2543 SIP: Session Initiation Protocol March 1999
|
||
|
||
|
||
7.4.7 406 Not Acceptable
|
||
|
||
The resource identified by the request is only capable of generating
|
||
response entities which have content characteristics not acceptable
|
||
according to the accept headers sent in the request.
|
||
|
||
7.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. The proxy MUST
|
||
return a Proxy-Authenticate header field (section 6.26) containing a
|
||
challenge applicable to the proxy for the requested resource. The
|
||
client MAY repeat the request with a suitable Proxy-Authorization
|
||
header field (section 6.27). SIP access authentication is explained
|
||
in section 13.2 and 14.
|
||
|
||
This status code is used for applications where access to the
|
||
communication channel (e.g., a telephony gateway) rather than the
|
||
callee requires authentication.
|
||
|
||
7.4.9 408 Request Timeout
|
||
|
||
The server could not produce a response, e.g., a user location,
|
||
within the time indicated in the Expires request-header field. The
|
||
client MAY repeat the request without modifications at any later
|
||
time.
|
||
|
||
7.4.10 409 Conflict
|
||
|
||
The request could not be completed due to a conflict with the current
|
||
state of the resource. This response is returned if the action
|
||
parameter in a REGISTER request conflicts with existing
|
||
registrations.
|
||
|
||
7.4.11 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.
|
||
|
||
7.4.12 411 Length Required
|
||
|
||
The server refuses to accept the request without a defined Content-
|
||
Length. The client MAY repeat the request if it adds a valid
|
||
Content-Length header field containing the length of the message-body
|
||
in the request message.
|
||
|
||
|
||
|
||
Handley, et al. Standards Track [Page 79]
|
||
|
||
RFC 2543 SIP: Session Initiation Protocol March 1999
|
||
|
||
|
||
7.4.13 413 Request Entity Too Large
|
||
|
||
The server is refusing to process a request because the request
|
||
entity 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.
|
||
|
||
7.4.14 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.
|
||
|
||
7.4.15 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 requested
|
||
resource for the requested method. The server SHOULD return a list of
|
||
acceptable formats using the Accept, Accept-Encoding and Accept-
|
||
Language header fields.
|
||
|
||
7.4.16 420 Bad Extension
|
||
|
||
The server did not understand the protocol extension specified in a
|
||
Require (Section 6.30) header field.
|
||
|
||
7.4.17 480 Temporarily Unavailable
|
||
|
||
The callee's end system was contacted successfully but the callee is
|
||
currently unavailable (e.g., not logged in or logged in in such a
|
||
manner as to preclude communication with the callee). The response
|
||
MAY indicate a better time to call in the Retry-After header. The
|
||
user could also be available elsewhere (unbeknownst to this host),
|
||
thus, this response does not terminate any searches. The reason
|
||
phrase SHOULD indicate a more precise cause as to why the callee is
|
||
unavailable. This value SHOULD be setable by the user agent. 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 server that recognizes the
|
||
user identified by the Request-URI, but does not currently have a
|
||
valid forwarding location for that user.
|
||
|
||
|
||
|
||
|
||
|
||
|
||
Handley, et al. Standards Track [Page 80]
|
||
|
||
RFC 2543 SIP: Session Initiation Protocol March 1999
|
||
|
||
|
||
7.4.18 481 Call Leg/Transaction Does Not Exist
|
||
|
||
This status is returned under two conditions: The server received a
|
||
BYE request that does not match any existing call leg or the server
|
||
received a CANCEL request that does not match any existing
|
||
transaction. (A server simply discards an ACK referring to an unknown
|
||
transaction.)
|
||
|
||
7.4.19 482 Loop Detected
|
||
|
||
The server received a request with a Via (Section 6.40) path
|
||
containing itself.
|
||
|
||
7.4.20 483 Too Many Hops
|
||
|
||
The server received a request that contains more Via entries (hops)
|
||
(Section 6.40) than allowed by the Max-Forwards (Section 6.23) header
|
||
field.
|
||
|
||
7.4.21 484 Address Incomplete
|
||
|
||
The server received a request with a To (Section 6.37) address or
|
||
Request-URI that was incomplete. Additional information SHOULD be
|
||
provided.
|
||
|
||
|
||
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
|
||
status response.
|
||
|
||
7.4.22 485 Ambiguous
|
||
|
||
The callee address provided in the request was ambiguous. The
|
||
response MAY contain a listing of possible unambiguous addresses in
|
||
Contact headers.
|
||
|
||
Revealing alternatives can infringe on privacy concerns 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 if the request address was ambiguous.
|
||
|
||
Example response to a request with the URL lee@example.com :
|
||
|
||
485 Ambiguous SIP/2.0
|
||
Contact: Carol Lee <sip:carol.lee@example.com>
|
||
|
||
|
||
|
||
|
||
Handley, et al. Standards Track [Page 81]
|
||
|
||
RFC 2543 SIP: Session Initiation Protocol March 1999
|
||
|
||
|
||
Contact: Ping Lee <sip:p.lee@example.com>
|
||
Contact: Lee M. Foote <sip: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 response.
|
||
|
||
7.4.23 486 Busy Here
|
||
|
||
The callee's end system was contacted successfully but the callee is
|
||
currently not willing or able to take additional calls. The response
|
||
MAY indicate a better time to call in the Retry-After header. The
|
||
user could also be available elsewhere, such as through a voice mail
|
||
service, thus, this response does not terminate any searches. Status
|
||
600 (Busy Everywhere) SHOULD be used if the client knows that no
|
||
other end system will be able to accept this call.
|
||
|
||
7.5 Server Failure 5xx
|
||
|
||
5xx responses are failure responses given when a server itself has
|
||
erred. They are not definitive failures, and MUST NOT terminate a
|
||
search if other possible locations remain untried.
|
||
|
||
7.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.
|
||
|
||
7.5.2 501 Not Implemented
|
||
|
||
The server does not support the functionality required to fulfill the
|
||
request. This is the appropriate response when the server does not
|
||
recognize the request method and is not capable of supporting it for
|
||
any user.
|
||
|
||
7.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.
|
||
|
||
|
||
|
||
|
||
Handley, et al. Standards Track [Page 82]
|
||
|
||
RFC 2543 SIP: Session Initiation Protocol March 1999
|
||
|
||
|
||
7.5.4 503 Service Unavailable
|
||
|
||
The server is currently unable to handle the request due to a
|
||
temporary overloading or maintenance of the server. The implication
|
||
is that this is a temporary condition which will be alleviated after
|
||
some delay. If known, the length of the delay MAY be indicated in a
|
||
Retry-After header. If no Retry-After is given, the client MUST
|
||
handle the response as it would for a 500 response.
|
||
|
||
Note: The existence of the 503 status code does not imply that a
|
||
server has to use it when becoming overloaded. Some servers MAY wish
|
||
to simply refuse the connection.
|
||
|
||
7.5.5 504 Gateway Time-out
|
||
|
||
The server, while acting as a gateway, did not receive a timely
|
||
response from the server (e.g., a location server) it accessed in
|
||
attempting to complete the request.
|
||
|
||
7.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 message. 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. The response MAY contain an entity describing why that
|
||
version is not supported and what other protocols are supported by
|
||
that server. The format for such an entity is not defined here and
|
||
may be the subject of future standardization.
|
||
|
||
7.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. All further searches for this user are doomed to failure
|
||
and pending searches SHOULD be terminated.
|
||
|
||
7.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. 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.
|
||
|
||
|
||
|
||
|
||
Handley, et al. Standards Track [Page 83]
|
||
|
||
RFC 2543 SIP: Session Initiation Protocol March 1999
|
||
|
||
|
||
7.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.
|
||
|
||
7.6.3 604 Does Not Exist Anywhere
|
||
|
||
The server has authoritative information that the user indicated in
|
||
the To request field does not exist anywhere. Searching for the user
|
||
elsewhere will not yield any results.
|
||
|
||
7.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. Reasons are listed in Section 6.41. 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.
|
||
|
||
8 SIP Message Body
|
||
|
||
8.1 Body Inclusion
|
||
|
||
Requests MAY contain message bodies unless otherwise noted. Within
|
||
this specification, the BYE request MUST NOT contain a message body.
|
||
For ACK, INVITE and OPTIONS, the message body is always a session
|
||
description. The use of message bodies for REGISTER requests is for
|
||
further study.
|
||
|
||
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. Message bodies for 1xx responses
|
||
contain advisory information about the progress of the request. 2xx
|
||
responses to INVITE requests contain session descriptions. In 3xx
|
||
responses, the message body MAY contain the description of
|
||
alternative destinations or services, as described in Section 7.3.
|
||
For responses with status 400 or greater, the message body MAY
|
||
|
||
|
||
|
||
|
||
|
||
Handley, et al. Standards Track [Page 84]
|
||
|
||
RFC 2543 SIP: Session Initiation Protocol March 1999
|
||
|
||
|
||
contain additional, human-readable information about the reasons for
|
||
failure. It is RECOMMENDED that information in 1xx and 300 and
|
||
greater responses be of type text/plain or text/html
|
||
|
||
8.2 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.
|
||
|
||
8.3 Message Body Length
|
||
|
||
The body length in bytes SHOULD be given by the Content-Length header
|
||
field. Section 6.15 describes the behavior 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.)
|
||
|
||
9 Compact Form
|
||
|
||
When SIP is carried over UDP with authentication and a complex
|
||
session description, it may be possible that the size of a request or
|
||
response is larger than the MTU. To address this problem, a more
|
||
compact form of SIP is also defined by using abbreviations for the
|
||
common header fields listed below:
|
||
|
||
|
||
short field name long field name note
|
||
c Content-Type
|
||
e Content-Encoding
|
||
f From
|
||
i Call-ID
|
||
m Contact from "moved"
|
||
l Content-Length
|
||
s Subject
|
||
t To
|
||
v Via
|
||
|
||
|
||
Thus, the message in section 16.2 could also be written:
|
||
|
||
|
||
|
||
|
||
|
||
|
||
Handley, et al. Standards Track [Page 85]
|
||
|
||
RFC 2543 SIP: Session Initiation Protocol March 1999
|
||
|
||
|
||
INVITE sip:schooler@vlsi.caltech.edu SIP/2.0
|
||
v:SIP/2.0/UDP 131.215.131.131;maddr=239.128.16.254;ttl=16
|
||
v:SIP/2.0/UDP 128.16.64.19
|
||
f:sip:mjh@isi.edu
|
||
t:sip:schooler@cs.caltech.edu
|
||
i:62729-27@128.16.64.19
|
||
c:application/sdp
|
||
CSeq: 4711 INVITE
|
||
l:187
|
||
|
||
v=0
|
||
o=user1 53655765 2353687637 IN IP4 128.3.4.5
|
||
s=Mbone Audio
|
||
i=Discussion of Mbone Engineering Issues
|
||
e=mbone@somewhere.com
|
||
c=IN IP4 224.2.0.1/127
|
||
t=0 0
|
||
m=audio 3456 RTP/AVP 0
|
||
|
||
|
||
|
||
Clients MAY mix short field names and long field names within the
|
||
same request. Servers MUST accept both short and long field names for
|
||
requests. Proxies MAY change header fields between their long and
|
||
short forms, but this MUST NOT be done to fields following an
|
||
Authorization header.
|
||
|
||
10 Behavior of SIP Clients and Servers
|
||
|
||
10.1 General Remarks
|
||
|
||
SIP is defined so it can use either UDP (unicast or multicast) or TCP
|
||
as a transport protocol; it provides its own reliability mechanism.
|
||
|
||
10.1.1 Requests
|
||
|
||
Servers discard isomorphic requests, but first retransmit the
|
||
appropriate response. (SIP requests are said to be idempotent , i.e.,
|
||
receiving more than one copy of a request does not change the server
|
||
state.)
|
||
|
||
After receiving a CANCEL request from an upstream client, a stateful
|
||
proxy server MAY send a CANCEL on all branches where it has not yet
|
||
received a final response.
|
||
|
||
When a user agent receives a request, it checks the Call-ID against
|
||
those of in-progress calls. If the Call-ID was found, it compares the
|
||
tag value of To with the user's tag and rejects the request if the
|
||
|
||
|
||
|
||
Handley, et al. Standards Track [Page 86]
|
||
|
||
RFC 2543 SIP: Session Initiation Protocol March 1999
|
||
|
||
|
||
two do not match. If the From header, including any tag value,
|
||
matches the value for an existing call leg, the server compares the
|
||
CSeq header field value. If less than or equal to the current
|
||
sequence number, the request is a retransmission. Otherwise, it is a
|
||
new request. If the From header does not match an existing call leg,
|
||
a new call leg is created.
|
||
|
||
If the Call-ID was not found, a new call leg is created, with entries
|
||
for the To, From and Call-ID headers. In this case, the To header
|
||
field should not have contained a tag. The server returns a response
|
||
containing the same To value, but with a unique tag added. The tag
|
||
MAY be omitted if the request contained only one Via header field.
|
||
|
||
10.1.2 Responses
|
||
|
||
A server MAY issue one or more provisional responses at any time
|
||
before sending a final response. If a stateful proxy, user agent
|
||
server, redirect server or registrar cannot respond to a request with
|
||
a final response within 200 ms, it SHOULD issue a provisional (1xx)
|
||
response as soon as possible. Stateless proxies MUST NOT issue
|
||
provisional responses on their own.
|
||
|
||
Responses are mapped to requests by the matching To, From, Call-ID,
|
||
CSeq headers and the branch parameter of the first Via header.
|
||
Responses terminate request retransmissions even if they have Via
|
||
headers that cause them to be delivered to an upstream client.
|
||
|
||
A stateful proxy may receive a response that it does not have state
|
||
for, that is, where it has no a record of an associated request. If
|
||
the Via header field indicates that the upstream server used TCP, the
|
||
proxy actively opens a TCP connection to that address. Thus, proxies
|
||
have to be prepared to receive responses on the incoming side of
|
||
passive TCP connections, even though most responses will arrive on
|
||
the incoming side of an active connection. (An active connection is a
|
||
TCP connection initiated by the proxy, a passive connection is one
|
||
accepted by the proxy, but initiated by another entity.)
|
||
|
||
100 responses SHOULD NOT be forwarded, other 1xx responses MAY be
|
||
forwarded, possibly after the server eliminates responses with status
|
||
codes that had already been sent earlier. 2xx responses are forwarded
|
||
according to the Via header. Once a stateful proxy has received a 2xx
|
||
response, it MUST NOT forward non-2xx final responses. Responses
|
||
with status 300 and higher are retransmitted by each stateful proxy
|
||
until the next upstream proxy sends an ACK (see below for timing
|
||
details) or CANCEL.
|
||
|
||
|
||
|
||
|
||
|
||
|
||
Handley, et al. Standards Track [Page 87]
|
||
|
||
RFC 2543 SIP: Session Initiation Protocol March 1999
|
||
|
||
|
||
A stateful proxy SHOULD maintain state for at least 32 seconds after
|
||
the receipt of the first definitive non-200 response, in order to
|
||
handle retransmissions of the response.
|
||
|
||
|
||
The 32 second window is given by the maximum retransmission
|
||
duration of 200-class responses using the default timers,
|
||
in case the ACK is lost somewhere on the way to the called
|
||
user agent or the next stateful proxy.
|
||
|
||
10.2 Source Addresses, Destination Addresses and Connections
|
||
|
||
10.2.1 Unicast UDP
|
||
|
||
Responses are returned to the address listed in the Via header field
|
||
(Section 6.40), not the source address of the request.
|
||
|
||
|
||
Recall that responses are not generated by the next-hop
|
||
stateless server, but generated by either a proxy server or
|
||
the user agent server. Thus, the stateless proxy can only
|
||
use the Via header field to forward the response.
|
||
|
||
10.2.2 Multicast UDP
|
||
|
||
Requests MAY be multicast; multicast requests likely feature a host-
|
||
independent Request-URI. This request SHOULD be scoped to ensure it
|
||
is not forwarded beyond the boundaries of the administrative system.
|
||
This MAY be done with either TTL or administrative scopes[25],
|
||
depending on what is implemented in the network.
|
||
|
||
A client receiving a multicast query does not have to check whether
|
||
the host part of the Request-URI matches its own host or domain name.
|
||
If the request was received via multicast, the response is also
|
||
returned via multicast. Responses to multicast requests are multicast
|
||
with the same TTL as the request, where the TTL is derived from the
|
||
ttl parameter in the Via header (Section 6.40).
|
||
|
||
To avoid response implosion, servers MUST NOT answer multicast
|
||
requests with a status code other than 2xx or 6xx. The server delays
|
||
its response by a random interval uniformly distributed between zero
|
||
and one second. Servers MAY suppress responses if they hear a lower-
|
||
numbered or 6xx response from another group member prior to sending.
|
||
Servers do not respond to CANCEL requests received via multicast to
|
||
avoid request implosion. A proxy or UAC SHOULD send a CANCEL on
|
||
receiving the first 2xx or 6xx response to a multicast request.
|
||
|
||
|
||
|
||
|
||
|
||
Handley, et al. Standards Track [Page 88]
|
||
|
||
RFC 2543 SIP: Session Initiation Protocol March 1999
|
||
|
||
|
||
Server response suppression is a MAY since it requires a
|
||
server to violate some basic message processing rules. Lets
|
||
say A sends a multicast request, and it is received by B,C,
|
||
and D. B sends a 200 response. The topmost Via field in the
|
||
response will contain the address of A. C will also receive
|
||
this response, and could use it to suppress its own
|
||
response. However, C would normally not examine this
|
||
response, as the topmost Via is not its own. Normally, a
|
||
response received with an incorrect topmost Via MUST be
|
||
dropped, but not in this case. To distinguish this packet
|
||
from a misrouted or multicast looped packet is fairly
|
||
complex, and for this reason the procedure is a MAY. The
|
||
CANCEL, instead, provides a simpler and more standard way
|
||
to perform response suppression. It is for this reason that
|
||
the use of CANCEL here is a SHOULD
|
||
|
||
10.3 TCP
|
||
|
||
A single TCP connection can serve one or more SIP transactions. A
|
||
transaction contains zero or more provisional responses followed by
|
||
one or more final responses. (Typically, transactions contain exactly
|
||
one final response, but there are exceptional circumstances, where,
|
||
for example, multiple 200 responses can be generated.)
|
||
|
||
The client SHOULD keep the connection open at least until the first
|
||
final response arrives. If the client closes or resets the TCP
|
||
connection prior to receiving the first final response, the server
|
||
treats this action as equivalent to a CANCEL request.
|
||
|
||
|
||
This behavior makes it less likely that malfunctioning
|
||
clients cause a proxy server to keep connection state
|
||
indefinitely.
|
||
|
||
The server SHOULD NOT close the TCP connection until it has sent its
|
||
final response, at which point it MAY close the TCP connection if it
|
||
wishes to. However, normally it is the client's responsibility to
|
||
close the connection.
|
||
|
||
If the server leaves the connection open, and if the client so
|
||
desires it MAY re-use the connection for further SIP requests or for
|
||
requests from the same family of protocols (such as HTTP or stream
|
||
control commands).
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
Handley, et al. Standards Track [Page 89]
|
||
|
||
RFC 2543 SIP: Session Initiation Protocol March 1999
|
||
|
||
|
||
If a server needs to return a response to a client and no longer has
|
||
a connection open to that client, it MAY open a connection to the
|
||
address listed in the Via header. Thus, a proxy or user agent MUST be
|
||
prepared to receive both requests and responses on a "passive"
|
||
connection.
|
||
|
||
10.4 Reliability for BYE, CANCEL, OPTIONS, REGISTER Requests
|
||
|
||
10.4.1 UDP
|
||
|
||
A SIP client using UDP SHOULD retransmit a BYE, CANCEL, OPTIONS, or
|
||
REGISTER request with an exponential backoff, starting at a T1 second
|
||
interval, doubling the interval for each packet, and capping off at a
|
||
T2 second interval. This means that after the first packet is sent,
|
||
the second is sent T1 seconds later, the next 2*T1 seconds after
|
||
that, the next 4*T1 seconds after that, and so on, until the interval
|
||
hits T2. Subsequent retransmissions are spaced by T2 seconds. If the
|
||
client receives a provisional response, it continues to retransmit
|
||
the request, but with an interval of T2 seconds. Retransmissions
|
||
cease when the client has sent a total of eleven packets, or receives
|
||
a definitive response. Default values for T1 and T2 are 500 ms and 4
|
||
s, respectively. Clients MAY use larger values, but SHOULD NOT use
|
||
smaller ones. Servers retransmit the response upon receipt of a
|
||
request retransmission. After the server sends a final response, it
|
||
cannot be sure the client has received the response, and thus SHOULD
|
||
cache the results for at least 10*T2 seconds to avoid having to, for
|
||
example, contact the user or location server again upon receiving a
|
||
request retransmission.
|
||
|
||
|
||
Use of the exponential backoff is for congestion control
|
||
purposes. However, the back-off must cap off, since request
|
||
retransmissions are used to trigger response
|
||
retransmissions at the server. Without a cap, the loss of a
|
||
single response could significantly increase transaction
|
||
latencies.
|
||
|
||
The value of the initial retransmission timer is smaller than that
|
||
that for TCP since it is expected that network paths suitable for
|
||
interactive communications have round-trip times smaller than 500 ms.
|
||
For congestion control purposes, the retransmission count has to be
|
||
bounded. Given that most transactions are expected to consist of one
|
||
request and a few responses, round-trip time estimation is not likely
|
||
to be very useful. If RTT estimation is desired to more quickly
|
||
discover a missing final response, each request retransmission needs
|
||
to be labeled with its own Timestamp (Section 6.36), returned in the
|
||
response. The server caches the result until it can be sure that the
|
||
client will not retransmit the same request again.
|
||
|
||
|
||
|
||
Handley, et al. Standards Track [Page 90]
|
||
|
||
RFC 2543 SIP: Session Initiation Protocol March 1999
|
||
|
||
|
||
Each server in a proxy chain generates its own final response to a
|
||
CANCEL request. The server responds immediately upon receipt of the
|
||
CANCEL request rather than waiting until it has received final
|
||
responses from the CANCEL requests it generates.
|
||
|
||
BYE and OPTIONS final responses are generated by redirect and user
|
||
agent servers; REGISTER final responses are generated by registrars.
|
||
Note that in contrast to the reliability mechanism described in
|
||
Section 10.5, responses to these requests are not retransmitted
|
||
periodically and not acknowledged via ACK.
|
||
|
||
10.4.2 TCP
|
||
|
||
Clients using TCP do not need to retransmit requests.
|
||
|
||
10.5 Reliability for INVITE Requests
|
||
|
||
Special considerations apply for the INVITE method.
|
||
|
||
1. After receiving an invitation, considerable time can elapse
|
||
before the server can determine the outcome. For example,
|
||
if the called party is "rung" or extensive searches are
|
||
performed, delays between the request and a definitive
|
||
response can reach several tens of seconds. If either
|
||
caller or callee are automated servers not directly
|
||
controlled by a human being, a call attempt could be
|
||
unbounded in time.
|
||
|
||
2. If a telephony user interface is modeled or if we need to
|
||
interface to the PSTN, the caller's user interface will
|
||
provide "ringback", a signal that the callee is being
|
||
alerted. (The status response 180 (Ringing) MAY be used to
|
||
initiate ringback.) Once the callee picks up, the caller
|
||
needs to know so that it can enable the voice path and stop
|
||
ringback. The callee's response to the invitation could get
|
||
lost. Unless the response is transmitted reliably, the
|
||
caller will continue to hear ringback while the callee
|
||
assumes that the call exists.
|
||
|
||
3. The client has to be able to terminate an on-going request,
|
||
e.g., because it is no longer willing to wait for the
|
||
connection or search to succeed. The server will have to
|
||
wait several retransmission intervals to interpret the lack
|
||
of request retransmissions as the end of a call. If the
|
||
call succeeds shortly after the caller has given up, the
|
||
callee will "pick up the phone" and not be "connected".
|
||
|
||
|
||
|
||
|
||
|
||
Handley, et al. Standards Track [Page 91]
|
||
|
||
RFC 2543 SIP: Session Initiation Protocol March 1999
|
||
|
||
|
||
10.5.1 UDP
|
||
|
||
For UDP, A SIP client SHOULD retransmit a SIP INVITE request with an
|
||
interval that starts at T1 seconds, and doubles after each packet
|
||
transmission. The client ceases retransmissions if it receives a
|
||
provisional or definitive response, or once it has sent a total of 7
|
||
request packets.
|
||
|
||
A server which transmits a provisional response should retransmit it
|
||
upon reception of a duplicate request. A server which transmits a
|
||
final response should retransmit it with an interval that starts at
|
||
T1 seconds, and doubles for each subsequent packet. Response
|
||
retransmissions cease when any one of the following occurs:
|
||
|
||
1. An ACK request for the same transaction is received;
|
||
|
||
2. a BYE request for the same call leg is received;
|
||
|
||
3. a CANCEL request for the same call leg is received and the
|
||
final response status was equal or greater to 300;
|
||
|
||
4. the response has been transmitted 7 times.
|
||
|
||
Only the user agent client generates an ACK for 2xx final responses,
|
||
If the response contained a Contact header field, the ACK MAY be sent
|
||
to the address listed in that Contact header field. If the response
|
||
did not contain a Contact header, the client uses the same To header
|
||
field and Request-URI as for the INVITE request and sends the ACK to
|
||
the same destination as the original INVITE request. ACKs for final
|
||
responses other than 2xx are sent to the same server that the
|
||
original request was sent to, using the same Request-URI as the
|
||
original request. Note, however, that the To header field in the ACK
|
||
is copied from the response being acknowledged, not the request, and
|
||
thus MAY additionally contain the tag parameter. Also note than
|
||
unlike 2xx final responses, a proxy generates an ACK for non-2xx
|
||
final responses.
|
||
|
||
The ACK request MUST NOT be acknowledged to prevent a response-ACK
|
||
feedback loop. Fig. 12 and 13 show the client and server state
|
||
diagram for invitations.
|
||
|
||
|
||
|
||
|
||
The mechanism in Sec. 10.4 would not work well for INVITE
|
||
because of the long delays between INVITE and a final
|
||
response. If the 200 response were to get lost, the callee
|
||
would believe the call to exist, but the voice path would
|
||
|
||
|
||
|
||
Handley, et al. Standards Track [Page 92]
|
||
|
||
RFC 2543 SIP: Session Initiation Protocol March 1999
|
||
|
||
|
||
|
||
|
||
+===========+
|
||
* *
|
||
...........>* Initial *<;;;;;;;;;;
|
||
: 7 INVITE * * ;
|
||
: sent +===========+ ;
|
||
: | ;
|
||
: | - ;
|
||
: | INVITE ;
|
||
: | ;
|
||
: v ;
|
||
: ************* ;
|
||
: T1*2^n <--* * ;
|
||
: INVITE -->* Calling *--------+ ;
|
||
: * * | ;
|
||
: ************* | ;
|
||
: : | | ;
|
||
:.............: | 1xx xxx | ;
|
||
| - ACK | ;
|
||
| | ;
|
||
v | ;
|
||
************* | ;
|
||
* * | ;
|
||
* Ringing *<->1xx | ;
|
||
* * | ;
|
||
************* | ;
|
||
| | ;
|
||
|<-------------+ ;
|
||
| ;
|
||
v ;
|
||
************* ;
|
||
xxx <--* * ;
|
||
ACK -->* Completed * ;
|
||
* * ;
|
||
************* ;
|
||
; 32s (for proxy);
|
||
;;;;;;;;;;;;;;;;;;
|
||
|
||
event (xxx=status)
|
||
message
|
||
|
||
|
||
Figure 12: State transition diagram of client for INVITE method
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
Handley, et al. Standards Track [Page 93]
|
||
|
||
RFC 2543 SIP: Session Initiation Protocol March 1999
|
||
|
||
|
||
|
||
|
||
7 pkts sent +===============+
|
||
+-------------->* *
|
||
| * Initial *<...............
|
||
|;;;;;;;;;;;;;;>* * :
|
||
|; +===============+ :
|
||
|; CANCEL ! :
|
||
|; 200 ! INVITE :
|
||
|; ! 1xx :
|
||
|; ! :
|
||
|; v :
|
||
|; ***************** BYE :
|
||
|; INVITE -->* * 200 :
|
||
|; 1xx <--* Call proceed. *..............>:
|
||
|; * * :
|
||
|;;;;;;;;;;;;;;;***************** :
|
||
|; ! ! :
|
||
|: ! ! :
|
||
|; failure ! ! picks up :
|
||
|; >= 300 ! ! 200 :
|
||
|; +-------+ +-------+ :
|
||
|; v v :
|
||
|; *********** *********** :
|
||
|;INVITE<* *<T1*2^n->* *>INVITE :
|
||
|;status>* failure *>status<-* success *<status :
|
||
|; * * * * :
|
||
|;;;;;;;;*********** *********** :
|
||
| ! : | | ! : :
|
||
| ! : | | ! : :
|
||
+-------------!-:-+------------+ ! : :
|
||
! :.................!..:.........>:
|
||
! ! BYE :
|
||
+---------+---------+ 200 :
|
||
event ! ACK :
|
||
message sent v :
|
||
***************** :
|
||
V---* * :
|
||
ACK * Confirmed * :
|
||
|-->* * :
|
||
***************** .
|
||
:......................>:
|
||
|
||
|
||
Figure 13: State transition diagram of server for INVITE method
|
||
|
||
Handley, et al. Standards Track [Page 94]
|
||
|
||
RFC 2543 SIP: Session Initiation Protocol March 1999
|
||
|
||
|
||
be dead since the caller does not know that the callee has
|
||
picked up. Thus, the INVITE retransmission interval would
|
||
have to be on the order of a second or two to limit the
|
||
duration of this state confusion. Retransmitting the
|
||
response with an exponential back-off helps ensure that the
|
||
response is received, without placing an undue burden on
|
||
the network.
|
||
|
||
10.5.2 TCP
|
||
|
||
A user agent using TCP MUST NOT retransmit requests, but uses the
|
||
same algorithm as for UDP (Section 10.5.1) to retransmit responses
|
||
until it receives an ACK.
|
||
|
||
|
||
It is necessary to retransmit 2xx responses as their
|
||
reliability is assured end-to-end only. If the chain of
|
||
proxies has a UDP link in the middle, it could lose the
|
||
response, with no possibility of recovery. For simplicity,
|
||
we also retransmit non-2xx responses, although that is not
|
||
strictly necessary.
|
||
|
||
10.6 Reliability for ACK Requests
|
||
|
||
The ACK request does not generate responses. It is only generated
|
||
when a response to an INVITE request arrives (see Section 10.5). This
|
||
behavior is independent of the transport protocol. Note that the ACK
|
||
request MAY take a different path than the original INVITE request,
|
||
and MAY even cause a new TCP connection to be opened in order to send
|
||
it.
|
||
|
||
10.7 ICMP Handling
|
||
|
||
Handling of ICMP messages in the case of UDP messages is
|
||
straightforward. For requests, a host, network, port, or protocol
|
||
unreachable error SHOULD be treated as if a 400-class response was
|
||
received. For responses, these errors SHOULD cause the server to
|
||
cease retransmitting the response.
|
||
|
||
Source quench ICMP messages SHOULD be ignored. TTL exceeded errors
|
||
SHOULD be ignored. Parameter problem errors SHOULD be treated as if a
|
||
400-class response was received.
|
||
|
||
11 Behavior of SIP User Agents
|
||
|
||
This section describes the rules for user agent client and servers
|
||
for generating and processing requests and responses.
|
||
|
||
|
||
|
||
|
||
Handley, et al. Standards Track [Page 95]
|
||
|
||
RFC 2543 SIP: Session Initiation Protocol March 1999
|
||
|
||
|
||
11.1 Caller Issues Initial INVITE Request
|
||
|
||
When a user agent client desires to initiate a call, it formulates an
|
||
INVITE request. The To field in the request contains the address of
|
||
the callee. The Request-URI contains the same address. The From field
|
||
contains the address of the caller. If the From address can appear
|
||
in requests generated by other user agent clients for the same call,
|
||
the caller MUST insert the tag parameter in the From field. A UAC MAY
|
||
optionally add a Contact header containing an address where it would
|
||
like to be contacted for transactions from the callee back to the
|
||
caller.
|
||
|
||
11.2 Callee Issues Response
|
||
|
||
When the initial INVITE request is received at the callee, the callee
|
||
can accept, redirect, or reject the call. In all of these cases, it
|
||
formulates a response. The response MUST copy the To, From, Call-ID,
|
||
CSeq and Via fields from the request. Additionally, the responding
|
||
UAS MUST add the tag parameter to the To field in the response if the
|
||
request contained more than one Via header field. Since a request
|
||
from a UAC may fork and arrive at multiple hosts, the tag parameter
|
||
serves to distinguish, at the UAC, multiple responses from different
|
||
UAS's. The UAS MAY add a Contact header field in the response. It
|
||
contains an address where the callee would like to be contacted for
|
||
subsequent transactions, including the ACK for the current INVITE.
|
||
The UAS stores the values of the To and From field, including any
|
||
tags. These become the local and remote addresses of the call leg,
|
||
respectively.
|
||
|
||
11.3 Caller Receives Response to Initial Request
|
||
|
||
Multiple 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 call
|
||
leg. The caller MAY choose to acknowledge or terminate the call with
|
||
each responding UAS. To acknowledge, it sends an ACK request, and to
|
||
terminate it sends a BYE request. The To header field in the ACK or
|
||
BYE MUST be the same as the To field in the 200 response, including
|
||
any tag. The From header field MUST be the same as the From header
|
||
field in the 200 (OK) response, including any tag. The Request-URI of
|
||
the ACK or BYE request MAY be set to whatever address was found in
|
||
the Contact header field in the 200 (OK) response, if present.
|
||
Alternately, a UAC may copy the address from the To header field into
|
||
the Request-URI. The UAC also notes the value of the To and From
|
||
header fields in each response. For each call leg, the To header
|
||
field becomes the remote address, and the From header field becomes
|
||
the local address.
|
||
|
||
|
||
|
||
|
||
Handley, et al. Standards Track [Page 96]
|
||
|
||
RFC 2543 SIP: Session Initiation Protocol March 1999
|
||
|
||
|
||
11.4 Caller or Callee Generate Subsequent Requests
|
||
|
||
Once the call has been established, either the caller or callee MAY
|
||
generate INVITE or BYE requests to change or terminate the call.
|
||
Regardless of whether the caller or callee is generating the new
|
||
request, the header fields in the request are set as follows. For the
|
||
desired call leg, the To header field is set to the remote address,
|
||
and the From header field is set to the local address (both including
|
||
any tags). The Contact header field MAY be different than the Contact
|
||
header field sent in a previous response or request. The Request-URI
|
||
MAY be set to the value of the Contact header field received in a
|
||
previous request or response from the remote party, or to the value
|
||
of the remote address.
|
||
|
||
11.5 Receiving Subsequent Requests
|
||
|
||
When a request is received subsequently, the following checks are
|
||
made:
|
||
|
||
1. If the Call-ID is new, the request is for a new call,
|
||
regardless of the values of the To and From header fields.
|
||
|
||
2. If the Call-ID exists, the request is for an existing call.
|
||
If the To, From, Call-ID, and CSeq values exactly match
|
||
(including tags) those of any requests received previously,
|
||
the request is a retransmission.
|
||
|
||
3. If there was no match to the previous step, the To and From
|
||
fields are compared against existing call leg local and
|
||
remote addresses. If there is a match, and the CSeq in the
|
||
request is higher than the last CSeq received on that leg,
|
||
the request is a new transaction for an existing call leg.
|
||
|
||
12 Behavior of SIP Proxy and Redirect Servers
|
||
|
||
This section describes behavior of SIP redirect and proxy servers in
|
||
detail. Proxy servers can "fork" connections, i.e., a single incoming
|
||
request spawns several outgoing (client) requests.
|
||
|
||
12.1 Redirect Server
|
||
|
||
A redirect server does not issue any SIP requests of its own. After
|
||
receiving a request other than CANCEL, the server gathers the list of
|
||
alternative locations and returns a final response of class 3xx or it
|
||
refuses the request. For well-formed CANCEL requests, it SHOULD
|
||
return a 2xx response. This response ends the SIP transaction. The
|
||
|
||
|
||
|
||
|
||
|
||
Handley, et al. Standards Track [Page 97]
|
||
|
||
RFC 2543 SIP: Session Initiation Protocol March 1999
|
||
|
||
|
||
redirect server maintains transaction state for the whole SIP
|
||
transaction. It is up to the client to detect forwarding loops
|
||
between redirect servers.
|
||
|
||
12.2 User Agent Server
|
||
|
||
User agent servers behave similarly to redirect servers, except that
|
||
they also accept requests and can return a response of class 2xx.
|
||
|
||
12.3 Proxy Server
|
||
|
||
This section outlines processing rules for proxy servers. A proxy
|
||
server can either be stateful or stateless. When stateful, a proxy
|
||
remembers the incoming request which generated outgoing requests, and
|
||
the outgoing requests. A stateless proxy forgets all information once
|
||
an outgoing request is generated. A forking proxy SHOULD be stateful.
|
||
Proxies that accept TCP connections MUST be stateful.
|
||
|
||
|
||
Otherwise, if the proxy were to lose a request, the TCP
|
||
client would never retransmit it.
|
||
|
||
A stateful proxy SHOULD NOT become stateless until after it sends a
|
||
definitive response upstream, and at least 32 seconds after it
|
||
received a definitive response.
|
||
|
||
A stateful proxy acts as a virtual UAS/UAC. It implements the server
|
||
state machine when receiving requests, and the client state machine
|
||
for generating outgoing requests, with the exception of receiving a
|
||
2xx response to an INVITE. Instead of generating an ACK, the 2xx
|
||
response is always forwarded upstream towards the caller.
|
||
Furthermore, ACK's for 200 responses to INVITE's are always proxied
|
||
downstream towards the UAS, as they would be for a stateless proxy.
|
||
|
||
A stateless proxy does not act as a virtual UAS/UAC (as this would
|
||
require state). Rather, a stateless proxy forwards every request it
|
||
receives downstream, and every response it receives upstream.
|
||
|
||
12.3.1 Proxying Requests
|
||
|
||
To prevent loops, a server MUST check if its own address is already
|
||
contained in the Via header field of the incoming request.
|
||
|
||
The To, From, Call-ID, and Contact tags are copied exactly from the
|
||
original request. The proxy SHOULD change the Request-URI to indicate
|
||
the server where it intends to send the request.
|
||
|
||
|
||
|
||
|
||
|
||
Handley, et al. Standards Track [Page 98]
|
||
|
||
RFC 2543 SIP: Session Initiation Protocol March 1999
|
||
|
||
|
||
A proxy server always inserts a Via header field containing its own
|
||
address into those requests that are caused by an incoming request.
|
||
Each proxy MUST insert a "branch" parameter (Section 6.40).
|
||
|
||
12.3.2 Proxying Responses
|
||
|
||
A proxy only processes a response if the topmost Via field matches
|
||
one of its addresses. A response with a non-matching top Via field
|
||
MUST be dropped.
|
||
|
||
12.3.3 Stateless Proxy: Proxying Responses
|
||
|
||
A stateless proxy removes its own Via field, and checks the address
|
||
in the next Via field. In the case of UDP, the response is sent to
|
||
the address listed in the "maddr" tag if present, otherwise to the
|
||
"received" tag if present, and finally to the address in the "sent-
|
||
by" field. A proxy MUST remain stateful when handling requests
|
||
received via TCP.
|
||
|
||
A stateless proxy MUST NOT generate its own provisional responses.
|
||
|
||
12.3.4 Stateful Proxy: Receiving Requests
|
||
|
||
When a stateful proxy receives a request, it checks the To, From
|
||
(including tags), Call-ID and CSeq against existing request records.
|
||
If the tuple exists, the request is a retransmission. The provisional
|
||
or final response sent previously is retransmitted, as per the server
|
||
state machine. If the tuple does not exist, the request corresponds
|
||
to a new transaction, and the request should be proxied.
|
||
|
||
A stateful proxy server MAY generate its own provisional (1xx)
|
||
responses.
|
||
|
||
12.3.5 Stateful Proxy: Receiving ACKs
|
||
|
||
When an ACK request is received, it is either processed locally or
|
||
proxied. To make this determination, the To, From, CSeq and Call-ID
|
||
fields are compared against those in previous requests. If there is
|
||
no match, the ACK request is proxied as if it were an INVITE request.
|
||
If there is a match, and if the server had ever sent a 200 response
|
||
upstream, the ACK is proxied. If the server had never sent any
|
||
responses upstream, the ACK is also proxied. If the server had sent a
|
||
3xx, 4xx, 5xx or 6xx response, but no 2xx response, the ACK is
|
||
processed locally if the tag in the To field of the ACK matches the
|
||
tag sent by the proxy in the response.
|
||
|
||
|
||
|
||
|
||
|
||
|
||
Handley, et al. Standards Track [Page 99]
|
||
|
||
RFC 2543 SIP: Session Initiation Protocol March 1999
|
||
|
||
|
||
12.3.6 Stateful Proxy: Receiving Responses
|
||
|
||
When a proxy server receives a response that has passed the Via
|
||
checks, the proxy server checks the To (without the tag), From
|
||
(including the tag), Call-ID and CSeq against values seen in previous
|
||
requests. If there is no match, the response is forwarded upstream to
|
||
the address listed in the Via field. If there is a match, the
|
||
"branch" tag in the Via field is examined. If it matches a known
|
||
branch identifier, the response is for the given branch, and
|
||
processed by the virtual client for the given branch. Otherwise, the
|
||
response is dropped.
|
||
|
||
A stateful proxy should obey the rules in Section 12.4 to determine
|
||
if the response should be proxied upstream. If it is to be proxied,
|
||
the same rules for stateless proxies above are followed, with the
|
||
following addition for TCP. If a request was received via TCP
|
||
(indicated by the protocol in the top Via header), the proxy checks
|
||
to see if it has a connection currently open to that address. If so,
|
||
the response is sent on that connection. Otherwise, a new TCP
|
||
connection is opened to the address and port in the Via field, and
|
||
the response is sent there. Note that this implies that a UAC or
|
||
proxy MUST be prepared to receive responses on the incoming side of a
|
||
TCP connection. Definitive non 200-class responses MUST be
|
||
retransmitted by the proxy, even over a TCP connection.
|
||
|
||
12.3.7 Stateless, Non-Forking Proxy
|
||
|
||
Proxies in this category issue at most a single unicast request for
|
||
each incoming SIP request, that is, they do not "fork" requests.
|
||
However, servers MAY choose to always operate in a mode that allows
|
||
issuing of several requests, as described in Section 12.4.
|
||
|
||
The server can forward the request and any responses. It does not
|
||
have to maintain any state for the SIP transaction. Reliability is
|
||
assured by the next redirect or stateful proxy server in the server
|
||
chain.
|
||
|
||
A proxy server SHOULD cache the result of any address translations
|
||
and the response to speed forwarding of retransmissions. After the
|
||
cache entry has been expired, the server cannot tell whether an
|
||
incoming request is actually a retransmission of an older request.
|
||
The server will treat it as a new request and commence another
|
||
search.
|
||
|
||
12.4 Forking Proxy
|
||
|
||
The server MUST respond to the request immediately with a 100
|
||
(Trying) response.
|
||
|
||
|
||
|
||
Handley, et al. Standards Track [Page 100]
|
||
|
||
RFC 2543 SIP: Session Initiation Protocol March 1999
|
||
|
||
|
||
Successful responses to an INVITE request MAY contain a Contact
|
||
header field so that the following ACK or BYE bypasses the proxy
|
||
search mechanism. If the proxy requires future requests to be routed
|
||
through it, it adds a Record-Route header to the request (Section
|
||
6.29).
|
||
|
||
The following C-code describes the behavior of a proxy server issuing
|
||
several requests in response to an incoming INVITE request. The
|
||
function request(r, a, b) sends a SIP request of type r to address a,
|
||
with branch id b. await_response() waits until a response is received
|
||
and returns the response. close(a) closes the TCP connection to
|
||
client with address a. response(r) sends a response to the client.
|
||
ismulticast() returns 1 if the location is a multicast address and
|
||
zero otherwise. The variable timeleft indicates the amount of time
|
||
left until the maximum response time has expired. The variable
|
||
recurse indicates whether the server will recursively try addresses
|
||
returned through a 3xx response. A server MAY decide to recursively
|
||
try only certain addresses, e.g., those which are within the same
|
||
domain as the proxy server. Thus, an initial multicast request can
|
||
trigger additional unicast requests.
|
||
|
||
|
||
/* request type */
|
||
typedef enum {INVITE, ACK, BYE, OPTIONS, CANCEL, REGISTER} Method;
|
||
|
||
process_request(Method R, int N, address_t address[])
|
||
{
|
||
struct {
|
||
int branch; /* branch id */
|
||
int done; /* has responded */
|
||
} outgoing[];
|
||
int done[]; /* address has responded */
|
||
char *location[]; /* list of locations */
|
||
int heard = 0; /* number of sites heard from */
|
||
int class; /* class of status code */
|
||
int timeleft = 120; /* sample timeout value */
|
||
int loc = 0; /* number of locations */
|
||
struct { /* response */
|
||
int status; /* response: CANCEL=-1 */
|
||
int locations; /* number of redirect locations */
|
||
char *location[]; /* redirect locations */
|
||
address_t a; /* address of respondent */
|
||
int branch; /* branch identifier */
|
||
} r, best; /* response, best response */
|
||
int i;
|
||
|
||
best.status = 1000;
|
||
for (i = 0; i < N; i++) {
|
||
|
||
|
||
|
||
Handley, et al. Standards Track [Page 101]
|
||
|
||
RFC 2543 SIP: Session Initiation Protocol March 1999
|
||
|
||
|
||
request(R, address[i], i);
|
||
outgoing[i].done = 0;
|
||
outgoing[i].branch = i;
|
||
}
|
||
|
||
while (timeleft > 0 && heard < N) {
|
||
r = await_response();
|
||
class = r.status / 100;
|
||
|
||
/* If final response, mark branch as done. */
|
||
if (class >= 2) {
|
||
heard++;
|
||
for (i = 0; i < N; i++) {
|
||
if (r.branch == outgoing[i].branch) {
|
||
outgoing[i].done = 1;
|
||
break;
|
||
}
|
||
}
|
||
}
|
||
/* CANCEL: respond, fork and wait for responses */
|
||
else if (class < 0) {
|
||
best.status = 200;
|
||
response(best);
|
||
for (i = 0; i < N; i++) {
|
||
if (!outgoing[i].done)
|
||
request(CANCEL, address[i], outgoing[i].branch);
|
||
}
|
||
best.status = -1;
|
||
}
|
||
|
||
/* Send an ACK */
|
||
|
||
if (class != 2) {
|
||
if (R == INVITE) request(ACK, r.a, r.branch);
|
||
}
|
||
|
||
|
||
if (class == 2) {
|
||
if (r.status < best.status) best = r;
|
||
break;
|
||
}
|
||
else if (class == 3) {
|
||
/* A server MAY optionally recurse. The server MUST check
|
||
* whether it has tried this location before and whether
|
||
* the location is part of the Via path of the incoming
|
||
* request. This check is omitted here for brevity.
|
||
* Multicast locations MUST NOT be returned to the client if
|
||
* the server is not recursing.
|
||
|
||
|
||
|
||
Handley, et al. Standards Track [Page 102]
|
||
|
||
RFC 2543 SIP: Session Initiation Protocol March 1999
|
||
|
||
|
||
*/
|
||
if (recurse) {
|
||
multicast = 0;
|
||
N += r.locations;
|
||
for (i = 0; i < r.locations; i++) {
|
||
request(R, r.location[i]);
|
||
}
|
||
} else if (!ismulticast(r.location)) {
|
||
best = r;
|
||
}
|
||
}
|
||
else if (class == 4) {
|
||
if (best.status >= 400) best = r;
|
||
}
|
||
else if (class == 5) {
|
||
if (best.status >= 500) best = r;
|
||
}
|
||
else if (class == 6) {
|
||
best = r;
|
||
break;
|
||
}
|
||
}
|
||
|
||
/* We haven't heard anything useful from anybody. */
|
||
if (best.status == 1000) {
|
||
best.status = 404;
|
||
}
|
||
if (best.status/100 != 3) loc = 0;
|
||
response(best);
|
||
}
|
||
|
||
|
||
Responses are processed as follows. The process completes (and state
|
||
can be freed) when all requests have been answered by final status
|
||
responses (for unicast) or 60 seconds have elapsed (for multicast). A
|
||
proxy MAY send a CANCEL to all branches and return a 408 (Timeout) to
|
||
the client after 60 seconds or more.
|
||
|
||
1xx: The proxy MAY forward the response upstream towards the client.
|
||
|
||
2xx: The proxy MUST forward the response upstream towards the client,
|
||
without sending an ACK downstream. After receiving a 2xx, the
|
||
server MAY terminate all other pending requests by sending a
|
||
CANCEL request and closing the TCP connection, if applicable.
|
||
(Terminating pending requests is advisable as searches consume
|
||
resources. Also, INVITE requests could "ring" on a number of
|
||
workstations if the callee is currently logged in more than
|
||
once.)
|
||
|
||
|
||
|
||
Handley, et al. Standards Track [Page 103]
|
||
|
||
RFC 2543 SIP: Session Initiation Protocol March 1999
|
||
|
||
|
||
3xx: The proxy MUST send an ACK and MAY recurse on the listed Contact
|
||
addresses. Otherwise, the lowest-numbered response is returned
|
||
if there were no 2xx responses.
|
||
|
||
Location lists are not merged as that would prevent
|
||
forwarding of authenticated responses. Also, responses can
|
||
have message bodies, so that merging is not feasible.
|
||
|
||
4xx, 5xx: The proxy MUST send an ACK and remember the response if it
|
||
has a lower status code than any previous 4xx and 5xx responses.
|
||
On completion, the lowest-numbered response is returned if there
|
||
were no 2xx or 3xx responses.
|
||
|
||
6xx: The proxy MUST forward the response to the client and send an
|
||
ACK. Other pending requests MAY be terminated with CANCEL as
|
||
described for 2xx responses.
|
||
|
||
A proxy server forwards any response for Call-IDs for which it does
|
||
not have a pending transaction according to the response's Via
|
||
header. User agent servers respond to BYE requests for unknown call
|
||
legs with status code 481 (Transaction Does Not Exist); they drop ACK
|
||
requests with unknown call legs silently.
|
||
|
||
Special considerations apply for choosing forwarding destinations for
|
||
ACK and BYE requests. In most cases, these requests will bypass
|
||
proxies and reach the desired party directly, keeping proxies from
|
||
having to make forwarding decisions.
|
||
|
||
A proxy MAY maintain call state for a period of its choosing. If a
|
||
proxy still has list of destinations that it forwarded the last
|
||
INVITE to, it SHOULD direct ACK requests only to those downstream
|
||
servers.
|
||
|
||
13 Security Considerations
|
||
|
||
13.1 Confidentiality and Privacy: Encryption
|
||
|
||
13.1.1 End-to-End Encryption
|
||
|
||
SIP requests and responses can contain sensitive information about
|
||
the communication patterns and communication content of individuals.
|
||
The SIP message body MAY also contain encryption keys for the session
|
||
itself. SIP supports three complementary forms of encryption to
|
||
protect privacy:
|
||
|
||
o End-to-end encryption of the SIP message body and certain
|
||
sensitive header fields;
|
||
|
||
|
||
|
||
|
||
Handley, et al. Standards Track [Page 104]
|
||
|
||
RFC 2543 SIP: Session Initiation Protocol March 1999
|
||
|
||
|
||
o hop-by-hop encryption to prevent eavesdropping that tracks
|
||
who is calling whom;
|
||
|
||
o hop-by-hop encryption of Via fields to hide the route a
|
||
request has taken.
|
||
|
||
Not all of the SIP request or response can be encrypted end-to-end
|
||
because header fields such as To and Via need to be visible to
|
||
proxies so that the SIP request can be routed correctly. Hop-by-hop
|
||
encryption encrypts the entire SIP request or response on the wire so
|
||
that packet sniffers or other eavesdroppers cannot see who is calling
|
||
whom. Hop-by-hop encryption can also encrypt requests and responses
|
||
that have been end-to-end encrypted. Note that proxies can still see
|
||
who is calling whom, and this information is also deducible by
|
||
performing a network traffic analysis, so this provides a very
|
||
limited but still worthwhile degree of protection.
|
||
|
||
SIP Via fields are used to route a response back along the path taken
|
||
by the request and to prevent infinite request loops. However, the
|
||
information given by them can also provide useful information to an
|
||
attacker. Section 6.22 describes how a sender can request that Via
|
||
fields be encrypted by cooperating proxies without compromising the
|
||
purpose of the Via field.
|
||
|
||
End-to-end encryption relies on keys shared by the two user agents
|
||
involved in the request. Typically, the message is sent encrypted
|
||
with the public key of the recipient, so that only that recipient can
|
||
read the message. All implementations SHOULD support PGP-based
|
||
encryption [33] and MAY implement other schemes.
|
||
|
||
A SIP request (or response) is end-to-end encrypted by splitting the
|
||
message to be sent into a part to be encrypted and a short header
|
||
that will remain in the clear. Some parts of the SIP message, namely
|
||
the request line, the response line and certain header fields marked
|
||
with "n" in the "enc." column in Table 4 and 5 need to be read and
|
||
returned by proxies and thus MUST NOT be encrypted end-to-end.
|
||
Possibly sensitive information that needs to be made available as
|
||
plaintext include destination address (To) and the forwarding path
|
||
(Via) of the call. The Authorization header field MUST remain in the
|
||
clear if it contains a digital signature as the signature is
|
||
generated after encryption, but MAY be encrypted if it contains
|
||
"basic" or "digest" authentication. The From header field SHOULD
|
||
normally remain in the clear, but MAY be encrypted if required, in
|
||
which case some proxies MAY return a 401 (Unauthorized) status if
|
||
they require a From field.
|
||
|
||
|
||
|
||
|
||
|
||
|
||
Handley, et al. Standards Track [Page 105]
|
||
|
||
RFC 2543 SIP: Session Initiation Protocol March 1999
|
||
|
||
|
||
Other header fields MAY be encrypted or MAY travel in the clear as
|
||
desired by the sender. The Subject, Allow and Content-Type header
|
||
fields will typically be encrypted. The Accept, Accept-Language,
|
||
Date, Expires, Priority, Require, Call-ID, Cseq, and Timestamp header
|
||
fields will remain in the clear.
|
||
|
||
All fields that will remain in the clear MUST precede those that will
|
||
be encrypted. The message is encrypted starting with the first
|
||
character of the first header field that will be encrypted and
|
||
continuing through to the end of the message body. If no header
|
||
fields are to be encrypted, encrypting starts with the second CRLF
|
||
pair after the last header field, as shown below. Carriage return and
|
||
line feed characters have been made visible as "$", and the encrypted
|
||
part of the message is outlined.
|
||
|
||
|
||
INVITE sip:watson@boston.bell-telephone.com SIP/2.0$
|
||
Via: SIP/2.0/UDP 169.130.12.5$
|
||
To: T. A. Watson <sip:watson@bell-telephone.com>$
|
||
From: A. Bell <sip:a.g.bell@bell-telephone.com>$
|
||
Encryption: PGP version=5.0$
|
||
Content-Length: 224$
|
||
Call-ID: 187602141351@worcester.bell-telephone.com$
|
||
CSeq: 488$
|
||
$
|
||
*******************************************************
|
||
* Subject: Mr. Watson, come here.$ *
|
||
* Content-Type: application/sdp$ *
|
||
* $ *
|
||
* v=0$ *
|
||
* o=bell 53655765 2353687637 IN IP4 128.3.4.5$ *
|
||
* c=IN IP4 135.180.144.94$ *
|
||
* m=audio 3456 RTP/AVP 0 3 4 5$ *
|
||
*******************************************************
|
||
|
||
|
||
|
||
An Encryption header field MUST be added to indicate the encryption
|
||
mechanism used. A Content-Length field is added that indicates the
|
||
length of the encrypted body. The encrypted body is preceded by a
|
||
blank line as a normal SIP message body would be.
|
||
|
||
Upon receipt by the called user agent possessing the correct
|
||
decryption key, the message body as indicated by the Content-Length
|
||
field is decrypted, and the now-decrypted body is appended to the
|
||
clear-text header fields. There is no need for an additional
|
||
Content-Length header field within the encrypted body because the
|
||
length of the actual message body is unambiguous after decryption.
|
||
|
||
|
||
|
||
Handley, et al. Standards Track [Page 106]
|
||
|
||
RFC 2543 SIP: Session Initiation Protocol March 1999
|
||
|
||
|
||
Had no SIP header fields required encryption, the message would have
|
||
been as below. Note that the encrypted body MUST then include a blank
|
||
line (start with CRLF) to disambiguate between any possible SIP
|
||
header fields that might have been present and the SIP message body.
|
||
|
||
|
||
INVITE sip:watson@boston.bell-telephone.com SIP/2.0$
|
||
Via: SIP/2.0/UDP 169.130.12.5$
|
||
To: T. A. Watson <sip:watson@bell-telephone.com>$
|
||
From: A. Bell <a.g.bell@bell-telephone.com>$
|
||
Encryption: PGP version=5.0$
|
||
Content-Type: application/sdp$
|
||
Content-Length: 107$
|
||
$
|
||
*************************************************
|
||
* $ *
|
||
* v=0$ *
|
||
* o=bell 53655765 2353687637 IN IP4 128.3.4.5$ *
|
||
* c=IN IP4 135.180.144.94$ *
|
||
* m=audio 3456 RTP/AVP 0 3 4 5$ *
|
||
*************************************************
|
||
|
||
|
||
|
||
13.1.2 Privacy of SIP Responses
|
||
|
||
SIP requests can be sent securely using end-to-end encryption and
|
||
authentication to a called user agent that sends an insecure
|
||
response. This is allowed by the SIP security model, but is not a
|
||
good idea. However, unless the correct behavior is explicit, it
|
||
would not always be possible for the called user agent to infer what
|
||
a reasonable behavior was. Thus when end-to-end encryption is used by
|
||
the request originator, the encryption key to be used for the
|
||
response SHOULD be specified in the request. If this were not done,
|
||
it might be possible for the called user agent to incorrectly infer
|
||
an appropriate key to use in the response. Thus, to prevent key-
|
||
guessing becoming an acceptable strategy, we specify that a called
|
||
user agent receiving a request that does not specify a key to be used
|
||
for the response SHOULD send that response unencrypted.
|
||
|
||
Any SIP header fields that were encrypted in a request SHOULD also be
|
||
encrypted in an encrypted response. Contact response fields MAY be
|
||
encrypted if the information they contain is sensitive, or MAY be
|
||
left in the clear to permit proxies more scope for localized
|
||
searches.
|
||
|
||
|
||
|
||
|
||
|
||
|
||
Handley, et al. Standards Track [Page 107]
|
||
|
||
RFC 2543 SIP: Session Initiation Protocol March 1999
|
||
|
||
|
||
13.1.3 Encryption by Proxies
|
||
|
||
Normally, proxies are not allowed to alter end-to-end header fields
|
||
and message bodies. Proxies MAY, however, encrypt an unsigned request
|
||
or response with the key of the call recipient.
|
||
|
||
|
||
Proxies need to encrypt a SIP request if the end system
|
||
cannot perform encryption or to enforce organizational
|
||
security policies.
|
||
|
||
13.1.4 Hop-by-Hop Encryption
|
||
|
||
SIP requests and responses MAY also be protected by security
|
||
mechanisms at the transport or network layer. No particular mechanism
|
||
is defined or recommended here. Two possibilities are IPSEC [34] or
|
||
TLS [35]. The use of a particular mechanism will generally need to be
|
||
specified out of band, through manual configuration, for example.
|
||
|
||
13.1.5 Via field encryption
|
||
|
||
When Via header fields are to be hidden, a proxy that receives a
|
||
request containing an appropriate "Hide: hop" header field (as
|
||
specified in section 6.22) SHOULD encrypt the header field. As only
|
||
the proxy that encrypts the field will decrypt it, the algorithm
|
||
chosen is entirely up to the proxy implementor. Two methods satisfy
|
||
these requirements:
|
||
|
||
o The server keeps a cache of Via header fields and the
|
||
associated To header field, and replaces the Via header field
|
||
with an index into the cache. On the reverse path, take the
|
||
Via header field from the cache rather than the message.
|
||
|
||
This is insufficient to prevent message looping, and so an
|
||
additional ID MUST be added so that the proxy can detect loops.
|
||
This SHOULD NOT normally be the address of the proxy as the goal
|
||
is to hide the route, so instead a sufficiently large random
|
||
number SHOULD be used by the proxy and maintained in the cache.
|
||
|
||
It is possible for replies to get directed to the wrong
|
||
originator if the cache entry gets reused, so great care needs
|
||
to be taken to ensure this does not happen.
|
||
|
||
o The server MAY use a secret key to encrypt the Via field, a
|
||
timestamp and an appropriate checksum in any such message with
|
||
the same secret key. The checksum is needed to detect whether
|
||
successful decoding has occurred, and the timestamp is
|
||
|
||
|
||
|
||
|
||
Handley, et al. Standards Track [Page 108]
|
||
|
||
RFC 2543 SIP: Session Initiation Protocol March 1999
|
||
|
||
|
||
required to prevent possible replay attacks and to ensure that
|
||
no two requests from the same previous hop have the same
|
||
encrypted Via field. This is the preferred solution.
|
||
|
||
13.2 Message Integrity and Access Control: Authentication
|
||
|
||
Protective measures need to be taken to prevent an active attacker
|
||
from modifying and replaying SIP requests and responses. The same
|
||
cryptographic measures that are used to ensure the authenticity of
|
||
the SIP message also serve to authenticate the originator of the
|
||
message. However, the "basic" and "digest" authentication mechanism
|
||
offer authentication only, without message integrity.
|
||
|
||
Transport-layer or network-layer authentication MAY be used for hop-
|
||
by-hop authentication. SIP also extends the HTTP WWW-Authenticate
|
||
(Section 6.42) and Authorization (Section 6.11) header field and
|
||
their Proxy counterparts to include cryptographically strong
|
||
signatures. SIP also supports the HTTP "basic" and "digest" schemes
|
||
(see Section 14) and other HTTP authentication schemes to be defined
|
||
that offer a rudimentary mechanism of ascertaining the identity of
|
||
the caller.
|
||
|
||
|
||
Since SIP requests are often sent to parties with which no
|
||
prior communication relationship has existed, we do not
|
||
specify authentication based on shared secrets.
|
||
|
||
SIP requests MAY be authenticated using the Authorization header
|
||
field to include a digital signature of certain header fields, the
|
||
request method and version number and the payload, none of which are
|
||
modified between client and called user agent. The Authorization
|
||
header field is used in requests to authenticate the request
|
||
originator end-to-end to proxies and the called user agent, and in
|
||
responses to authenticate the called user agent or proxies returning
|
||
their own failure codes. If required, hop-by-hop authentication can
|
||
be provided, for example, by the IPSEC Authentication Header.
|
||
|
||
SIP does not dictate which digital signature scheme is used for
|
||
authentication, but does define how to provide authentication using
|
||
PGP in Section 15. As indicated above, SIP implementations MAY also
|
||
use "basic" and "digest" authentication and other authentication
|
||
mechanisms defined for HTTP. Note that "basic" authentication has
|
||
severe security limitations. The following does not apply to these
|
||
schemes.
|
||
|
||
To cryptographically sign a SIP request, the order of the SIP header
|
||
fields is important. When an Authorization header field is present,
|
||
it indicates that all header fields following the Authorization
|
||
|
||
|
||
|
||
Handley, et al. Standards Track [Page 109]
|
||
|
||
RFC 2543 SIP: Session Initiation Protocol March 1999
|
||
|
||
|
||
header field have been included in the signature. Therefore, hop-
|
||
by-hop header fields which MUST or SHOULD be modified by proxies MUST
|
||
precede the Authorization header field as they will generally be
|
||
modified or added-to by proxy servers. Hop-by-hop header fields
|
||
which MAY be modified by a proxy MAY appear before or after the
|
||
Authorization header. When they appear before, they MAY be modified
|
||
by a proxy. When they appear after, they MUST NOT be modified by a
|
||
proxy. To sign a request, a client constructs a message from the
|
||
request method (in upper case) followed, without LWS, by the SIP
|
||
version number, followed, again without LWS, by the request headers
|
||
to be signed and the message body. The message thus constructed is
|
||
then signed.
|
||
|
||
For example, if the SIP request is to be:
|
||
|
||
INVITE sip:watson@boston.bell-telephone.com SIP/2.0
|
||
Via: SIP/2.0/UDP 169.130.12.5
|
||
Authorization: PGP version=5.0, signature=...
|
||
From: A. Bell <sip:a.g.bell@bell-telephone.com>
|
||
To: T. A. Watson <sip:watson@bell-telephone.com>
|
||
Call-ID: 187602141351@worcester.bell-telephone.com
|
||
Subject: Mr. Watson, come here.
|
||
Content-Type: application/sdp
|
||
Content-Length: ...
|
||
|
||
v=0
|
||
o=bell 53655765 2353687637 IN IP4 128.3.4.5
|
||
c=IN IP4 135.180.144.94
|
||
m=audio 3456 RTP/AVP 0 3 4 5
|
||
|
||
|
||
|
||
Then the data block that is signed is:
|
||
|
||
INVITESIP/2.0From: A. Bell <sip:a.g.bell@bell-telephone.com>
|
||
To: T. A. Watson <sip:watson@bell-telephone.com>
|
||
Call-ID: 187602141351@worcester.bell-telephone.com
|
||
Subject: Mr. Watson, come here.
|
||
Content-Type: application/sdp
|
||
Content-Length: ...
|
||
|
||
v=0
|
||
o=bell 53655765 2353687637 IN IP4 128.3.4.5
|
||
c=IN IP4 135.180.144.94
|
||
m=audio 3456 RTP/AVP 0 3 4 5
|
||
|
||
|
||
|
||
|
||
|
||
|
||
Handley, et al. Standards Track [Page 110]
|
||
|
||
RFC 2543 SIP: Session Initiation Protocol March 1999
|
||
|
||
|
||
Clients wishing to authenticate requests MUST construct the portion
|
||
of the message below the Authorization header using a canonical form.
|
||
This allows a proxy to parse the message, take it apart, and
|
||
reconstruct it, without causing an authentication failure due to
|
||
extra white space, for example. Canonical form consists of the
|
||
following rules:
|
||
|
||
o No short form header fields
|
||
|
||
o Header field names are capitalized as shown in this document
|
||
|
||
o No white space between the header name and the colon
|
||
|
||
o A single space after the colon
|
||
|
||
o Line termination with a CRLF
|
||
|
||
o No line folding
|
||
|
||
o No comma separated lists of header values; each must appear
|
||
as a separate header
|
||
|
||
o Only a single SP between tokens, between tokens and quoted
|
||
strings, and between quoted strings; no SP after last token or
|
||
quoted string
|
||
|
||
o No LWS between tokens and separators, except as described
|
||
above for after the colon in header fields
|
||
|
||
Note that if a message is encrypted and authenticated using a digital
|
||
signature, when the message is generated encryption is performed
|
||
before the digital signature is generated. On receipt, the digital
|
||
signature is checked before decryption.
|
||
|
||
A client MAY require that a server sign its response by including a
|
||
Require: org.ietf.sip.signed-response request header field. The
|
||
client indicates the desired authentication method via the WWW-
|
||
Authenticate header.
|
||
|
||
The correct behavior in handling unauthenticated responses to a
|
||
request that requires authenticated responses is described in section
|
||
13.2.1.
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
Handley, et al. Standards Track [Page 111]
|
||
|
||
RFC 2543 SIP: Session Initiation Protocol March 1999
|
||
|
||
|
||
13.2.1 Trusting responses
|
||
|
||
There is the possibility that an eavesdropper listens to requests and
|
||
then injects unauthenticated responses that terminate, redirect or
|
||
otherwise interfere with a call. (Even encrypted requests contain
|
||
enough information to fake a response.)
|
||
|
||
Clients need to be particularly careful with 3xx redirection
|
||
responses. Thus a client receiving, for example, a 301 (Moved
|
||
Permanently) which was not authenticated when the public key of the
|
||
called user agent is known to the client, and authentication was
|
||
requested in the request SHOULD be treated as suspicious. The correct
|
||
behavior in such a case would be for the called-user to form a dated
|
||
response containing the Contact field to be used, to sign it, and
|
||
give this signed stub response to the proxy that will provide the
|
||
redirection. Thus the response can be authenticated correctly. A
|
||
client SHOULD NOT automatically redirect such a request to the new
|
||
location without alerting the user to the authentication failure
|
||
before doing so.
|
||
|
||
Another problem might be responses such as 6xx failure responses
|
||
which would simply terminate a search, or "4xx" and "5xx" response
|
||
failures.
|
||
|
||
If TCP is being used, a proxy SHOULD treat 4xx and 5xx responses as
|
||
valid, as they will not terminate a search. However, fake 6xx
|
||
responses from a rogue proxy terminate a search incorrectly. 6xx
|
||
responses SHOULD be authenticated if requested by the client, and
|
||
failure to do so SHOULD cause such a client to ignore the 6xx
|
||
response and continue a search.
|
||
|
||
With UDP, the same problem with 6xx responses exists, but also an
|
||
active eavesdropper can generate 4xx and 5xx responses that might
|
||
cause a proxy or client to believe a failure occurred when in fact it
|
||
did not. Typically 4xx and 5xx responses will not be signed by the
|
||
called user agent, and so there is no simple way to detect these
|
||
rogue responses. This problem is best prevented by using hop-by-hop
|
||
encryption of the SIP request, which removes any additional problems
|
||
that UDP might have over TCP.
|
||
|
||
These attacks are prevented by having the client require response
|
||
authentication and dropping unauthenticated responses. A server user
|
||
agent that cannot perform response authentication responds using the
|
||
normal Require response of 420 (Bad Extension).
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
Handley, et al. Standards Track [Page 112]
|
||
|
||
RFC 2543 SIP: Session Initiation Protocol March 1999
|
||
|
||
|
||
13.3 Callee Privacy
|
||
|
||
User location and SIP-initiated calls can violate a callee's privacy.
|
||
An implementation 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.
|
||
|
||
13.4 Known Security Problems
|
||
|
||
With either TCP or UDP, a denial of service attack exists by a rogue
|
||
proxy sending 6xx responses. Although a client SHOULD choose to
|
||
ignore such responses if it requested authentication, a proxy cannot
|
||
do so. It is obliged to forward the 6xx response back to the client.
|
||
The client can then ignore the response, but if it repeats the
|
||
request it will probably reach the same rogue proxy again, and the
|
||
process will repeat.
|
||
|
||
14 SIP Authentication using HTTP Basic and Digest Schemes
|
||
|
||
SIP implementations MAY use HTTP's basic and digest authentication
|
||
mechanisms to provide a rudimentary form of security. This section
|
||
overviews usage of these mechanisms in SIP. The basic operation is
|
||
almost completely identical to that for HTTP [36]. This section
|
||
outlines this operation, pointing to [36] for details, and noting the
|
||
differences when used in SIP.
|
||
|
||
14.1 Framework
|
||
|
||
The framework for SIP authentication parallels that for HTTP [36]. In
|
||
particular, the BNF for auth-scheme, auth-param, challenge, realm,
|
||
realm-value, and credentials is identical. The 401 response is used
|
||
by user agent servers in SIP to challenge the authorization of a user
|
||
agent client. Additionally, registrars and redirect servers MAY make
|
||
use of 401 responses for authorization, but proxies MUST NOT, and
|
||
instead MAY use the 407 response. The requirements for inclusion of
|
||
the Proxy-Authenticate, Proxy-Authorization, WWW-Authenticate, and
|
||
Authorization in the various messages is identical to [36].
|
||
|
||
Since SIP does not have the concept of a canonical root URL, the
|
||
notion of protections spaces are interpreted differently for SIP. The
|
||
realm is a protection domain for all SIP URIs with the same value for
|
||
the userinfo, host and port part of the SIP Request-URI. For example:
|
||
|
||
|
||
INVITE sip:alice.wonderland@example.com SIP/2.0
|
||
WWW-Authenticate: Basic realm="business"
|
||
|
||
|
||
|
||
|
||
|
||
Handley, et al. Standards Track [Page 113]
|
||
|
||
RFC 2543 SIP: Session Initiation Protocol March 1999
|
||
|
||
|
||
and
|
||
|
||
|
||
INVITE sip:aw@example.com SIP/2.0
|
||
WWW-Authenticate: Basic realm="business"
|
||
|
||
|
||
|
||
define different protection realms according to this rule.
|
||
|
||
When a UAC resubmits a request with its credentials after receiving a
|
||
401 or 407 response, it MUST increment the CSeq header field as it
|
||
would normally do when sending an updated request.
|
||
|
||
14.2 Basic Authentication
|
||
|
||
The rules for basic authentication follow those defined in [36], but
|
||
with the words "origin server" replaced with "user agent server,
|
||
redirect server , or registrar".
|
||
|
||
Since SIP URIs are not hierarchical, the paragraph in [36] that
|
||
states that "all paths at or deeper than the depth of the last
|
||
symbolic element in the path field of the Request-URI also are within
|
||
the protection space specified by the Basic realm value of the
|
||
current challenge" does not apply for SIP. SIP clients MAY
|
||
preemptively send the corresponding Authorization header with
|
||
requests for SIP URIs within the same protection realm (as defined
|
||
above) without receipt of another challenge from the server.
|
||
|
||
14.3 Digest Authentication
|
||
|
||
The rules for digest authentication follow those defined in [36],
|
||
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-URL
|
||
|
||
|
||
2. The BNF for digest-uri-value is:
|
||
|
||
|
||
digest-uri-value = Request-URI ; a defined in Section
|
||
4.3
|
||
|
||
|
||
|
||
|
||
|
||
Handley, et al. Standards Track [Page 114]
|
||
|
||
RFC 2543 SIP: Session Initiation Protocol March 1999
|
||
|
||
|
||
3. The example procedure for choosing a nonce based on Etag
|
||
does not work for SIP.
|
||
|
||
4. The Authentication-Info and Proxy-Authentication-Info
|
||
fields are not used in SIP.
|
||
|
||
5. The text in [36] regarding cache operation does not apply
|
||
to SIP.
|
||
|
||
6. [36] requires that a server check that the URI in the
|
||
request line, and the URI included in the Authorization
|
||
header, point to the same resource. In a SIP context, these
|
||
two URI's may actually 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
|
||
corresponds to a user that the server is willing to accept
|
||
forwarded or direct calls for.
|
||
|
||
14.4 Proxy-Authentication
|
||
|
||
The use of the Proxy-Authentication and Proxy-Authorization parallel
|
||
that as described in [36], with one difference. Proxies MUST NOT add
|
||
the Proxy-Authorization header. 407 responses MUST be forwarded
|
||
upstream towards the client following the procedures for any other
|
||
response. It is the client's responsibility to add the Proxy-
|
||
Authorization header containing credentials for the proxy which has
|
||
asked for authentication.
|
||
|
||
|
||
If a proxy were to resubmit a request with a Proxy-
|
||
Authorization header field, it would need to increment the
|
||
CSeq in the new request. However, this would mean that the
|
||
UAC which submitted the original request would discard a
|
||
response from the UAS, as the CSeq value would be
|
||
different.
|
||
|
||
See sections 6.26 and 6.27 for additional information on usage of
|
||
these fields as they apply to SIP.
|
||
|
||
15 SIP Security Using PGP
|
||
|
||
15.1 PGP Authentication Scheme
|
||
|
||
The "pgp" authentication scheme is based on the model that the client
|
||
authenticates itself with a request signed with the client's private
|
||
key. The server can then ascertain the origin of the request if it
|
||
has access to the public key, preferably signed by a trusted third
|
||
party.
|
||
|
||
|
||
|
||
Handley, et al. Standards Track [Page 115]
|
||
|
||
RFC 2543 SIP: Session Initiation Protocol March 1999
|
||
|
||
|
||
15.1.1 The WWW-Authenticate Response Header
|
||
|
||
|
||
|
||
WWW-Authenticate = "WWW-Authenticate" ":" "pgp" pgp-challenge
|
||
pgp-challenge = * (";" pgp-params )
|
||
pgp-params = realm | pgp-version | pgp-algorithm | nonce
|
||
realm = "realm" "=" realm-value
|
||
realm-value = quoted-string
|
||
pgp-version = "version" "="
|
||
<"> digit *( "." digit ) *letter <">
|
||
pgp-algorithm = "algorithm" "=" ( "md5" | "sha1" | token )
|
||
nonce = "nonce" "=" nonce-value
|
||
nonce-value = quoted-string
|
||
|
||
|
||
|
||
The meanings of the values of the parameters used above are as
|
||
follows:
|
||
|
||
realm: A string to be displayed to users so they know which identity
|
||
to use. This string SHOULD contain at least the name of the host
|
||
performing the authentication and MAY additionally indicate the
|
||
collection of users who might have access. An example might be "
|
||
Users with call-out privileges ".
|
||
|
||
pgp-algorithm: The value of this parameter indicates the PGP message
|
||
integrity check (MIC) to be used to produce the signature. If
|
||
this not present it is assumed to be "md5". The currently
|
||
defined values are "md5" for the MD5 checksum, and "sha1" for
|
||
the SHA.1 algorithm.
|
||
|
||
pgp-version: The version of PGP that the client MUST use. Common
|
||
values are "2.6.2" and "5.0". The default is 5.0.
|
||
|
||
nonce: A server-specified data string which should be uniquely
|
||
generated each time a 401 response is made. It is RECOMMENDED
|
||
that this string be base64 or hexadecimal data. Specifically,
|
||
since the string is passed in the header lines as a quoted
|
||
string, the double-quote character is not allowed. The contents
|
||
of the nonce are implementation dependent. The quality of the
|
||
implementation depends on a good choice. Since the nonce is used
|
||
only to prevent replay attacks and is signed, a time stamp in
|
||
units convenient to the server is sufficient.
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
Handley, et al. Standards Track [Page 116]
|
||
|
||
RFC 2543 SIP: Session Initiation Protocol March 1999
|
||
|
||
|
||
Replay attacks within the duration of the call setup are of
|
||
limited interest, so that timestamps with a resolution of a
|
||
few seconds are often should be sufficient. In that case,
|
||
the server does not have to keep a record of the nonces.
|
||
|
||
Example:
|
||
|
||
WWW-Authenticate: pgp ;version="5.0"
|
||
;realm="Your Startrek identity, please" ;algorithm=md5
|
||
;nonce="913082051"
|
||
|
||
|
||
|
||
15.1.2 The Authorization Request Header
|
||
|
||
The client is expected to retry the request, passing an Authorization
|
||
header line, which is defined as follows.
|
||
|
||
|
||
|
||
Authorization = "Authorization" ":" "pgp" *( ";" pgp-response )
|
||
pgp-response = realm | pgp-version | pgp-signature
|
||
| signed-by | nonce
|
||
pgp-signature = "signature" "=" quoted-string
|
||
signed-by = "signed-by" "=" <"> URI <">
|
||
|
||
|
||
The client MUST increment the CSeq header before resubmitting the
|
||
request. The signature MUST correspond to the From header of the
|
||
request unless the signed-by parameter is provided.
|
||
|
||
pgp-signature: The PGP ASCII-armored signature [33], as it appears
|
||
between the "BEGIN PGP MESSAGE" and "END PGP MESSAGE"
|
||
delimiters, without the version indication. The signature is
|
||
included without any linebreaks.
|
||
|
||
The signature is computed across the nonce (if present), request
|
||
method, request version and header fields following the Authorization
|
||
header and the message body, in the same order as they appear in the
|
||
message. The request method and version are prepended to the header
|
||
fields without any white space. The signature is computed across the
|
||
headers as sent, and the terminating CRLF. The CRLF following the
|
||
Authorization header is NOT included in the signature.
|
||
|
||
A server MAY be configured not to generate nonces only if replay
|
||
attacks are not a concern.
|
||
|
||
|
||
|
||
|
||
|
||
Handley, et al. Standards Track [Page 117]
|
||
|
||
RFC 2543 SIP: Session Initiation Protocol March 1999
|
||
|
||
|
||
Not generating nonces avoids the additional set of request,
|
||
401 response and possibly ACK messages and reduces delay by
|
||
one round-trip time.
|
||
|
||
|
||
Using the ASCII-armored version is about 25% less space-
|
||
efficient than including the binary signature, but it is
|
||
significantly easier for the receiver to piece together.
|
||
Versions of the PGP program always include the full
|
||
(compressed) signed text in their output unless ASCII-
|
||
armored mode ( -sta ) is specified. Typical signatures are
|
||
about 200 bytes long. -- The PGP signature mechanism allows
|
||
the client to simply pass the request to an external PGP
|
||
program. This relies on the requirement that proxy servers
|
||
are not allowed to reorder or change header fields.
|
||
|
||
realm: The realm is copied from the corresponding WWW-Authenticate
|
||
header field parameter.
|
||
|
||
signed-by: If and only if the request was not signed by the entity
|
||
listed in the From header, the signed-by header indicates the
|
||
name of the signing entity, expressed as a URI.
|
||
|
||
Receivers of signed SIP messages SHOULD discard any end-to-end header
|
||
fields above the Authorization header, as they may have been
|
||
maliciously added en route by a proxy.
|
||
|
||
Example:
|
||
|
||
Authorization: pgp version="5.0"
|
||
;realm="Your Startrek identity, please"
|
||
;nonce="913082051"
|
||
;signature="iQB1AwUBNNJiUaYBnHmiiQh1AQFYsgL/Wt3dk6TWK81/b0gcNDf
|
||
VAUGU4rhEBW972IPxFSOZ94L1qhCLInTPaqhHFw1cb3lB01rA0RhpV4t5yCdUt
|
||
SRYBSkOK29o5e1KlFeW23EzYPVUm2TlDAhbcjbMdfC+KLFX
|
||
=aIrx"
|
||
|
||
|
||
|
||
15.2 PGP Encryption Scheme
|
||
|
||
The PGP encryption scheme uses the following syntax:
|
||
|
||
|
||
|
||
Encryption = "Encryption" ":" "pgp" pgp-eparams
|
||
pgp-eparams = 1# ( pgp-version | pgp-encoding )
|
||
pgp-encoding = "encoding" "=" "ascii" | token
|
||
|
||
|
||
|
||
Handley, et al. Standards Track [Page 118]
|
||
|
||
RFC 2543 SIP: Session Initiation Protocol March 1999
|
||
|
||
|
||
encoding: Describes the encoding or "armor" used by PGP. The value
|
||
"ascii" refers to the standard PGP ASCII armor, without the
|
||
lines containing "BEGIN PGP MESSAGE" and "END PGP MESSAGE" and
|
||
without the version identifier. By default, the encrypted part
|
||
is included as binary.
|
||
|
||
Example:
|
||
|
||
Encryption: pgp version="2.6.2", encoding="ascii"
|
||
|
||
|
||
|
||
15.3 Response-Key Header Field for PGP
|
||
|
||
|
||
|
||
Response-Key = "Response-Key" ":" "pgp" pgp-eparams
|
||
pgp-eparams = 1# ( pgp-version | pgp-encoding | pgp-key)
|
||
pgp-key = "key" "=" quoted-string
|
||
|
||
|
||
If ASCII encoding has been requested via the encoding parameter, the
|
||
key parameter contains the user's public key as extracted from the
|
||
pgp key ring with the "pgp -kxa user ".
|
||
|
||
Example:
|
||
|
||
Response-Key: pgp version="2.6.2", encoding="ascii",
|
||
key="mQBtAzNWHNYAAAEDAL7QvAdK2utY05wuUG+ItYK5tCF8HNJM60sU4rLaV+eUnkMk
|
||
mOmJWtc2wXcZx1XaXb2lkydTQOesrUR75IwNXBuZXPEIMThEa5WLsT7VLme7njnx
|
||
sE86SgWmAZx5ookIdQAFEbQxSGVubmluZyBTY2h1bHpyaW5uZSA8c2NodWx6cmlu
|
||
bmVAY3MuY29sdW1iaWEuZWR1Pg==
|
||
=+y19"
|
||
|
||
|
||
|
||
16 Examples
|
||
|
||
In the following examples, we often omit the message body and the
|
||
corresponding Content-Length and Content-Type headers for brevity.
|
||
|
||
16.1 Registration
|
||
|
||
A user at host saturn.bell-tel.com registers on start-up, via
|
||
multicast, with the local SIP server named bell-tel.com. In the
|
||
example, the user agent on saturn expects to receive SIP requests on
|
||
UDP port 3890.
|
||
|
||
|
||
|
||
|
||
Handley, et al. Standards Track [Page 119]
|
||
|
||
RFC 2543 SIP: Session Initiation Protocol March 1999
|
||
|
||
|
||
C->S: REGISTER sip:bell-tel.com SIP/2.0
|
||
Via: SIP/2.0/UDP saturn.bell-tel.com
|
||
From: sip:watson@bell-tel.com
|
||
To: sip:watson@bell-tel.com
|
||
Call-ID: 70710@saturn.bell-tel.com
|
||
CSeq: 1 REGISTER
|
||
Contact: <sip:watson@saturn.bell-tel.com:3890;transport=udp>
|
||
Expires: 7200
|
||
|
||
|
||
|
||
The registration expires after two hours. Any future invitations for
|
||
watson@bell-tel.com arriving at sip.bell-tel.com will now be
|
||
redirected to watson@saturn.bell-tel.com, UDP port 3890.
|
||
|
||
If Watson wants to be reached elsewhere, say, an on-line service he
|
||
uses while traveling, he updates his reservation after first
|
||
cancelling any existing locations:
|
||
|
||
|
||
C->S: REGISTER sip:bell-tel.com SIP/2.0
|
||
Via: SIP/2.0/UDP saturn.bell-tel.com
|
||
From: sip:watson@bell-tel.com
|
||
To: sip:watson@bell-tel.com
|
||
Call-ID: 70710@saturn.bell-tel.com
|
||
CSeq: 2 REGISTER
|
||
Contact: *
|
||
Expires: 0
|
||
|
||
C->S: REGISTER sip:bell-tel.com SIP/2.0
|
||
Via: SIP/2.0/UDP saturn.bell-tel.com
|
||
From: sip:watson@bell-tel.com
|
||
To: sip:watson@bell-tel.com
|
||
Call-ID: 70710@saturn.bell-tel.com
|
||
CSeq: 3 REGISTER
|
||
Contact: sip:tawatson@example.com
|
||
|
||
|
||
|
||
Now, the server will forward any request for Watson to the server at
|
||
example.com, using the Request-URI tawatson@example.com. For the
|
||
server at example.com to reach Watson, he will need to send a
|
||
REGISTER there, or inform the server of his current location through
|
||
some other means.
|
||
|
||
It is possible to use third-party registration. Here, the secretary
|
||
jon.diligent registers his boss, T. Watson:
|
||
|
||
|
||
|
||
|
||
Handley, et al. Standards Track [Page 120]
|
||
|
||
RFC 2543 SIP: Session Initiation Protocol March 1999
|
||
|
||
|
||
C->S: REGISTER sip:bell-tel.com SIP/2.0
|
||
Via: SIP/2.0/UDP pluto.bell-tel.com
|
||
From: sip:jon.diligent@bell-tel.com
|
||
To: sip:watson@bell-tel.com
|
||
Call-ID: 17320@pluto.bell-tel.com
|
||
CSeq: 1 REGISTER
|
||
Contact: sip:tawatson@example.com
|
||
|
||
|
||
|
||
The request could be sent to either the registrar at bell-tel.com or
|
||
the server at example.com. In the latter case, the server at
|
||
example.com would proxy the request to the address indicated in the
|
||
Request-URI. Then, Max-Forwards header could be used to restrict the
|
||
registration to that server.
|
||
|
||
16.2 Invitation to a Multicast Conference
|
||
|
||
The first example invites schooler@vlsi.cs.caltech.edu to a multicast
|
||
session. All examples use the Session Description Protocol (SDP) (RFC
|
||
2327 [6]) as the session description format.
|
||
|
||
16.2.1 Request
|
||
|
||
|
||
C->S: INVITE sip:schooler@cs.caltech.edu SIP/2.0
|
||
Via: SIP/2.0/UDP csvax.cs.caltech.edu;branch=8348
|
||
;maddr=239.128.16.254;ttl=16
|
||
Via: SIP/2.0/UDP north.east.isi.edu
|
||
From: Mark Handley <sip:mjh@isi.edu>
|
||
To: Eve Schooler <sip:schooler@caltech.edu>
|
||
Call-ID: 2963313058@north.east.isi.edu
|
||
CSeq: 1 INVITE
|
||
Subject: SIP will be discussed, too
|
||
Content-Type: application/sdp
|
||
Content-Length: 187
|
||
|
||
v=0
|
||
o=user1 53655765 2353687637 IN IP4 128.3.4.5
|
||
s=Mbone Audio
|
||
i=Discussion of Mbone Engineering Issues
|
||
e=mbone@somewhere.com
|
||
c=IN IP4 224.2.0.1/127
|
||
t=0 0
|
||
m=audio 3456 RTP/AVP 0
|
||
|
||
|
||
|
||
|
||
|
||
|
||
Handley, et al. Standards Track [Page 121]
|
||
|
||
RFC 2543 SIP: Session Initiation Protocol March 1999
|
||
|
||
|
||
The From request header above states that the request was initiated
|
||
by mjh@isi.edu and addressed to schooler@caltech.edu (From header
|
||
fields). The Via fields list the hosts along the path from invitation
|
||
initiator (the last element of the list) towards the callee. In the
|
||
example above, the message was last multicast to the administratively
|
||
scoped group 239.128.16.254 with a ttl of 16 from the host
|
||
csvax.cs.caltech.edu. The second Via header field indicates that it
|
||
was originally sent from the host north.east.isi.edu. The Request-URI
|
||
indicates that the request is currently being being addressed to
|
||
schooler@cs.caltech.edu, the local address that csvax looked up for
|
||
the callee.
|
||
|
||
In this case, the session description is using the Session
|
||
Description Protocol (SDP), as stated in the Content-Type header.
|
||
|
||
The header is terminated by an empty line and is followed by a
|
||
message body containing the session description.
|
||
|
||
16.2.2 Response
|
||
|
||
The called user agent, directly or indirectly through proxy servers,
|
||
indicates that it is alerting ("ringing") the called party:
|
||
|
||
|
||
S->C: SIP/2.0 180 Ringing
|
||
Via: SIP/2.0/UDP csvax.cs.caltech.edu;branch=8348
|
||
;maddr=239.128.16.254;ttl=16
|
||
Via: SIP/2.0/UDP north.east.isi.edu
|
||
From: Mark Handley <sip:mjh@isi.edu>
|
||
To: Eve Schooler <sip:schooler@caltech.edu> ;tag=9883472
|
||
Call-ID: 2963313058@north.east.isi.edu
|
||
CSeq: 1 INVITE
|
||
|
||
|
||
|
||
A sample response to the invitation is given below. The first line of
|
||
the response states the SIP version number, that it is a 200 (OK)
|
||
response, which means the request was successful. The Via headers are
|
||
taken from the request, and entries are removed hop by hop as the
|
||
response retraces the path of the request. A new authentication field
|
||
MAY be added by the invited user's agent if required. The Call-ID is
|
||
taken directly from the original request, along with the remaining
|
||
fields of the request message. The original sense of From field is
|
||
preserved (i.e., it is the session initiator).
|
||
|
||
In addition, the Contact header gives details of the host where the
|
||
user was located, or alternatively the relevant proxy contact point
|
||
which should be reachable from the caller's host.
|
||
|
||
|
||
|
||
Handley, et al. Standards Track [Page 122]
|
||
|
||
RFC 2543 SIP: Session Initiation Protocol March 1999
|
||
|
||
|
||
S->C: SIP/2.0 200 OK
|
||
Via: SIP/2.0/UDP csvax.cs.caltech.edu;branch=8348
|
||
;maddr=239.128.16.254;ttl=16
|
||
Via: SIP/2.0/UDP north.east.isi.edu
|
||
From: Mark Handley <sip:mjh@isi.edu>
|
||
To: Eve Schooler <sip:schooler@caltech.edu> ;tag=9883472
|
||
Call-ID: 2963313058@north.east.isi.edu
|
||
CSeq: 1 INVITE
|
||
Contact: sip:es@jove.cs.caltech.edu
|
||
|
||
|
||
|
||
The caller confirms the invitation by sending an ACK request to the
|
||
location named in the Contact header:
|
||
|
||
|
||
C->S: ACK sip:es@jove.cs.caltech.edu SIP/2.0
|
||
Via: SIP/2.0/UDP north.east.isi.edu
|
||
From: Mark Handley <sip:mjh@isi.edu>
|
||
To: Eve Schooler <sip:schooler@caltech.edu> ;tag=9883472
|
||
Call-ID: 2963313058@north.east.isi.edu
|
||
CSeq: 1 ACK
|
||
|
||
|
||
|
||
16.3 Two-party Call
|
||
|
||
For two-party Internet phone calls, the response must contain a
|
||
description of where to send the data. In the example below, Bell
|
||
calls Watson. Bell indicates that he can receive RTP audio codings 0
|
||
(PCMU), 3 (GSM), 4 (G.723) and 5 (DVI4).
|
||
|
||
|
||
C->S: INVITE sip:watson@boston.bell-tel.com SIP/2.0
|
||
Via: SIP/2.0/UDP kton.bell-tel.com
|
||
From: A. Bell <sip:a.g.bell@bell-tel.com>
|
||
To: T. Watson <sip:watson@bell-tel.com>
|
||
Call-ID: 3298420296@kton.bell-tel.com
|
||
CSeq: 1 INVITE
|
||
Subject: Mr. Watson, come here.
|
||
Content-Type: application/sdp
|
||
Content-Length: ...
|
||
|
||
v=0
|
||
o=bell 53655765 2353687637 IN IP4 128.3.4.5
|
||
s=Mr. Watson, come here.
|
||
c=IN IP4 kton.bell-tel.com
|
||
m=audio 3456 RTP/AVP 0 3 4 5
|
||
|
||
|
||
|
||
Handley, et al. Standards Track [Page 123]
|
||
|
||
RFC 2543 SIP: Session Initiation Protocol March 1999
|
||
|
||
|
||
S->C: SIP/2.0 100 Trying
|
||
Via: SIP/2.0/UDP kton.bell-tel.com
|
||
From: A. Bell <sip:a.g.bell@bell-tel.com>
|
||
To: T. Watson <sip:watson@bell-tel.com> ;tag=37462311
|
||
Call-ID: 3298420296@kton.bell-tel.com
|
||
CSeq: 1 INVITE
|
||
Content-Length: 0
|
||
|
||
S->C: SIP/2.0 180 Ringing
|
||
Via: SIP/2.0/UDP kton.bell-tel.com
|
||
From: A. Bell <sip:a.g.bell@bell-tel.com>
|
||
To: T. Watson <sip:watson@bell-tel.com> ;tag=37462311
|
||
Call-ID: 3298420296@kton.bell-tel.com
|
||
CSeq: 1 INVITE
|
||
Content-Length: 0
|
||
|
||
S->C: SIP/2.0 182 Queued, 2 callers ahead
|
||
Via: SIP/2.0/UDP kton.bell-tel.com
|
||
From: A. Bell <sip:a.g.bell@bell-tel.com>
|
||
To: T. Watson <sip:watson@bell-tel.com> ;tag=37462311
|
||
Call-ID: 3298420296@kton.bell-tel.com
|
||
CSeq: 1 INVITE
|
||
Content-Length: 0
|
||
|
||
S->C: SIP/2.0 182 Queued, 1 caller ahead
|
||
Via: SIP/2.0/UDP kton.bell-tel.com
|
||
From: A. Bell <sip:a.g.bell@bell-tel.com>
|
||
To: T. Watson <sip:watson@bell-tel.com> ;tag=37462311
|
||
Call-ID: 3298420296@kton.bell-tel.com
|
||
CSeq: 1 INVITE
|
||
Content-Length: 0
|
||
|
||
S->C: SIP/2.0 200 OK
|
||
Via: SIP/2.0/UDP kton.bell-tel.com
|
||
From: A. Bell <sip:a.g.bell@bell-tel.com>
|
||
To: <sip:watson@bell-tel.com> ;tag=37462311
|
||
Call-ID: 3298420296@kton.bell-tel.com
|
||
CSeq: 1 INVITE
|
||
Contact: sip:watson@boston.bell-tel.com
|
||
Content-Type: application/sdp
|
||
Content-Length: ...
|
||
|
||
v=0
|
||
o=watson 4858949 4858949 IN IP4 192.1.2.3
|
||
s=I'm on my way
|
||
c=IN IP4 boston.bell-tel.com
|
||
m=audio 5004 RTP/AVP 0 3
|
||
|
||
|
||
|
||
|
||
Handley, et al. Standards Track [Page 124]
|
||
|
||
RFC 2543 SIP: Session Initiation Protocol March 1999
|
||
|
||
|
||
The example illustrates the use of informational status responses.
|
||
Here, the reception of the call is confirmed immediately (100), then,
|
||
possibly after some database mapping delay, the call rings (180) and
|
||
is then queued, with periodic status updates.
|
||
|
||
Watson can only receive PCMU and GSM. Note that Watson's list of
|
||
codecs may or may not be a subset of the one offered by Bell, as each
|
||
party indicates the data types it is willing to receive. Watson will
|
||
send audio data to port 3456 at c.bell-tel.com, Bell will send to
|
||
port 5004 at boston.bell-tel.com.
|
||
|
||
By default, the media session is one RTP session. Watson will receive
|
||
RTCP packets on port 5005, while Bell will receive them on port 3457.
|
||
|
||
Since the two sides have agreed on the set of media, Bell confirms
|
||
the call without enclosing another session description:
|
||
|
||
|
||
C->S: ACK sip:watson@boston.bell-tel.com SIP/2.0
|
||
Via: SIP/2.0/UDP kton.bell-tel.com
|
||
From: A. Bell <sip:a.g.bell@bell-tel.com>
|
||
To: T. Watson <sip:watson@bell-tel.com> ;tag=37462311
|
||
Call-ID: 3298420296@kton.bell-tel.com
|
||
CSeq: 1 ACK
|
||
|
||
|
||
|
||
16.4 Terminating a Call
|
||
|
||
To terminate a call, caller or callee can send a BYE request:
|
||
|
||
|
||
C->S: BYE sip:watson@boston.bell-tel.com SIP/2.0
|
||
Via: SIP/2.0/UDP kton.bell-tel.com
|
||
From: A. Bell <sip:a.g.bell@bell-tel.com>
|
||
To: T. A. Watson <sip:watson@bell-tel.com> ;tag=37462311
|
||
Call-ID: 3298420296@kton.bell-tel.com
|
||
CSeq: 2 BYE
|
||
|
||
|
||
|
||
If the callee wants to abort the call, it simply reverses the To and
|
||
From fields. Note that it is unlikely that a BYE from the callee will
|
||
traverse the same proxies as the original INVITE.
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
Handley, et al. Standards Track [Page 125]
|
||
|
||
RFC 2543 SIP: Session Initiation Protocol March 1999
|
||
|
||
|
||
16.5 Forking Proxy
|
||
|
||
In this example, Bell (a.g.bell@bell-tel.com) (C), currently seated
|
||
at host c.bell-tel.com wants to call Watson (t.watson@ieee.org). At
|
||
the time of the call, Watson is logged in at two workstations,
|
||
t.watson@x.bell-tel.com (X) and watson@y.bell-tel.com (Y), and has
|
||
registered with the IEEE proxy server (P) called sip.ieee.org. The
|
||
IEEE server also has a registration for the home machine of Watson,
|
||
at watson@h.bell-tel.com (H), as well as a permanent registration at
|
||
watson@acm.org (A). For brevity, the examples omit the session
|
||
description and Via header fields.
|
||
|
||
Bell's user agent sends the invitation to the SIP server for the
|
||
ieee.org domain:
|
||
|
||
|
||
C->P: INVITE sip:t.watson@ieee.org SIP/2.0
|
||
Via: SIP/2.0/UDP c.bell-tel.com
|
||
From: A. Bell <sip:a.g.bell@bell-tel.com>
|
||
To: T. Watson <sip:t.watson@ieee.org>
|
||
Call-ID: 31415@c.bell-tel.com
|
||
CSeq: 1 INVITE
|
||
|
||
|
||
|
||
The SIP server at ieee.org tries the four addresses in parallel. It
|
||
sends the following message to the home machine:
|
||
|
||
|
||
P->H: INVITE sip:watson@h.bell-tel.com SIP/2.0
|
||
Via: SIP/2.0/UDP sip.ieee.org ;branch=1
|
||
Via: SIP/2.0/UDP c.bell-tel.com
|
||
From: A. Bell <sip:a.g.bell@bell-tel.com>
|
||
To: T. Watson <sip:t.watson@ieee.org>
|
||
Call-ID: 31415@c.bell-tel.com
|
||
CSeq: 1 INVITE
|
||
|
||
|
||
|
||
This request immediately yields a 404 (Not Found) response, since
|
||
Watson is not currently logged in at home:
|
||
|
||
|
||
H->P: SIP/2.0 404 Not Found
|
||
Via: SIP/2.0/UDP sip.ieee.org ;branch=1
|
||
Via: SIP/2.0/UDP c.bell-tel.com
|
||
From: A. Bell <sip:a.g.bell@bell-tel.com>
|
||
To: T. Watson <sip:t.watson@ieee.org>;tag=87454273
|
||
|
||
|
||
|
||
Handley, et al. Standards Track [Page 126]
|
||
|
||
RFC 2543 SIP: Session Initiation Protocol March 1999
|
||
|
||
|
||
Call-ID: 31415@c.bell-tel.com
|
||
CSeq: 1 INVITE
|
||
|
||
|
||
|
||
The proxy ACKs the response so that host H can stop retransmitting
|
||
it:
|
||
|
||
P->H: ACK sip:watson@h.bell-tel.com SIP/2.0
|
||
Via: SIP/2.0/UDP sip.ieee.org ;branch=1
|
||
From: A. Bell <sip:a.g.bell@bell-tel.com>
|
||
To: T. Watson <sip:t.watson@ieee.org>;tag=87454273
|
||
Call-ID: 31415@c.bell-tel.com
|
||
CSeq: 1 ACK
|
||
|
||
|
||
|
||
Also, P attempts to reach Watson through the ACM server:
|
||
|
||
P->A: INVITE sip:watson@acm.org SIP/2.0
|
||
Via: SIP/2.0/UDP sip.ieee.org ;branch=2
|
||
Via: SIP/2.0/UDP c.bell-tel.com
|
||
From: A. Bell <sip:a.g.bell@bell-tel.com>
|
||
To: T. Watson <sip:t.watson@ieee.org>
|
||
Call-ID: 31415@c.bell-tel.com
|
||
CSeq: 1 INVITE
|
||
|
||
|
||
|
||
In parallel, the next attempt proceeds, with an INVITE to X and Y:
|
||
|
||
|
||
P->X: INVITE sip:t.watson@x.bell-tel.com SIP/2.0
|
||
Via: SIP/2.0/UDP sip.ieee.org ;branch=3
|
||
Via: SIP/2.0/UDP c.bell-tel.com
|
||
From: A. Bell <sip:a.g.bell@bell-tel.com>
|
||
To: T. Watson <sip:t.watson@ieee.org>
|
||
Call-ID: 31415@c.bell-tel.com
|
||
CSeq: 1 INVITE
|
||
|
||
P->Y: INVITE sip:watson@y.bell-tel.com SIP/2.0
|
||
Via: SIP/2.0/UDP sip.ieee.org ;branch=4
|
||
Via: SIP/2.0/UDP c.bell-tel.com
|
||
From: A. Bell <sip:a.g.bell@bell-tel.com>
|
||
To: T. Watson <sip:t.watson@ieee.org>
|
||
Call-ID: 31415@c.bell-tel.com
|
||
CSeq: 1 INVITE
|
||
|
||
|
||
|
||
|
||
Handley, et al. Standards Track [Page 127]
|
||
|
||
RFC 2543 SIP: Session Initiation Protocol March 1999
|
||
|
||
|
||
As it happens, both Watson at X and a colleague in the other lab at
|
||
host Y hear the phones ringing and pick up. Both X and Y return 200s
|
||
via the proxy to Bell.
|
||
|
||
|
||
X->P: SIP/2.0 200 OK
|
||
Via: SIP/2.0/UDP sip.ieee.org ;branch=3
|
||
Via: SIP/2.0/UDP c.bell-tel.com
|
||
From: A. Bell <sip:a.g.bell@bell-tel.com>
|
||
To: T. Watson <sip:t.watson@ieee.org> ;tag=192137601
|
||
Call-ID: 31415@c.bell-tel.com
|
||
CSeq: 1 INVITE
|
||
Contact: sip:t.watson@x.bell-tel.com
|
||
|
||
Y->P: SIP/2.0 200 OK
|
||
Via: SIP/2.0/UDP sip.ieee.org ;branch=4
|
||
Via: SIP/2.0/UDP c.bell-tel.com
|
||
Contact: sip:t.watson@y.bell-tel.com
|
||
From: A. Bell <sip:a.g.bell@bell-tel.com>
|
||
To: T. Watson <sip:t.watson@ieee.org> ;tag=35253448
|
||
Call-ID: 31415@c.bell-tel.com
|
||
CSeq: 1 INVITE
|
||
|
||
|
||
|
||
Both responses are forwarded to Bell, using the Via information. At
|
||
this point, the ACM server is still searching its database. P can now
|
||
cancel this attempt:
|
||
|
||
|
||
P->A: CANCEL sip:watson@acm.org SIP/2.0
|
||
Via: SIP/2.0/UDP sip.ieee.org ;branch=2
|
||
From: A. Bell <sip:a.g.bell@bell-tel.com>
|
||
To: T. Watson <sip:t.watson@ieee.org>
|
||
Call-ID: 31415@c.bell-tel.com
|
||
CSeq: 1 CANCEL
|
||
|
||
|
||
|
||
The ACM server gladly stops its neural-network database search and
|
||
responds with a 200. The 200 will not travel any further, since P is
|
||
the last Via stop.
|
||
|
||
|
||
A->P: SIP/2.0 200 OK
|
||
Via: SIP/2.0/UDP sip.ieee.org ;branch=2
|
||
From: A. Bell <sip:a.g.bell@bell-tel.com>
|
||
To: T. Watson <sip:t.watson@ieee.org>
|
||
|
||
|
||
|
||
Handley, et al. Standards Track [Page 128]
|
||
|
||
RFC 2543 SIP: Session Initiation Protocol March 1999
|
||
|
||
|
||
Call-ID: 31415@c.bell-tel.com
|
||
CSeq: 1 CANCEL
|
||
|
||
|
||
|
||
Bell gets the two 200 responses from X and Y in short order. Bell's
|
||
reaction now depends on his software. He can either send an ACK to
|
||
both if human intelligence is needed to determine who he wants to
|
||
talk to or he can automatically reject one of the two calls. Here, he
|
||
acknowledges both, separately and directly to the final destination:
|
||
|
||
|
||
C->X: ACK sip:t.watson@x.bell-tel.com SIP/2.0
|
||
Via: SIP/2.0/UDP c.bell-tel.com
|
||
From: A. Bell <sip:a.g.bell@bell-tel.com>
|
||
To: T. Watson <sip:t.watson@ieee.org>;tag=192137601
|
||
Call-ID: 31415@c.bell-tel.com
|
||
CSeq: 1 ACK
|
||
|
||
C->Y: ACK sip:watson@y.bell-tel.com SIP/2.0
|
||
Via: SIP/2.0/UDP c.bell-tel.com
|
||
From: A. Bell <sip:a.g.bell@bell-tel.com>
|
||
To: T. Watson <sip:t.watson@ieee.org>;tag=35253448
|
||
Call-ID: 31415@c.bell-tel.com
|
||
CSeq: 1 ACK
|
||
|
||
|
||
|
||
After a brief discussion between Bell with X and Y, it becomes clear
|
||
that Watson is at X. (Note that this is not a three-way call; only
|
||
Bell can talk to X and Y, but X and Y cannot talk to each other.)
|
||
Thus, Bell sends a BYE to Y, which is replied to:
|
||
|
||
|
||
C->Y: BYE sip:watson@y.bell-tel.com SIP/2.0
|
||
Via: SIP/2.0/UDP c.bell-tel.com
|
||
From: A. Bell <sip:a.g.bell@bell-tel.com>
|
||
To: T. Watson <sip:t.watson@ieee.org>;tag=35253448
|
||
Call-ID: 31415@c.bell-tel.com
|
||
CSeq: 2 BYE
|
||
|
||
Y->C: SIP/2.0 200 OK
|
||
Via: SIP/2.0/UDP c.bell-tel.com
|
||
From: A. Bell <sip:a.g.bell@bell-tel.com>
|
||
To: T. Watson <sip:t.watson@ieee.org>;tag=35253448
|
||
Call-ID: 31415@c.bell-tel.com
|
||
CSeq: 2 BYE
|
||
|
||
|
||
|
||
|
||
Handley, et al. Standards Track [Page 129]
|
||
|
||
RFC 2543 SIP: Session Initiation Protocol March 1999
|
||
|
||
|
||
16.6 Redirects
|
||
|
||
Replies with status codes 301 (Moved Permanently) or 302 (Moved
|
||
Temporarily) specify another location using the Contact field.
|
||
Continuing our earlier example, the server P at ieee.org decides to
|
||
redirect rather than proxy the request:
|
||
|
||
|
||
P->C: SIP/2.0 302 Moved temporarily
|
||
Via: SIP/2.0/UDP c.bell-tel.com
|
||
From: A. Bell <sip:a.g.bell@bell-tel.com>
|
||
To: T. Watson <sip:t.watson@ieee.org>;tag=72538263
|
||
Call-ID: 31415@c.bell-tel.com
|
||
CSeq: 1 INVITE
|
||
Contact: sip:watson@h.bell-tel.com,
|
||
sip:watson@acm.org, sip:t.watson@x.bell-tel.com,
|
||
sip:watson@y.bell-tel.com
|
||
CSeq: 1 INVITE
|
||
|
||
|
||
|
||
As another example, assume Alice (A) wants to delegate her calls to
|
||
Bob (B) while she is on vacation until July 29th, 1998. Any calls
|
||
meant for her will reach Bob with Alice's To field, indicating to him
|
||
what role he is to play. Charlie (C) calls Alice (A), whose server
|
||
returns:
|
||
|
||
|
||
A->C: SIP/2.0 302 Moved temporarily
|
||
From: Charlie <sip:charlie@caller.com>
|
||
To: Alice <sip:alice@anywhere.com> ;tag=2332462
|
||
Call-ID: 27182@caller.com
|
||
Contact: sip:bob@anywhere.com
|
||
Expires: Wed, 29 Jul 1998 9:00:00 GMT
|
||
CSeq: 1 INVITE
|
||
|
||
|
||
|
||
Charlie then sends the following request to the SIP server of the
|
||
anywhere.com domain. Note that the server at anywhere.com forwards
|
||
the request to Bob based on the Request-URI.
|
||
|
||
|
||
C->B: INVITE sip:bob@anywhere.com SIP/2.0
|
||
From: sip:charlie@caller.com
|
||
To: sip:alice@anywhere.com
|
||
Call-ID: 27182@caller.com
|
||
CSeq: 2 INVITE
|
||
|
||
|
||
|
||
Handley, et al. Standards Track [Page 130]
|
||
|
||
RFC 2543 SIP: Session Initiation Protocol March 1999
|
||
|
||
|
||
In the third redirection example, we assume that all outgoing
|
||
requests are directed through a local firewall F at caller.com, with
|
||
Charlie again inviting Alice:
|
||
|
||
|
||
C->F: INVITE sip:alice@anywhere.com SIP/2.0
|
||
From: sip:charlie@caller.com
|
||
To: Alice <sip:alice@anywhere.com>
|
||
Call-ID: 27182@caller.com
|
||
CSeq: 1 INVITE
|
||
|
||
|
||
|
||
The local firewall at caller.com happens to be overloaded and thus
|
||
redirects the call from Charlie to a secondary server S:
|
||
|
||
|
||
F->C: SIP/2.0 302 Moved temporarily
|
||
From: sip:charlie@caller.com
|
||
To: Alice <sip:alice@anywhere.com>
|
||
Call-ID: 27182@caller.com
|
||
CSeq: 1 INVITE
|
||
Contact: <sip:alice@anywhere.com:5080;maddr=spare.caller.com>
|
||
|
||
|
||
|
||
Based on this response, Charlie directs the same invitation to the
|
||
secondary server spare.caller.com at port 5080, but maintains the
|
||
same Request-URI as before:
|
||
|
||
|
||
C->S: INVITE sip:alice@anywhere.com SIP/2.0
|
||
From: sip:charlie@caller.com
|
||
To: Alice <sip:alice@anywhere.com>
|
||
Call-ID: 27182@caller.com
|
||
CSeq: 2 INVITE
|
||
|
||
|
||
|
||
16.7 Negotiation
|
||
|
||
An example of a 606 (Not Acceptable) response is:
|
||
|
||
|
||
S->C: SIP/2.0 606 Not Acceptable
|
||
From: sip:mjh@isi.edu
|
||
To: <sip:schooler@cs.caltech.edu> ;tag=7434264
|
||
Call-ID: 14142@north.east.isi.edu
|
||
|
||
|
||
|
||
Handley, et al. Standards Track [Page 131]
|
||
|
||
RFC 2543 SIP: Session Initiation Protocol March 1999
|
||
|
||
|
||
CSeq: 1 INVITE
|
||
Contact: sip:mjh@north.east.isi.edu
|
||
Warning: 370 "Insufficient bandwidth (only have ISDN)",
|
||
305 "Incompatible media format",
|
||
330 "Multicast not available"
|
||
Content-Type: application/sdp
|
||
Content-Length: 50
|
||
|
||
v=0
|
||
s=Let's talk
|
||
b=CT:128
|
||
c=IN IP4 north.east.isi.edu
|
||
m=audio 3456 RTP/AVP 5 0 7
|
||
m=video 2232 RTP/AVP 31
|
||
|
||
|
||
|
||
In this example, the original request specified a bandwidth that was
|
||
higher than the access link could support, requested multicast, and
|
||
requested a set of media encodings. The response states that only 128
|
||
kb/s is available and that (only) DVI, PCM or LPC audio could be
|
||
supported in order of preference.
|
||
|
||
The response also states that multicast is not available. In such a
|
||
case, it might be appropriate to set up a transcoding gateway and
|
||
re-invite the user.
|
||
|
||
16.8 OPTIONS Request
|
||
|
||
A caller Alice can use an OPTIONS request to find out the
|
||
capabilities of a potential callee Bob, without "ringing" the
|
||
designated address. Bob returns a description indicating that he is
|
||
capable of receiving audio encodings PCM Ulaw (payload type 0), 1016
|
||
(payload type 1), GSM (payload type 3), and SX7300/8000 (dynamic
|
||
payload type 99), and video encodings H.261 (payload type 31) and
|
||
H.263 (payload type 34).
|
||
|
||
|
||
C->S: OPTIONS sip:bob@example.com SIP/2.0
|
||
From: Alice <sip:alice@anywhere.org>
|
||
To: Bob <sip:bob@example.com>
|
||
Call-ID: 6378@host.anywhere.org
|
||
CSeq: 1 OPTIONS
|
||
Accept: application/sdp
|
||
|
||
S->C: SIP/2.0 200 OK
|
||
From: Alice <sip:alice@anywhere.org>
|
||
To: Bob <sip:bob@example.com> ;tag=376364382
|
||
|
||
|
||
|
||
Handley, et al. Standards Track [Page 132]
|
||
|
||
RFC 2543 SIP: Session Initiation Protocol March 1999
|
||
|
||
|
||
Call-ID: 6378@host.anywhere.org
|
||
Content-Length: 81
|
||
Content-Type: application/sdp
|
||
|
||
v=0
|
||
m=audio 0 RTP/AVP 0 1 3 99
|
||
m=video 0 RTP/AVP 31 34
|
||
a=rtpmap:99 SX7300/8000
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
Handley, et al. Standards Track [Page 133]
|
||
|
||
RFC 2543 SIP: Session Initiation Protocol March 1999
|
||
|
||
|
||
A Minimal Implementation
|
||
|
||
A.1 Client
|
||
|
||
All clients MUST be able to generate the INVITE and ACK requests.
|
||
Clients MUST generate and parse the Call-ID, Content-Length,
|
||
Content-Type, CSeq, From and To headers. Clients MUST also parse the
|
||
Require header. A minimal implementation MUST understand SDP (RFC
|
||
2327, [6]). It MUST be able to recognize the status code classes 1
|
||
through 6 and act accordingly.
|
||
|
||
The following capability sets build on top of the minimal
|
||
implementation described in the previous paragraph. In general, each
|
||
capability listed below builds on the ones above it:
|
||
|
||
Basic: A basic implementation adds support for the BYE method to
|
||
allow the interruption of a pending call attempt. It includes a
|
||
User-Agent header in its requests and indicates its preferred
|
||
language in the Accept-Language header.
|
||
|
||
Redirection: To support call forwarding, a client needs to be able to
|
||
understand the Contact header, but only the SIP-URL part, not
|
||
the parameters.
|
||
|
||
Firewall-friendly: A firewall-friendly client understands the Route
|
||
and Record-Route header fields and can be configured to use a
|
||
local proxy for all outgoing requests.
|
||
|
||
Negotiation: A client MUST be able to request the OPTIONS method and
|
||
understand the 380 (Alternative Service) status and the Contact
|
||
parameters to participate in terminal and media negotiation. It
|
||
SHOULD be able to parse the Warning response header to provide
|
||
useful feedback to the caller.
|
||
|
||
Authentication: If a client wishes to invite callees that require
|
||
caller authentication, it MUST be able to recognize the 401
|
||
(Unauthorized) status code, MUST be able to generate the
|
||
Authorization request header and MUST understand the WWW-
|
||
Authenticate response header.
|
||
|
||
If a client wishes to use proxies that require caller authentication,
|
||
it MUST be able to recognize the 407 (Proxy Authentication Required)
|
||
status code, MUST be able to generate the Proxy-Authorization request
|
||
header and understand the Proxy-Authenticate response header.
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
Handley, et al. Standards Track [Page 134]
|
||
|
||
RFC 2543 SIP: Session Initiation Protocol March 1999
|
||
|
||
|
||
A.2 Server
|
||
|
||
A minimally compliant server implementation MUST understand the
|
||
INVITE, ACK, OPTIONS and BYE requests. A proxy server MUST also
|
||
understand CANCEL. It MUST parse and generate, as appropriate, the
|
||
Call-ID, Content-Length, Content-Type, CSeq, Expires, From, Max-
|
||
Forwards, Require, To and Via headers. It MUST echo the CSeq and
|
||
Timestamp headers in the response. It SHOULD include the Server
|
||
header in its responses.
|
||
|
||
A.3 Header Processing
|
||
|
||
Table 6 lists the headers that different implementations support. UAC
|
||
refers to a user-agent client (calling user agent), UAS to a user-
|
||
agent server (called user-agent).
|
||
|
||
The fields in the table have the following meaning. Type is as in
|
||
Table 4 and 5. "-" indicates the field is not meaningful to this
|
||
system (although it might be generated by it). "m" indicates the
|
||
field MUST be understood. "b" indicates the field SHOULD be
|
||
understood by a Basic implementation. "r" indicates the field SHOULD
|
||
be understood if the system claims to understand redirection. "a"
|
||
indicates the field SHOULD be understood if the system claims to
|
||
support authentication. "e" indicates the field SHOULD be understood
|
||
if the system claims to support encryption. "o" indicates support of
|
||
the field is purely optional. Headers whose support is optional for
|
||
all implementations are not shown.
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
Handley, et al. Standards Track [Page 135]
|
||
|
||
RFC 2543 SIP: Session Initiation Protocol March 1999
|
||
|
||
|
||
|
||
|
||
type UAC proxy UAS registrar
|
||
_____________________________________________________
|
||
Accept R - o m m
|
||
Accept-Encoding R - - m m
|
||
Accept-Language R - b b b
|
||
Allow 405 o - - -
|
||
Authorization R a o a a
|
||
Call-ID g m m m m
|
||
Content-Encoding g m - m m
|
||
Content-Length g m m m m
|
||
Content-Type g m - m m
|
||
CSeq g m m m m
|
||
Encryption g e - e e
|
||
Expires g - o o m
|
||
From g m o m m
|
||
Hide R - m - -
|
||
Contact R - - - m
|
||
Contact r r r - -
|
||
Max-Forwards R - b - -
|
||
Proxy-Authenticate 407 a - - -
|
||
Proxy-Authorization R - a - -
|
||
Proxy-Require R - m - -
|
||
Require R m - m m
|
||
Response-Key R - - e e
|
||
Route R - m - -
|
||
Timestamp g o o m m
|
||
To g m m m m
|
||
Unsupported r b b - -
|
||
User-Agent g b - b -
|
||
Via g m m m m
|
||
WWW-Authenticate 401 a - - -
|
||
|
||
|
||
Table 6: Header Field Processing Requirements
|
||
|
||
B Usage of the Session Description Protocol (SDP)
|
||
|
||
This section describes the use of the Session Description Protocol
|
||
(SDP) (RFC 2327 [6]).
|
||
|
||
B.1 Configuring Media Streams
|
||
|
||
The caller and callee align their media descriptions so that the nth
|
||
media stream ("m=" line) in the caller's session description
|
||
corresponds to the nth media stream in the callee's description.
|
||
|
||
|
||
|
||
|
||
Handley, et al. Standards Track [Page 136]
|
||
|
||
RFC 2543 SIP: Session Initiation Protocol March 1999
|
||
|
||
|
||
All media descriptions SHOULD contain "a=rtpmap" mappings from RTP
|
||
payload types to encodings.
|
||
|
||
This allows easier migration away from static payload
|
||
types.
|
||
|
||
If the callee wants to neither send nor receive a stream offered by
|
||
the caller, the callee sets the port number of that stream to zero in
|
||
its media description.
|
||
|
||
|
||
There currently is no other way than port zero for the
|
||
callee to refuse a bidirectional stream offered by the
|
||
caller. Both caller and callee need to be aware what media
|
||
tools are to be started.
|
||
|
||
For example, assume that the caller Alice has included the following
|
||
description in her INVITE request. It includes an audio stream and
|
||
two bidirectional video streams, using H.261 (payload type 31) and
|
||
MPEG (payload type 32).
|
||
|
||
|
||
v=0
|
||
o=alice 2890844526 2890844526 IN IP4 host.anywhere.com
|
||
c=IN IP4 host.anywhere.com
|
||
m=audio 49170 RTP/AVP 0
|
||
a=rtpmap:0 PCMU/8000
|
||
m=video 51372 RTP/AVP 31
|
||
a=rtpmap:31 H261/90000
|
||
m=video 53000 RTP/AVP 32
|
||
a=rtpmap:32 MPV/90000
|
||
|
||
|
||
|
||
The callee, Bob, does not want to receive or send the first video
|
||
stream, so it returns the media description below:
|
||
|
||
v=0
|
||
o=bob 2890844730 2890844730 IN IP4 host.example.com
|
||
c=IN IP4 host.example.com
|
||
m=audio 47920 RTP/AVP 0 1
|
||
a=rtpmap:0 PCMU/8000
|
||
a=rtpmap:1 1016/8000
|
||
m=video 0 RTP/AVP 31
|
||
m=video 53000 RTP/AVP 32
|
||
a=rtpmap:32 MPV/90000
|
||
|
||
|
||
|
||
|
||
|
||
Handley, et al. Standards Track [Page 137]
|
||
|
||
RFC 2543 SIP: Session Initiation Protocol March 1999
|
||
|
||
|
||
B.2 Setting SDP Values for Unicast
|
||
|
||
If a session description from a caller contains a media stream which
|
||
is listed as send (receive) only, it means that the caller is only
|
||
willing to send (receive) this stream, not receive (send). The same
|
||
is true for the callee.
|
||
|
||
For receive-only and send-or-receive streams, the port number and
|
||
address in the session description indicate where the media stream
|
||
should be sent to by the recipient of the session description, either
|
||
caller or callee. For send-only streams, the address and port number
|
||
have no significance and SHOULD be set to zero.
|
||
|
||
The list of payload types for each media stream conveys two pieces of
|
||
information, namely the set of codecs that the caller or callee is
|
||
capable of sending or receiving, and the RTP payload type numbers
|
||
used to identify those codecs. For receive-only or send-and-receive
|
||
media streams, a caller SHOULD list all of the codecs it is capable
|
||
of supporting in the session description in an INVITE or ACK. For
|
||
send-only streams, the caller SHOULD indicate only those it wishes to
|
||
send for this session. For receive-only streams, the payload type
|
||
numbers indicate the value of the payload type field in RTP packets
|
||
the caller is expecting to receive for that codec type. For send-only
|
||
streams, the payload type numbers indicate the value of the payload
|
||
type field in RTP packets the caller is planning to send for that
|
||
codec type. For send-and-receive streams, the payload type numbers
|
||
indicate the value of the payload type field the caller expects to
|
||
both send and receive.
|
||
|
||
If a media stream is listed as receive-only by the caller, the callee
|
||
lists, in the response, those codecs it intends to use from among the
|
||
ones listed in the request. If a media stream is listed as send-only
|
||
by the caller, the callee lists, in the response, those codecs it is
|
||
willing to receive among the ones listed in the the request. If the
|
||
media stream is listed as both send and receive, the callee lists
|
||
those codecs it is capable of sending or receiving among the ones
|
||
listed by the caller in the INVITE. The actual payload type numbers
|
||
in the callee's session description corresponding to a particular
|
||
codec MUST be the same as the caller's session description.
|
||
|
||
If caller and callee have no media formats in common for a particular
|
||
stream, the callee MUST return a session description containing the
|
||
particular "m=" line, but with the port number set to zero, and no
|
||
payload types listed.
|
||
|
||
If there are no media formats in common for all streams, the callee
|
||
SHOULD return a 400 response, with a 304 Warning header field.
|
||
|
||
|
||
|
||
|
||
Handley, et al. Standards Track [Page 138]
|
||
|
||
RFC 2543 SIP: Session Initiation Protocol March 1999
|
||
|
||
|
||
B.3 Multicast Operation
|
||
|
||
The interpretation of send-only and receive-only for multicast media
|
||
sessions differs from that for unicast sessions. For multicast,
|
||
send-only means that the recipient of the session description (caller
|
||
or callee) SHOULD only send media streams to the address and port
|
||
indicated. Receive-only means that the recipient of the session
|
||
description SHOULD only receive media on the address and port
|
||
indicated.
|
||
|
||
For multicast, receive and send multicast addresses are the same and
|
||
all parties use the same port numbers to receive media data. If the
|
||
session description provided by the caller is acceptable to the
|
||
callee, the callee can choose not to include a session description or
|
||
MAY echo the description in the response.
|
||
|
||
A callee MAY, in the response, return a session description with some
|
||
of the payload types removed, or port numbers set to zero (but no
|
||
other value). This indicates to the caller that the callee does not
|
||
support the given stream or media types which were removed. A callee
|
||
MUST NOT change whether a given stream is send-only, receive-only, or
|
||
send-and-receive.
|
||
|
||
If a callee does not support multicast at all, it SHOULD return a 400
|
||
status response and include a 330 Warning.
|
||
|
||
B.4 Delayed Media Streams
|
||
|
||
In some cases, a caller may not know the set of media formats which
|
||
it can support at the time it would like to issue an invitation. This
|
||
is the case when the caller is actually a gateway to another protocol
|
||
which performs media format negotiation after call setup. When this
|
||
occurs, a caller MAY issue an INVITE with a session description that
|
||
contains no media lines. The callee SHOULD interpret this to mean
|
||
that the caller wishes to participate in a multimedia session
|
||
described by the session description, but that the media streams are
|
||
not yet known. The callee SHOULD return a session description
|
||
indicating the streams and media formats it is willing to support,
|
||
however. The caller MAY update the session description either in the
|
||
ACK request or in a re-INVITE at a later time, once the streams are
|
||
known.
|
||
|
||
B.5 Putting Media Streams on Hold
|
||
|
||
If a party in a call wants to put the other party "on hold", i.e.,
|
||
request that it temporarily stops sending one or more media streams,
|
||
a party re-invites the other by sending an INVITE request with a
|
||
modified session description. The session description is the same as
|
||
|
||
|
||
|
||
Handley, et al. Standards Track [Page 139]
|
||
|
||
RFC 2543 SIP: Session Initiation Protocol March 1999
|
||
|
||
|
||
in the original invitation (or response), but the "c" destination
|
||
addresses for the media streams to be put on hold are set to zero
|
||
(0.0.0.0).
|
||
|
||
B.6 Subject and SDP "s=" Line
|
||
|
||
The SDP "s=" line and the SIP Subject header field have different
|
||
meanings when inviting to a multicast session. The session
|
||
description line describes the subject of the multicast session,
|
||
while the SIP Subject header field describes the reason for the
|
||
invitation. The example in Section 16.2 illustrates this point. For
|
||
invitations to two-party sessions, the SDP "s=" line MAY be left
|
||
empty.
|
||
|
||
B.7 The SDP "o=" Line
|
||
|
||
The "o=" line is not strictly necessary for two-party sessions, but
|
||
MUST be present to allow re-use of SDP-based tools.
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
Handley, et al. Standards Track [Page 140]
|
||
|
||
RFC 2543 SIP: Session Initiation Protocol March 1999
|
||
|
||
|
||
C Summary of Augmented BNF
|
||
|
||
All of the mechanisms specified in this document are described in
|
||
both prose and an augmented Backus-Naur Form (BNF) similar to that
|
||
used by RFC 822 [9]. Implementors will need to be familiar with the
|
||
notation in order to understand this specification. The augmented BNF
|
||
includes the following constructs:
|
||
|
||
|
||
|
||
name = definition
|
||
|
||
|
||
The name of a rule is simply the name itself (without any enclosing
|
||
"<" and ">") and is separated from its definition by the equal "="
|
||
character. White space is only significant in that indentation of
|
||
continuation lines is used to indicate a rule definition that spans
|
||
more than one line. Certain basic rules are in uppercase, such as SP,
|
||
LWS, HT, CRLF, DIGIT, ALPHA, etc. Angle brackets are used within
|
||
definitions whenever their presence will facilitate discerning the
|
||
use of rule names.
|
||
|
||
|
||
"literal"
|
||
|
||
|
||
Quotation marks surround literal text. Unless stated otherwise, the
|
||
text is case-insensitive.
|
||
|
||
|
||
rule1 | rule2
|
||
|
||
|
||
Elements separated by a bar ("|") are alternatives, e.g., "yes | no"
|
||
will accept yes or no.
|
||
|
||
|
||
(rule1 rule2)
|
||
|
||
|
||
Elements enclosed in parentheses are treated as a single element.
|
||
Thus, "(elem (foo | bar) elem)" allows the token sequences "elem foo
|
||
elem" and "elem bar elem".
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
Handley, et al. Standards Track [Page 141]
|
||
|
||
RFC 2543 SIP: Session Initiation Protocol March 1999
|
||
|
||
|
||
*rule
|
||
|
||
|
||
The character "*" preceding an element indicates repetition. The full
|
||
form is "<n>*<m>element" indicating at least <n> and at most <m>
|
||
occurrences of element. Default values are 0 and infinity so that
|
||
"*(element)" allows any number, including zero; "1*element" requires
|
||
at least one; and "1*2element" allows one or two.
|
||
|
||
|
||
[rule]
|
||
|
||
|
||
Square brackets enclose optional elements; "[foo bar]" is equivalent
|
||
to "*1(foo bar)".
|
||
|
||
|
||
N rule
|
||
|
||
|
||
Specific repetition: "<n>(element)" is equivalent to
|
||
"<n>*<n>(element)"; that is, exactly <n> occurrences of (element).
|
||
Thus 2DIGIT is a 2-digit number, and 3ALPHA is a string of three
|
||
alphabetic characters.
|
||
|
||
|
||
#rule
|
||
|
||
|
||
A construct "#" is defined, similar to "*", for defining lists of
|
||
elements. The full form is "<n>#<m> element" indicating at least <n>
|
||
and at most <m> elements, each separated by one or more commas (",")
|
||
and OPTIONAL linear white space (LWS). This makes the usual form of
|
||
lists very easy; a rule such as
|
||
|
||
|
||
|
||
( *LWS element *( *LWS "," *LWS element ))
|
||
|
||
|
||
can be shown as 1# element. Wherever this construct is used, null
|
||
elements are allowed, but do not contribute to the count of elements
|
||
present. That is, "(element), , (element)" is permitted, but counts
|
||
as only two elements. Therefore, where at least one element is
|
||
required, at least one non-null element MUST be present. Default
|
||
values are 0 and infinity so that "#element" allows any number,
|
||
including zero; "1#element" requires at least one; and "1#2element"
|
||
allows one or two.
|
||
|
||
|
||
|
||
Handley, et al. Standards Track [Page 142]
|
||
|
||
RFC 2543 SIP: Session Initiation Protocol March 1999
|
||
|
||
|
||
; comment
|
||
|
||
|
||
A semi-colon, set off some distance to the right of rule text, starts
|
||
a comment that continues to the end of line. This is a simple way of
|
||
including useful notes in parallel with the specifications.
|
||
|
||
|
||
implied *LWS
|
||
|
||
|
||
The grammar described by this specification is word-based. Except
|
||
where noted otherwise, linear white space (LWS) can be included
|
||
between any two adjacent words (token or quoted-string), and between
|
||
adjacent tokens and separators, without changing the interpretation
|
||
of a field. At least one delimiter (LWS and/or separators) MUST exist
|
||
between any two tokens (for the definition of "token" below), since
|
||
they would otherwise be interpreted as a single token.
|
||
|
||
C.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.
|
||
|
||
|
||
OCTET = <any 8-bit sequence of data>
|
||
CHAR = <any US-ASCII character (octets 0 - 127)>
|
||
upalpha = "A" | "B" | "C" | "D" | "E" | "F" | "G" | "H" | "I" |
|
||
"J" | "K" | "L" | "M" | "N" | "O" | "P" | "Q" | "R" |
|
||
"S" | "T" | "U" | "V" | "W" | "X" | "Y" | "Z"
|
||
lowalpha = "a" | "b" | "c" | "d" | "e" | "f" | "g" | "h" | "i" |
|
||
"j" | "k" | "l" | "m" | "n" | "o" | "p" | "q" | "r" |
|
||
"s" | "t" | "u" | "v" | "w" | "x" | "y" | "z"
|
||
alpha = lowalpha | upalpha
|
||
digit = "0" | "1" | "2" | "3" | "4" | "5" | "6" | "7" |
|
||
"8" | "9"
|
||
alphanum = alpha | digit
|
||
CTL = <any US-ASCII control character
|
||
(octets 0 -- 31) and DEL (127)>
|
||
CR = %d13 ; US-ASCII CR, carriage return character
|
||
LF = %d10 ; US-ASCII LF, line feed character
|
||
SP = %d32 ; US-ASCII SP, space character
|
||
HT = %d09 ; US-ASCII HT, horizontal tab character
|
||
CRLF = CR LF ; typically the end of a line
|
||
|
||
|
||
The following are defined in RFC 2396 [12] for the SIP URI:
|
||
|
||
|
||
|
||
Handley, et al. Standards Track [Page 143]
|
||
|
||
RFC 2543 SIP: Session Initiation Protocol March 1999
|
||
|
||
|
||
unreserved = alphanum | mark
|
||
mark = "-" | "_" | "." | "!" | "~" | "*" | "'"
|
||
| "(" | ")"
|
||
escaped = "%" hex hex
|
||
|
||
|
||
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.
|
||
|
||
|
||
|
||
LWS = [CRLF] 1*( SP | HT ) ; linear whitespace
|
||
|
||
|
||
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 character set
|
||
(RFC 2279 [21]). In this regard, SIP differs from HTTP, which uses
|
||
the ISO 8859-1 character set.
|
||
|
||
|
||
|
||
TEXT-UTF8 = <any UTF-8 character encoding, except CTLs,
|
||
but including LWS>
|
||
|
||
|
||
A CRLF is allowed in the definition of TEXT-UTF8 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
|
||
value.
|
||
|
||
Hexadecimal numeric characters are used in several protocol elements.
|
||
|
||
|
||
|
||
hex = "A" | "B" | "C" | "D" | "E" | "F"
|
||
| "a" | "b" | "c" | "d" | "e" | "f" | digit
|
||
|
||
|
||
Many SIP header field values consist of words separated by LWS or
|
||
special characters. These special characters MUST be in a quoted
|
||
string to be used within a parameter value.
|
||
|
||
|
||
|
||
|
||
|
||
|
||
Handley, et al. Standards Track [Page 144]
|
||
|
||
RFC 2543 SIP: Session Initiation Protocol March 1999
|
||
|
||
|
||
token = 1*< any CHAR except CTL's or separators>
|
||
separators = "(" | ")" | "<" | ">" | "@" |
|
||
"," | ";" | ":" | "\" | <"> |
|
||
"/" | "[" | "]" | "?" | "=" |
|
||
"{" | "}" | SP | HT
|
||
|
||
|
||
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 = "(" *(ctext | quoted-pair | comment) ")"
|
||
ctext = < any TEXT-UTF8 excluding "(" and ")">
|
||
|
||
|
||
A string of text is parsed as a single word if it is quoted using
|
||
double-quote marks.
|
||
|
||
|
||
|
||
quoted-string = ( <"> *(qdtext | quoted-pair ) <"> )
|
||
qdtext = <any TEXT-UTF8 except <">>
|
||
|
||
|
||
The backslash character ("\") MAY be used as a single-character
|
||
quoting mechanism only within quoted-string and comment constructs.
|
||
|
||
|
||
|
||
quoted-pair = " \ " CHAR
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
Handley, et al. Standards Track [Page 145]
|
||
|
||
RFC 2543 SIP: Session Initiation Protocol March 1999
|
||
|
||
|
||
D Using SRV DNS Records
|
||
|
||
The following procedure is experimental and relies on DNS SRV records
|
||
(RFC 2052 [14]). The steps listed below are used in place of the two
|
||
steps in section 1.4.2.
|
||
|
||
If a step elicits no addresses, the client continues to the next
|
||
step. However if a step elicits one or more addresses, but no SIP
|
||
server at any of those addresses responds, then the client concludes
|
||
the server is down and doesn't continue on to the next step.
|
||
|
||
When SRV records are to be used, the protocol to use when querying
|
||
for the SRV record is "sip". SRV records contain port numbers for
|
||
servers, in addition to IP addresses; the client always uses this
|
||
port number when contacting the SIP server. Otherwise, the port
|
||
number in the SIP URI is used, if present. If there is no port number
|
||
in the URI, the default port, 5060, is used.
|
||
|
||
1. If the host portion of the Request-URI is an IP address,
|
||
the client contacts the server at the given address. If the
|
||
host portion of the Request-URI is not an IP address, the
|
||
client proceeds to the next step.
|
||
|
||
2. The Request-URI is examined. If it contains an explicit
|
||
port number, the next two steps are skipped.
|
||
|
||
3. The Request-URI is examined. If it does not specify a
|
||
protocol (TCP or UDP), the client queries the name server
|
||
for SRV records for both UDP (if supported by the client)
|
||
and TCP (if supported by the client) SIP servers. The
|
||
format of these queries is defined in RFC 2052 [14]. The
|
||
results of the query or queries are merged together and
|
||
ordered based on priority. Then, the searching technique
|
||
outlined in RFC 2052 [14] is used to select servers in
|
||
order. If DNS doesn't return any records, the user goes to
|
||
the last step. Otherwise, the user attempts to contact
|
||
each server in the order listed. If no server is
|
||
contacted, the user gives up.
|
||
|
||
4. If the Request-URI specifies a protocol (TCP or UDP) that
|
||
is supported by the client, the client queries the name
|
||
server for SRV records for SIP servers of that protocol
|
||
type only. If the client does not support the protocol
|
||
specified in the Request-URI, it gives up. The searching
|
||
technique outlined in RFC 2052 [14] is used to select
|
||
servers from the DNS response in order. If DNS doesn't
|
||
|
||
|
||
|
||
|
||
|
||
Handley, et al. Standards Track [Page 146]
|
||
|
||
RFC 2543 SIP: Session Initiation Protocol March 1999
|
||
|
||
|
||
return any records, the user goes to the last step.
|
||
Otherwise, the user attempts to contact each server in the
|
||
order listed. If no server is contacted, the user gives up.
|
||
|
||
5. The client queries the name server for address records for
|
||
the host portion of the Request-URI. If there were no
|
||
address records, the client stops, as it has been unable to
|
||
locate a server. By address record, we mean A RR's, AAAA
|
||
RR's, or their most modern equivalent.
|
||
|
||
A client MAY cache a successful DNS query result. A successful query
|
||
is one which contained records in the answer, and a server was
|
||
contacted at one of the addresses from the answer. When the client
|
||
wishes to send a request to the same host, it starts the search as if
|
||
it had just received this answer from the name server. The server
|
||
uses the procedures specified in RFC1035 [15] regarding cache
|
||
invalidation when the time-to-live of the DNS result expires. If the
|
||
client does not find a SIP server among the addresses listed in the
|
||
cached answer, it starts the search at the beginning of the sequence
|
||
described above.
|
||
|
||
For example, consider a client that wishes to send a SIP request. The
|
||
Request-URI for the destination is sip:user@company.com. The client
|
||
only supports UDP. It would follow these steps:
|
||
|
||
1. The host portion is not an IP address, so the client goes
|
||
to step 2 above.
|
||
|
||
2. The client does a DNS query of QNAME="sip.udp.company.com",
|
||
QCLASS=IN, QTYPE=SRV. Since it doesn't support TCP, it
|
||
omits the TCP query. There were no addresses in the DNS
|
||
response, so the client goes to the next step.
|
||
|
||
3. The client does a DNS query for A records for
|
||
"company.com". An address is found, so that client attempts
|
||
to contact a server at that address at port 5060.
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
Handley, et al. Standards Track [Page 147]
|
||
|
||
RFC 2543 SIP: Session Initiation Protocol March 1999
|
||
|
||
|
||
E IANA Considerations
|
||
|
||
Section 4.4 describes a name space and mechanism for registering SIP
|
||
options.
|
||
|
||
Section 6.41 describes the name space for registering SIP warn-codes.
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
Handley, et al. Standards Track [Page 148]
|
||
|
||
RFC 2543 SIP: Session Initiation Protocol March 1999
|
||
|
||
|
||
F Acknowledgments
|
||
|
||
We wish to thank the members of the IETF MMUSIC WG for their comments
|
||
and suggestions. Detailed comments were provided by Anders
|
||
Kristensen, Jim Buller, Dave Devanathan, Yaron Goland, Christian
|
||
Huitema, Gadi Karmi, Jonathan Lennox, Keith Moore, Vern Paxson, Moshe
|
||
J. Sambol, and Eric Tremblay.
|
||
|
||
This work is based, inter alia, on [37,38].
|
||
|
||
G Authors' Addresses
|
||
|
||
Mark Handley
|
||
AT&T Center for Internet Research at ISCI (ACIRI)
|
||
1947 Center St., Suite 600
|
||
Berkeley, CA 94704-119
|
||
USA
|
||
Email: mjh@aciri.org
|
||
|
||
Henning Schulzrinne
|
||
Dept. of Computer Science
|
||
Columbia University
|
||
1214 Amsterdam Avenue
|
||
New York, NY 10027
|
||
USA
|
||
Email: schulzrinne@cs.columbia.edu
|
||
|
||
Eve Schooler
|
||
Computer Science Department 256-80
|
||
California Institute of Technology
|
||
Pasadena, CA 91125
|
||
USA
|
||
Email: schooler@cs.caltech.edu
|
||
|
||
Jonathan Rosenberg
|
||
Lucent Technologies, Bell Laboratories
|
||
Rm. 4C-526
|
||
101 Crawfords Corner Road
|
||
Holmdel, NJ 07733
|
||
USA
|
||
Email: jdrosen@bell-labs.com
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
Handley, et al. Standards Track [Page 149]
|
||
|
||
RFC 2543 SIP: Session Initiation Protocol March 1999
|
||
|
||
|
||
H Bibliography
|
||
|
||
[1] Pandya, R., "Emerging mobile and personal communication systems,"
|
||
IEEE Communications Magazine , vol. 33, pp. 44--52, June 1995.
|
||
|
||
[2] Braden, B., Zhang, L., Berson, S., Herzog, S. and S. Jamin,
|
||
"Resource ReSerVation protocol (RSVP) -- version 1 functional
|
||
specification", RFC 2205, October 1997.
|
||
|
||
[3] Schulzrinne, H., Casner, S., Frederick, R. and V. Jacobson, "RTP:
|
||
a transport protocol for real-time applications", RFC 1889,
|
||
Internet Engineering Task Force, Jan. 1996.
|
||
|
||
[4] Schulzrinne, H., Lanphier, R. and A. Rao, "Real time streaming
|
||
protocol (RTSP)", RFC 2326, April 1998.
|
||
|
||
[5] Handley, M., "SAP: Session announcement protocol," Internet
|
||
Draft, Internet Engineering Task Force, Nov. 1996. Work in
|
||
progress.
|
||
|
||
[6] Handley, M. and V. Jacobson, "SDP: session description protocol",
|
||
RFC 2327, April 1998.
|
||
|
||
[7] International Telecommunication Union, "Visual telephone systems
|
||
and equipment for local area networks which provide a non-
|
||
guaranteed quality of service," Recommendation H.323,
|
||
Telecommunication Standardization Sector of ITU, Geneva,
|
||
Switzerland, May 1996.
|
||
|
||
[8] International Telecommunication Union, "Control protocol for
|
||
multimedia communication," Recommendation H.245,
|
||
Telecommunication Standardization Sector of ITU, Geneva,
|
||
Switzerland, Feb. 1998.
|
||
|
||
[9] International Telecommunication Union, "Media stream
|
||
packetization and synchronization on non-guaranteed quality of
|
||
service LANs," Recommendation H.225.0, Telecommunication
|
||
Standardization Sector of ITU, Geneva, Switzerland, Nov. 1996.
|
||
|
||
[10] Bradner, S., "Key words for use in RFCs to indicate requirement
|
||
levels", BCP 14, RFC 2119, Mardch 1997.
|
||
|
||
[11] Fielding, R., Gettys, J., Mogul, J., Nielsen, H. and T.
|
||
Berners-Lee, "Hypertext transfer protocol -- HTTP/1.1", RFC
|
||
2068, January 1997.
|
||
|
||
[12] Berners-Lee, T., Fielding, R. and L. Masinter, "Uniform resource
|
||
identifiers (URI): generic syntax", RFC 2396, August 1998.
|
||
|
||
|
||
|
||
Handley, et al. Standards Track [Page 150]
|
||
|
||
RFC 2543 SIP: Session Initiation Protocol March 1999
|
||
|
||
|
||
[13] Berners-Lee, T., Masinter, L. and M. McCahill, "Uniform resource
|
||
locators (URL)", RFC 1738, December 1994.
|
||
|
||
[14] Gulbrandsen, A. and P. Vixie, "A DNS RR for specifying the
|
||
location of services (DNS SRV)", RFC 2052, October 1996.
|
||
|
||
[15] Mockapetris, P., "Domain names - implementation and
|
||
specification", STD 13, RFC 1035, Noveberm 1997.
|
||
|
||
[16] Hamilton, M. and R. Wright, "Use of DNS aliases for network
|
||
services", RFC 2219, October 1997.
|
||
|
||
[17] Zimmerman, D., "The finger user information protocol", RFC 1288,
|
||
December 1991.
|
||
|
||
[18] Williamson, S., Kosters, M., Blacka, D., Singh, J. and K.
|
||
Zeilstra, "Referral whois (rwhois) protocol V1.5", RFC 2167,
|
||
June 1997.
|
||
|
||
[19] Yeong, W., Howes, T. and S. Kille, "Lightweight directory access
|
||
protocol", RFC 1777, March 1995.
|
||
|
||
[20] Schooler, E., "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.
|
||
|
||
[21] Yergeau, F., "UTF-8, a transformation format of ISO 10646", RFC
|
||
2279, January 1998.
|
||
|
||
[22] Stevens, W., TCP/IP illustrated: the protocols , vol. 1.
|
||
Reading, Massachusetts: Addison-Wesley, 1994.
|
||
|
||
[23] Mogul, J. and S. Deering, "Path MTU discovery", RFC 1191,
|
||
November 1990.
|
||
|
||
[24] Crocker, D., "Standard for the format of ARPA internet text
|
||
messages", RFC STD 11, RFC 822, August 1982.
|
||
|
||
[25] Meyer, D., "Administratively scoped IP multicast", RFC 2365,
|
||
July 1998.
|
||
|
||
[26] Schulzrinne, H., "RTP profile for audio and video conferences
|
||
with minimal control", RFC 1890, January 1996
|
||
|
||
[27] Eastlake, D., Crocker, S. and J. Schiller, "Randomness
|
||
recommendations for security", RFC 1750, December 1994.
|
||
|
||
|
||
|
||
|
||
Handley, et al. Standards Track [Page 151]
|
||
|
||
RFC 2543 SIP: Session Initiation Protocol March 1999
|
||
|
||
|
||
[28] Hoffman, P., Masinter, L. and J. Zawinski, "The mailto URL
|
||
scheme", RFC 2368, July 1998.
|
||
|
||
[29] Braden, B., "Requirements for internet hosts - application and
|
||
support", STD 3, RFC 1123, October 1989.
|
||
|
||
[30] Palme, J., "Common internet message headers", RFC 2076, February
|
||
1997.
|
||
|
||
[31] Alvestrand, H., "IETF policy on character sets and languages",
|
||
RFC 2277, January 1998.
|
||
|
||
[32] Elkins, M., "MIME security with pretty good privacy (PGP)", RFC
|
||
2015, October 1996.
|
||
|
||
[33] Atkins, D., Stallings, W. and P. Zimmermann, "PGP message
|
||
exchange formats", RFC 1991, August 1996.
|
||
|
||
[34] Atkinson, R., "Security architecture for the internet protocol",
|
||
RFC 2401, November 1998.
|
||
|
||
[35] Allen, C. and T. Dierks, "The TLS protocol version 1.0," RFC
|
||
2246, January 1999.
|
||
|
||
[36] Franks, J., Hallam-Baker, P., Hostetler, J., Lawrence, S.,
|
||
Leach, P., Luotonen, A. and L. Stewart, "HTTP authentication:
|
||
Basic and digest access authentication," Internet Draft,
|
||
Internet Engineering Task Force, Sept. 1998. Work in progress.
|
||
|
||
[37] Schooler, E., "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.
|
||
|
||
[38] Schulzrinne, H., "Personal mobility for multimedia services in
|
||
the Internet," in European Workshop on Interactive Distributed
|
||
Multimedia Systems and Services (IDMS) , (Berlin, Germany), Mar.
|
||
1996.
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
Handley, et al. Standards Track [Page 152]
|
||
|
||
RFC 2543 SIP: Session Initiation Protocol March 1999
|
||
|
||
|
||
Full Copyright Statement
|
||
|
||
Copyright (C) The Internet Society (1999). 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.
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
Handley, et al. Standards Track [Page 153]
|