The call flows shown in this document were developed in the design of
a SIP IP communications network. They represent an example minimum
set of functionality.

It is the hope of the authors that this document will be useful for
SIP implementers, designers, and protocol researchers alike and will
help further the goal of a standard implementation of RFC 3261 [1].
These flows represent carefully checked and working group reviewed
scenarios of the most basic examples as a companion to the
specifications.
These call flows are based on the current version 2.0 of SIP in RFC
3261 [1] with SDP usage described in RFC 3264 [2]. Other RFCs also
comprise the SIP standard but are not used in this set of basic call
flows.

Call flow examples of SIP interworking with the PSTN through gateways
are contained in a companion document, RFC 3666 [5].

The key words "MUST", "MUST NOT", "REQUIRED", "SHALL", "SHALL NOT",
"SHOULD", "SHOULD NOT", "RECOMMENDED", "MAY", and "OPTIONAL" in this
document are to be interpreted as described in BCP 14, RFC 2119 [4].

1.1. General Assumptions

A number of architecture, network, and protocol assumptions underlie
the call flows in this document. Note that these assumptions are not
requirements. They are outlined in this section so that they may be
taken into consideration and to aid in the understanding of the call
flow examples.

The authentication of SIP User Agents in these example call flows is
performed using HTTP Digest as defined in [1] and [3].

Some Proxy Servers in these call flows insert Record-Route headers
into requests to ensure that they are in the signaling path for
future message exchanges.

These flows show TCP, TLS, and UDP for transport. See the discussion
in RFC 3261 for details on the transport issues for SIP.

1.2. Legend for Message Flows

Dashed lines (---) represent signaling messages that are mandatory to
the call scenario. These messages can be SIP or PSTN signaling. The
arrow indicates the direction of message flow.

Messages with parentheses around their name represent optional
messages.

Messages are identified in the Figures as F1, F2, etc. This
references the message details in the list that follows the Figure.
Comments in the message details are shown in the following form:

/* Comments. */

1.3. SIP Protocol Assumptions

This document does not prescribe the flows precisely as they are
shown, but rather the flows illustrate the principles for best
practice. They are best practices usages (orderings, syntax,
selection of features for the purpose, handling of error) of SIP
methods, headers and parameters. IMPORTANT: The exact flows here
must not be copied as is by an implementer due to specific incorrect
characteristics that were introduced into the document for
convenience and are listed below. To sum up, the basic flows
represent well-reviewed examples of SIP usage, which are best common
practice according to IETF consensus.

For simplicity in reading and editing the document, there are a
number of differences between some of the examples and actual SIP
messages. For example, the HTTP Digest responses are not actual MD5
encodings. Call-IDs are often repeated, and CSeq counts often begin
at 1. Header fields are usually shown in the same order. Usually
only the minimum required header field set is shown, others that
would normally be present such as Accept, Supported, Allow, etc are
not shown.

Bob sends a SIP REGISTER request to the SIP server. The request
includes the user's contact list. This flow shows the use of HTTP
Digest for authentication using TLS transport. TLS transport is used
due to the lack of integrity protection in HTTP Digest and the danger
of registration hijacking without it, as described in RFC 3261 [1].
The SIP server provides a challenge to Bob. Bob enters her/his valid
user ID and password. Bob's SIP client encrypts the user information
according to the challenge issued by the SIP server and sends the
response to the SIP server. The SIP server validates the user's
credentials. It registers the user in its contact database and
returns a response (200 OK) to Bob's SIP client. The response
includes the user's current contact list in Contact headers. The
format of the authentication shown is HTTP digest. It is assumed
that Bob has not previously registered with this Server.

Bob wishes to update the list of addresses where the SIP server will
redirect or forward INVITE requests.

Bob sends a SIP REGISTER request to the SIP server. Bob's request
includes an updated contact list. Since the user already has
authenticated with the server, the user supplies authentication
credentials with the request and is not challenged by the server. The
SIP server validates the user's credentials. It registers the user
in its contact database, updates the user's contact list, and returns
a response (200 OK) to Bob's SIP client. The response includes the
user's current contact list in Contact headers.

Bob sends a register request to the Proxy Server containing no
Contact headers, indicating the user wishes to query the server for
the user's current contact list. Since the user already has
authenticated with the server, the user supplies authentication
credentials with the request and is not challenged by the server.
The SIP server validates the user's credentials. The server returns
a response (200 OK) which includes the user's current registration
list in Contact headers.

