- 接前面章节。
- 10 Registrations
- 10.1 Overview
SIP 提供一种查询能力。如果一个用户想和其他用户发起一个会话的话,SIP必须查找当前其他用户的目的地地址是否是可达状态。这个查询处理过程经常是基于用户地址信息,通过SIP网络的核心要素单元来完成,例如代理服务器和重定位服务器(负责接收请求)来决定发送其发送地址,然后发送这个用户到其地址。为了实现这个处理流程,SIP网络的要素单元会查询一个抽象服务,我们称之为定位服务。这个服务为具体的域提供地址绑定。这些地址绑定映射一个正抵达的SIP或者SIPS URL地址,例如sip:bob@biloxi.com,可能会匹配一个或者多个这样相似的URLs地址,例如sip:bob@engineering.biloxi.com。最终,代理会查询一个定位服务,定位服务会映射收到的URL地址到用户代理,这个用户是已经定位的,这个会话期望抵达的用户。
注册实际上是在定位服务中为指定的域创建了一个绑定关系,这个指定的域通过一个或多个contact地址关联了一个address-of-record(AoR) URI地址。因此,当这个域的代理收到一个请求,这个请求中的Request-URI匹配了address-of-record(AOR)时,代理就会转发这个请求到这个contact地址,这个地址已经注册到了那个address-of-record(AOR)上。一般情况下,只有这样的处理方式是合理的,当注册请求的AOR路由到那个域的时候,在域的定位服务上注册添加一个address-of-record(AOR)地址。大部分情况下,这里表示的意思是,注册的域将需要匹配在AOR地址的域。
有多种方式创建定位服务的内容。一种方式是通过管理方式创建。在以上的示例中,Bob被看作是一名技术部门的成员之一,他有权访问公司数据库。具体操作过程中,SIP协议对UA提供了一种机制,可以明确创建一种绑定关系。这种机制被称之为注册。
注册需要对指定的UAS类型对象发生一个REGISTER请求,这种类型的对象称之为注册服务或者注册服务器。注册服务工作方式类似于置于域定位服务的前端一个角色,注册服务负责读写映射REGISTER请求中的内容。定位服务然后通过解析出的结果查询代理服务器,代理服务器负责针对那个域的绑定结果路由那个请求。
以上所有关于注册流程的解释在Figure 2有完整的说明。注意,注册服务和代理服务器都是逻辑对象,它们可以在网络中部署为一个单一的逻辑对象。
为了说明其功能,这里都把它们分开说明。同时也要注意,如果注册服务和代理服务是独立的对象,为了让UAs那个抵达注册服务,UAs可以通过代理服务器发送请求服务。
SIP不能对一个特别的机制授权来支持定位服务。只有一个要求是必须满足的,那就是针对某些域的注册服务必须可以读写到定位服务中,并且针对那个域的代理或者转发服务必须能够读那些数据消息。注册服务针对同一域,它可以和一个指定的SIP代理服务器部署在同一服务器中。
10.2 Constructing the REGISTER Request
注册可以请求添加,移除和查询绑定。一个注册请求可以在一个address-of-record和一个或多个contact地址之间添加一个新的绑定。通过一个授权的,合适的第三方执行一个指定的address-of-record的注册。客户端也可以移除前面的绑定或通过查询来决定哪个绑定是支持的address-of-record。
这里有一个特别说明,注册请求构建和客户发送注册请求的处理是通过基本的UAC处理方式来规范的,具体的规范说明,请参阅Section 8.1 和Section 17.1。
一个注册请求不能创建dialog。一个UAC可以在注册请求中包括一个Route头,这里的注册请求是基于一个前面存在的route set列表,具体的描述参阅Section 8.1。在注册请求或响应中的这个Record-Route头没有任何含义,如果出现的话,它必须被忽略。特别强调,这个UAC一定不能在注册请求的任何响应中,基于当前的或缺省的Record-Route创建一个新的route set。
除了Contact以外,以下头域必须包括在注册请求中。Contact头也可以包括进去:
- Request-URI: Request-URI命名定位服务的域名(例如,sip:chicago.com)。 SIP URL的"userinfo" 和"@" 部分一定不能出现。
- To: To头包含记录地址,其注册流程可以被创建,查询和修改。To头和Request-URI 是不同的,因为前者包含一个用户名称。这个记录地址必须是一个SIP URL或者SIPS URL。
- From: From头包含一个人的地址记录,它负责注册。除非请求是一个第三方的注册,否则,这个值和To头域值相同。
- Call-ID: 所有从UAC发送到特定注册服务的注册使用同一Call-ID头域。
- CSeq: CSeq值用来保证正确的注册请求顺序处理。UA必须对每个带同样Call-ID的注册请求递增一个数值来保证其实现的正确性。
- Contact: 注册请求可以包含一个Contact头,它包含零个或者多个绑定的地址。
- UAs在收到注册的最终响应之前或者没有收到前面的注册请求超时响应,它们一定不能发送新的注册(和重传相反,它包含一个新的Contact地址头)。

以下Contact头参数在注册请求中具有特别的含义:
- action: 在RFC2543的规范中使用的参数"action" 已经停止使用。
- UACs 不应该再使用"action" 参数。
- expires: “expires”参数表示UA绑定的有效时长。参数值以秒为单位。如果没有提供这个参数的话,将使用Expires头的值来代替。部署时可以,如果此值大于 2**32-1 (4294967295 seconds 或136 years)可以看作是等于2**32-1。 如果是异常的值的话,异常的值应该被视为等于3600。
继续发布……

关注微信公众号:asterisk-cn,获得有价值的Asterisk行业分享
Asterisk freepbx FreeSBC技术文档: www.freepbx.org.cn
融合通信/IPPBX商业解决方案:www.hiastar.com
如何使用FreeSBC+FreeSWITCH/Asterisk,qq技术分享群:334023047