SIPP呼叫提前释放问题解决方法

来源:互联网 发布:最新网络灰色项目干货 编辑:程序博客网 时间:2024/06/09 16:46
    昨天研究SIPP带媒体呼叫时候,发现只要播放的媒体流超过20s以上,系统就会自动释放,首先以为是媒体播放所致,经过仔细排查:1、系统未开启RtpTimeOut机制 2、即使有媒体流机制,SIPp工具是带媒体呼叫,应该不存在该问题3、是否是录制的媒体流文件存在问题?经过多次录制,多次替换,发现都是在播放20s时候话务中断。由此说来并不是以上原因导致。
    到底是什么原因所致呢?抓包发现,流程有些反常,话务建立之后,系统仍旧不断向SIpp侧发200OK,SIpp侧同时不断向系统回复Ack消息,于是怀疑是流程异常导致系统释放,在服务器后台查看呼叫日志,得到一条重要线索:
    Retransmitting #6 (NAT) to 192.168.28.105:6808:
SIP/2.0 200 OK
Via: SIP/2.0/UDP 192.168.28.105:6808;received=192.168.28.105
From: 3108 <sip:3108@192.168.28.105:6808>;tag=1
To: 3101 <sip:3101@192.168.81.3:5060>;tag=as6a5a101d
Call-ID: 1-2451@192.168.28.105
CSeq: 2 INVITE
User-Agent: OFFICETEN
Allow: INVITE, ACK, CANCEL, OPTIONS, BYE, REFER, SUBSCRIBE, NOTIFY
Supported: replaces, timer
Contact: <sip:3101@192.168.81.3>
Content-Type: application/sdp
Content-Length: 167

v=0
o=root 631028997 631028997 IN IP4 192.168.81.3
s=OFFICETEN
c=IN IP4 192.168.81.3
t=0 0
m=audio 12698 RTP/AVP 0
a=rtpmap:0 PCMU/8000
a=ptime:20
a=sendrecv

---
[Jun 20 09:57:29] DEBUG[5232]: chan_sip.c:3094 __sip_xmit: Trying to put 'SIP/2.0 20' onto UDP socket destined for 192.168.28.105:6808

octeon*CLI>
<--- SIP read from UDP://192.168.28.105:6808 --->
ACK sip:3108@192.168.81.3:5060 SIP/2.0
Via: SIP/2.0/UDP 192.168.28.105:6808;branch=z9hG4bK-2451-1-14
From: 3108 <sip:3108@192.168.28.105:6808>;tag=1
To: 3101 <sip:3101@192.168.81.3:5060>;tag=as6a5a101d
Call-ID: 1-2451@192.168.28.105
CSeq: 1 ACK
Contact: sip:3108@192.168.28.105:6808
Max-Forwards: 70
Subject: Performance Test
Content-Length: 0


