Pjsip信令超时机制修改
- 超时机制
Sip信令的超时,主要指超时重发机制。Sip信令交互可以使用TCP或者UDP,如果是TCP,不需要重发,可以保证信令的时效性。但是UPD本身的机制问题,存在丢包等的情况。而sip信令的丢失容易造成sip状态的混乱。
Pjsip本身已经实现了信令的超时重发机制,主要包括INVITE信令,普通的BYE,UPDATE等信令的重发。
UAC:呼叫发
UAS:被叫方
- 超时修改
自组网是一个不稳定的网络,丢包情况严重,延时也厉害。如果不修改超时重发机制,会导致在短时重复发送sip指令,导致自组网带宽占用和sip状态的不稳定性。
根据目前自组网的性能,每个UDP网络包,从发送到对方接收,在只有1跳的情况下,普遍耗时2秒~3秒。所以sip信令重复发送时间太短,就没什么意义。
- 超时时间定义
在sip_transaction.c的文件中,有如下超时定义:
/* Timer timeout value constants */
static pj_time_val t1_timer_val = { PJSIP_T1_TIMEOUT/1000,
PJSIP_T1_TIMEOUT%1000 };
static pj_time_val t2_timer_val = { PJSIP_T2_TIMEOUT/1000,
PJSIP_T2_TIMEOUT%1000 };
static pj_time_val t4_timer_val = { PJSIP_T4_TIMEOUT/1000,
PJSIP_T4_TIMEOUT%1000 };
static pj_time_val td_timer_val = { PJSIP_TD_TIMEOUT/1000,
PJSIP_TD_TIMEOUT%1000 };
static pj_time_val timeout_timer_val = { (64*PJSIP_T1_TIMEOUT)/1000,
(64*PJSIP_T1_TIMEOUT)%1000 };
T1,T2,T4,TD的定义在pjsip/include/pjsip/sip_config.h中。
/** Transaction T1 timeout value. */
#if !defined(PJSIP_T1_TIMEOUT)
# define PJSIP_T1_TIMEOUT 3000/*500*/ //set to 3 second by dengfei
#endif
/** Transaction T2 timeout value. */
#if !defined(PJSIP_T2_TIMEOUT)
# define PJSIP_T2_TIMEOUT 4000
#endif
/** Transaction completed timer for non-INVITE */
#if !defined(PJSIP_T4_TIMEOUT)
# define PJSIP_T4_TIMEOUT 5000
#endif
/** Transaction completed timer for INVITE */
#if !defined(PJSIP_TD_TIMEOUT)
# define PJSIP_TD_TIMEOUT 60000 /*32000*/ //set to 60 second by dengfei
- INVITE信令超时修改
在拨打电话时,由呼叫方(UAC)发出INVITE信令给对方,并携带协商的SDP等信息。
每条sip信令都存在一个生存周期。Pjsip的实现主要在sip_transaction.c中。
UAC:
INVITE信令的生存周期如下:
NULL ------Tx INVITE-----> Calling -----Rx 100 trying---> Processing ----Rx 180 Ringing---> Processing ---Rx 200 OK---> Terminated ---Tx ACK ----> Destroyed
其他信令的生存周期:
比如BYE
NULL---Tx Bye---> Calling ---Rx 200 OK---> Completed---time out--> Terminated ----time out---> Destroyed
UAS:
INVITE信令的生存周期如下:
NULL ------Rx INVITE-----> Trying -----Tx 100 trying---> Processing ----Tx 180 Ringing---> Processing ---Tx 200 OK---> Completed---Rx ACK ---->Terminated ---time out ----> Destroyed
其他信令的生存周期:
比如BYE
NULL---Rx Bye---> Trying ---Tx 200 OK---> Completed---time out--> Terminated ----time out---> Destroyed
根据UAC 的INVITE信令生存周期,在发送INVITE信令时,会先进入NULL状态。
该状态的处理函数为:tsx_on_state_null
当前自组网中, sip信令传输使用的是UDP协议,因此tsx->is_reliable的值为false。会设置重复发送的timeout时间,并计时。
设置计时的函数为:tsx_schedule_timer。重复发送的timer名称为retransmit_timer。所有的sip信令超时重复发送都是 用的这个timer。
未修改时,INVITE的time out时间,设置的是t1_timer_val。根据t1的定义。未修改前的时间为500ms。
在宽带网络情况下,500ms的时间完全可以完成信令的发送并接收到被叫方回复的100 trying信令。
当在自组网中,这个时间是无法达到了,所以每次都会重复发送。我们把INVITE的首次信令重复发送时间修改为:t4_timer_val,大概为5秒时间。在1跳的情况下,差不多可以接收到100 trying信令的接收。
当首次超时时,在tsx_on_state_calling会收到超时的消息,并进行处理。
第二次超时:
原来的方案是:1 << (tsx->retransmit_count)) * pjsip_cfg()->tsx.t1
可以看出,根据重复发送的次数*2倍增时间,tsx.t1为原来的500ms,算下来,重复发送的时间为:0.5秒,1秒,2秒,4秒,8秒,16秒,32秒……
修改偶,t1设置成3秒,根据重复的次数相加,算下来时间为:5秒,3秒,6秒,9秒,12秒,15秒,18秒….
- 普通信令超时时间
普通信令的超时重复发送时间间隔为:
代码:
if (tsx->role==PJSIP_ROLE_UAC && tsx->status_code >= 100)
msec_time = pjsip_cfg()->tsx.t2;
用的是t2的时间。T2设置成4秒。
- INV生命周期time out修改
除了信令的生命周期,还存在一个INV的生命周期,主要用于未收到信令时,用于整个通话的挂断。
这个time out使用的的timer为:timeout_timer。
使用的超时时间:td_timer_val,td设置为1分钟。
- 网络异常时超时挂断修改
网络异常或者对方掉网超时挂断,总时间主要有两方面组成。
- sip_time.c文件pjsip_timer_setting_default函数,设置PJSIP_SESS_TIMER_DEF_SE和ABS_MIN_SE,这两个宏定义在sip_config.h中,可以修改超时时间。这个时间是设置timer定时发送update信令,update发送时间间隔为:PJSIP_SESS_TIMER_DEF_SE的二分之一时间。
- update信令在发送后,如果收不到对方的反馈,会有个60秒的信令超时。
- 如果ABS_MIN_SE设置为30,PJSIP_SESS_TIMER_DEF_SE设置为60,则网络异常时,大致1分钟时,会自动挂断电话
Pjsip信令超时机制修改相关推荐
- mysql会话超时机制_mysql超时机制
mysql每次建立一个socket连接(connect)时,这个socket都会占用一定内存.即使你关闭(close)连接时,并不是真正的关闭,而是处于睡眠(sleep)状态. 当你下次再进行连接时, ...
- 一种软件定时器/超时机制的实现方法
目录 概述 简单方法 优化方案 计数值自减 开启超时 超时检测 概述 在程序设计中,常会遇到需要循环等待的问题,比如在while中等待串口中断接收完一帧数据.这时为了避免一直接收不到,程序进入死循环, ...
- PHP timeout情况_php脚本运行时的超时机制详解
在做php开发的时候,经常会设置max_input_time.max_execution_time,用来控制脚本的超时时间.但却从来没有思考过背后的原理. 趁着这两天有空,研究一下这个问题. 超时配置 ...
- 关于Hystrix超时机制和线程状态的测试观察和个人理解
作者:未完成交响曲,资深Java工程师!目前在某一线互联网公司任职,架构师社区合伙人! 我们在使用Hystrix时,大部分情况下都是直接基于SpringCloud的相关注解来完成请求调用的.我们有个项 ...
- golang net/http 超时机制完全手册
目录 SetDeadline 服务器端超时设置 客户端超时设置 Cancel 和 Context 英文原始出处: The complete guide to Go net/http timeouts, ...
- .Net Cancellable Task - APM异步超时机制扩展
概述 .NET基于委托的APM(Asynchronous Programming Model)模式通过BeginInvoke, EndInvoke, AsyncCallback,IAsyncResul ...
- 超时机制,断路器模式简介
使用Hystrix保护应用,它是一种豪猪,他身上有很多的刺,所以他能保护自己,我们知道老外的项目,他的项目名称往往取得比较有格调,比较的生动形象,所以他可以保护这样的一个组件,起名叫Hystrix,我 ...
- java netty swap高_Netty 超时机制及心跳程序实现
本文介绍了 Netty 超时机制的原理,以及如何在连接闲置时发送一个心跳来维持连接. Netty 超时机制的介绍 Netty 的超时类型 IdleState 主要分为: ALL_IDLE : 一段时间 ...
- php7 字符串,php7 参数、整形及字符串处理机制修改实例分析
本文实例讲述了php7 参数.整形及字符串处理机制修改.分享给大家供大家参考,具体如下: 参数处理机制修改 一.重复参数命名不再支持. 重复的参数命名不再支持.比如下面的代码执行的时候会报错: pub ...
最新文章
- 实习生笔试面试题总结
- php4和php5的区别,php4和php5区别是什么
- python【蓝桥杯vip练习题库】ADV-234字符串跳步
- 聊一聊Load Average
- UnicodeDecodeError: 'utf-8' codec can't decode byte 0x80 in position 0: invalid start byte
- 将本地创建的工程上传到github仓库中
- 自用_C/C++报错记录汇总
- 2019 蓝桥杯省赛 B 组模拟赛(一) 程序设计:后缀字符串 ( STL map 和 substr()函数的应用)
- 矩阵、优化理论常用记号
- Android TV开发总结(七)构建一个TV app中的剧集列表控件
- Matlab信号提取、频谱分析、滤波、阈值设定、寻找极值点
- Python编曲实践(十):用Ableton Live 10手工扒的Grunge摇滚数据集,涵盖Grunge时期四大代表乐队的经典专辑
- 口腔行业的隐形冠军,现代牙科集团掘金步入新阶段
- 手写板(数位板)如何和希沃白板5无缝切换
- ToolBar修改返回按钮图标,CollapsingToolbarLayout修改文字居中
- Linux lvm(pv、vg、lv)操作命令收集
- OSSIM开源安全信息管理系统(六)
- HTML5响应式手机模板:电商网站设计——仿淘宝手机app界面模板源码 HTML+CSS+JavaScript...
- 掌握好亚马逊品类销量排名规则助力备战旺季!
- 品商业模式[摘自xiewen网络业游戏规则]