SIP 호출 그래프 다이어그램에서 검증 버그가 온다 :UAC에서 200을 수신 한 경우 OpenSIP에서 UAS로 취소를 보내지 않습니다. 1.7.2 및 1.8
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는 UC에 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:[email protected][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:[email protected][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:[email protected][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>
답장을 보내 주셔서 감사합니다. 그러나 나의 경우에는 어떤 일이 일어 났습니까? INVITE에 대해 STATUS 200 OK를받지 못했습니다. 이제 A가 CANCEL을 보냅니다. (B -> A에서 INVITE OK, A -> B에서 CANCEL이 서로 중첩됩니다.) CANCEL을 전송 한 후 B에 전송 된 INVITE에 대해 200 OK를 수신 한 다음 CANCEL 요청에 대해 200 OK를 수신합니다. 따라서 다른 Bye 메시지도 보내지 않습니다. OpenSIP에서 이런 상황을 어떻게 처리 할 수 있을지 제안 해 주실 수 있습니까? – Mani
그런 경우 BYE 요청을 보내기 위해서는 여전히 UAC A가 될 것입니다. SIP 표준은 호출이 취소 된 후에 INVITE 요청에 대한 OK 응답이 수신되면 UAC는 즉시 BYE 요청을 보내야한다고 명시합니다. – sipwiz
실제로 제 경우에는 초대의 ACK가 클라이언트 A에서 B로 보내지고 그 후에 B에서 OK 200이 취소됩니다. 이제 클라이언트에서 보 내야하지만 그렇지 않습니다. 나는 이것이 공식 문서에서 인터넷에서 확인할 수 없으므로이를 증명해야한다. 당신은 올바른 방향으로 (어떤 공식 문서를 의미하는지) 안내해 주시겠습니까? – Mani