Eine SIP-Antwort auf eine INVITE-Anforderung kann endgültig oder vorläufig sein.
Endgültige Antworten werden immer zuverlässig gesendet, vorläufige Antworten standardmäßig aber nicht.
In Fällen, in denen eine vorläufige Antwort zuverlässig gesendet werden soll, können Sie die Methode PRACK (Provisional Response Acknowledgment) verwenden.
Vorbereitende Schritte
Die folgen Kriterien müssen erfüllt sein, damit Sie Anwendungen entwickeln können, die PRACK unterstützen:
- Um anzugeben, dass der Client PRACK unterstützt, muss der Client, der die INVITE-Anforderung sendet, ein
100rel-Tag im Header "Supported" oder "Require" angeben.
- Das SIP-Servlet muss durch Aufrufen der Methode "sendReliably()" anstelle der Methode
"send()" darauf reagieren.
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 erweitert den Standard
RFC 3261 ("SIP:
Session Initiation Protocol") um PRACK und das Optionstag
"100rel".
- Abschnitt 5.7.1 ("Reliable Provisional Responses") von JSR 289 ("SIP
Servlet Specification Version 1.1").
Vorgehensweise
- Wenn Sie eine Anwendung entwickeln, die als Proxy fungiert,
lassen Sie Ihre Anwendung zuverlässige vorläufige Antworten für jede INVITE-Anforderung generieren und senden,
bei der kein Tag im Feld "To" angegeben ist.
- Wenn Sie eine Anwendung entwickeln, die als Benutzeragentenclient
fungiert, führen Sie die folgenden Aktionen aus:
- Veranlassen Sie Ihre Anwendung, das Tag "100rel" der abgehenden INVITE-Anforderung hinzuzufügen.
Das Optionstag muss im Header "Supported" oder im Header "Require" angegeben werden.
- Zum Erstellen einer PRACK-Anforderung und zum Senden der Anforderung an den Benutzeragentenserver rufen Sie die Methode
"createPrack()" für die eingehende Antwort in
der Methode "doProvisionalResponse(...)" Ihrer Anwendudng auf. Der Container
behandelt den RAck-Header wie in JSR 289 im Abschnitt 5.7.1 definiert.
- Die als Benutzeragentenclient fungierende Anwendung empfängt eine endgültige Antwort mit einem Code im Bereich 2xx - 6xx
für PRACK, die vom Benutzeragentenclient mit einer Methode "doResponse()" verarbeitet werden kann.
- Wenn Sie eine Anwendung entwickeln, die als Benutzeragentenserver
fungiert, führen Sie die folgenden Aktionen aus:
Anmerkung: Wenn für eine eingehende INVITE-Anforderung das Tag "100rel" erforderlich ist
und versucht wird, eine Antwort mit einem Code im Bereich 101 - 199 nicht zuverlässig mit der Methode "send()" zu senden,
tritt eine Ausnahme ein.
- Deklarieren Sie in der Anwendung ein SipErrorListener-Objekt, um Ereignisse vom Typ
"noPrackReceived()" zu empfangen, wenn innerhalb von
64*T1 Sekunden (wobei T1 ein SIP-Zeitgeber ist) keine zuverlässige vorläufige Antwort bestätigt wird. Bei der Verarbeitung des
Ereignisses "noPrackReceived()" generiert und sendet die Anwendung gemäß JSR 116 Abschnitt 6.7.1 eine Fehlerantwort mit dem Code 5xx für die zugeordnete
INVITE-Anforderung.
- Die Anwendung kann maximal eine ausstehende, nicht bestätigte zuverlässige vorläufige Antwort haben.
Der Versuch, eine weitere zu senden, bevor die erste bestätigt wurde, führt zu einer Ausnahme.
- Vergewissern Sie sich, dass die Anwendung die Angebot/Antwort-Semantik in RFC 3262 für PRACK-Anforderungen
mit Sitzungsbeschreibungen durchsetzt. Genau gesagt heißt das, dass
ein Servlet keine endgültige Antwort mit dem Code 2xx senden darf,
wenn nicht bestätigte vorläufige Antworten eine Sitzungsbeschreibung enthalten.