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.