Una respuesta SIP a una solicitud INVITE puede ser final o provisional.
Las respuestas finales siempre se envían de forma fiable, pero las provisionales habitualmente no. Para aquellos casos en los que necesite enviar una respuesta
provisional de forma fiable, puede utilizar el método PRACK (Provisional Response Acknowledgement).
Antes de empezar
Para poder desarrollar aplicaciones que den soporte a PRACK, se deben
cumplir los siguientes criterios:
- El cliente que envía la solicitud INVITE debe colocar una etiqueta 100rel en la
cabecera Soportado o Necesario para indicar que el cliente da soporte a PRACK.
- El servlet SIP debe responder invocando el método sendReliably() en lugar del
método send() para enviar una respuesta.
Acerca de esta tarea
PRACK se describe en los siguientes estándares:
- RFC 3262
("Reliability of Provisional Responses in the Session Initiation Protocol
(SIP)"), que amplía
RFC 3261
("SIP: Session Initiation Protocol"), añadiendo PRACK y la etiqueta de opción
100rel.
- La sección 6.7.1 ("Reliable Provisional Responses") de
JSR 116 ("SIP Servlet API Versión 1.0").
Procedimiento
- Para una aplicación que actúe como proxy, siga estos pasos:
- Haga que la aplicación genere y envíe una respuesta provisional fiable para toda
solicitud INVITE que no tenga etiqueta en el campo Para.
- Para una aplicación que actúe como cliente de agente de usuario (UAC),
siga estos pasos:
- Haga que la aplicación añada la etiqueta 100rel a las solicitudes INVITE
salientes.
La etiqueta de opción debe aparecer en la cabecera Soportado o Necesario.
- En el método doProvisionalResponse(...)
de la aplicación, prepare la aplicación
para crear y enviar solicitudes PRACK para las respuestas provisionales fiables
entrantes. La aplicación debe crear la solicitud PRACK en el diálogo de la respuesta
mediante un método SipSession.createRequest(...), y debe establecer la cabecera RAck
de acuerdo con RFC 3262 Sección 7.2 ("RAck").
- La aplicación que actúe como un UAC no recibirá métodos doPrack( ). El UAC envía INVITE y recibe respuestas fiables. Cuando el UAC recibe la respuesta
fiable, envía una solicitud PRACK al UAS y recibe 200 OK en PRACK para que
implemente a continuación doResponse( ) para poder recibirla.
- Para una aplicación que actúe como servidor de agente de usuario (UAS),
siga estos pasos:
- Cuando una solicitud INVITE entrante requiere la etiqueta 100rel, si intenta
enviar una respuesta 101-199 de forma no fiable utilizando el método send(),
recibirá una excepción.
- Haga que la aplicación declare un SipErrorListener para recibir sucesos
noPrackReceived() cuando no se reconozca una respuesta provisional fiable en 64*T1
segundos, donde T1 es un temporizador SIP. En el proceso de sucesos
noPrackReceived(), la aplicación debe generar y enviar una respuesta de error
5xx para la solicitud INVITE asociada, según JSR 116 Sección 6.7.1.
- Haga que la aplicación tenga como máximo una respuesta provisional fiable
pendiente no reconocida. Intente enviar otra antes de que el primer reconocimiento
genere una excepción.
- Asegúrese de que la aplicación fuerce la semántica de oferta/respuesta de RFC
3262 alrededor de las solicitudes PRACK que contienen descripciones de sesiones.
En concreto, un servlet no puede enviar una respuesta final 2xx
si alguna de las respuestas provisionales no reconocidas contenía una
descripción de sesión.