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. coco数据集大小分类_MicroSoft COCO数据集
  2. [原创]一种自动地将继承自NSObject的自定义类序列化成JSON的方法
  3. 结对编程--基于android平台的黄金点游戏
  4. 剑指Offer 56 数组中数字出现的次数
  5. python有哪些插件_Python和它高大上的插件们
  6. python3精要(42)-异步生成器
  7. boost::edge_connectivity用法的测试程序
  8. nginx服务器的配置
  9. CAN总线很难吗?CAN总线看不懂是不可能的!
  10. div动态消失的动画效果
  11. 从用户空间直接访问系统调用
  12. only has output.xml, how to check failed step.
  13. centos 7 install VirtualBox
  14. java随机抽取数字_java 获取随机数字的三种方法
  15. linux第八周实验
  16. 解决pr导入的视频在监控器里面画面会放大的问题
  17. love2d引擎开发资源合集
  18. 华尔街英语:又一成人英语巨头悄然出局
  19. OA系统(海信集团)双因素身份认证解决方案
  20. CSS控制,彩色图片变灰色

热门文章

  1. matlab求最小割,matlab實現圖割算法中的最大流最小割Max-flow/min-cut問題(一)
  2. 100+套大数据可视化模板
  3. 面试官:抽象工厂模式是什么?
  4. Java之美[从菜鸟到高手演变]之智力题【史上最全】
  5. 各地美女排行榜之幕后真相----东北美女更胜一筹!
  6. HTML5简介(补充. 浏览器私有前缀)
  7. 汇川MD500E变频器开发方案
  8. Tomcat Ajp(CVE-2020-1938) 漏洞复现与修复
  9. 老网工: 浅谈SDN技术的部署和未来
  10. 如何使用CNN进行物体识别和分类_基于CNN目标检测方法(RCNN,FastRCNN,FasterRCNN,MaskRCNN,YOLO,SSD)行人检测...