由一个典型呼叫场景引出
用户alice与另一个用户bob新建一个会话,请求消息经过abc.com域的代理服务器到达xyz.com域的代理服务器后,该代理服务器如何找到目标用户的主机呢?
通过接收到请求的代理服务器(proxy server)或重定向服务器(redirect server),基于用户的位置信息(location of the user),然后把消息转发过去
查询用户位置涉及到一个抽象服务叫位置服务(location service)
(1) 位置服务(location service)
对特定域提供地址绑定关系
建立位置服务的内容有许多种方式
SIP提供了一种用户代理(UA)显示创建绑定关系的方式——注册
(2) 注册
注册在特定域的位置服务中创建一个或多个记录地址(address-of-record)URI与联络地址(contact address)的关联关系。当该域(domain)的代理服务器收到请求的request uri与记录地址匹配,代理服务器会将请求转发到与记录地址绑定的联络地址。
协议中有一个特殊类型的被称为登记员(registrar)的UAS,作为域中位置服务的前端,基于注册请求读写地址映射关系。
构建注册请求
一个注册请求不会建立对话(dialog),注册请求消息和响应头中的record-route没有意义,必须忽略。发送注册消息的客户端行为与通用UAC一致(section 8.1, section 17.1)
注册请求中必须包含的消息头:
(1) Request-URI: 给出了注册的位置服务的域
(2) To:包含创建、查询或修改的注册的记录地址(AOR)。通常to和request-uri不一样,因为to中包含user name
(3) From:除非三方注册,和to一样
(4) Call-id:同一个uac给一个registrar的注册的callid应该一样
(5) Cseq:递增用来保证注册顺序
可用contact包含0个或多个地址绑定
*在注册收到响应或超时前,不能发新注册(包含新的contact)
超期时间:
Expire可以试消息头中字段,也可以在每个contact后,后者更灵活。如果请求不带expire,那么意味着让server选
注册成功响应里要包含完整的绑定关系列表。Ua比较看绑定关系是否生成(比较规则在19.1.4),如果成功生成,就更新注册周期
发现registrar:
(1) 通过配置
(2) 使用AOR:使用AOR的host部分作为request-uri,使用通常的sip server location mechanisms(参考RFC3263)
(3) 多播(multicast)
处理注册请求
Registrar是UAS,回复注册请求,维持绑定关系,并且在管理域内接受代理服务器和重定向服务器查询
Registrar可以在多播接口监听,将注册重定向到单播接口,并返回302
Registrar必须忽略record-route
处理步骤:
Step1: Registrar检查reqeust-uri,是否认识绑定关系的域。如果不是且服务器也是代理服务器,forward request
Step2: 按照section8.2.2处理要求的头域值
Step3: 对uac鉴权(section 22)
Step4: 检查用户是否授权修改这个AOR的注册信息,非授权回403
Step5: 从to中获取AOR,如果AOR不合法,回404.将AOR转为canonical form
Step6: 检查是否带contact,没有到step8.如果contact有*,但是expire不为0,回400.检查每个contact与存储的callid,如果不一样把绑定关系清除。如果一样,但是cseq不比存储的大,不能刷新绑定关系。
Step7: 遍历contact,对每个地址:
如果有expire头或单独的expire,作为请求expire,如果没有使用本地默认值
Registrar可以选一个小于请求的值,如果请求值大于0消息3600,或低于指定值,回423(interval too brief)
如果绑定关系不存在,添加。存在看call-id,不一样的话看exipre清除或更新。如果一样看cseq,如果大于存储的,就清除或更新。否则回失败500
Step8: 回200OK响应。响应包含所有绑定关系和expire
Reference
[1].RFC 3261 SIP: Session Initiation Protocol