如何确保BYE消息绕过SIP代理?

如何确保BYE消息绕过SIP代理?,sip,sip-server,Sip,Sip Server,我正在尝试构建一个无状态SIP代理,类似于此图中的代理: 当“Alice”先挂断时,它的行为应该是正常的,BYE消息直接发送给“Bob”,而不触及代理。然而,当“Bob”先挂断时,BYE消息在以太中丢失,或者到达代理,而不是“Alice” 这是代理发送给Alice的200条消息,就在ACK之前(由Bob转发) SIP/2.0 200正常 Via:SIP/2.0/UDP 192.168.168.103:58922;已接收=98.0.xxx.xxx;rport=39612;分支=Z9HG4BKPJ

我正在尝试构建一个无状态SIP代理,类似于此图中的代理:

当“Alice”先挂断时,它的行为应该是正常的,BYE消息直接发送给“Bob”,而不触及代理。然而,当“Bob”先挂断时,BYE消息在以太中丢失,或者到达代理,而不是“Alice”

这是代理发送给Alice的200条消息,就在ACK之前(由Bob转发)

SIP/2.0 200正常
Via:SIP/2.0/UDP 192.168.168.103:58922;已接收=98.0.xxx.xxx;rport=39612;分支=Z9HG4BKPJKDKDFFK6647HFRB-.WRwaWW0HixPPnG
记录路线:,
来自:“爱丽丝”;tag=I9jUO6GotuK.DLbMUK9.HRKStDfVA18r
致:;标签=as13aaa2d9
呼叫ID:gL7sgrTlu7wCcQCeOqhgOSe6tr.LDu9v
CSeq:19813邀请
用户代理:星号PBX
允许:邀请、确认、取消、选项、再见、推荐、订阅、通知、信息
支持:替换
联系人:
内容类型:应用程序/sdp
内容长度:300
v=0
o=IP4 199.x.xxx.73中的根3520 3520
s=会话
c=在IP4 199.x.xxx.73中
t=0
m=音频59316 RTP/AVP 0 8 9 101
a=消声抑制:关闭-----
a=rtpmap:0 PCMU/8000
a=rtpmap:8 PCMA/8000
a=rtpmap:9 G722/8000
a=rtpmap:101电话事件/8000
a=fmtp:101 0-16
a=sendrecv
a=rtcp:59317
a=时间:20
这是Alice发送给Bob的确认:

ACK sip:12340@208.xx.xx.12:5090 SIP/2.0
Via: SIP/2.0/UDP 192.168.168.103:58922;rport;branch=z9hG4bKPjKxiikjcMSTNLKavscYpxTToZfOn7AlCI
Max-Forwards: 70
From: "Alice" <sip:alice@foo.com>;tag=I9jUO6GotuK.DLbMUK9.HRKStDfVA18r
To: <sip:proxy@proxy-uri.com>;tag=as13aaa2d9
Call-ID: gL7sgrTlu7wCcQCeOqhgOSe6tr.LDu9v
CSeq: 19813 ACK
Route: <sip:199.x.xxx.101;lr;ftag=I9jUO6GotuK.DLbMUK9.HRKStDfVA18r;nc=1;did=615.7e25f325;pr=3>
Route: <sip:208.xx.xx.11;lr;ftag=I9jUO6GotuK.DLbMUK9.HRKStDfVA18r>
User-Agent: Blink Lite 4.6.0 (MacOSX)
Content-Length:  0
ACK-sip:12340@208.xx.xx.12:5090 SIP/2.0
Via:SIP/2.0/UDP 192.168.168.103:58922;rport;分支=z9hG4bKPjKxiikjcMSTNLKavscYpxTToZfOn7AlCI
最大前锋:70
来自:“爱丽丝”;tag=I9jUO6GotuK.DLbMUK9.HRKStDfVA18r
致:;标签=as13aaa2d9
呼叫ID:gL7sgrTlu7wCcQCeOqhgOSe6tr.LDu9v
CSeq:19813 ACK
路线:
路线:
用户代理:Blink Lite 4.6.0(MacOSX)
内容长度:0

我只能控制代理生成的消息。我猜在确认之前我需要添加/删除/更改代理发送的200,但我不确定?提前感谢。

