SIP To头和Contact头之间的关系

Relationship between SIP To header and Contact header

我最近遇到这样一个关于SIP代理的问题:

Bob(192.168.10.10) ----- Proxy1(192.168.10.11) ----- Proxy2(192.168.10.12) ----- Alice(注册的Proxy2)(192.168.10.13)

问题:Bob呼叫Alice(第一个socket发送地址是Proxy1),SIP request uri use Alice@192.168.10.12 or Alice@192.168.10.11 ?

我分别对这两种情况做了实验, 第一种情况没有问题,第二种情况出现问题,不同的终端看起来不一样,我觉得这跟被叫端的SIP Contact head有直接关系。

case failed(Polycom RealPresence Desktop for Windows (3.10.0.71107)):
    callee recv SIP INVITE header:
        Request-Line: INVITE sip:4594927728@192.168.10.13:5060 SIP/2.0
        Record-Route: <sip:192.168.10.12;lr>
        Record-Route: <sip:192.168.10.11;lr;nat=yes>
        Via: SIP/2.0/UDP 192.168.10.12;branch=z9hG4bKaaf1.70dfc3f1d0af80c063cb4249ae938e9e.0
        Via: SIP/2.0/UDP 192.168.10.11;branch=z9hG4bKaaf1.802002a25de0b2f6bd5501e66591e189.0
        Via: SIP/2.0/UDP 192.168.10.10:5060;received=192.168.10.10;rport=5060;branch=z9hG4bK1763450237
        From: "elink11" <sip:xxx@192.168.10.10>;tag=1452304765
        To: <sip:4594927728@192.168.10.11;user=phone>

    callee SIP response 200 OK header:
        Via: SIP/2.0/UDP 192.168.10.12;branch=z9hG4bKaaf1.70dfc3f1d0af80c063cb4249ae938e9e.0
        Via: SIP/2.0/UDP 192.168.10.11;branch=z9hG4bKaaf1.802002a25de0b2f6bd5501e66591e189.0
        Via: SIP/2.0/UDP 192.168.10.10:5060;received=192.168.10.10;rport=5060;branch=z9hG4bK1763450237
        From: "xxxx" <sip:xxx@192.168.10.10>;tag=1452304765
        To: "PVS2803841713" <sip:4594927728@192.168.10.11;user=phone>;tag=C76FC69F-9372BA4C
        Contact: <sip:4594927728@192.168.10.11:5060>
        Record-Route: <sip:192.168.10.12;lr>
        Record-Route: <sip:192.168.10.11;lr;nat=yes>

当200 OK Contact头携带To头地址(被叫本方地址)时,调用失败,后续请求由于请求URI错误,无法正确路由到被叫。

case success(PolycomRealPresenceGroup310/6.1.7):
    The callee send 200 OK header:
        Contact: 4594927728 <sip:4594927728@192.168.10.13:5060>

携带的联系地址是自己的地址。 后续请求(例如 ACK)将使用联系地址作为请求 URI,以便将它们路由到被叫方。

哪个是标配?在多个代理的情况下,请求 URI 的正确地址是什么?或者他们还好吗? 非常感谢。

当 Bob 尝试联系 Alice 时,Request-URI 应该是 Alice 的 Address-Of-Record。 AOR 的形式为 Alice@Domain。域可以是域的名称或域服务器的 IP 地址,处理有关域的请求。 To 和 From header 分别包含 Alice 和 Bob 的 AOR。

根据您的示例,我了解到 proxy2 是 Alice 域的域服务器,而 proxy1 是 Bob 的出站代理。这意味着 Request-URI 应该是 Alice@192.168.10.12。然后 INVITE 请求将被路由到 proxy2,proxy2 将其转发给 Alice。

INVITE 响应将包含可以在创建的对话中联系到 Alice 的联系地址。此联系地址的域部分可以是 192.168.10.12 或 192.168.10.13。这取决于 proxy2 是允许 Bob 和 Alice 之间的直接通信还是希望在通信路径中。以及这些 IP 地址是否可路由 Bob 的请求。

如果 proxy1 是 Alice 域的域服务器,则 AOR 应该是 Alice@proxy1。 Proxy1 然后将在域内转发传入请求(到 proxy2)。同样,响应将包含一个联系地址,Bob 应该使用该地址向 Alice 发送 in-dialog 请求。

To/From header 中的 URI 与联系人 header 之间没有直接关系。 To/From headers 应该包含 Alice 和 Bob 的 AOR。联系地址可以是 Alice(或通信路径中的代理)想要的任何地址。