SIP 200 OK消息的SIP ACK响应的有效性

SIP 200 OK消息的SIP ACK响应的有效性,sip,Sip,我们正在向其中一个合作伙伴发送sip呼叫。他们向我们发送200条OK消息中的“记录路线”和“联系”标题。我方正在向记录路由中提到的IP地址发送ACK,但它正在将“Contact”头替换为“Route”头,而另一方不接受我方的ACK并向我们发送重复的200 OK,这导致呼叫断开 我不确定我们是否违反了任何SIP RFC,将“Contact”头更改为“Route”,同时维护头的内容。有人能解释一下吗 这是来自合作伙伴方的200 OK: SIP/2.0 200 OK Via: SIP/2.0/UDP

我们正在向其中一个合作伙伴发送sip呼叫。他们向我们发送200条OK消息中的“记录路线”和“联系”标题。我方正在向记录路由中提到的IP地址发送ACK,但它正在将“Contact”头替换为“Route”头,而另一方不接受我方的ACK并向我们发送重复的200 OK,这导致呼叫断开

我不确定我们是否违反了任何SIP RFC,将“Contact”头更改为“Route”,同时维护头的内容。有人能解释一下吗

这是来自合作伙伴方的200 OK:

SIP/2.0 200 OK
Via: SIP/2.0/UDP 100.100.100.100;received=100.100.100.100;rport=5060
Record-Route: <sip:200.200.200.2:5060;lr>
Contact: <sip:+100@10.10.10.135:7654>
To: +200<sip:+200@200.200.200.2:5060>;tag=784054843
From: +100<sip:+100@100.100.100.100:5060>;tag=4244235125227
Call-ID: CANTATA21.1a8.1200679.50@100.100.100.100
CSeq: 1 INVITE
Allow: ACK, INVITE, BYE, CANCEL
Content-Type: application/sdp
Server: YATE/3.0.0
Content-Length: 195

v=0
o=yate 1441225325 1441225325 IN IP4 201.201.201.30
s=SIP Call
c=IN IP4 201.201.201.30
t=0 0
m=audio 19305 RTP/AVP 0 101
a=rtpmap:0 PCMU/8000
a=rtpmap:101 telephone-event/8000
a=sendrecv
ACK sip:200.200.200.2:5060 SIP/2.0
Via: SIP/2.0/UDP 100.100.100.100
To: +200<sip:+200@200.200.200.2:5060>;tag=784054843
From: +100<sip:+100@100.100.100.100:5060>;tag=4244235125227
Call-ID: CANTATA21.1a8.1200679.50@100.100.100.100
CSeq: 1 ACK
Max-Forwards: 70
Route: <sip:+100@10.10.10.135:7654>
Content-Length: 0
INVITE sip:+200@200.200.200.2:5060 SIP/2.0
Via: SIP/2.0/UDP 100.100.100.100
To: +200<sip:+200@200.200.200.2:5060>
From: +100<sip:+100@100.100.100.100:5060>;tag=4244235125227
Call-ID: CANTATA21.1a8.1200679.50@100.100.100.100
Contact: +100<sip:+100@100.100.100.100:5060>
User-Agent: Excel_CSP/84.11.34
Supported: timer
Session-Expires: 3660
Min-SE: 300
CSeq: 1 INVITE
Max-Forwards: 70
Content-Type: application/sdp
Content-Length: 144

v=0
o=sip 0 0 IN IP4 100.100.100.100
s=SIP_Call
c=IN IP4 100.100.100.230
t=0 0
m=audio 46750 RTP/AVP 0 101
a=rtpmap:101 telephone-event/8000

SIP/2.0 100 Trying
Via: SIP/2.0/UDP 100.100.100.100;received=100.100.100.100;rport=5060
Record-Route: <sip:200.200.200.2:5060;lr>
To: +200<sip:+200@200.200.200.2:5060>
From: +100<sip:+100@100.100.100.100:5060>;tag=4244235125227
Call-ID: CANTATA21.1a8.1200679.50@100.100.100.100
CSeq: 1 INVITE
Server: YATE/3.0.0
Content-Length: 0

