SIP没有摘机消息可以通话吗

概述
SIP流程中,A路没有收到摘机的200 OK响应消息可以通话吗?
客户反馈的问题千奇百怪,公共互联网的问题同样百转千回,让你欲罢不能,头秃方休。
客户报故障,问题描述是这样的,我用号码A打给号码B,明明B接通说话了,话单记录中却显示“未接通”。。。
查服务器,查日志,查网络,查信令,一顿操作之后发现,B没有返回200 OK摘机消息给A,通话确实未接通,话单记录没错。
那难道是客户撒谎了?一番核实之后,客户200%确定通话接通了,马上就签合同了。
好吧,回到最初的问题了,SIP没有摘机消息可以通话吗?
环境
centos:CentOS release 7.0 (Final)或以上版本
freeswitch:v1.8.7
GCC:4.8.5
可能性分析
首先画出客户呼叫流程的节点图。
A->fs1->运营商A->运营商B->B
A:本地话单未接通,但是有和B通话。
fs1:话单和信令都显示未接通。
运营商A:和运营商A沟通,反馈话单未接通,B方向发过来480。
运营商B:和运营商B沟通,反馈话单已接通,有通话时长30秒。
B:未知。
经过各个节点的沟通之后,发现问题出在运营商A和运营商B节点之间,俩个节点的通话状态不一致,摘机消息很大可能在中间丢失了。
节点A,fs1,运营商A,话单未接通。
节点运营商B,B(推测),话单已接通。
但是还有一个问题,为什么A反馈通话是正常的,明明没有收到摘机消息啊。
回到信令层面,B返回的振铃消息是183(SDP)。
SIP信令中振铃消息有俩种,180和183(SDP),俩者的区别在于有没有带媒体(SDP)。
180消息仅仅是一个通知消息,B告诉A我收到呼叫请求了,然后A本地产生振铃音。
183消息带有媒体信息(SDP),fs需要建立早期媒体通道(early media),并转发RTP媒体。
那么,摘机消息丢失的情况下,用户可以用183的早期媒体通道实现通话吗?
模拟场景配置
为了回答上面的问题,我们使用俩台fs来模拟一下问题场景。
A->fs1A->fs2->fs1B->B
fs1:注册服务器,10.55.55.138。
fs2:业务服务器,10.55.55.137。
A和B注册在fs1上,A发起呼叫B,fs1B先回复183消息,B摘机,并在fs2->fs1A回复200 OK的时候,丢弃200消息。
fs2,10.55.55.137,服务器dialplan配置如下。
<include>
<context name="public">
<extension name="test" continue="false">
<condition field="destination_number" expression="^(\d+)$">
<action application="bridge" data="{sip_invite_call_id=${sip_call_id}}sofia/external/$1@10.55.55.138:5090" />
</condition>
</extension>
</context>
</include>
fs1,10.55.55.138,服务器dialplan配置如下。
<include>
<context name="default">
<extension name="test" continue="false">
<condition field="destination_number" expression="^(\d+)$">
<action application="bridge" data="sofia/external/$1@10.55.55.137:5080" />
</condition>
</extension>
</context>
<context name="public">
<extension name="test1">
<condition field="destination_number" expression="^(\d+)$">
<action application="pre_answer" />
<action application="playback" data="/usr/local/freeswitch/sounds/test-cailing.wav" />
<action application="bridge" data="user/$1" />
</condition>
</extension>
</context>
</include>
为了丢弃掉200 OK消息,在fs1(10.55.55.138)配置防火墙规则如下。
sudo iptables -I INPUT -m string --string "200 OK" --algo kmp --to 65535 -s 10.55.55.137/0 -p udp --dport 5080 -j DROP
测试
使用A(1001)注册到fs1。
使用B(1002)注册到fs1。
在A路侧开启wireshark抓包。
在fs2(10.55.55.137)开启sngrep抓包。
使用A(1001)呼叫B(1002)。
B(1002)摘机,A(1001)未收到摘机消息,但是AB可以正常通话。
最后附上sngrep和wireshark的抓包截图。图左边看到200消息丢弃的过程,图右边看到A路侧收发的语音媒体流正常。

