概述

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没有摘机消息可以通话吗的更多相关文章

  1. VCI_CAN二次开发摘机

    1. 关于CAN滤波的设置的几个参数 PVCI_INIT_CONFIG结构,VCI_InitCAN函数调用时使用 AccCode: 验收码(左对齐) 帧过滤验收码.对经过屏蔽码过滤为"有关位 ...

  2. 那些年,用C#调用过的外部Dll

    经常有人找到我咨询以前在csdn资源里分享的dll调用.算算也写过N多接口程序.翻一翻试试写篇随笔. 明华IC读写器DLL 爱迪尔门锁接口DLL 通用OPOS指令打印之北洋pos打印机dll 明泰非接 ...

  3. [Android应用开发] 05.广播和服务

    *:first-child { margin-top: 0 !important; } body > *:last-child { margin-bottom: 0 !important; } ...

  4. [置顶] android开发之来电自动拒接并自动回复短信_上课模式app

    上课的时候老师说总是错过电话,对方打来没人接还一遍遍的打,觉得可以有个app在上课期间自动拒接电话,并自动回复短信过去. 当然了,需要权限的. 尝试做了个雏形出来. 界面如下: 主要代码如下: pac ...

  5. 流媒体学习三-------SIP消息结构详解

    SIP消息由三部分组成,即:开始行(start line).消息头(header).正文(body)Start-line:请求行Request-line  消息为 request消息时使用reques ...

  6. 流媒体学习二-------SIP协议学习(基本场景分析 )

    作者:gnuhpc 出处:http://www.cnblogs.com/gnuhpc/ 1.SIP业务基本知识 1.1 业务介绍 会话初始协议(Session Initiation Protocol) ...

  7. SIP基本呼叫

    我们首先来看下主要的呼叫流程. INVITEsip:69690067@beijing.chinamobile.com;user=phone SIP/2.0 From:"+8610696900 ...

  8. 【协议学习】SIP基本场景分析

    1.SIP业务基本知识 1.1 业务介绍 会话初始协议(Session Initiation Protocol)是一种信令协议,用于初始.管理和终止网络中的语音和视频会话,具体地说就是用来生成.修改和 ...

  9. SIP业务基本知识

    1.SIP业务基本知识 1.1 业务介绍会话初始协议(Session Initiation Protocol)是一种信令协议,用于初始.管理和终止网络中的语音和视频会话,具体地说就是用来生成.修改和终 ...

  10. SIP协议&开源SIP服务器搭建和客户端安装

    1. SIP SIP 是一个应用层的控制协议,可以用来建立,修改,和终止多媒体会话,例如Internet电话 SIP在建立和维持终止多媒体会话协议上,支持五个方面: 1)   用户定位: 检查终端用户 ...

随机推荐

  1. DI入门案例

    1.基于IoC管理bean 2.Service中使用new形式创建的Dao对象是否保留?(不保留) 3.Service中需要的Dao对象如何进入到Service中?(提供方法) 4.Service与D ...

  2. 3 与HTTP相关的各种协议

    目录 1 TCP/IP 2 DNS 3 URI/URL 4 HTTPS 5 代理 1 TCP/IP TCP/IP是网络世界最常用协议,HTTP通常运行在TCP/IP提供的可靠传输基础上 IP 协议是& ...

  3. Android阅读器之文本、图片和表格测量

    文章摘要 本文将介绍如何在Android开发中实现文本.图片和表格的测量.我们将使用Android Studio和Java语言,并利用Android SDK中的相关类库. 正文 文本测量 在Andro ...

  4. Linux服务器安装好Jenkins,IP+端口无法访问的问题排查

    1.是否已安装jdk,命令:java -version 2.查看Jenkins进程是否还在,命令 ps -ef|grep jenkins 3.查看8080(Jenkins默认)端口号是否开放,命令:f ...

  5. ASR项目实战-交付团队的分工

    对于通常的软件项目,参与角色,比如可以有用户,消费者,产品团队,研发团队(研发团队包括开发和测试),运营团队,运维团队,管理团队. 通常认为,用户,负责购买服务的群体,而消费者,负责使用业务的群体.这 ...

  6. vulntarget-d-wp

    vulntarget-d 配置信息 系统 ip kali 192.168.130.5 ubuntu 18 ip1: 192.168.130.8 ip2: 10.0.10.1 win7 10.0.10. ...

  7. 谁再说学不会 MySQL 数据库,就把这个给他扔过去!

    大家好,我是民工哥. 又是新的一年奋斗路的开启,相信有不少人农历新年之后,肯定会有所变动(跳槽加薪少不了).所以,我把往期推送过的MySQL技术文章做了一个相关的整理,基础不好的可以从最基础的学习一遍 ...

  8. ubuntu 之 lftp 上传 和下载

    1. 安装 sudo apt-get install lftp 2. 简单教程 2.0 声明:上传或下载文件 用get 或 mget,这种方式 不包含文件夹本身,如果需要连文件夹一起上传或下载则需要使 ...

  9. 文心一言 VS 讯飞星火 VS chatgpt (177)-- 算法导论13.3 6题

    六.用go语言,说明如果红黑树的表示中不提供父指针,应当如何有效地实现 RB-INSERT. 文心一言: 红黑树是一种自平衡的二叉搜索树,其中每个节点都包含一个颜色属性(红色或黑色),并且满足以下性质 ...

  10. 第五部分_Shell脚本条件判断语法结构

    条件判断语法结构 思考:何为真(true)?何为假(false)? 1. 条件判断语法格式 格式1: test条件表达式 格式2: [ 条件表达式 ] 格式3: [[ 条件表达式 ]] (支持正则~) ...