Pjsip信令超时机制修改

  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分钟时,会自动挂断电话
  • 2
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值