基于OpenSIPS做注册服务下,场景A打B,一方发起BYE挂断后收到500,另一方无法挂断的问题
 
 
最近在工作中遇到一个看似很奇怪的,排除起来很费劲,但最后的解决方式又及其简单的问题,下面我们一起来看看具体发生了什么吧!
 
一句话概括:那都是OpenSIPS  Dialog模块的default_timeout 惹的祸(学业不精,木办法呀……)
 
问题现象:
  1. A打B,电话接通后,持续通过话5分钟后,任意一方挂断电话,另一方无法正常挂断,另一方电话始终显示正在通话中。
  2. 如果通话时长在4分钟以内,任何一方挂断,则另一方都能正常结束。
 
运行环境:
    OpenSIPS      2.4.2
    FreeSWITCH  1.6.20
 
 
业务场景:
  • OpenSIPs为分机提供注册服务
  • OpenSIPs为FreeSWITCH提供Load balance服务,将电话转接至相应FreeSWITCH
  • OpenSIPs为FreeSWITCH提供Gateway服务
    如下图所示,无论分机互打,9001拨打9003,OpenSIPs都是先将INVITE发送至FS,FS 再将电话通过OpenSIPS呼叫到 9003
        

问题分析:
  1. 通过抓包分析,发现主被叫任意一方挂断后,FS收到bye后,直接回给OpenSIPS 500 (Internal Server Error), 而导致OpenSIPS没能将bye信号发给另一方电话终端
  2. OpenSIPS 给FS和电话终端发OPTIONS检测会话状态只发4分钟后,就不再发了,并且主被双方可以继续通话
  3. 如果OpenSIPS关闭掉对FS的dialog会话OPTIONS检测,FS收到BYE后,能转发到另一方电话终端,但终端会返回500
  4. 四分之内正常挂断的BYE报文,跟超过4分钟无法挂断的BYE报文构造形式完全相同
      SIP信令时序图部分内容如下所示:
           
 
    下面是FreeSWITCH 收到 分机9003 发起的BYE之后的SIP报文情况:

问题原因:
    通过上面分析,我们可以猜测这是由于OpenSIPS对dialog做OPTIONS探测引起的。仔细检测OpenSIPS的dialog 模块配置,我发现dialog模块的 default_timeout = 240 (秒)。
    这就能充分解释上面‘问题分析’中的第2点了(只发4分钟OPTIONS), 因为4分钟后dialog就过期了,OpenSIPS不再发送探测包。
 
    FreeSWITCH 和 电话终端(如Yealink话机) 都遵循 SIP 协议规范,如果一通已建立的电话,在通话过程中,FS或电话终端有收到上游(如OpenSIPS)的OPTIONS探测,那么电话从接通到挂断,都必须收到周期性的进行OPTIONS探测,
    如果超过周期时长了,FS或电话终端仍没有收到OPTIONS探测, 那么FS和电话终端就会认为通话存在错误,后面在收到BYE时,就会返回 500 (Internal Server Error)。
 
 
解决办法:
    将 OpenSIPS 的 default_timeout 值改大,如改成10800 即3小时,重启OpenSIPS即可解决问题。
loadmodule "dialog.so"
modparam("dialog", "db_mode", 1)
modparam("dialog", "dlg_match_mode", 1)
modparam("dialog", "default_timeout", 10800) # 3 hours timeout 【正确配置】
#modparam("dialog", "default_timeout", 240) # 4 mins 【错误配置 :如果使用了create_dialog("Pp"),当一同电话超过 default_timout +
options_pint_interval ,就会出现终端返回500】
modparam("dialog", "profiles_with_value", "caller ; callee")
modparam("dialog", "options_ping_interval", 60) # 1 minu route{
if (is_method("INVITE")) {
if ( !create_dialog("Pp") ) { # 对OpenSIPS上进出两个dialog(如主/被叫)都进行OPTIONS探测
xlog("create_dialog error : Internal Server Error");
send_reply("500","Internal Server Error");
exit();
}
}
}
 
 
 

