2013-08-07 6 views
0

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> 

답변

3

. UAC A는 CANCEL 요청 대신 BYE 요청을 보내야합니다.

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

내 생각 엔 OpenSIPS 잘못된을 받고 있기 때문에 C에 충분히 공정 인 UAS를 전달하기 귀찮게하지 않는 요청 취소합니다.

업데이트 : SIP RFC에서

:

가 아닌가 2xx 최종 응답의 영향이 대화 상자와 세션에 초대하고는 사용이 매력적인 취소합니다. CANCEL은 으로 시도하여 2xx가 아닌 응답을 INVITE (특히 487)에 강제 실행합니다. 따라서 UAC가 통화 시도를 완전히 포기할 경우 CANCEL을 보낼 수 있습니다. INVITE가 INVITE에 대한 2xx 최종 응답 ( )을 초래하면 이는 UC가 CANCEL이 진행되는 동안 초대를 수락했음을 의미합니다. UAC는 모든 2xx 응답에 의해 설정된 세션을 계속할 수도 있고 BYE로 끝낼 수도 있습니다 (MAY).

+0

답장을 보내 주셔서 감사합니다. 그러나 나의 경우에는 어떤 일이 일어 났습니까? INVITE에 대해 STATUS 200 OK를받지 못했습니다. 이제 A가 CANCEL을 보냅니다. (B -> A에서 INVITE OK, A -> B에서 CANCEL이 서로 중첩됩니다.) CANCEL을 전송 한 후 B에 전송 된 INVITE에 대해 200 OK를 수신 한 다음 CANCEL 요청에 대해 200 OK를 수신합니다. 따라서 다른 Bye 메시지도 보내지 않습니다. OpenSIP에서 이런 상황을 어떻게 처리 할 수 ​​있을지 제안 해 주실 수 있습니까? – Mani

+2

그런 경우 BYE 요청을 보내기 위해서는 여전히 UAC A가 될 것입니다. SIP 표준은 호출이 취소 된 후에 INVITE 요청에 대한 OK 응답이 수신되면 UAC는 즉시 BYE 요청을 보내야한다고 명시합니다. – sipwiz

+0

실제로 제 경우에는 초대의 ACK가 클라이언트 A에서 B로 보내지고 그 후에 B에서 OK 200이 취소됩니다. 이제 클라이언트에서 보 내야하지만 그렇지 않습니다. 나는 이것이 공식 문서에서 인터넷에서 확인할 수 없으므로이를 증명해야한다. 당신은 올바른 방향으로 (어떤 공식 문서를 의미하는지) 안내해 주시겠습니까? – Mani