Openser中文网

专注于VoIP,Opensips,Kamailio等技术,QQ群:QQ群:293697898

如何在OpenSIPS中消除僵尸注册


tags:OpenSIPS 僵尸注册 注册掉线 创建时间:2024-10-11 14:17:12

  SIP 的注册机制是其关键组成部分,它允许用户设备与SIP服务联系,宣告其当前的位置,并确保能够接收传入的呼叫。注册过程的有效性直接影响到SIP服务的性能,特别是注册信息的存储是否准确和最新。

  然而,在实际操作中,注册过程中会出现一种常见但有害的现象——僵尸注册。这种情况可能会对SIP服务的性能和用户体验产生负面影响,因此了解和解决这一问题至关重要。

什么是僵尸注册?

   僵尸注册是指SIP设备在其注册期满前意外失联。例如,一个设备可能会注册30分钟,但5分钟后由于某种原因消失了。设备“消失”的原因有多种可能性,包括:

  • 软/硬电话崩溃

  • 网络拔出(例如拔掉电缆或接口)

  • 拔掉硬电话的电源

  • 网络断开(如网络地址转换NAT导致)

  • IP漫游(如移动设备迁移到不同网络)

这些情况都会导致设备在注册期内无法接收到呼叫,从而形成僵尸注册。

僵尸注册的危害

  僵尸注册会导致SIP服务器持续尝试将呼叫路由到一个无法响应的目的地,带来以下几种影响:

  • 延迟和较差的用户体验:呼叫会被发送到僵尸设备,造成长时间的呼叫延迟或失败,进而降低用户体验。

  • 性能损耗:对于基于TCP协议的设备,服务器可能会尝试建立一个指向无法响应的设备的TCP连接,这会增加不必要的I/O操作,从而影响服务器的整体性能。

  • 注册负载:大规模的SIP系统可能有数万甚至数十万用户,任何注册处理中的偏差都会被这些用户数量放大,进一步加剧问题。

  • 呼叫路由逻辑失效:错误的注册信息可能会导致呼叫被错误地路由,进一步增加服务的复杂性和不确定性。

OpenSIPS处理僵尸注册的方法OpenSIPS处理僵尸注册的方法

  为了应对僵尸注册问题,OpenSIPS提供了多个解决方案,特别是通过其nathelper模块提供的SIP OPTIONS ping功能。

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信令。这是一种有效的自动化方式来清除不可达的设备。

TCP处理方法

  与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集智能语音和手拨外呼为一体



如果在有疑问或需要沟通的地方,可以QQ:1354608370 或 加FreeSWITCH+Kamailio+Opensips QQ群: 293697898 沟通交流!