Uma resposta SIP a um pedido INVITE pode ser final ou provisional.
Respostas finais são sempre enviadas de forma confiável, ao contrário das respostas
provisionais, que normalmente não são. Nos casos em que você precisa enviar uma
resposta provisional de forma confiável, pode utilizar o método PRACK (Provisional
Response Acknowledgement).
Antes de Iniciar
Para conseguir desenvolver os aplicativos que suportam
PRACK, devem ser atendidos os seguintes critérios:
- O cliente que envia o pedido INVITE deve colocar uma tag
100rel no título Suportado ou Requerido para indicar que o cliente suporta PRACK.
- O servlet SIP deve responder chamando o método sendReliably(), em vez do método
send() para enviar a resposta.
Sobre Esta Tarefa
O PRACK está descrito nos seguintes padrões:
- RFC 3262
("Confiabilidade de Respostas Provisionais no SIP (Session Initiation Protocol)"),
que estende RFC 3261 ("SIP:
Session Initiation Protocol"), incluindo PRACK e a tag de opção 100rel.
- A seção 6.7.1 ("Respostas Provisionais Confiáveis") de
JSR 116 ("SIP Servlet API Versão 1.0").
Procedimento
- Para um aplicativo que atua como um proxy, execute o seguinte:
- Faça com que seu aplicativo gere e envie uma resposta provisional confiável
para qualquer pedido INVITE que não tenha nenhuma tag no campo Para.
- Para um aplicativo que atua como um cliente UAC (User Agent Client), execute o seguinte:
- Faça com que seu aplicativo inclua a tag 100rel nos pedidos INVITE de saída.
A tag de opção deve aparecer no cabeçalho Suportado ou Requerido.
- No método doProvisionalResponse(...)
do aplicativo, prepare o aplicativo para criar e enviar pedidos PRACK para as respostas provisionais confiáveis de entrada. O aplicativo deve criar o pedido PRACK no diálogo de resposta através de um método SipSession.createRequest(...) e deve configurar o cabeçalho
RAck de acordo com o RFC 3262 Seção 7.2 ("RAck").
- O aplicativo que atua como um UAC não receberá os métodos doPrack( ). O UAC envia INVITE e recebe Respostas Confiáveis. Quando o UAC recebe a
resposta Confiável, ele envia ao PRACK um pedido para a UAS e
recebe um 200 OK no PRACK; portanto, ele deve implementar o
doResponse( ) em seguida para recebê-lo.
- Para um aplicativo que atua como um servidor de agente usuário
(UAS), execute o seguinte:
- Se um pedido INVITE de entrada precisa da tag 100rel, tentar enviar uma
resposta 101-199 não confiável utilizando o método send() provocará uma Exceção.
- Faça com que o aplicativo declare um SipErrorListener para receber eventos
noPrackReceived() quando uma resposta provisional confiável não for reconhecida
dentro de 64*T1 segundos, em que T1 é um cronômetro SIP. Dentro do
processamento de evento noPrackReceived(), o aplicativo deve gerar e enviar uma
resposta de erro 5xx para o pedido
INVITE associado segundo o JSR 116 Seção 6.7.1.
- Faça com que o aplicativo tenha, no máximo, uma resposta provisional
confiável não reconhecida considerável. Tentar enviar outro antes do reconhecimento do primeiro resulta em uma Exceção.
- Certifique-se de que o aplicativo força as semânticas de oferta/resposta
RFC 3262 que cercam os pedidos PRACK que contenham descrições de sessão.
Especificamente, um servlet não deve enviar uma resposta final
2xx, se alguma resposta provisional não reconhecida continha
uma descrição da sessão.