【opensips】客户端的注册
创始人
2024-03-25 23:04:12
0

opensips的注册能力

opensips可以通过registrar模块实现注册的能力,
所有的账户信息默认是在opensips的subscibe表中,

subscribe表
默认的subscibe表结构如上图,

  • id是主键,
  • username是账户名
  • domain是opensips的域名
  • password是密码
  • email_address是邮件地址,一般不会使用该字段
  • ha1ha1b是用于鉴权,它们的生成方式如下:
    ha1 = md5(concat(username,":",domain,":",password))
    ha1b = md5(concat(username,"@",domain,":",domain,":",password))

客户端的注册流程

客户端通过REGISTER消息来注册,注册流程如下
在这里插入图片描述
第一个Register可能会不带任何鉴权信息,opensips会做鉴权。这些是需要写在opensips.cfg文件中
下面是一个示例片段,

if (is_method("REGISTER")) {if (!www_authorize("", "subscriber")) {www_challenge("", "0");exit;}# indicate that the client supports DTLS# so we know when he is calledif (isflagset(SRC_WS)) {setbflag(DST_WS);}if (nat_uac_test("19")) {fix_nated_register();}if (!save("location","f")){sl_reply_error();exit;}exit;}

注:

  1. www_challenge是opensips发起鉴权请求
  2. 如果通过鉴权,客户端的信息会通过save函数保存到"location"表
  3. 如果客户端是走的ws或者wss协议过来的,通过设置DST_WS标值,可以在location表中记录
    判断客户端的协议,可以通过如下逻辑
if ($proto == "ws" || $proto == "wss") {setflag(SRC_WS);        }
  1. 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的AOR
在这里插入图片描述

opensipsctl ul show --brief
查看所有AOR (简约信息)
在这里插入图片描述


如何去注册

在SIP中注册消息是REGISTER,但是却没有UNREGISTER消息。 那么,除了等注册超时外,怎么显示地去注册呢?

方法如下:

还是发送REGISTER消息,不过REGISTER消息中需要特殊处理一下,下面两种方式,

a) Expires Header值为0

样例如下:(注意Expires

REGISTER sip:XXX.XXX.XXX:5060 SIP/2.0
Via: SIP/2.0/UDP YYY.YYY.YYY.YYY:5060;branch=z9hG4bK3AF1E87
From: ;tag=48206668-C6C
To: 
Date: Tue, 21 May 2019 11:01:00 GMT
Call-ID: 8CFC113F-7AEE11E9-8525B193-993D21B5
User-Agent: Cisco-SIPGateway/IOS-12.x
Max-Forwards: 70
Timestamp: 1558436460
CSeq: 4 REGISTER
Contact: 
Expires:  0
Supported: path
Content-Length: 0

该例子是从cisco网站上看到的,没有测试过。

b) 没有Expires Header;但是contact header中携带expires=0参数;

样例如下:(注意Contact

REGISTER sip:xxxxx.xxxxx.xxx:32060 SIP/2.0
Via: SIP/2.0/UDP 10.11.0.65:53310;branch=z9hG4bK-d87543-bb51c7089769c71a-1--d87543-;rport
Max-Forwards: 70
Contact: ;expires=0
To: "gw_61225552"
From: "gw_61225552";tag=d71dd162
Call-ID: Y2JiMTIxODMzODZiNWMzN2E5MjIxZWQ5ZDkwM2ExMmY.
CSeq: 12 REGISTER
Allow: INVITE, ACK, CANCEL, OPTIONS, BYE, REFER, NOTIFY, MESSAGE, SUBSCRIBE, INFO
User-Agent: eyeBeam release 1011d stamp 40820

该例子是从eyeBeam客户端去注册或者关闭软件时抓包截取的。实测是有效的。

是否可以直接删除location中的数据字段来去注册?

答案是不可以的。 从上面的介绍可以看到,opensips中的注册信息其实分为两部分,location数据和内存中的AOR,如果仅仅是删除location表中的数据,opensips中还是存在AOR信息的。

所以删除location数据后,还需要执行opensipsctl ul rm 来删除AOR。
注意,该命令可能不会立刻生效,执行后要观察一下。

总之,不建议通过手动删除的方式去注册。还是通过上面一节介绍的方式,通过register来去注册。

相关内容

热门资讯

前端-session、jwt 目录:   (1)session (2&#x...
linux入门---制作进度条 了解缓冲区 我们首先来看看下面的操作: 我们首先创建了一个文件并在这个文件里面添加了...
关于测试,我发现了哪些新大陆 关于测试 平常也只是听说过一些关于测试的术语,但并没有使用过测试工具。偶然看到编程老师...
前缀和与对数器与二分法 1. 前缀和 假设有一个数组,我们想大量频繁的去访问L到R这个区间的和,...
nodejs:本地安装nvm实... 一、背景-使用不同版本node的原因 vue3+ts、nuxt3版本,node...
JAVA集合知识整理 Java集合知识整理 HashMap相关 HashMap的底层数据结构:jdk1.8之...
无刷直流电机介绍及单片机控制实... 无刷直流电机介绍及单片机控制实例前言基本概念优势与劣势使用寿命基本结构使用单片机控制实例电子调速器&...
fwdiary(2) dp2 1.传纸条  AcWing 275. 传纸条 - AcWing 走两条路,走一条最大的...
常用的DOS命令 常用的DOS命令 DOS(Disk Operating System,磁...
<C++> 类和对象(下) 1.const成员函数将const修饰的“成员函数”称之为const成员函数,cons...