总结
SIP没有摘机消息也可以通话,但是有时间上限。
互联网场景下,什么都有可能发生。
并没有什么事情是非黑即白的,不要轻易下结论。
空空如常
求真得真
SIP没有摘机消息可以通话吗的更多相关文章
- VCI_CAN二次开发摘机
1. 关于CAN滤波的设置的几个参数 PVCI_INIT_CONFIG结构,VCI_InitCAN函数调用时使用 AccCode: 验收码(左对齐) 帧过滤验收码.对经过屏蔽码过滤为"有关位 ...
- 那些年,用C#调用过的外部Dll
经常有人找到我咨询以前在csdn资源里分享的dll调用.算算也写过N多接口程序.翻一翻试试写篇随笔. 明华IC读写器DLL 爱迪尔门锁接口DLL 通用OPOS指令打印之北洋pos打印机dll 明泰非接 ...
- [Android应用开发] 05.广播和服务
*:first-child { margin-top: 0 !important; } body > *:last-child { margin-bottom: 0 !important; } ...
- [置顶] android开发之来电自动拒接并自动回复短信_上课模式app
上课的时候老师说总是错过电话,对方打来没人接还一遍遍的打,觉得可以有个app在上课期间自动拒接电话,并自动回复短信过去. 当然了,需要权限的. 尝试做了个雏形出来. 界面如下: 主要代码如下: pac ...
- 流媒体学习三-------SIP消息结构详解
SIP消息由三部分组成,即:开始行(start line).消息头(header).正文(body)Start-line:请求行Request-line 消息为 request消息时使用reques ...
- 流媒体学习二-------SIP协议学习(基本场景分析 )
作者:gnuhpc 出处:http://www.cnblogs.com/gnuhpc/ 1.SIP业务基本知识 1.1 业务介绍 会话初始协议(Session Initiation Protocol) ...
- SIP基本呼叫
我们首先来看下主要的呼叫流程. INVITEsip:69690067@beijing.chinamobile.com;user=phone SIP/2.0 From:"+8610696900 ...
- 【协议学习】SIP基本场景分析
1.SIP业务基本知识 1.1 业务介绍 会话初始协议(Session Initiation Protocol)是一种信令协议,用于初始.管理和终止网络中的语音和视频会话,具体地说就是用来生成.修改和 ...
- SIP业务基本知识
1.SIP业务基本知识 1.1 业务介绍会话初始协议(Session Initiation Protocol)是一种信令协议,用于初始.管理和终止网络中的语音和视频会话,具体地说就是用来生成.修改和终 ...
- SIP协议&开源SIP服务器搭建和客户端安装
1. SIP SIP 是一个应用层的控制协议,可以用来建立,修改,和终止多媒体会话,例如Internet电话 SIP在建立和维持终止多媒体会话协议上,支持五个方面: 1) 用户定位: 检查终端用户 ...
随机推荐
- SpringBoot核心注解:@SpringBootApplication
@SpringBootApplication它是由三个注解的复合: @ComponentScan @SpringConguration @EnableAutoConfiguration 三个注解的作用 ...
- Elasticsearch入门到进阶
Elasticsearch 一.Elasticsearch 是什么(中文官网)? Elasticsearch 是一个分布式的免费开源搜索和分析引擎,适用于包括文本.数字.地理空间.结构化和非结构化数据 ...
- 华企盾DSC导致Solidworks无法导出xls文件
将Solidworks进程和Excel进程的OLE控制和启用虚拟重定向都关闭
- springboot整合hibernate(非JPA)(二)
springboot整合hibernate(非JPA)(二) springboot整合hibernate,非jpa,若是jpa就简单了,但是公司项目只有hibernate,并要求支持多数据库,因此记录 ...
- Netty 组件介绍
BootStrap Netty 中的 BootStrap 分为两种:一种是客户端的 BootStrap:一种是服务端的 ServerBootStrap. 客户端的 BootStrap 初始化客户端,该 ...
- uniapp中实现H5录音和上传、实时语音识别(兼容App小程序)和波形可视化
目录 Recorder-UniCore插件特性 集成到项目中 调用录音 上传录音 ASR语音识别 在uniapp中使用Recorder-UniCore插件可以实现跨平台录音功能,uniapp自带的re ...
- HTTP安全头部对jsp页面不生效
本文于2016年4月底完成,发布在个人博客网站上. 考虑个人博客因某种原因无法修复,于是在博客园安家,之前发布的文章逐步搬迁过来. 诡异的问题 AppScan扫描报告中提示,Web服务器返回js.cs ...
- JavaImprove--Lesson01--枚举类,泛型
一.枚举 认识枚举类 枚举是一种特殊的类 枚举的格式: 修饰符 enmu 枚举类名{ 名称1,名称2: 其它成员 } //枚举类 public enum A { //枚举类的第一列必须是罗列枚举 ...
- CodeForces 1453D 概率 期望
CodeForces 1453D Checkpoints 概率 期望 原题链接 题意 现在我们可以设计n个擂台,有的是激活点,有的不是.从第一个开始挑战,每次都有1/2的概率成功,如果该点成功,则跳到 ...
- POJ 3003 DP 寻路 记录路径
POJ 3003 DP 寻路 记录路径 我一开始把M看成是每个a_i的上限了,这是致命的,因为这个题dfs暴力搜索+剪枝是过不了的因为M<=40,全部状态有2的四十次幂. 正解是DP,设dp[i ...