需要做什么来改变已建立对话之间的 SIP 传输协议?

What needs to be done to change the SIP transport protocol in-between an established dialog?

假定已通过 TCP 建立 SIP 对话(INVITE、200 OK、ACK)。如何切换到UDP?

我认为可以通过 RE-INVITE,更改 Via- 和 Contact-Header 来完成。


请注意,在 rfc3665#3.7#F9 中,RE-INVITE 更改了 IP 地址,因此我假设传输协议也可以切换..

您可以在发送(或接收)SIP 消息时在传输之间自由切换。即使在对话中。对话建立时未设置传输类型。

用于特定消息的传输类型确实可以反映在 Via 和 Contact headers、URI 等中。但这并不意味着 SIP 消息中包含 'UDP'通过 header 已经 sent/received 通过 UDP:如果 2 个 SIP 端点之间存在 TCP 连接,那么将此连接用于 UDP 消息也非常有意义。始终允许升级传输,不允许降级。

您唯一需要牢记的就是安全。当使用 sips-URIs、TLS 等时,can/will 对允许用于通信的传输类型施加了限制。

rfc3665#3.7#F9 对您的用例没有帮助,因为它着重于解释当 媒体 IP 需要更新时发生的情况

每个 SIP 事务都是独立的,每个事务都可以使用任何传输。但是,如果您更新对话(运输、联系人),可以通过重新邀请来完成,但也可以通过更新

I would assume it could be done via RE-INVITE, changing the Via- and the Contact-Header.

这对我来说是正确的。实践中:

Via: SIP/2.0/UDP XXX.XXX.XXX.XXX:XXXX;branch=z9hG4bKlkld5l
Contact: <sip:bob@XXX.XXX.XXX.XXX:XXXX>

应该修改为

Via: SIP/2.0/TCP YYY.YYY.YYY.YYY:YYYY;branch=z9hG4bKlkld5l
Contact: <sip:bob@YYY.YYY.YYY.YYY:YYYY>

而在现实生活中,您也可以在 Contact 中使用 and/or mofidy transport=UDP,在 Via 中使用 rport 参数.

旁注:强烈不建议从 TCP 切换到 UDP。只有从 UDP 切换到 TCP 才应该有好处。