tl;dr您的代理必须是所谓的非记录路由代理,以确保您的代理不是任何后续请求的一部分

嘿,亚当

在SIP中,有几个“神奇”的报头控制消息在网络上的路由方式。路由标头用于请求,Via标头用于响应。如果要确保任何请求都遵循网络中的特定路径,则需要确保添加正确的路由头以强制请求以特定方式执行(或者,在您的情况下,不添加路由头)。对于由UAC(本例中为用户代理客户端-Alice)发起的新请求,客户端可以将路由头推送到该请求上。当该请求通过其他元素到达UAS(用户代理服务器-Bob)时,这些元素希望保留在后续请求的路径中,这些元素需要向消息添加一个记录路由头,这将建立路由集,UA稍后将使用该路由集将路由头推送到后续请求上

因此,简而言之,您需要控制后续请求的路径,在本例中,您不需要在代理中添加记录路由

此外,如果拜拜没有到达Alice,很可能是因为Alice没有在联系人标题中标记正确的信息。确保无论你标记什么,都有可以从Bob访问的东西(假设这是公共互联网,那么它必须是公共IP地址)


如果你想知道关于这些东西的所有细节,我实际上在很久以前录制了一个关于这个主题的演示,因为这是SIP中最容易被误解的领域之一。见:

tl;dr您的代理必须是所谓的非记录路由代理,以确保您的代理不是任何后续请求的一部分

嘿,亚当

在SIP中,有几个“神奇”的报头控制消息在网络上的路由方式。路由标头用于请求,Via标头用于响应。如果要确保任何请求都遵循网络中的特定路径,则需要确保添加正确的路由头以强制请求以特定方式执行(或者,在您的情况下,不添加路由头)。对于由UAC(本例中为用户代理客户端-Alice)发起的新请求,客户端可以将路由头推送到该请求上。当该请求通过其他元素到达UAS(用户代理服务器-Bob)时,这些元素希望保留在后续请求的路径中,这些元素需要向消息添加一个记录路由头,这将建立路由集,UA稍后将使用该路由集将路由头推送到后续请求上

因此,简而言之,您需要控制后续请求的路径,在本例中,您不需要在代理中添加记录路由

此外,如果拜拜没有到达Alice,很可能是因为Alice没有在联系人标题中标记正确的信息。确保无论你标记什么,都有可以从Bob访问的东西(假设这是公共互联网,那么它必须是公共IP地址)


如果你想知道关于这些东西的所有细节,我实际上在很久以前录制了一个关于这个主题的演示,因为这是SIP中最容易被误解的领域之一。请参阅:

我认为问题在于Alice发送给Bob的确认。它没有用于路由新事务的联系人标头。它可能工作不正常。在yor 200 OK中,触点不是代理,因此ACK没有通过它

为了避免Alice在ACK中不发送联系人,您的代理应该这样做。我会尝试在200 OK中的联系人内设置代理:

SIP/2.0 200正常
[…]
联系人:
[……]

这样,Alice发送给Bob的ACK将在代理中接收,您必须将其发送给Bob,并将联系人更改为Alice


希望这有帮助。让我知道它是否有效。

我认为问题在于Alice发送给Bob的ACK。它没有联系人标题,而
ACK sip:12340@208.xx.xx.12:5090 SIP/2.0
Via: SIP/2.0/UDP 192.168.168.103:58922;rport;branch=z9hG4bKPjKxiikjcMSTNLKavscYpxTToZfOn7AlCI
Max-Forwards: 70
From: "Alice" <sip:alice@foo.com>;tag=I9jUO6GotuK.DLbMUK9.HRKStDfVA18r
To: <sip:proxy@proxy-uri.com>;tag=as13aaa2d9
Call-ID: gL7sgrTlu7wCcQCeOqhgOSe6tr.LDu9v
CSeq: 19813 ACK
Route: <sip:199.x.xxx.101;lr;ftag=I9jUO6GotuK.DLbMUK9.HRKStDfVA18r;nc=1;did=615.7e25f325;pr=3>
Route: <sip:208.xx.xx.11;lr;ftag=I9jUO6GotuK.DLbMUK9.HRKStDfVA18r>
User-Agent: Blink Lite 4.6.0 (MacOSX)
Content-Length:  0