opensips的注册能力
opensips可以通过registrar模块实现注册的能力,
所有的账户信息默认是在opensips的subscibe表中,
默认的subscibe表结构如上图,
- id是主键,
- username是账户名
- domain是opensips的域名
- password是密码
- email_address是邮件地址,一般不会使用该字段
- ha1和ha1b是用于鉴权,它们的生成方式如下:
ha1 = md5(concat(username,":",domain,":",password))
ha1b = md5(concat(username,"@",domain,":",domain,":",password))
客户端的注册流程
客户端通过REGISTER消息来注册,注册流程如下
第一个Register可能会不带任何鉴权信息,opensips会做鉴权。这些是需要写在opensips.cfg文件中
下面是一个示例片段,
注:
- www_challenge是opensips发起鉴权请求
- 如果通过鉴权,客户端的信息会通过save函数保存到"location"表
- 如果客户端是走的ws或者wss协议过来的,通过设置DST_WS标值,可以在location表中记录
判断客户端的协议,可以通过如下逻辑
- fix_nated_register会将客户端的出口IP(对于NAT有用)保存到location的received字段。
opensips中保存的注册信息
location表中的注册数据样例,
默认的字段比较多,不逐一介绍了。这里主要看几个重要的字段含义
- Username:就是subscribe表中的username字段
- contact:客户端注册消息中的contact header,它表明了客户端的地址
- Recieved:上一节中介绍的,主要是客户端出口的公网信息;一般在NAT穿越过程中需要使用。如截图中的contact地址,明显就是一个无效的地址。信令返回时,会使用到Recieved中的地址做路由。
- Expires:注册的超时时间
- Cflags: 这里保存的是opensips中的bflag。这里看到的DST_WS,就是在上一节中setbflag(DST_WS);保存的。
注册到opensips的地址成为AOR (Address-of-Record)存于opensips的内存中,这里应该是共享内存中。
如何查看AOR呢? (2.x版本)
opensipsctl ul show
可以看所有的AOR
opensipsctl ul show <username>
可以查看某一个具体的username的AOR
opensipsctl ul show --brief
查看所有AOR (简约信息)
如何去注册
在SIP中注册消息是REGISTER,但是却没有UNREGISTER消息。 那么,除了等注册超时外,怎么显示地去注册呢?
方法如下:
还是发送REGISTER消息,不过REGISTER消息中需要特殊处理一下,下面两种方式,
a) Expires Header值为0
样例如下:(注意Expires)
该例子是从cisco网站上看到的,没有测试过。
b) 没有Expires Header;但是contact header中携带expires=0参数;
样例如下:(注意Contact)
该例子是从eyeBeam客户端去注册或者关闭软件时抓包截取的。实测是有效的。
是否可以直接删除location中的数据字段来去注册?
答案是不可以的。 从上面的介绍可以看到,opensips中的注册信息其实分为两部分,location数据和内存中的AOR,如果仅仅是删除location表中的数据,opensips中还是存在AOR信息的。
所以删除location数据后,还需要执行opensipsctl ul rm <username>
来删除AOR。
注意,该命令可能不会立刻生效,执行后要观察一下。
总之,不建议通过手动删除的方式去注册。还是通过上面一节介绍的方式,通过register来去注册。