1
背景介绍
如果熟悉SIP响应的读者都一定知道,请求和响应是信令协商的基本手段。在RFC3261中规定了响应的定义,响应主要分为最终响应和临时响应。根据其概念名称,读者也大致理解了最终响应和临时响应的基本含义。简单来说,最终响应是可靠的,而临时响应是临时的,不可靠的响应。根据RFC3261-7.2的说明,其定义是:在针对临时响应的定义中,读者可以非常明确地知道,对端已经收到请求,对端正在处理其请求。以下示例说明了启用PRACK的和使用最终响应处理的呼叫:1xx: Provisional -- request received, continuing to process the request;
https://tools.ietf.org/html/rfc3261#section-7.2
2
UAS工作方式说明
根据RFC3262的说明,只要初始的请求包含了一个Supported,它的可选项是100rel,UAS可以对INVITE发送任何非100的响应。这里的初始请求的响应是一个临时的可靠性响应。此规范除了支持INVITE以外,不支持其他的可靠性临时响应的method。如果初始请求包含了Require头域,其包含了100rel可选项的话,UAS必须发送一个非100临时可靠响应。如果UAS不愿意那样处理的话,它必须拒绝此初始请求,返回一个420响应(Bad Extension),并且在响应消息中包含一个Unsupported 头域,可选项是100rel。具体示例,参考后续介绍。
根据RFC3262说明,UAS一定不能通过100(Trying)发送可靠的响应。UAS只能通过101到109中间的响应码发送临时可靠响应。如果请求中既不包含Supported 头域也不包含Require头来表示临时可靠响应功能的话,UAS一定不能发送临时可靠响应。
100(Trying)响应只能支持hop-by-hop之间的响应。因为此原因,这里讨论的可靠性机制是介于end-to-end的响应,因此不能使用100(Trying)。这里,关于end-to-end 和hop-by-hop的使用方式,读者一定要小心理解,因为各种method涉及了代理之间的通信和用户身份安全的问题。例如,BYE method是end-to-end之间的处理,而CANCEL是hop-by-hop的请求处理。
在一些场景中,一个网络要素可以当作proxy来使用,此proxy也可以可靠临时响应。其工作方式类似于一个UAS,它的作用就是作为一个事务功能。但是,它不能尝试发送携带To头标签的请求。这里,一个proxy不能对已经在一个dialog内容中发送过的请求生成可靠临时响应。简单来说,就是已在一个dialog中发送过请求内容的,就不能对其请求生成临时可靠响应。当然,不像UAS一样,当proxy的一个网络要素收到一个PRACK时