如果从UAC收到200,OpenSIP不会向UAS发送取消。在1.7.2和1.8中验证

时间:2013-08-07 11:00:33

标签: sip asterisk sip-server opensips

Bug出现时的SIP呼叫图表:

A = UAC
B = OpenSIPS
C = UAS

A ---------- INVITE ---------> B
A <-------- STATUS 100 TRYING ------- B
B ---------- INVITE ---------> C
B <-------- STATUS 100 TRYING --------- C
B <-------- STATUS 200 OK --------------- C
A <-------- STATUS 200 OK ------------- B
A ---------- CANCEL ------------------> B
A <-------- 200 CANCELING ----------- B
A ---------- ACK ---------------> B
B ---------- ACK ---------------> B
B ---------- ACK ---------------> B
B ---------- ACK ---------------> B
B ---------- ACK ---------------> B
B ---------- ACK ---------------> B
B ---------- ACK ---------------> B
B ---------- ACK ---------------> B
B ---------- ACK ---------------> B
B ---------- ACK ---------------> B
B ---------- ACK ---------------> B
B ---------- ACK ---------------> B
B <-------- STATUS 200 OK --------- C
A <-------- STATUS 200 OK --------- B
B <-------- STATUS 200 OK --------- C
A <-------- STATUS 200 OK --------- B
B <-------- STATUS 200 OK --------- C
A <-------- STATUS 200 OK --------- B
B <-------- STATUS 200 OK --------- C
B <-------- STATUS 200 OK --------- C
B <-------- STATUS 200 OK --------- C
B <-------- STATUS 200 OK --------- C

在我的情况下问题实际上是UAS永远不会知道OpenSIP取消的INVITE并且它一直在Pinging,但是在只有1XX的情况下(即UAS的临时回复到OpenSIP它向UAS发送取消也)。这是理想的行为????????

从我的观点来看,当OpenSIP没有向UAS发送CANCEL时,也不应该向UAC发送OK。

重建问题的步骤: - 我用sipp来模仿这个问题。 sipp的客户端xml如下: -

<?xml version="1.0" encoding="ISO-8859-1" ?>
<!DOCTYPE scenario SYSTEM "sipp.dtd">

<scenario name="Basic Sipstone UAC">


  <send retrans="500">
    ;tag=[pid]SIPpTag00[call_number] To: [service] Call-ID: [call_id] CSeq: 1 INVITE Contact: sip:sipp@[local_ip]:[local_port] Max-Forwards: 70 Subject: Performance Test Content-Type: application/sdp Content-Length: [len] v=0 o=user1 53655765 2353687637 IN IP[local_ip_type] [local_ip] s=- c=IN IP[media_ip_type] [media_ip] t=0 0 m=audio [media_port] RTP/AVP 0 a=rtpmap:0 PCMU/8000 ]]>
  </send>

  <recv response="100"
        optional="true">
  </recv>

  <recv response="180" optional="true">
  </recv>

  <recv response="183" optional="true">
  </recv>

  <recv response="200" rtd="true">
  </recv>


<send retrans="500">
Call-ID: [call_id] CSeq: [cseq] CANCEL Contact: sip:sipp@[local_ip]:[local_port] Max-Forwards: 10 Content-Length: 0 ]]>
</send>

  <pause/>


  <send retrans="1">
    ;tag=[pid]SIPpTag00[call_number] To: [service] [peer_tag_param] Call-ID: [call_id] CSeq: 2 BYE Contact: sip:sipp@[local_ip]:[local_port] Max-Forwards: 70 Subject: Performance Test Content-Length: 0 ]]>
  </send>

  <recv response="200" crlf="true">
  </recv>

  <ResponseTimeRepartition value="10, 20, 30, 40, 50, 100, 150, 200"/>


  <CallLengthRepartition value="10, 50, 100, 500, 1000, 5000, 10000"/>

</scenario>

1 个答案:

答案 0 :(得分:3)

一旦接听电话,您就无法取消。 UAC A应该发送BYE请求而不是CANCEL请求。

B <-------- STATUS 200 OK --------------- C
A <-------- STATUS 200 OK ------------- B
A ---------- BYE ------------------> B
A <-------- 200 OK ----------- B

我的猜测是因为OpenSIPS收到了一个无效的CANCEL请求,它并不打算将它转发到UAS,这是公平的。

更新

来自SIP RFC

  

对于INVITE的非2xx最终响应对话框和对话框的影响      会话使CANCEL的使用具有吸引力。 CANCEL试图      强制对INVITE进行非2xx响应(特别是487)。      因此,如果UAC希望完全放弃其通话尝试,      它可以发送取消。如果INVITE导致2xx最终响应      对于INVITE,这意味着UAS接受了邀请      CANCEL正在进行中。 UAC可以继续会议      由任何2xx响应建立,或者可以用BYE终止它们。