FreeSWITCH及VOIP,Openser,电话机器人等产品中文技术资讯、交流、沟通、培训、咨询、服务一体化网络。QQ群:293697898
SIP 的注册机制是其关键组成部分,它允许用户设备与SIP服务联系,宣告其当前的位置,并确保能够接收传入的呼叫。注册过程的有效性直接影响到SIP服务的性能,特别是注册信息的存储是否准确和最新。
然而,在实际操作中,注册过程中会出现一种常见但有害的现象——僵尸注册。这种情况可能会对SIP服务的性能和用户体验产生负面影响,因此了解和解决这一问题至关重要。
僵尸注册是指SIP设备在其注册期满前意外失联。例如,一个设备可能会注册30分钟,但5分钟后由于某种原因消失了。设备“消失”的原因有多种可能性,包括:
软/硬电话崩溃
网络拔出(例如拔掉电缆或接口)
拔掉硬电话的电源
网络断开(如网络地址转换NAT导致)
IP漫游(如移动设备迁移到不同网络)
这些情况都会导致设备在注册期内无法接收到呼叫,从而形成僵尸注册。
僵尸注册会导致SIP服务器持续尝试将呼叫路由到一个无法响应的目的地,带来以下几种影响:
延迟和较差的用户体验:呼叫会被发送到僵尸设备,造成长时间的呼叫延迟或失败,进而降低用户体验。
性能损耗:对于基于TCP协议的设备,服务器可能会尝试建立一个指向无法响应的设备的TCP连接,这会增加不必要的I/O操作,从而影响服务器的整体性能。
注册负载:大规模的SIP系统可能有数万甚至数十万用户,任何注册处理中的偏差都会被这些用户数量放大,进一步加剧问题。
呼叫路由逻辑失效:错误的注册信息可能会导致呼叫被错误地路由,进一步增加服务的复杂性和不确定性。
为了应对僵尸注册问题,OpenSIPS提供了多个解决方案,特别是通过其nathelper模块提供的SIP OPTIONS ping功能。
OpenSIPS的nathelper模块可以通过SIP OPTIONS ping检查设备的可达性。这个功能默认是被动的,仅用于创建必要的流量来保持NAT打洞。不过,它也可以通过设置参数来主动检测设备是否仍然在线:
## 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");
}
...
}
通过这些设置,如果设备在注册后多次未能响应ping请求,OpenSIPS将自动删除该联系人,而不会生成任何SIP信令。这是一种有效的自动化方式来清除不可达的设备。
与UDP不同,TCP不需要通过NAT ping来保持连接,因为TCP连接本身就可以维持NAT隧道。因此,处理基于TCP的SIP设备时需要采取不同的方法。
OpenSIPS允许保持与设备的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");
}
...
}
这样,SIP服务器在处理TCP连接时,可以避免关闭连接,从而确保设备即使在NAT后面也可以接收呼叫。
此外,如果设备因掉线或其他原因断开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");
}
为确保OpenSIPS高效运行,及时清理僵尸注册至关重要。这不仅可以改善服务性能,还能大大提高用户的通话体验,减少拨号延迟。未来的文章中,我们将进一步探讨如何通过更多优化措施提升SIP系统的注册和延迟表现,敬请期待。
原文:https://blog.opensips.org/2024/10/03/how-to-eliminate-zombie-registrations-in-opensips/
FSGui6.9.0集智能语音和手拨外呼为一体