2013-08-07 7 views
0

SIP вызовов Graph диаграмма, когда ошибка приходит:OpenSIP не отправляет отменить в UAS в случае, если он получил 200 от UAC. Проверенные в 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 никогда не узнает об INVITE, отмененном OpenSIP, и он продолжает Pinging, но в случае, когда только 1XX (т. Е. Предварительные ответы поступают от UAS до OpenSIP, он также отправляет Отмена в UAS). Это желаемое поведение ???????

С моей точки зрения OpenSIP не должен отправлять OK в UAC также, когда он не отправляет CANCEL в UAS.

Шаги по воссозданию проблемы: - Я использовал sipp для подражания проблеме. Клиент XML для SIPP как: -

<?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 должен отправлять запрос BYE вместо запроса CANCEL.

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

Я думаю, потому что OpenSIPS получает недопустимый запрос отмены не заморачиваться пересылкой его на C УАС, которая является достаточно справедливым.

Update:

От SIP RFC:

воздействие не-2xx окончательный ответ на ПРИГЛАШЕНИЕ на диалогах и сеансов делает использование ОТМЕНА привлекательным. CANCEL пытается установить , чтобы не принимать сигнал 2xx к INVITE (в частности, 487). Следовательно, если UAC хочет полностью отказаться от своей попытки вызова, может отправить CANCEL. Если INVITE приводит к окончательному отклику 2xx на INVITE, это означает, что UAS принял приглашение, а - ОТМЕНА. UAC МОЖЕТ продолжить сеансы , установленные любыми ответами 2xx, или МОЖЕТ прекратить их с помощью BYE.

+0

Спасибо за ответ. Но в моем случае произошло то, что произошло: Dosen't получил STATUS 200 OK для INVITE. Итак, A отправил CANCEL сейчас (OK для INVITE из B -> A и CANCEL из A-> B перекрывают друг друга). После отправки CANCEL он получает 200 OK для INVITE, отправленного на B, и затем он получает 200 OK для запроса CANCEL. Также так A не посылает какое-либо сообщение Bye. Можете ли вы предложить, как я могу справиться с такой ситуацией в OpenSIP – Mani

+2

В этом случае все равно до UAC A будет отправлен запрос BYE. В стандарте SIP указано, что если ответ OK на запрос INVITE принимается после отмены вызова, UAC должен немедленно отправить запрос BYE. – sipwiz

+0

Фактически в моем случае ACK приглашения отправляется клиентом от A до B, после чего он получает отмену OK 200 из B. Теперь, на мой взгляд, клиент должен отправить сообщение, но он этого не делает. Я не могу найти в Интернете в любом официальном документе, что это должно быть так, чтобы я мог его проверить. Не могли бы вы направить меня в правильном направлении (означает какой-либо официальный документ или так), чтобы я мог его проверить. – Mani