对 INVITE 请求的 SIP 响应可能是最终的或临时的。最终响应始终可靠地发送,而临时响应通常并非这样。对于需要可靠地发送临时响应的情况,可以使用 PRACK(临时响应确认)方法。
开始之前
为了能够开发支持 PRACK 的应用程序,必须符合下列条件:
- 发送 INVITE 请求的客户机必须将一个 100rel 标记放入到 Supported 或 Require 头中以指示此客户机支持 PRACK。
- SIP Servlet 必须通过调用 sendReliably() 方法(而不是 send() 方法)发送响应来作出反应。
关于此任务
PRACK 按下列标准进行了描述:
- RFC 3262(“Reliability of Provisional Responses in the Session Initiation Protocol (SIP)”),它通过添加 PRACK 和选项标记 100rel 扩展了 RFC 3261(“SIP: Session Initiation Protocol”)。
- JSR 116(“SIP Servlet API Version 1.0”)的第 6.7.1 节(“Reliable Provisional Responses”)。
过程
- 对于充当代理的应用程序,执行此操作:
- 使应用程序生成并发送一个可靠的临时响应给在“至”字段中任何没有标记的 INVITE 请求。
- 对于充当用户代理客户机 (UAC) 的应用程序,执行此操作:
- 使应用程序将 100rel 标记添加至出局 INVITE
请求。此选项标记必须出现在 Supported 头或 Require 头中。
- 在应用程序的 doProvisionalResponse(...) 方法内,准备好应用程序以便为入局的可靠临时响应创建并发送
PRACK 请求。应用程序必须通过 SipSession.createRequest(...) 方法在该响应的对话上创建
PRACK 请求,并且它必须根据 RFC 3262 第 7.2 节(“RAck”)设置 RAck 头。
- 充当 UAC 的应用程序将不会接收 doPrack( ) 方法。该 UAC 发送 INVITE 并接收可靠的响应。当 UAC
接收此可靠响应时,它发送 PRACK 请求给 UAS 并在 PRACK 上接收到一个 200 OK,所以紧接着应实现 doResponse( ) 以接收此 200 OK。
- 对于充当用户代理服务器 (UAS) 的应用程序,执行此操作:
- 如果入局的 INVITE 请求需要 100rel 标记,那么通过使用 send() 方法尝试不可靠地发送一个 101-199 响应会导致抛出一个异常。
- 当可靠的临时响应没有在 64*T1 秒内应答时(其中 T1 是一个 SIP 计时器),使该应用程序声明 SipErrorListener 以接收 noPrackReceived()
事件。在 noPrackReceived() 事件处理中,该应用程序应按照 JSR 116 第 6.7.1 节为关联的
INVITE 请求生成并发送一个 5xx 错误响应。
- 使该应用程序至多有一个未完成、未应答的可靠临时响应。在第一个应答导致出现异常之前尝试发送另一个。
- 确保该应用程序强制 RFC 3262 提供/应答语义周围的 PRACK 请求包含会话描述。具体来说,如果任何未应答的临时响应包含会话描述,Servlet 不能发送一个 2xx 最终响应。