SIP/2.0 180 Ringing
Via: SIP/2.0/UDP 100.100.100.100;received=100.100.100.100;rport=5060
Record-Route: <sip:200.200.200.2:5060;lr>
Contact: <sip:+100@10.10.10.135:7654>
To: +200<sip:+200@200.200.200.2:5060>;tag=784054843
From: +100<sip:+100@100.100.100.100:5060>;tag=4244235125227
Call-ID: CANTATA21.1a8.1200679.50@100.100.100.100
CSeq: 1 INVITE
Allow: ACK, INVITE, BYE, CANCEL
Server: YATE/3.0.0
Content-Length: 0

SIP/2.0 200 OK
Via: SIP/2.0/UDP 100.100.100.100;received=100.100.100.100;rport=5060
Record-Route: <sip:200.200.200.2:5060;lr>
Contact: <sip:+100@10.10.10.135:7654>
To: +200<sip:+200@200.200.200.2:5060>;tag=784054843
From: +100<sip:+100@100.100.100.100:5060>;tag=4244235125227
Call-ID: CANTATA21.1a8.1200679.50@100.100.100.100
CSeq: 1 INVITE
Allow: ACK, INVITE, BYE, CANCEL
Content-Type: application/sdp
Server: YATE/3.0.0
Content-Length: 195

v=0
o=yate 1441225325 1441225325 IN IP4 201.201.201.30
s=SIP Call
c=IN IP4 201.201.201.30
t=0 0
m=audio 19305 RTP/AVP 0 101
a=rtpmap:0 PCMU/8000
a=rtpmap:101 telephone-event/8000
a=sendrecv

ACK sip:200.200.200.2:5060 SIP/2.0
Via: SIP/2.0/UDP 100.100.100.100
To: +200<sip:+200@200.200.200.2:5060>;tag=784054843
From: +100<sip:+100@100.100.100.100:5060>;tag=4244235125227
Call-ID: CANTATA21.1a8.1200679.50@100.100.100.100
CSeq: 1 ACK
Max-Forwards: 70
Route: <sip:+100@10.10.10.135:7654>
Content-Length: 0

SIP/2.0 200 OK
Via: SIP/2.0/UDP 100.100.100.100;received=100.100.100.100;rport=5060
Record-Route: <sip:200.200.200.2:5060;lr>
Contact: <sip:+100@10.10.10.135:7654>
To: +200<sip:+200@200.200.200.2:5060>;tag=784054843
From: +100<sip:+100@100.100.100.100:5060>;tag=4244235125227
Call-ID: CANTATA21.1a8.1200679.50@100.100.100.100
CSeq: 1 INVITE
Allow: ACK, INVITE, BYE, CANCEL
Content-Type: application/sdp
Server: YATE/3.0.0
Content-Length: 195

v=0
o=yate 1441225325 1441225325 IN IP4 201.201.201.30
s=SIP Call
c=IN IP4 201.201.201.30
t=0 0
m=audio 19305 RTP/AVP 0 101
a=rtpmap:0 PCMU/8000
a=rtpmap:101 telephone-event/8000
a=sendrecv
ACK sip:200.200.200.2:5060 SIP/2.0
Via: SIP/2.0/UDP 100.100.100.100
To: +200<sip:+200@200.200.200.2:5060>;tag=784054843
From: +100<sip:+100@100.100.100.100:5060>;tag=4244235125227
Call-ID: CANTATA21.1a8.1200679.50@100.100.100.100
CSeq: 1 ACK
Max-Forwards: 70
Route: <sip:+100@10.10.10.135:7654>
Content-Length: 0

SIP/2.0 200 OK
Via: SIP/2.0/UDP 100.100.100.100;received=100.100.100.100;rport=5060
Record-Route: <sip:200.200.200.2:5060;lr>
Contact: <sip:+100@10.10.10.135:7654>
To: +200<sip:+200@200.200.200.2:5060>;tag=784054843
From: +100<sip:+100@100.100.100.100:5060>;tag=4244235125227
Call-ID: CANTATA21.1a8.1200679.50@100.100.100.100
CSeq: 1 INVITE
Allow: ACK, INVITE, BYE, CANCEL
Content-Type: application/sdp
Server: YATE/3.0.0
Content-Length: 195