基于OpenSIPS做注册服务下,场景A打B,一方发起BYE挂断后收到500,另一方无法挂断的问题的更多相关文章

  1. 基于LadybugFlow的微服务编排(1.SpringBoot集成)

    前言 前面的系列文章里,介绍了ladybugflow的业务可视化的设计以及常见场景的使用方法. 感谢大家对项目的关注. 本篇文章介绍一下基于ladybugflow的微服务编排场景及使用方法. 1. 业 ...

  2. 基于OpenSIPS 实现分机注册服务服务器

    呼叫中心平台中坐席是不可或缺的一环,而坐席打电话自然需要使用办公分机.通常情况下我们通过软交换平台FreeSWITCH.Asterisk即可搭建分机注册服务. 但单台FreeSWITCH或Asteri ...

  3. 一个故事,一段代码告诉你如何使用不同语言(Golang&C#)提供相同的能力基于Consul做服务注册与发现

    目录 引言 什么是微服务 传统服务 微服务 什么是服务注册与服务发现 为什么要使用不同的语言提供相同的服务能力 服务协调器 服务注册 Golang C#(.NetCore3.1) 服务发现 通过Htt ...

  4. 用Nacos做微服务架构里的服务注册与发现中心

    转自:https://www.jianshu.com/p/61608ff86344 Nacos 另一个非常重要的特性就是服务注册与发现,说到服务的注册与发现相信大家应该都不陌生,在微服务盛行的今天,服 ...

  5. mormort 土拨鼠,做后端服务那是杠杠的,基于http.sys

    http.sys你可以用 mormort 土拨鼠,做后端服务那是杠杠的,基于http.sys并且还是开源的,作者天天更新代码,非常勤奋,官方论坛提问,回答也快其实,稍微看看,就能玩的挺好的

  6. windows下consul利用json文件注册服务

    windows下,以开发模式启动consul命令 consul agent -dev -config-dir=D:\tools\consul 人工注册服务,新建一个json文件 ,放到D:\tools ...

  7. 转载:ubuntu下编译安装nginx及注册服务

    原文地址:https://www.cnblogs.com/EasonJim/p/7806879.html 安装gcc g++的依赖库 sudo apt-get install build-essent ...

  8. 手把手教你写一个windows服务 【基于.net】 附实用小工具{注册服务/开启服务/停止服务/删除服务}

    1,本文适用范围 语言:.net 服务类型:windows服务,隔一段时间执行 2,服务搭建: 1,在vs中创建 console程序 2,在console项目所在类库右键 添加-新建项-选择Windo ...

  9. maven小项目注册服务(一)--email和persist模块

    跟着书里的讲解,跟着做了一遍该项目: 首先明白注册账户的需求: 账号的lD和Email地址都可以用来唯一地标识某个用户,而显示名称则用来显示在页面下,方便浏览.注册的时候用户还需要输入两次密码,以确保 ...

随机推荐

  1. Android 性能优化 ---- 启动优化

    Android 性能优化 ---- 启动优化 1.为什么要进行启动优化 一款应用的第一印象很重要,第一印象往往决定了用户的去留.打开一款应用,如果速度很快,很顺畅,那么很容易让人觉得这款应用背后的技术 ...

  2. [Android] keytools生成jsk文件以及获取sha1码

    生成jks文件 进入要生的jks文件的路径,打开windows的命令提示符(CMD) keytool -genkey -alias dct -keyalg RSA -keysize 1024 -key ...

  3. 关于git,无论是命令使用还是深入学习,看我总结就够了

    周五了,又是划水的一下午,无意中在某号上发现了这样一张图,说的内容很简单,就是我们日常离不开的git,可能因为最近github宕机,网传服务器被盗的新闻把,让我瞬间产生了兴趣,就点进去看一下 大家能看 ...

  4. C++语法小记---标准库

    C++标准库 C++标准库包含如下内容: C++标准编译工具链 C++扩展编译工具链(各种C++编译器独有) C++标准库 C++库 C库 C兼容库(为了兼容能够用C编译器编译的项目,直接使用C++也 ...

  5. Android 性能优化---布局优化

    Android 性能优化---布局优化 Android 布局绘制原理 布局加载过程 setContentView() --> inflate() -- > getLayout()(I/O操 ...

  6. 一起学Blazor WebAssembly 开发(3)

    接着上篇,本篇开始讲下实现登录窗口,先看下大概的效果图: 打开的效果,没有美工美化 点登录校验得到不能为空 我在做blazor时用到了一个ui框架,这个框架名叫Ant Design blazor(ht ...

  7. 占个坑 未来学qt的时候专用

    今天看了一个大佬发了一个上位机图片便向大佬问道 ”上位机是用什么软件做的“大佬抛下一句qt ,在业界内很通用,windows和linux通吃,便让我萌生了一个想法,去学qt.虽说上位机时常听到,但是自 ...

  8. ELasticSearch(五)ES集群原理与搭建

    一.ES集群原理 查看集群健康状况:URL+ /GET _cat/health (1).ES基本概念名词 Cluster 代表一个集群,集群中有多个节点,其中有一个为主节点,这个主节点是可以通过选举产 ...

  9. BUUCTF-web EasySearch (服务端包含注入ssi)

    一打开就是登录页面 存在index.php.swp...(反正我是没有扫出来,题目没给提示),分析一波源码 <?php ob_start(); function get_hash(){ $cha ...

  10. 使用ATOMac进行Mac自动化测试

    ATOMac简介 atomac是一个支持在mac上做自动化的python库,GitHub地址如下: https://github.com/pyatom/pyatom 安装 # Python2 sudo ...