<------------->
[Jun 20 09:57:29] DEBUG[5232]: chan_sip.c:7572 parse_request:  Header  0 [ 38]: ACK sip:3108@192.168.81.3:5060 SIP/2.0
[Jun 20 09:57:29] DEBUG[5232]: chan_sip.c:7572 parse_request:  Header  1 [ 61]: Via: SIP/2.0/UDP 192.168.28.105:6808;branch=z9hG4bK-2451-1-14
[Jun 20 09:57:29] DEBUG[5232]: chan_sip.c:7572 parse_request:  Header  2 [ 47]: From: 3108 <sip:3108@192.168.28.105:6808>;tag=1
[Jun 20 09:57:29] DEBUG[5232]: chan_sip.c:7572 parse_request:  Header  3 [ 52]: To: 3101 <sip:3101@192.168.81.3:5060>;tag=as6a5a101d
[Jun 20 09:57:29] DEBUG[5232]: chan_sip.c:7572 parse_request:  Header  4 [ 30]: Call-ID: 1-2451@192.168.28.105
[Jun 20 09:57:29] DEBUG[5232]: chan_sip.c:7572 parse_request:  Header  5 [ 11]: CSeq: 1 ACK
[Jun 20 09:57:29] DEBUG[5232]: chan_sip.c:7572 parse_request:  Header  6 [ 37]: Contact: sip:3108@192.168.28.105:6808
[Jun 20 09:57:29] DEBUG[5232]: chan_sip.c:7572 parse_request:  Header  7 [ 16]: Max-Forwards: 70
[Jun 20 09:57:29] DEBUG[5232]: chan_sip.c:7572 parse_request:  Header  8 [ 25]: Subject: Performance Test
[Jun 20 09:57:29] DEBUG[5232]: chan_sip.c:7572 parse_request:  Header  9 [ 17]: Content-Length: 0
[Jun 20 09:57:29] DEBUG[5232]: chan_sip.c:7572 parse_request:  Header 10 [  0]:
--- (10 headers 0 lines) ---
[Jun 20 09:57:29] DEBUG[5232]: chan_sip.c:7246 find_call: ***Got request: callid [1-2451@192.168.28.105] from [3108 <sip:3108@192.168.28.105:6808>;tag=1] to [3101 <sip:3101@192.168.81.3:5060>;tag=as6a5a101d] cseq [1 ACK]
[Jun 20 09:57:29] DEBUG[5232]: chan_sip.c:7293 find_call: = No match Their Call ID: 228448725db21b5f67c2b71e13fdd80c@192.168.81.3 Their Tag dd321065 Our tag: as51e38fc7
[Jun 20 09:57:29] DEBUG[5232]: chan_sip.c:7293 find_call: = Found Their Call ID: 1-2451@192.168.28.105 Their Tag 1 Our tag: as6a5a101d
[Jun 20 09:57:29] DEBUG[5232]: chan_sip.c:21554 handle_incoming: cid_num.3108
[Jun 20 09:57:29] DEBUG[5232]: chan_sip.c:21637 handle_incoming: **** Received ACK (6) - Command in SIP ACK
[Jun 20 09:57:29] DEBUG[5232]: chan_sip.c:21643 handle_incoming: Ignoring too old SIP packet packet 1 (expecting >= 2)   
 
加红的两处表明:服务器侧不识别我们回复的ack,所以服务器认为没有收到回应,一直在重发200OK消息

为什么系统不认ACK呢?仔细查看:
系统发送200OK时候cseq是2
SIP/2.0 200 OK
Via: SIP/2.0/UDP 192.168.28.105:6808;received=192.168.28.105
From: 3108 <sip:3108@192.168.28.105:6808>;tag=1
To: 3101 <sip:3101@192.168.81.3:5060>;tag=as6a5a101d
Call-ID: 1-2451@192.168.28.105
CSeq: 2 INVITE
User-Agent: OFFICETEN
Allow: INVITE, ACK, CANCEL, OPTIONS, BYE, REFER, SUBSCRIBE, NOTIFY
Supported: replaces, timer
Contact: <sip:3101@192.168.81.3>
Content-Type: application/sdp
Content-Length: 167
然而我们工具在回复ack时候cseq却是1
<--- SIP read from UDP://192.168.28.105:6808 --->
ACK sip:3108@192.168.81.3:5060 SIP/2.0
Via: SIP/2.0/UDP 192.168.28.105:6808;branch=z9hG4bK-2451-1-14
From: 3108 <sip:3108@192.168.28.105:6808>;tag=1
To: 3101 <sip:3101@192.168.81.3:5060>;tag=as6a5a101d
Call-ID: 1-2451@192.168.28.105
CSeq: 1 ACK
Contact: sip:3108@192.168.28.105:6808
Max-Forwards: 70
Subject: Performance Test
Content-Length: 0

最后解决办法:将主叫xml脚本中回复200OK对应消息ACK中cseq改为2,测试长时间通话,恢复正常。



原创粉丝点击