注册过程是 SIP 的一个重要机制。它允许用户与服务取得联系,公布自己的位置,并接收来自服务的呼叫。
SIP 服务的健康状况及其性能取决于注册过程的运行状况以及注册信息的准确性和最新存储情况。“僵尸”注册是影响最大的负面因素。
什么是僵尸注册?由 SIP 设备完成的注册,在注册到期前消失。例如,假设一个设备在接下来的 30 分钟内注册一个联系人,但 5 分钟后该设备消失。设备如何消失?
- 软/硬电话崩溃
- 拔掉网络(电缆、接口)
- 拔掉硬电话的电源
- 网络断开(如 NAT)
- IP 漫游(移动设备迁移到不同的网络)
因此,有很多原因可能导致僵尸注册。但是,为什么它们对 SIP 服务如此有害呢?
- 僵尸注册意味着 SIP 服务器试图将呼叫发送到无应答目的地。这意味着延迟、更高的 PDD、更差的用户体验。
- 如果涉及基于 TCP 的协议,将呼叫发送到此类僵尸目的地将转换为尝试创建通往此类无应答目的地的 TCP 连接。这意味着可能会阻止影响 SIP 服务器性能的 I/O 操作。
- 注册的数量——系统可能有数万或数十万注册用户,因此注册处理上的任何小偏差都会随着用户数量的增加而倍增。
- 破坏呼叫路由逻辑——错误的注册可能会改变呼叫路由的方式,从而导致不良影响。
OpenSIPS 和僵尸注册
现在,让我们看看OpenSIPS提供哪些功能来处理僵尸注册。nathelper模块已经为已注册的设备提供了 SIP OPTIONS ping。但默认情况下是被动的,只会产生必要的流量以保持 NAT 针孔打开。
或者,您可以配置模块以等待并解释收到的 SIP OPTIONS 请求的回复 – 主要是为了检测被 ping 的联系人/设备是否仍然可以访问且处于活动状态:
...
## ping all UDP contacts with OPTIONS
modparam("nathelper", "sipping_bflag", "SIPPING_ENABLE")
## the timeout (seconds) for a ping to fail
modparam("nathelper", "ping_threshold", 10)
## number of failed pings before removing contact
modparam("nathelper", "max_pings_lost", 5)
## branch flag to activate ping based removal
modparam("nathelper", "remove_on_timeout_bflag", "SIPPING_RTO")
...
route {
...
if (is_method("REGISTER") {
setbflag("SIPPING_ENABLE");
setbflag("SIPPING_RTO");
save("location");
}
...
}
使用上述设置,如果在注册期间用“ SIPPING_RTO”分支标记了联系,则在 5 次(连续)ping 失败且超时 10 秒后,OpenSIPS 将自动丢弃该联系。此丢弃操作不会产生任何类型的 SIP 信令。
TCP 特定处理
上述 ping 方法在 UDP 上工作得很好。但 TCP 有点不同——没有 NAT ping(不需要,因为 TCP 连接确保通过 NAT 进行隧道传输),所以我们需要一些不同的方法。
基于 TCP 的联系解决方案利用了这样一个事实:与 SIP 注册状态并行,我们还在传输层保存了一个状态 – TCP 连接本身。理想情况下,在处理注册时,注册使用的 TCP 连接应在整个注册期间保持连接。为什么?这样 SIP 服务器将能够返回已注册的设备而无需打开 TCP 连接。这是必需的,因为在大多数情况下,注册设备位于 NAT 网络后面,并且不可能打开到 NAT 后面的目标的 TCP 连接。因此,最好保持初始 TCP 连接并重新使用它来返回设备:
modparam("registrar", "tcp_persistent_flag", "TCP_PERSIST_DURATION")
...
route {
...
if (is_method("REGISTER") {
if ( $socket_in(proto)=="TCP")
setflag("TCP_PERSIST_DURATION");
save("location");
}
...
}
这将阻止 OpenSIPS 关闭由接收的 REGISTER 请求创建的入站 TCP 连接。
为了处理设备可能关闭连接的情况(由于其消失),我们可以配置 OpenSIPS 来捕获与 TCP 连接关闭相关的事件并删除与该连接的 IP 和端口匹配的任何联系人。
event_route[E_CORE_TCP_DISCONNECT] {
# remove any contact matching the far end
# (source) of the TCP connection
remove_ip_port( $param(src_ip), $param(src_port),"location");
}
通过这样做,当与设备的 TCP 连接丢失时,匹配的注册(变得无法访问)也将被 OpenSIPS 删除。
结论
为了让您的 OpenSIPS 尽可能高效,尝试摆脱僵尸注册是一个很好的做法。此外,这将改善拨号延迟时的用户体验。
在后续文章中,我们将进一步介绍您可以采取哪些措施来改善注册和延迟设置。敬请期待。
原文:https://blog.opensips.org/2024/10/03/how-to-eliminate-zombie-registrations-in-opensips/
本文来自作者投稿,版权归原作者所有。如需转载,请注明出处:https://www.nxrte.com/jishu/52930.html