Bob wishes to cancel their registration with the SIP server. Bob
sends a SIP REGISTER request to the SIP server. The request has an
expiration period of 0 and applies to all existing contact locations.
Since the user already has authenticated with the server, the user
supplies authentication credentials with the request and is not
challenged by the server. The SIP server validates the user's
credentials. It clears the user's contact list, and returns a
response (200 OK) to Bob's SIP client.

Bob sends a SIP REGISTER request to the SIP Server. The SIP server
provides a challenge to Bob. Bob enters her/his user ID and
password. Bob's SIP client encrypts the user information according
to the challenge issued by the SIP server and sends the response to
the SIP server. The SIP server attempts to validate the user's
credentials, but they are not valid (the user's password does not
match the password established for the user's account). The server
returns a response (401 Unauthorized) to Bob's SIP client.

This section details session establishment between two SIP User
Agents (UAs): Alice and Bob. Alice (sip:alice@atlanta.example.com)
and Bob (sip:bob@biloxi.example.com) are assumed to be SIP phones or
SIP-enabled devices. The successful calls show the initial
signaling, the exchange of media information in the form of SDP
payloads, the establishment of the media session, then finally the
termination of the call.

HTTP Digest authentication is used by Proxy Servers to authenticate
the caller Alice. It is assumed that Bob has registered with Proxy
Server Proxy 2 as per Section 2 to be able to receive the calls via
the Proxy.

/* Bob Hangs Up with Alice. Note that the CSeq is NOT 2, since
Alice and Bob maintain their own independent CSeq counts.
(The INVITE was request 1 generated by Alice, and the BYE is
request 1 generated by Bob) */

In this scenario, Alice completes a call to Bob using two proxies
Proxy 1 and Proxy 2. The initial INVITE (F1) contains a pre-loaded
Route header with the address of Proxy 1 (Proxy 1 is configured as a
default outbound proxy for Alice). The request does not contain the
Authorization credentials Proxy 1 requires, so a 407 Proxy
Authorization response is sent containing the challenge information.
A new INVITE (F4) is then sent containing the correct credentials and
the call proceeds. The call terminates when Bob disconnects by
initiating a BYE message.
Proxy 1 inserts a Record-Route header into the INVITE message to
ensure that it is present in all subsequent message exchanges. Proxy
2 also inserts itself into the Record-Route header. The ACK (F15)
and BYE (F18) both have a Route header.

In this scenario, Alice completes a call to Bob using two proxies
Proxy 1 and Proxy 2. Alice has valid credentials in both domains.
Since the initial INVITE (F1) does not contain the Authorization
credentials Proxy 1 requires, so a 407 Proxy Authorization response
is sent containing the challenge information. A new INVITE (F4) is
then sent containing the correct credentials and the call proceeds
after Proxy 2 challenges and receives valid credentials. The call
terminates when Bob disconnects by initiating a BYE message.

Proxy 1 inserts a Record-Route header into the INVITE message to
ensure that it is present in all subsequent message exchanges. Proxy
2 also inserts itself into the Record-Route header.

In this scenario, Alice completes a call to Bob via a Proxy Server.
Alice is configured for a primary SIP Proxy Server Proxy 1 and a
secondary SIP Proxy Server Proxy 2 (Or is able to use DNS SRV records
to locate Proxy 1 and Proxy 2). Alice has valid credentials for both
domains. Proxy 1 is out of service and does not respond to INVITEs
(it is reachable, but unresponsive). Alice then completes the call
to Bob using Proxy 2.

Alice completes a call to Bob through a ALG (Application Layer
Gateway) and a SIP Proxy. The routing through the ALG is
accomplished using a pre-loaded Route header in the INVITE F1. Note
that the media stream setup is not end-to-end - the ALG terminates
both media streams and bridges them. This is done by the ALG
modifying the SDP in the INVITE (F1) and 200 OK (F10) messages, and
possibly any 18x or ACK messages containing SDP.

In addition to firewall traversal, this Back-to-Back User Agent
(B2BUA) could be used as part of an anonymizer service (in which all
identifying information on Alice would be removed), or to perform
codec media conversion, such as mu-law to A-law conversion of PCM on
an international call.

/* SIP ALG prepares to proxy data from port 192.0.2.128/2000 to
192.0.2.101/49172. Proxy 2 uses a Location Service function to
determine where Bob is located. Based upon location analysis the call
is forwarded to Bob */

In this scenario, Alice places a call to Bob using first a Redirect
server then a Proxy Server. The INVITE message is first sent to the
Redirect Server. The Server returns a 302 Moved Temporarily response
(F2) containing a Contact header with Bob's current SIP address.
Alice then generates a new INVITE and sends to Bob via the Proxy
Server and the call proceeds normally. In this example, no SDP is
present in the INVITE, so the SDP is carried in the ACK message.

This example shows a session in which the media changes midway
through the session. When Bob's IP address changes during the
session, Bob sends a re-INVITE containing a new Contact and SDP
(version number incremented) information to A. In this flow, the
proxy does not Record-Route so is not in the SIP messaging path after
the initial exchange.

In this scenario, Alice gives up on the call before Bob answers
(sends a 200 OK response). Alice sends a CANCEL (F9) since no final
response had been received from Bob. If a 200 OK to the INVITE had
crossed with the CANCEL, Alice would have sent an ACK then a BYE to
Bob in order to properly terminate the call.

Note that the CANCEL message is acknowledged with a 200 OK on a hop
by hop basis, rather than end to end.

In this scenario, Bob is busy and sends a 486 Busy Here response to
Alice's INVITE. Note that the non-2xx response is acknowledged on a
hop-by-hop basis instead of end-to-end. Also note that many SIP UAs
will not return a 486 response, as they have multiple line and other
features.

In this scenario, Bob initially sends a 180 Ringing response to
Alice, indicating that alerting is taking place. However, then a
480 Unavailable is then sent to Alice. This response is
acknowledged then proxied back to Alice.

Since this document contains examples of SIP session establishment,
the security considerations in RFC 3261 [1] apply. RFC 3261
describes the basic threats including registration hijacking, server
impersonation, message body tampering, session modifying or teardown,
and denial of service and amplification attacks. The use of HTTP
Digest as shown in this document provides one-way authentication and
protection against replay attacks. TLS transport is used in
registration scenarios due to the lack of integrity protection in
HTTP Digest and the danger of registration hijacking without it, as
described in RFC 3261 [1]. A full discussion of the weaknesses of
HTTP Digest is provided in RFC 3261 [1]. The use of TLS and the
Secure SIP (sips) URI scheme provides a better level of security
including two-way authentication. S/MIME can provide end-to-end
confidentiality and integrity protection of message bodies, as
described in RFC 3261.

The IETF takes no position regarding the validity or scope of any
intellectual property or other rights that might be claimed to
pertain to the implementation or use of the technology described in

this document or the extent to which any license under such rights
might or might not be available; neither does it represent that it
has made any effort to identify any such rights. Information on the
IETF's procedures with respect to rights in standards-track and
standards-related documentation can be found in BCP-11. Copies of
claims of rights made available for publication and any assurances of
licenses to be made available, or the result of an attempt made to
obtain a general license or permission for the use of such
proprietary rights by implementors or users of this specification can
be obtained from the IETF Secretariat.

The IETF invites any interested party to bring to its attention any
copyrights, patents or patent applications, or other proprietary
rights which may cover technology that may be required to practice
this standard. Please address the information to the IETF Executive
Director.

7. Acknowledgments

This document is has been a group effort by the SIP and SIPPING WGs.
The authors wish to thank everyone who has read, reviewed, commented,
or made suggestions to improve this document.

Thanks to Rohan Mahy, Adam Roach, Gonzalo Camarillo, Cullen Jennings,
and Tom Taylor for their detailed comments during the final review.
Thanks to Dean Willis for his early contributions to the development
of this document.

The authors wish to thank Kundan Singh for performing parser
validation of messages.

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 assignees.

This document and the information contained herein is provided on an
"AS IS" basis and THE INTERNET SOCIETY AND THE INTERNET ENGINEERING
TASK FORCE DISCLAIMS ALL WARRANTIES, EXPRESS OR IMPLIED, INCLUDING
BUT NOT LIMITED TO ANY WARRANTY THAT THE USE OF THE INFORMATION
HEREIN WILL NOT INFRINGE ANY RIGHTS OR ANY IMPLIED WARRANTIES OF
MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE.

Acknowledgement

Funding for the RFC Editor function is currently provided by the
Internet Society.