draft-ietf-mmusic-sip-100rel-00.txt   draft-ietf-mmusic-sip-100rel-01.txt 
Internet Engineering Task Force MMUSIC WG Internet Engineering Task Force MMUSIC WG
Internet Draft J.Rosenberg,H.Schulzrinne Internet Draft J.Rosenberg,H.Schulzrinne
draft-ietf-mmusic-sip-100rel-00.txt Bell Laboratories,Columbia U. draft-ietf-mmusic-sip-100rel-01.txt Bell Laboratories,Columbia U.
November 18, 1998 May 20, 1999
Expires: May 1999 Expires: November 20, 1999
Reliability of Provisional Responses in SIP Reliability of Provisional Responses in SIP
STATUS OF THIS MEMO STATUS OF THIS MEMO
This document is an Internet-Draft. Internet-Drafts are working This document is an Internet-Draft and is in full conformance with
documents of the Internet Engineering Task Force (IETF), its areas, all provisions of Section 10 of RFC2026.
and its working groups. Note that other groups may also distribute
working documents as Internet-Drafts. Internet-Drafts are working documents of the Internet Engineering
Task Force (IETF), its areas, and its working groups. Note that
other groups may also distribute working documents as Internet-
Drafts.
Internet-Drafts are draft documents valid for a maximum of six months Internet-Drafts are draft documents valid for a maximum of six months
and may be updated, replaced, or obsoleted by other documents at any and may be updated, replaced, or obsoleted by other documents at any
time. It is inappropriate to use Internet-Drafts as reference time. It is inappropriate to use Internet-Drafts as reference
material or to cite them other than as ``work in progress''. material or to cite them other than as work in progress.
To learn the current status of any Internet-Draft, please check the The list of current Internet-Drafts can be accessed at
``1id-abstracts.txt'' listing contained in the Internet-Drafts Shadow http://www.ietf.org/ietf/1id-abstracts.txt
Directories on ftp.is.co.za (Africa), nic.nordu.net (Europe),
munnari.oz.au (Pacific Rim), ftp.ietf.org (US East Coast), or
ftp.isi.edu (US West Coast).
Distribution of this document is unlimited. The list of Internet-Draft Shadow Directories can be accessed at
http://www.ietf.org/shadow.html.
1 Abstract Abstract
This document specifies an extension to the Session Initiation This document specifies an extension to the Session Initiation
Protocol (SIP) providing reliable provisional response messages. Protocol (SIP) providing reliable provisional response messages.
2 Introduction 1 Introduction
The Session Initiation Protocol (SIP) [1] is a request-response The Session Initiation Protocol (SIP) [1] is a request-response
protocol for initiating, maintaining, and terminating multimedia protocol for initiating, maintaining, and terminating multimedia
sessions. Each SIP request is followed by one or more provisional sessions. Each SIP request is followed by one or more provisional
responses, followed by a one or more definitive responses. These responses, followed by a one or more definitive responses. These
provisional responses, also called informational responses, have provisional responses, also called informational responses, have
status codes within the 100-199 range. They provide information on status codes within the 100-199 range. They are most commonly used
call progress, such as trying (100), alerting (180), and queuing for responses to an INVITE request. They provide information on call
(181). However, when run over UDP, SIP does not guarantee that these progress, such as trying (100), alerting (180), and queueing (182).
messages are delivered reliably, or in order. A server simply However, when run over UDP, SIP does not guarantee that these
transmits a provisional response. If the client retransmits the messages are delivered reliably, or in order.
request, the server retransmits the most recent response, provisional
or otherwise.
However, a number of applications require reliability and in-order However, a number of applications require reliability and in-order
delivery of provisional responses. These include gateway delivery of provisional responses to INVITE. These include gateway
applications, wireless phones, ACD servers, and call queueing applications, wireless phones, ACD servers, and call queueing
systems. Generally, these applications make use of the provisional systems. Generally, these applications make use of the provisional
responses to drive state machinery. This is especially true for the responses to drive state machinery. This is especially true for the
180 Ringing provisional response, which maps to the Q.931 ALERTING 180 Ringing provisional response, which maps to the Q.931 ALERTING
message. message.
This document provides a simple extension to SIP for ensuring that This document provides a simple extension to SIP for ensuring that
provisional responses are delivered reliably, independent of the provisional responses to INVITEs are delivered reliably, independent
underlying transport mechanism. The extension is simple, requiring of the underlying transport mechanism. The extension applies only to
two new header fields, and no new methods. It fits well within the the INVITE method. Reliability of provisional responses for other
generic framework of SIP reliability. methods is not provided. The extension is simple, requiring two new
header fields, and no new methods. It fits well within the generic
framework of SIP reliability. It is partly backwards compatible, so
that a Require header is not needed (it can be included if the UAC
insists on the feature, of course), although a Proxy-Require header
is needed.
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 [2] and
indicate requirement levels for compliant implementations.
3 Overview 3 Overview
The reliability mechanism is based on the standard windowed The reliability mechanism is based on the standard windowed
acknowledgement technique. When a server generates a provisional acknowledgement technique. When a server generates a provisional
response, it places a sequence number (via the RSeq header field) in response which is to be delivered reliably, it places a sequence
the provisional response. The sequence number always starts at zero. number (via the RSeq header field) in the provisional response. These
The sequence number space need only be unique within each Call-ID, sequence numbers always start at zero, since they are defined only
To, and CSeq tuple. Because of this, there is no need for randomized within the context of a transaction. This elimiates the need for SYN
sequence number selection or SYN handshakes as in TCP. handshakes as in TCP. The provisional response is then retransmitted
with an exponential backoff.
The UAC maintains a variable, sn, which is the highest sequence
number seen in a reliable response. When the client receives a
provisional response that has been sent reliably, and this response
has a sequence number one higher than sn, sn is incremented, and the
request is retransmitted. Otherwise, if the response has a sequence
number greater than one higher, sn is not incremented. Either way,
the request is retransmitted, and the value of sn is placed in the
RAck header in the request.
When the server sees a request retransmission with an RAck header
with a value equalling the sequence number in the last reliably
transmitted response, it stops retransmitting that response, and is
free to send the next provisional response, with a higher sequence
number.
The mechanism is similar to TCP, but with a constant window of one.
The use of a fixed size window comes at the penalty of reduced
response throughput. The througput of responses is fairly low (1 per
RTT without loss, lower with loss). However, as the provisional
responses are used to signal changes in phone call states, which
generally occur on timescales on the order of hundreds of
milliseconds to seconds, such a limited throughput appears
acceptable. The mechanism can be extended to support larger window
sizes, if necessary.
The server can still generate unreliable provisional responses by
sending them without an RSeq header. A UAC which receives a
provisional response without a RSeq does not retransmit the request.
This allows for backwards compatibility; a UAS which doesn't know how
to transmit reliable responses will never place an RSeq header in a
response, and so the SIP transaction will proceed normally.
Similarly, the initial INVITE from the client contains an RAck
header. This serves as an indicator to the server than the client
supports the reliability mechanism. A UAS which doesn't see this
header in a request knows it cannot provide reliable provisional
responses.
4 Detailed Protocol Semantics
A transaction begins when the client sends a request. The client
sends the INVITE request as per RFC2543 [1]. The RAck header MUST be
placed in the request, with a value of zero, if the client
understands and is willing to support this extension for the
transaction.
When the initial INVITE is received by the server, it MAY send a 100
response (depending on whether it is a proxy or not). A 100 response
is normally sent reliably according to the current SIP specification.
This is because the client retransmits its request until a response
(i.e., 100) is received, and the server retransmits the 100 response
upon request retransmission. As a result, no additional means is
needed to reliably send a 100 response over a single hop.
Furthermore, the SIP specification mandates that the 100 response is
not forwarded through a proxy. For these reasons, 100 responses MUST
NOT contain an RSeq header.
The server maintains a window of size 1, which is effectively the The server maintains a window of size 1, which is effectively the
value of the highest unacknowledged provisional response that has value of the highest unacknowledged provisional response that has
been transmitted, call this rn. The client maintains a single been transmitted; call this rn. The client maintains a single
variable, sn, which represents the highest in order provisional variable, sn, which represents the highest in order provisional
response received so far. Both sn and rn are initialized to -1. response received so far. Both sn and rn MUST be initialized to 0.
When the server wishes to send a provisional response, it increments The server MAY send a reliable response if the initial INVITE request
rn, places its value in the RSeq header field, and sends the from the client contained a RAck header with a value of 0. If the
response. The provisional response is retransmitted at intervals with request contained a Require header, and the server is a UAS, the UAS
an exponential backoff, starting at T1 (default of 500ms), and SHOULD send all non-100 provisional responses reliably. If the
doubling after each retransmission. When the client receives the request contained a Proxy-Require header, and the server is a proxy,
response, it checks the sequence number. If it is one higher than the the server SHOULD send all locally generated non-100 provisional
current value of sn, sn is incremented, otherwise sn is unchanged. It responses reliably. It also SHOULD reliably send upstream any
then resends the original request (independently of whether the value responses received reliably from a downstream server. The server MUST
of sn has changed), and includes the sequence number sn in the NOT send a reliable response if the initial INVITE request did not
request in the header field RAck. contain an RAck header with a value of zero. When the server decides
to send a provisional response reliably, it MUST increment rn, and
MUST place this incremented value in the RSeq header in the response.
The provisional response SHOULD be retransmitted at intervals with an
exponential backoff, starting at T1 (default of 500ms), and doubling
after each retransmission.
When the request is received at the server, if the sequence number in When a client receives a provisional response, it checks for the
the message is equal to the current value of rn, the provisional presence of the RSeq header. If it is not present, the response was
response is no longer retransmitted. The server is free to increment an unreliable provisional response. The client MUST NOT retransmit
rn and transmit another provisional response. If the value of the the request. As per [1], the client also ceases exponentially backing
sequence number in the request is one less than the current value of off request retransmissions when any response (with or without the
rn, the response is retransmitted, and the server may not generate an RSeq header) is received.
additional provisional response.
The mechanism is essentially TCP without congestion control, and with If the server does not understand this extension, it will
a window of one. The result is a fairly simple mechanism. However, behave according to the base SIP specification, and
the penalty is that the throughput of provisional responses is fairly retransmit responses upon request retransmissions. A client
low (1 per RTT without loss, lower with loss). However, as the which retransmits requests upon response retransmissions
provisional responses are used to signal changes in phone call would cause a feedback loop of constant request and
states, which generally occur on timescales on the order of hundreds response retransmissions. By checking for the RSeq header,
of milliseconds to seconds, such a limited throughput appears the client can determine whether the server is supporting
acceptable. The mechanism can be extended to support larger window this extension for this response.
sizes, if necessary.
4 Header Fields If, however, the provisional response contains an RSeq header, the
value is compared against sn. If it is one higher than the current
value of sn, sn is incremented, otherwise sn is unchanged. The client
SHOULD then resend the original request (independently of whether the
value of sn has changed), and MUST include the sequence number sn in
the request in the header field RAck.
When a request is received at a server, it checks for the presence of
the RAck header. If it is not present, the server retransmits the
last response that was sent. If the RAck header is present, and the
value is lower than the value of rn, the last reliable response is
retransmitted. If the RAck header was present in the request, and the
value is equal to the current value of rn, the exponentially backing
off response retransmissions cease. Additional copies of the request
with the same or lower value of RAck that are received by the server
SHOULD NOT cause the server to retransmit any response (as they would
in the above case if RAck were lower), unless rn is zero. The server
always retransmits the last response sent (provisional, reliable
provisional, or otherwise) when a request is received with both RAck
and rn equal to 0.
This handles the case where a proxy server doesn't send a
100 response, but transmits a reliable response as the
first response. To make sure the initial request is
transmitted reliably, the server has to retransmit the
first response upon request retransmissions.
Once a request has arrived with RAck equal to rn, the server is free
to increment rn and transmit another provisional response. The server
MUST NOT ever generate an additional reliable response until it has
received a request with an RAck header with a value equal to rn.
When the server is ready to send a final response, it does so
according to [1]. An ACK request causes retransmissions of the final
response to cease. The server SHOULD NOT continue to retransmit any
reliable provisional responses once a final response has been sent.
5 Header Syntax
Two new header fields are defined, RSeq and RAck. The BNF for these Two new header fields are defined, RSeq and RAck. The BNF for these
are: are:
RSeq = "RSeq" ":" 1*DIGIT RSeq = "RSeq" ":" 1*DIGIT
RAck = "RAck" ":" 1*DIGIT RAck = "RAck" ":" 1*DIGIT
RSeq is a response header field. It is mandatory when used with this RSeq is a response header field. RAck is a request header field.
extension. RAck is a request header field. It is mandatory when used
with this extension.
The use of reliable provisional responses is signaled by the UAC to If a client insists that all provisional responses (those generated
the UAS through the Requires header field. This document specifies by proxies and UAS's) be sent reliably, it MUST include both the
the named extension org.ietf.sip.reliable-100 requests which require Require and Proxy-Require headers in all requests. A UAC MAY
reliable 100's must include this name in the Requires header field alternately send requests only with the Proxy-Require header. This
and in the Proxy-Require header field, as proxies need to will cause all non-100 provisional responses generated by proxies to
participate. be sent reliably. Responses sent by UAS's may, or may not be sent
reliably, at the discretion of the UAS.
5 Operation with Proxies This document specifies the named extension org.ietf.sip.reliable-
100.
6 Operation with Proxies
A SIP request may pass through any number of proxies, some of which A SIP request may pass through any number of proxies, some of which
may fork the request. Furthermore, the SIP specification allows may fork the request. The reliability mechanism defined here requires
proxies to pass back provisional responses (except for the 100 proxies to be aware of the extension. Consider what would happen if a
response) upstream at the discretion of the administrator. If proxy receives a request with a RSeq header, but no Proxy-Require
reliability of provisional responses were done end-to-end only, an header, and the proxy does not know the extension. As per normal SIP
intermediate proxy which discards provisional responses by default rules, the proxy would forward the request, with the RSeq header in
would interfere with the reliability. As such, all intermediate tact, to the downstream proxy. If that proxy did understand the
proxies must be aware of the use of the mechanism, and participate. extension, it might try and send a reliable response to the first
proxy. The first proxy would see the provisional response
retransmissions, but never resend the request. This would cause an
excess of network traffic, and block transmission of other
provisional responses at the downstream proxy.
As a result, reliability of provisional responses is done hop-by-hop, The situation would be even more catastrophic for a forking proxy.
similar to the way non-200-class final responses are handled in Consider the case where the first proxy forks the request to
normal SIP operation. Stateless proxies can simply forward all downstream proxies A and B. Both A and B understand the extension,
provisional responses upstream, ignoring the reliability and each try to send a reliable response. The first proxy forwards
requirements. A stateful proxy must act as a virtual UAS-UAC in the both responses upstream. But, since it does not understand the
algorithm described in the previous section. Once a provisional extension, it does not remove or change the value of the RSeq header
response has been received reliably at a proxy, the proxy can in either response. Thus, the client receiving these requests will
reliably transmit it upstream towards the next stateful proxy, or may think they are retransmissions, rather than being two separate
discard it. responses.
Implementation of this extension in a stateless proxy is not done
according to the rules in section 4. A stateless proxy implementing
this extension MUST forward all requests it receives downstream, and
MUST forward all responses it receives upstream, including
provisional responses. Actual reliability is achieved between the
first pair of stateful proxies.
A stateful proxy implementing this extension MUST act as a virtual
UAS-UAC in the algorithm described in the previous section. When any
non-100 provisional response is received reliably at a proxy, the
proxy MUST reliably transmit it upstream towards the next stateful
proxy. When any non-100 provisional response is received unreliably
at the proxy, the proxy MUST send the response unreliably upstream.
Any provisional responses generated by the proxy itself (excepting
100) MUST be sent reliably upstream.
Since a proxy may be receiving reliable provisional responses from Since a proxy may be receiving reliable provisional responses from
several branches of a forked request, it will need to merge the several branches of a forked request, it will need to merge the
provisional response streams together. There are no requirements provisional response streams together. There are no requirements
about the ordering of provisional responses across branches. However, about the ordering of provisional responses across branches. However,
all provisional responses from a given branch must be transmitted all provisional responses from a given branch MUST be transmitted
reliably upstream in the same order they were received along a reliably upstream in the same order they were received along a
branch. For example, consider a forking proxy A which sends a request branch. For example, consider a forking proxy A which sends a request
to UAS's B and C. B sends provisional response 0 towards A, and once to UAS's B and C. B sends provisional response 0 towards A, and once
it has been received, sends response 1. Similarly, B sends it has been received, sends response 1. Similarly, B sends
provisional response 2, and once received and acknowledged by A, provisional response 2, and once received and acknowledged by A,
sends provisional response 3. Proxy A may forward the provisional sends provisional response 3. Proxy A may forward the provisional
responses towards the UAS in any one of the following orders: responses towards the UAS in any one of the following orders:
0,1,2,3 0,1,2,3
0,2,1,3 0,2,1,3
2,3,0,1 2,3,0,1
2,0,3,1 2,0,3,1
0,2,3,1 0,2,3,1
2,0,1,3 2,0,1,3
Since responses from several branches may be merged at a forking Since responses from several branches may be merged at a forking
proxy, a proxy may need to renumber the provisional responses (always proxy, a proxy MUST renumber the provisional responses (always
starting at zero, however) when forwarding them upstream. As this starting at zero, however) when forwarding them upstream. As this
requires changing the RSeq value, the RSeq header field cannot be requires changing the RSeq value, the RSeq header field cannot be
protected by either end-to-end encryption or authentication. protected by either end-to-end encryption or authentication.
Similarly, a stateful proxy will need to insert the RAck header field Similarly, a stateful proxy will need to remove the RAck header from
itself in all proxied requests. all requests it receives, and insert its own value into proxied
requests.
6 Example 7 Examples
7.1 Message Formatting
In this example, a UAC wishes to send an INVITE message and receive In this example, a UAC wishes to send an INVITE message and receive
reliable 100-class responses. Such an INVITE might look like: reliable 100-class responses. Such an INVITE might look like:
C->S: INVITE sip:watson@bell-tel.com SIP/2.0 C->S: INVITE sip:watson@bell-tel.com SIP/2.0
Via: SIP/2.0/UDP saturn.bell-tel.com Via: SIP/2.0/UDP saturn.bell-tel.com
RAck: 0
From: sip:alexander@bell-tel.com From: sip:alexander@bell-tel.com
To: sip:watson@bell-tel.com To: sip:watson@bell-tel.com
Call-ID: 70710@saturn.bell-tel.com Call-ID: 70710@saturn.bell-tel.com
CSeq: 1 INVITE CSeq: 1 INVITE
Subject: Come here Watson Subject: Come here Watson
Require: org.ietf.sip.reliable-100 Require: org.ietf.sip.reliable-100
Proxy-Require: org.ietf.sip.reliable-100 Proxy-Require: org.ietf.sip.reliable-100
The server wishes to send a 180 Ringing provisional response The server wishes to send a 180 Ringing provisional response
reliably. The response will look like: reliably. The response will look like:
S->C: SIP/2.0 180 Ringing S->C: SIP/2.0 180 Ringing
Via: SIP/2.0/UDP saturn.bell-tel.com Via: SIP/2.0/UDP saturn.bell-tel.com
RSeq: 0 RSeq: 1
From: sip:alexander@bell-tel.com From: sip:alexander@bell-tel.com
To: sip:watson@bell-tel.com To: sip:watson@bell-tel.com
Call-ID: 70710@saturn.bell-tel.com Call-ID: 70710@saturn.bell-tel.com
CSeq: 1 INVITE CSeq: 1 INVITE
This response is retransmitted with an exponential backoff. When the This response is retransmitted with an exponential backoff. When the
UAC receives the response, it retransmits the request, but adds the UAC receives the response, it retransmits the request, but adds the
RAck header field: RAck header field:
C->S: INVITE sip:watson@bell-tel.com SIP/2.0 C->S: INVITE sip:watson@bell-tel.com SIP/2.0
RAck: 0 RAck: 1
Via: SIP/2.0/UDP saturn.bell-tel.com Via: SIP/2.0/UDP saturn.bell-tel.com
From: sip:alexander@bell-tel.com From: sip:alexander@bell-tel.com
To: sip:watson@bell-tel.com To: sip:watson@bell-tel.com
Call-ID: 70710@saturn.bell-tel.com Call-ID: 70710@saturn.bell-tel.com
CSeq: 1 INVITE CSeq: 1 INVITE
Subject: Come here Watson Subject: Come here Watson
Require: org.ietf.sip.reliable-100 Require: org.ietf.sip.reliable-100
Proxy-Require: org.ietf.sip.reliable-100 Proxy-Require: org.ietf.sip.reliable-100
7 Open Issues 7.2 Message Flows
There are a number of open issues: This section illustrates a number of message flows using this
extension. We abbreviate an INVITE request with a RAck header value
of N as "INV N", and a provisional response with a RSeq header value
of M as "1xx M". Packets which are lost are shown with an "X" in
front of them.
1. It is possible to use a list of sequence numbers in the 7.2.1 UAC to UAS, with Require
RAck header field instead of a single number. This would
enable a SACK-like mechanism very easily. Is this worth the
additional complication?
2. Should we support window sizes greater than one?
3. Currently, SIP requests with the same values of the To, In this case, the UAC sends a request directly to a UAS, and includes
the Require header, naming this extension. The extension is supported
by the UAS. The UAS sends a 100 response first, and then a 180
reliably.
UAC UAS
-------INV 0-------------->
X<.......100.........
-------INV 0--->X
-------INV 0-------------->
(request <..........100.............
retransmissions
cease)
X<...180 1............ (180 retransmits start, sn=1)
(rn inc to 1) <.........180 1............
-------INV 1---->
<.........180 1............
-------INV 1--------------> (180 retransmits cease)
X<....300............... (300 class retransmits start)
<........300...............
-----------ACK------------>
7.2.2 UAC to UAS, without Require, UAS doesn't understand
In this case, a UAC sends a request directly to the UAS, and doesn't
include the Require header in the request. The UAS doesn't support
the extension. The UAS sends a single 180 before sending a final
response.
UAC UAS
-------INV 0-------------->
X<.......100.........
-------INV 0--->X
-------INV 0-------------->
(request <..........100.............
retransmissions
cease)
<..........180 ............
X<....300............... (300 class retransmits start)
<........300...............
-----------ACK------------>
Note that after reception of the 180, the request is not
retransmitted, since the response did not contain an RSeq header.
7.2.3 UAC to proxy to UAS
In this case, a UAC sends a request to a proxy, which forwards it to
the final UAS. Both the Require and Proxy-Require headers are present
in the request. The local proxy generates its own provisional
response (188), and the UAS generates a 180:
UAC PROXY UAS
-----INV 0-------------> ----INV 0-->X
-----INV 0-------------> ----INV 0------------->
X<....100........
X<....100........ <....100...............
<........100............
X<......188 1.......
<...........188 1.......
---------INV 1-->X
<...........188 1.......
--------INV 1---------->
X<....180 1.....
<......180 1.............
-------INV 1--->X
X<....180 2..... <......180 1.............
-------INV 1------------>
<...........180 2.....
-----INV 2------------>
Note that the proxy renumbers the two provisional responses before
sending them upstream.
8 Open Issues
There are a number of open issues:
1. Currently, SIP requests with the same values of the To,
From, Call-ID and CSeq fields are isomorphic. It is From, Call-ID and CSeq fields are isomorphic. It is
possible that certain implementations may discard non- possible that certain implementations may discard non-
isomorphic requests with identical values for these header isomorphic requests with identical values for these header
fields. By adding the RAck header into a request fields. By adding the RAck header into a request
retransmission, we break the isomorphism of retransmitted retransmission, we break the isomorphism of retransmitted
requests. Is this a problem? requests. Is this a problem?
8 Security Considerations 2. The mechanism currently requires proxies to understand it
to work. It is possible to hack a solution without this
constraint, by placing the RAck value as a parameter in the
Via header, rather than its own header. The result would be
those pairs of proxies which both understand provisional
reliability would provide it, those that don't, would not.
Is this useful?
Since the RSeq value cannot be encrypted or authenticated end-to- 9 Security Considerations
end, nor can the RAck, man in the middle attacks are possible which
can cause the provisional responses to be reordered at the UAC. This
can be alleviated by the use of hop-by-hop encryption and
authentication mechanisms, such as IPSEC [2,2].
9 Author's Addresses Since the RSeq value cannot be encrypted or authenticated end-to-end,
nor can the RAck, man in the middle attacks are possible which can
cause the provisional responses to be reordered at the UAC. This can
be alleviated by the use of hop-by-hop encryption and authentication
mechanisms, such as IPSEC [3,3].
10 Acknowledgements
The authors would like to thank Jonathan Lennox and Adam Roach for
the comments on this document.
11 Author's Addresses
Jonathan Rosenberg Jonathan Rosenberg
Lucent Technologies, Bell Laboratories Lucent Technologies, Bell Laboratories
101 Crawfords Corner Rd. 101 Crawfords Corner Rd.
Holmdel, NJ 07733 Holmdel, NJ 07733
Rm. 4C-526 Rm. 4C-526
email: jdrosen@bell-labs.com email: jdrosen@bell-labs.com
Henning Schulzrinne Henning Schulzrinne
Columbia University Columbia University
M/S 0401 M/S 0401
1214 Amsterdam Ave. 1214 Amsterdam Ave.
New York, NY 10027-7003 New York, NY 10027-7003
email: schulzrinne@cs.columbia.edu email: schulzrinne@cs.columbia.edu
10 Bibliography 12 Bibliography
[1] M. Handley, H. Schulzrinne, E. Schooler, and J. Rosenberg, "SIP: [1] M. Handley, H. Schulzrinne, E. Schooler, and J. Rosenberg, "SIP:
session initiation protocol," Internet Draft, Internet Engineering session initiation protocol," Request for Comments (Proposed
Task Force, Sept. 1998. Work in progress. Standard) 2543, Internet Engineering Task Force, Mar. 1999.
[2] R. Atkinson, "IP encapsulating security payload (ESP)," Request [2] S. Bradner, "Key words for use in RFCs to indicate requirement
levels," Request for Comments (Best Current Practice) 2119, Internet
Engineering Task Force, Mar. 1997.
[3] R. Atkinson, "IP encapsulating security payload (ESP)," Request
for Comments (Proposed Standard) 1827, Internet Engineering Task for Comments (Proposed Standard) 1827, Internet Engineering Task
Force, Aug. 1995. Force, Aug. 1995.
 End of changes. 

This html diff was produced by rfcdiff 1.23, available from http://www.levkowetz.com/ietf/tools/rfcdiff/