Eine SIP-Antwort auf eine INVITE-Anforderung kann endgültig oder provisorisch sein. Endgültige Antworten werden immer zuverlässig
gesendet, provisorische Antworten gewöhnlich nicht.
In den Fällen, in denen Sie
eine provisorische Antwort zuverlässig senden müssen, können Sie die Methode
PRACK (Provisional Response Acknowledgement) verwenden.
Vorbereitende Schritte
Damit Sie Anwendungen entwickeln können, die PRACK unterstützen, müssen die folgenden Bedingungen erfüllt sein:
- Der Client, der die INVITE-Anforderung sendet, muss ein Tag "100rel" in den Header
"Supported" oder "Require" einfügen, um anzuzeigen, dass er PRACK unterstützt.
- Das SIP-Servlet muss zum Senden der Antwort die Methode "sendReliably()" anstelle der Methode
"send()" aufrufen.
Informationen zu diesem Vorgang
PRACK ist in den folgenden Standards beschrieben:
- RFC 3262 ("Reliability
of Provisional Responses in the Session Initiation Protocol (SIP)"). Dieser Standard ist eine Erweiterung des
Standards RFC 3261 ("SIP:
Session Initiation Protocol"), die PRACK und das Options-Tag 100rel definiert.
- Abschnitt 6.7.1 ("Reliable Provisional Responses") von JSR 116 ("SIP Servlet API Version 1.0").
Vorgehensweise
- Wenn Sie eine Anwendung entwickeln, die als Proxy-Server eingesetzt wird, führen Sie die folgenden Schritte aus:
- Sorgen Sie dafür, dass Ihre Anwendung eine zuverlässige provisorische Antwort für eine
INVITE-Anforderung generiert und sendet, die kein Tag im Feld "To" enthält.
- Wenn Sie eine Anwendung entwickeln, die als UAC (User Agent Client) eingesetzt wird, führen Sie die folgenden Schritte aus:
- Sorgen Sie dafür, dass Ihre Anwendung das Tag 100rel in abgehende INVITE-Anforderungen einfügt.
Das Tag "Options" muss in den Header "Supported" oder "Require" eingefügt werden.
- Bereiten Sie in der Methode "doProvisionalResponse(...)" die Anwendung darauf vor, dass sie
PRACK-Anforderungen für eingehende zuverlässige und provisorische Antworten erstellt und sendet.
Die Anwendung muss die PRACK-Anforderung im Antwortdialog
über eine Methode "SipSession.createRequest(...)" erstellen und den RAck-Header gemäß RFC 3262, Abschnitt 7.2 ("RAck") setzen.
- Die Anwendung, die als UAC eingesetzt wird, empfängt keine Methoden "doPrack()".
Der UAC sendet INVITE-Anforderungen und empfängt zuverlässige Antworten. Wenn der UAC die zuverlässige Antwort empfängt,
sendet er eine PRACK-Anforderung an den UAS und empfängt
200 OK. Anschließend muss er "doResponse()" implementieren, um die Antwort zu empfangen.
- Wenn Sie eine Anwendung entwickeln, die als UAS (User Agent Server) eingesetzt wird, führen Sie die folgenden Schritte aus:
- Wenn eine eingehende INVITE-Anforderung das Tag "100rel" erfordert, wird bei dem Versuch, eine
Antwort des Typs 101-199 unzuverlässig mit der Methode send() zu senden, eine Ausnahme ausgelöst.
- Sorgen Sie dafür, dass die Anwendung einen SipErrorListener deklariert, der noPrackReceived()-Ereignisse empfängt,
wenn eine zuverlässige provisorische Antwort nicht innerhalb von 64*T1
Sekunden bestätigt wird. T1 ist der SIP-Zeitgeber. Während der Verarbeitung des noPrackReceived()-Ereignisses
muss die Anwendung gemäß JSR 116, Abschnitt 6.7.1 eine Fehlerantwort des Typs
5xx für die zugehörige INVITE-Anforderung generieren und senden.
- Sorgen Sie dafür, dass die Anwendung maximal eine ausstehende, nicht bestätigte zuverlässige
provisorische Antwort hat. Der Versuch, eine weitere Antwort zu senden, bevor die erste bestätigt ist, führt zu einer Ausnahme.
- Sorgen Sie dafür, dass die Anwendung die in 3262 definierte Angebot/Antwort-Semantik für
PRACK-Anforderungen mit Sitzungsbeschreibungen verwendet. Ein Servlet darf keine endgültige Antwort des
Typs 2xx senden, wenn eine nicht bestätigte provisorische Antwort eine Sitzungsbeschreibung enthält.