v=0
o=yate 1441225325 1441225325 IN IP4 201.201.201.30
s=SIP Call
c=IN IP4 201.201.201.30
t=0 0
m=audio 19305 RTP/AVP 0 101
a=rtpmap:0 PCMU/8000
a=rtpmap:101 telephone-event/8000
a=sendrecv
ACK sip:200.200.200.2:5060 SIP/2.0
Via: SIP/2.0/UDP 100.100.100.100
To: +200<sip:+200@200.200.200.2:5060>;tag=784054843
From: +100<sip:+100@100.100.100.100:5060>;tag=4244235125227
Call-ID: CANTATA21.1a8.1200679.50@100.100.100.100
CSeq: 1 ACK
Max-Forwards: 70
Route: <sip:+100@10.10.10.135:7654>
Content-Length: 0

SIP/2.0 200 OK
Via: SIP/2.0/UDP 100.100.100.100;received=100.100.100.100;rport=5060
Record-Route: <sip:200.200.200.2:5060;lr>
Contact: <sip:+100@10.10.10.135:7654>
To: +200<sip:+200@200.200.200.2:5060>;tag=784054843
From: +100<sip:+100@100.100.100.100:5060>;tag=4244235125227
Call-ID: CANTATA21.1a8.1200679.50@100.100.100.100
CSeq: 1 INVITE
Allow: ACK, INVITE, BYE, CANCEL
Content-Type: application/sdp
Server: YATE/3.0.0
Content-Length: 195

v=0
o=yate 1441225325 1441225325 IN IP4 201.201.201.30
s=SIP Call
c=IN IP4 201.201.201.30
t=0 0
m=audio 19305 RTP/AVP 0 101
a=rtpmap:0 PCMU/8000
a=rtpmap:101 telephone-event/8000
a=sendrecv
ACK sip:200.200.200.2:5060 SIP/2.0
Via: SIP/2.0/UDP 100.100.100.100
To: +200<sip:+200@200.200.200.2:5060>;tag=784054843
From: +100<sip:+100@100.100.100.100:5060>;tag=4244235125227
Call-ID: CANTATA21.1a8.1200679.50@100.100.100.100
CSeq: 1 ACK
Max-Forwards: 70
Route: <sip:+100@10.10.10.135:7654>
Content-Length: 0

SIP/2.0 200 OK
Via: SIP/2.0/UDP 100.100.100.100;received=100.100.100.100;rport=5060
Record-Route: <sip:200.200.200.2:5060;lr>
Contact: <sip:+100@10.10.10.135:7654>
To: +200<sip:+200@200.200.200.2:5060>;tag=784054843
From: +100<sip:+100@100.100.100.100:5060>;tag=4244235125227
Call-ID: CANTATA21.1a8.1200679.50@100.100.100.100
CSeq: 1 INVITE
Allow: ACK, INVITE, BYE, CANCEL
Content-Type: application/sdp
Server: YATE/3.0.0
Content-Length: 195

v=0
o=yate 1441225325 1441225325 IN IP4 201.201.201.30
s=SIP Call
c=IN IP4 201.201.201.30
t=0 0
m=audio 19305 RTP/AVP 0 101
a=rtpmap:0 PCMU/8000
a=rtpmap:101 telephone-event/8000
a=sendrecv
ACK sip:200.200.200.2:5060 SIP/2.0
Via: SIP/2.0/UDP 100.100.100.100
To: +200<sip:+200@200.200.200.2:5060>;tag=784054843
From: +100<sip:+100@100.100.100.100:5060>;tag=4244235125227
Call-ID: CANTATA21.1a8.1200679.50@100.100.100.100
CSeq: 1 ACK
Max-Forwards: 70
Route: <sip:+100@10.10.10.135:7654>
Content-Length: 0

SIP/2.0 200 OK
Via: SIP/2.0/UDP 100.100.100.100;received=100.100.100.100;rport=5060
Record-Route: <sip:200.200.200.2:5060;lr>
Contact: <sip:+100@10.10.10.135:7654>
To: +200<sip:+200@200.200.200.2:5060>;tag=784054843
From: +100<sip:+100@100.100.100.100:5060>;tag=4244235125227
Call-ID: CANTATA21.1a8.1200679.50@100.100.100.100
CSeq: 1 INVITE
Allow: ACK, INVITE, BYE, CANCEL
Content-Type: application/sdp
Server: YATE/3.0.0
Content-Length: 195

