A SIP response to an INVITE request can be final or provisional.
Final responses are always sent reliably, but provisional responses
typically are not. For cases where you need to send a provisional
response reliably, you can use the PRACK (Provisional response acknowledgement)
method.
Before you begin
For you to be able
to develop applications that support PRACK,
the following criteria must be met:- The client that sends the
INVITE request must put a 100rel tag
in the Supported or the Require header to indicate that the client
supports PRACK.
- The SIP servlet must respond by invoking the
sendReliably() method
instead of the send() method to send the response.
About this task
PRACK is described in the following standards:- RFC
3262
(Reliability of Provisional Responses in the Session Initiation Protocol (SIP)), which
extends RFC 3261 (SIP:
Session Initiation Protocol), adding PRACK and the option tag 100rel.
- Section 6.7.1 (Reliable Provisional Responses) of JSR 116 (SIP Servlet API
Version 1.0).
Procedure
-
For an application acting as a proxy, do this:
- Make
your application generate and send a reliable provisional
response for any INVITE request that has no tag in the To field.
- For an application acting as a user
agent client (UAC),
do this:
- Make your application add the 100rel tag
to outgoing INVITE requests.
The option tag must appear in either the Supported header or the Require
header.
- Within your application's doProvisionalResponse(...) method, prepare the application to create
and send PRACK requests for incoming reliable provisional responses. The application must create the
PRACK request on the response's dialog through a SipSession.createRequest(...) method, and it must
set the RAck header according to RFC 3262 Section 7.2 (RAck).
- The application that acts as an UAC will not
receive doPrack(
) methods. The UAC sends INVITE and receives Reliable responses. When
the UAC receives the Reliable response, it sends PRACK a request to
the UAS and receives a 200 OK on the PRACK so it should next implement
doResponse( ) in order to receive it.
- For
an application acting as a user agent server (UAS),
do this:
- If an incoming INVITE request requires
the 100rel tag, trying
to send a 101-199 response unreliably by using the send() method causes
an Exception.
- Make the application declare a SipErrorListener
to receive noPrackReceived()
events when a reliable provisional response is not acknowledged within
64*T1 seconds, where T1 is a SIP timer. Within the noPrackReceived()
event processing, the application should generate and send a 5xx error
response for the associated INVITE request per JSR 116 Section 6.7.1.
- Make the application have at most one outstanding, unacknowledged
reliable provisional response. Trying to send another one before the
first's acknowledgement results in an Exception.
- Make sure
that the application enforces the RFC 3262 offer/answer
semantics surrounding PRACK requests containing session descriptions.
Specifically, a servlet must not send a 2xx final
response if any unacknowledged provisional responses contained a session
description.