设置自身内部时钟
如果注册响应中包含Data头域,客户端可以按此设置自身时间
发现注册服务(器)(Request-URI的设置)
三种方案:直接设置 ,To头域的主机部分(For example, the UA for the user"sip:carol@chicago.com" addresses the REGISTER request to"sip:chicago.com".)广播"sip.mcast.net" (224.0.1.75 for IPv4,IpV6自己决定),注意广播注册是不一定响应的,而且有时候不恰当
发送注册消息
(如Section 8.1.2发送给事务层(直译交易层))
如果事务层发生超时错误,UAC不能马上重试(等等再试)!
错误响应(423)
若收到423(间隔太短 Interval Too Brief),需将超时设为大于等于423响应中的Min-Expires 头域内容
处理REGISTER请求
Registrar是个特殊UAS(行为如Section8.2 and Section 17.2),仅处理REGISTER requests.,不会发送6xx responses.
注册请求可被重定向
注册请求包中Record-Routeheader必须忽略,返回中也不能含Record-Route header
注册要么彻底成功,要么彻底失败
具体步骤
1) 检查Request-URI能否注册。不能但UAS是转发代理,则按照Section16转发。
2) 检查是否包含Section 8.2.2的头域和值
3) 按Session22验证UAC,不需验证的则假设From为请求发生者
4) 验证请求发生者有无更改权限,无回403(Forbidden),跳过接下步骤
5) 从To中取address-of-record,如果它不符合Request-URI中的域,必须发送404 (Not Found) response andskip the remaining steps。取出的URI转为标准URI(去除转义字符和参数),然后作为绑定列表的索引
6) 检查Contact header field ,没有则跳最后步。检查是否有’*’和Expires头域,如果Contact header field有其他内容或者Expires!=0,必须返回400 (Invalid Request),然后结束。然后比较绑定的Call-ID和包中Call-ID是否一致。不一致则更新绑定,否则再检查CSeq,只有它高于储存的值才更新。其他情况都必须放弃并返回错误。
7) 处理Contact header field中contact address,按照规则(见rfc33261-10.3)。注意这些地址要么全部绑定成功,要么全部失败(删除,然后返回500(Server Error))
8) 返回200(OK),必须包含Contact header field values enumerating all current bindings. Each Contact value MUST feature an"expires"parameter indicating its expiration interval chosen by theregistrar. The response SHOULD include aDate header field.