v=0
o=yate 1441225325 1441225325 IN IP4 201.201.201.30
s=SIP Call
c=IN IP4 201.201.201.30
t=0 0
m=audio 19305 RTP/AVP 0 101
a=rtpmap:0 PCMU/8000
a=rtpmap:101 telephone-event/8000
a=sendrecv


ACK sip:200.200.200.2:5060 SIP/2.0
Via: SIP/2.0/UDP 100.100.100.100
To: +200<sip:+200@200.200.200.2:5060>;tag=784054843
From: +100<sip:+100@100.100.100.100:5060>;tag=4244235125227
Call-ID: CANTATA21.1a8.1200679.50@100.100.100.100
CSeq: 1 ACK
Max-Forwards: 70
Route: <sip:+100@10.10.10.135:7654>
Content-Length: 0

BYE sip:+100@100.100.100.100:5060 SIP/2.0
Via: SIP/2.0/UDP 200.200.200.2:5060;branch=z9hG4bK-524287-1---baf0e608a3be462e3d9534147efb1150;rport
Via: SIP/2.0/UDP 10.10.10.135:7654;rport=7654;branch=z9hG4bK962836463;received=10.10.10.135
Max-Forwards: 69
Record-Route: <sip:200.200.200.2:5060;lr>
To: <sip:+100@100.100.100.100:5060>;tag=4244235125227
From: <sip:+200@200.200.200.2:5060>;tag=784054843
Call-ID: CANTATA21.1a8.1200679.50@100.100.100.100
CSeq: 95618 BYE
Allow: ACK, INVITE, BYE, CANCEL
User-Agent: YATE/3.0.0
Reason: SIP;cause=408;text="Request Timeout"
Content-Length: 0

SIP/2.0 200 OK 
To: <sip:+100@100.100.100.100:5060>;tag=4244235125227
From: <sip:+200@200.200.200.2:5060>;tag=784054843
Call-ID: CANTATA21.1a8.1200679.50@100.100.100.100
CSeq: 95618 BYE
Record-Route: <sip:200.200.200.2:5060;lr>
Via: SIP/2.0/UDP 200.200.200.2:5060;branch=z9hG4bK-524287-1---baf0e608a3be462e3d9534147efb1150;rport
Via: SIP/2.0/UDP 10.10.10.135:7654;rport=7654;branch=z9hG4bK962836463;received=10.10.10.135
User-Agent: Excel_CSP/84.11.34
Content-Length: 0
200 Ok包含:

Record-Route: <sip:200.200.200.2:5060;lr>
Contact: <sip:+100@10.10.10.135:7654>
记录路线:
联系人:
您的应用程序似乎不理解“lr”参数的含义:rfc3261中引入的“松散路由”参数。它甚至与最初的rfc2543不兼容

如果您的应用程序仅与rfc2543兼容,则ACK将包含您的确切消息,但带有附加的“lr”参数。这将向服务器表明订单是rfc2543,理论上,服务器将理解并重新订购:(rfc3261,第16.6节,步骤6.后处理路由信息)

acksip:200.200.2:5060;lr SIP/2.0
路线:
但是,正确的消息应符合最新的rfc3261,因此您的应用程序必须生成以下SIP消息:

ACK sip:+100@10.10.10.135:7654 SIP/2.0
Route: <sip:200.200.200.2:5060;lr>
ACK-sip:+100@10.10.10.135:7654 SIP/2.0
路线:

整个问题都与应用程序中“lr”参数的错误处理有关!解决方案是根据rfc3261修复缺失的“lr”,并确保顺序准确。

我猜您在发布问题时已经删除了SIP标题的某些部分。大多数Via头都缺少必需的branchs参数,这在INVITE事务处理中尤其重要

除了突出显示的与联系人和路由头相关的AymericM哈希问题外,您“可能”还存在与ACK请求中的Via header分支参数相关的另一个问题。具体来说,您应该看一看章节,了解有关如何构造ACK请求的详细信息

关键是确认非2xx故障响应时,ACK请求必须启动新事务。确认2xx响应时,ACK请求必须是事务内请求,并使用与原始INVITE请求相同的标头字段,包括Via header branch参数

ACK请求的构造是SIP中最大的难题之一

ACK sip:200.200.200.2:5060;lr SIP/2.0
Route: <sip:+100@10.10.10.135:7654>
ACK sip:+100@10.10.10.135:7654 SIP/2.0
Route: <sip:200.200.200.2:5060;lr>