1. 超时机制

Sip信令的超时,主要指超时重发机制。Sip信令交互可以使用TCP或者UDP,如果是TCP,不需要重发,可以保证信令的时效性。但是UPD本身的机制问题,存在丢包等的情况。而sip信令的丢失容易造成sip状态的混乱。

Pjsip本身已经实现了信令的超时重发机制,主要包括INVITE信令,普通的BYE,UPDATE等信令的重发。

UAC:呼叫发

UAS:被叫方

  1. 超时修改

自组网是一个不稳定的网络,丢包情况严重,延时也厉害。如果不修改超时重发机制,会导致在短时重复发送sip指令,导致自组网带宽占用和sip状态的不稳定性。

根据目前自组网的性能,每个UDP网络包,从发送到对方接收,在只有1跳的情况下,普遍耗时2秒~3秒。所以sip信令重复发送时间太短,就没什么意义。

  1. 超时时间定义

在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

  1. 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秒….

  1. 普通信令超时时间

普通信令的超时重复发送时间间隔为:

代码:

if (tsx->role==PJSIP_ROLE_UAC && tsx->status_code >= 100)

msec_time = pjsip_cfg()->tsx.t2;

用的是t2的时间。T2设置成4秒。

  1. INV生命周期time out修改

除了信令的生命周期,还存在一个INV的生命周期,主要用于未收到信令时,用于整个通话的挂断。

这个time out使用的的timer为:timeout_timer。

使用的超时时间:td_timer_val,td设置为1分钟。

  1. 网络异常时超时挂断修改

网络异常或者对方掉网超时挂断,总时间主要有两方面组成。

  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的二分之一时间。
  2. update信令在发送后,如果收不到对方的反馈,会有个60秒的信令超时。
  3. 如果ABS_MIN_SE设置为30,PJSIP_SESS_TIMER_DEF_SE设置为60,则网络异常时,大致1分钟时,会自动挂断电话

Pjsip信令超时机制修改相关推荐

  1. mysql会话超时机制_mysql超时机制

    mysql每次建立一个socket连接(connect)时,这个socket都会占用一定内存.即使你关闭(close)连接时,并不是真正的关闭,而是处于睡眠(sleep)状态. 当你下次再进行连接时, ...

  2. 一种软件定时器/超时机制的实现方法

    目录 概述 简单方法 优化方案 计数值自减 开启超时 超时检测 概述 在程序设计中,常会遇到需要循环等待的问题,比如在while中等待串口中断接收完一帧数据.这时为了避免一直接收不到,程序进入死循环, ...

  3. PHP timeout情况_php脚本运行时的超时机制详解

    在做php开发的时候,经常会设置max_input_time.max_execution_time,用来控制脚本的超时时间.但却从来没有思考过背后的原理. 趁着这两天有空,研究一下这个问题. 超时配置 ...

  4. 关于Hystrix超时机制和线程状态的测试观察和个人理解

    作者:未完成交响曲,资深Java工程师!目前在某一线互联网公司任职,架构师社区合伙人! 我们在使用Hystrix时,大部分情况下都是直接基于SpringCloud的相关注解来完成请求调用的.我们有个项 ...

  5. golang net/http 超时机制完全手册

    目录 SetDeadline 服务器端超时设置 客户端超时设置 Cancel 和 Context 英文原始出处: The complete guide to Go net/http timeouts, ...

  6. .Net Cancellable Task - APM异步超时机制扩展

    概述 .NET基于委托的APM(Asynchronous Programming Model)模式通过BeginInvoke, EndInvoke, AsyncCallback,IAsyncResul ...

  7. 超时机制,断路器模式简介

    使用Hystrix保护应用,它是一种豪猪,他身上有很多的刺,所以他能保护自己,我们知道老外的项目,他的项目名称往往取得比较有格调,比较的生动形象,所以他可以保护这样的一个组件,起名叫Hystrix,我 ...

  8. java netty swap高_Netty 超时机制及心跳程序实现

    本文介绍了 Netty 超时机制的原理,以及如何在连接闲置时发送一个心跳来维持连接. Netty 超时机制的介绍 Netty 的超时类型 IdleState 主要分为: ALL_IDLE : 一段时间 ...

  9. php7 字符串,php7 参数、整形及字符串处理机制修改实例分析

    本文实例讲述了php7 参数.整形及字符串处理机制修改.分享给大家供大家参考,具体如下: 参数处理机制修改 一.重复参数命名不再支持. 重复的参数命名不再支持.比如下面的代码执行的时候会报错: pub ...

最新文章

  1. 实习生笔试面试题总结
  2. php4和php5的区别,php4和php5区别是什么
  3. python【蓝桥杯vip练习题库】ADV-234字符串跳步
  4. 聊一聊Load Average
  5. UnicodeDecodeError: 'utf-8' codec can't decode byte 0x80 in position 0: invalid start byte
  6. 将本地创建的工程上传到github仓库中
  7. 自用_C/C++报错记录汇总
  8. 2019 蓝桥杯省赛 B 组模拟赛(一) 程序设计:后缀字符串 ( STL map 和 substr()函数的应用)
  9. 矩阵、优化理论常用记号
  10. Android TV开发总结(七)构建一个TV app中的剧集列表控件
  11. Matlab信号提取、频谱分析、滤波、阈值设定、寻找极值点
  12. Python编曲实践(十):用Ableton Live 10手工扒的Grunge摇滚数据集,涵盖Grunge时期四大代表乐队的经典专辑
  13. 口腔行业的隐形冠军,现代牙科集团掘金步入新阶段
  14. 手写板(数位板)如何和希沃白板5无缝切换
  15. ToolBar修改返回按钮图标,CollapsingToolbarLayout修改文字居中
  16. Linux lvm(pv、vg、lv)操作命令收集
  17. OSSIM开源安全信息管理系统(六)
  18. HTML5响应式手机模板:电商网站设计——仿淘宝手机app界面模板源码 HTML+CSS+JavaScript...
  19. 掌握好亚马逊品类销量排名规则助力备战旺季!
  20. 品商业模式[摘自xiewen网络业游戏规则]

热门文章

  1. 经典Windows编程书单
  2. NRS1800 芯片使用技巧(二)
  3. python最基本语句,实例1温度转换
  4. 采用傅里叶模态法分析闪耀光栅
  5. tomcat 服务器访问日志配置方法
  6. SSH 和 SSM 有什么区别?
  7. 同时删除多个 Txt 文本文档的最后几行
  8. 【字体压缩】ttf字体压缩软件,默认保留常用3500字,可手动添加删减文字
  9. 七彩虹技术服务论坛硬件驱动更新指南(添加Vista支持)
  10. IBM POWER750硬盘背板介绍和如何配置分区