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.
- Within your application's doPrack(...) method, prepare the application
to generate and send a final response to an incoming PRACK request.
- 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.