El Protocolo de inicio de sesión (SIP) es un protocolo de control (señalización) desarrollado por el Grupo de trabajo de ingeniería de Internet (IETF) para administrar sesiones IP multimedia interactivas, incluida la telefonía IP, la presencia y la mensajería instantánea. La Especificación de Servlet SIP (Solicitud de Especificación de Java 116), desarrollada a través del Proceso de la Comunidad de Java, proporciona un modelo de programación API de Java estándar para entregar servicios basados en SIP. Derivado de la popular arquitectura de servlet Java de Java Platform, Enterprise Edition (Java EE es el nuevo nombre de Sun para J2EE), SIP Servlet trae capacidades de desarrollo de aplicaciones de Internet a las soluciones SIP.
Las tecnologías de la información y las telecomunicaciones están convergiendo. Las aplicaciones de TI de red, normalmente orientadas a datos, se están fusionando con aplicaciones de comunicación. El creciente número de botones Llámame que aparecen en las páginas web es un ejemplo de esta integración. La Especificación de servlet SIP ofrece un modelo de programación familiar a los desarrolladores de Java para crear aplicaciones convergentes. Este artículo ofrece una introducción paso a paso sobre cómo utilizar SIP Servlet para crear un servicio de chat de eco simple.
protocolo de Iniciacion de Sesion
Definido en la Solicitud de comentarios 3261, SIP es un protocolo para establecer, modificar y finalizar sesiones de comunicación IP multimedia. La Figura 1 es un ejemplo simple de cómo usar SIP para establecer una llamada VoIP (Voice-over Internet Protocol):
Todas las líneas blancas en la Figura 1 representan las comunicaciones SIP. La persona que llama envía una solicitud SIP INVITE para invitar al "destinatario" a establecer una sesión de voz. El destinatario de la llamada responde primero con un mensaje que tiene un código de estado 180 para indicar que el teléfono está sonando. Tan pronto como se atiende el teléfono, se envía una respuesta con un código de estado 200 a la persona que llama para que acepte la invitación. La persona que llama confirma con un mensaje ACK y se establece la sesión. Una vez que se establece la sesión, la conversación de voz digitalizada real generalmente se transmite a través del Protocolo de transmisión en tiempo real (RTP) con la sesión, como indica la línea roja en la Figura 1. Cuando finaliza la conversación, se envía una solicitud SIP BYE, seguida de una respuesta con un código de estado 200 para confirmar la finalización de la sesión.
A continuación, se muestra un ejemplo de una solicitud SIP INVITE y una respuesta con un código de estado 200 OK:
SIP INVITE request: INVITE sip:[email protected] SIP/2.0 Via: SIP/2.0/UDP pc.caller.com;branch=z9hG4bK776asdhds Max-Forwards: 70 To: Callee From: Caller ;tag=1928301774 Call-ID: a84b4c76e66710 CSeq: 314159 INVITE Contact: Content-Type: application/sdp Content-Length: 142
(content (SDP) is not shown)
Respuesta SIP 200 OK:
SIP/2.0 200 OK Via: SIP/2.0/UDP pc.caller.com;branch=z9hG4bK776asdhds;received=192.0.2.1 To: Callee ;tag=a6c85cf From: Caller ;tag=1928301774 Call-ID: a84b4c76e66710 CSeq: 314159 INVITE Contact: Content-Type: application/sdp Content-Length: 131
(content (SDP) is not shown)
Como puede ver, el formato de SIP se parece a HTTP. Sin embargo, en comparación con HTTP, SIP es:
- Responsable de la gestión de sesiones. El contenido multimedia real, como mensajes instantáneos, voz y video, puede o no transmitirse a través de SIP.
- Asincrónico y con estado. Para cada solicitud SIP, podría haber varias respuestas. Esto significa que la aplicación tiene que procesar cada mensaje SIP dentro de un contexto de estado adecuado.
- Un protocolo de aplicación que puede ejecutarse tanto en transporte confiable como no confiable. Por tanto, la aplicación debe garantizar la entrega del mensaje con retransmisión y acuse de recibo.
- Un protocolo de igual a igual en el que no existe una distinción clara entre cliente y servidor. Cualquiera de las partes debe poder enviar y recibir solicitudes y respuestas.
Servicios basados en SIP
Los servicios basados en SIP son servidores SIP que ofrecen servicios, como enrutamiento de mensajes, a puntos finales SIP, como teléfonos IP. Por ejemplo, en la Figura 2, el servidor de registro SIP y el servidor proxy ofrecen registro SIP y servicios de proxy para ayudar a los terminales SIP a ubicarse y comunicarse entre sí.
La figura 2 ilustra lo siguiente:
- El destinatario se registra en el servidor de registro enviando una solicitud de REGISTRO.
- El servidor de registro acepta el registro, que contiene la dirección del nombre de la persona que llama, respondiendo con un código de estado 200 OK.
- La persona que llama solicita establecer una sesión de comunicación con la persona que llama enviando una solicitud de INVITACIÓN al servidor proxy. El contenido del mensaje INVITE generalmente contiene la descripción de la sesión de comunicación que la persona que llama desea establecer, como el tipo de medio, la seguridad o la dirección IP. La descripción suele estar en formato de Protocolo de descripción de sesión (SDP).
- El servidor proxy busca el servidor de registro para averiguar la dirección actual del destinatario. Tenga en cuenta que la búsqueda es un problema de implementación que no forma parte de SIP.
- El servidor proxy reenvía la solicitud INVITE de la persona que llama a la persona que llama en función de su dirección actual.
- El destinatario acepta la invitación respondiendo con un código de estado 200 OK. La respuesta 200 OK a una solicitud INVITE generalmente contiene la descripción de la sesión de comunicación que la persona que llama puede establecer con la persona que llama.
- El servidor proxy envía una respuesta 200 OK de la persona que llama a la persona que llama.
- La persona que llama confirma el establecimiento de la sesión enviando un mensaje ACK al servidor proxy. El mensaje ACK puede contener el acuerdo final de la sesión.
- A su vez, el servidor proxy reenvía el ACK al destinatario. Por lo tanto, el protocolo de enlace de tres vías se completa a través del servidor proxy y se establece una sesión.
- Ahora ocurre la comunicación entre la persona que llama y la persona que llama. El protocolo utilizado para la comunicación puede ser SIP o no. Por ejemplo, los mensajes instantáneos se pueden transmitir a través de SIP. Las conversaciones de voz se transmiten normalmente a través de RTP.
- Ahora, el destinatario finaliza la conversación y desea finalizar la sesión enviando una solicitud BYE.
- La persona que llama responde con un código de estado 200 OK para aceptar la terminación de la sesión.
En el escenario anterior, el servidor proxy SIP simplemente enruta los mensajes a la dirección actual del destinatario. Como puede imaginar, pueden suceder servicios de enrutamiento más interesantes e inteligentes. Por ejemplo, el servidor proxy puede "seguir a un usuario" enrutando los mensajes a un lugar donde se le pueda localizar, como un teléfono celular, incluso si alguien está llamando desde el teléfono de su oficina.
Servlet SIP
Definida en la Solicitud de especificación de Java 116, la Especificación de servlet SIP proporciona un modelo de programación de servlet-contenedor para aplicaciones SIP. Dado que se deriva de la arquitectura de servlet de Java en Java EE, JSR 116 ofrece un enfoque familiar para la creación de servicios SIP para los desarrolladores de Java EE.
La siguiente tabla resume la similitud entre HTTPServlet
y SIPServlet
.
Comparación entre un servlet HTTP y SIP
|
Al igual que los servlets HTTP, los servlets SIP amplían la javax.servlet.sip.SipServlet
clase, que a su vez amplía la javax.servlet.GenericServlet
clase. Como habrás adivinado, SipServlet
anula el service(ServletRequest request, ServletResponse response)
método para manejar diferentes tipos de mensajes SIP.
Since SIP is asynchronous, only one of the request and response arguments in the service()
method is valid; the other one is null. For example, if the incoming SIP message is a request, only the request is valid and the response is null, and vice versa. The default implementation of the SipServlet
class dispatches requests to doXXX()
methods and responses to doXXXResponse()
methods with a single argument. For example, doInvite(SipServletRequest request)
for a SIP invite request and doSuccessResponse(SipServletResponse response)
for SIP 2xx class responses. Typically SIP servlets override doXXX()
methods and/or doXXXResponse()
methods to provide application logic.
How do you send SIP responses if there is no response object in the doXXX()
methods? In SIP servlets, you must call one of the createResponse()
methods in the javax.servlet.sip.SipServletRequest
class to create a response object. Then, call the send()
method on the response object to send the response.
How about creating a SIP request in a SIP servlet? There are two ways to create SIP requests: Call either one of the createRequest()
methods on the SipSession
class to create a SIP request within the session, or one of the createRequest()
methods on javax.servlet.sip.SipFactory
to create a SIP request within a new SipSession
. To get an instance of SipFactory
, you must call getAttribute("javax.servlet.sip.SipFactory")
on the ServletContext
class.
The SipFactory
is a factory interface in the SIP Servlet API for creating various API abstractions, such as requests, address objects, and application sessions. One interesting object created by SipFactory
is javax.servlet.sip.SipApplicationSession
. The intention of JSR 116 is to create a unified servlet container that can run both an HTTP and a SIP servlet. SipApplicationSession
provides a protocol-agnostic session object to store application data and correlate protocol-specific sessions, such as SipSession
and HttpSession
. Hopefully this concept will be adopted by future versions of the Servlet API to make it javax.servlet.ApplicationSession
instead of javax.servlet.sip.SipApplicationSession
.
The SipApplicationSession
manages protocol-specific sessions like SipSession
. The SipSession
interface represents the point-to-point relationship between two SIP endpoints and roughly corresponds to a SIP dialog defined in Request for Comments 3261. SipSession
is inherently more complicated than its HTTP counterpart due to SIP's asynchronous and unreliable nature mentioned above. For example, Figure 3 shows the SipSession
state transitions defined in JSR 116:
Typically, an HttpSession
is created when a user logs in and destroyed after logout. A SipSession
typically represents one logical conversation, even if you have multiple conversations between the same endpoints. So SipSession
is more dynamic and has a shorter lifespan.
Las discusiones más avanzadas sobre el SipSession
ciclo de vida y su relación con el diálogo SIP van más allá del alcance de este artículo. Afortunadamente, el contenedor maneja la mayor parte de la complejidad, como el ciclo de vida y las transiciones de estado, y SipSession
puede usarse simplemente como almacenamiento para los datos de sesión.
Un ejemplo completo: EchoServlet
El EchoServlet es un servlet SIP que puede hacer eco de los mensajes instantáneos que escribe en Windows Messenger: