考虑具有一些公共 ip 的服务器 S 和位于 NAT N 后面的客户端 C。现在 C 在 UDP 通道上向 S 发送一些消息。客户端 C 声明 S 应该连接 RTP 流的端口。您可能已经注意到这是一个标准的 voip 问题,我们可以在其中使用 ICE(STUN/TURN)。但是我不清楚流量。问题是 S 可以用 nat 形成一个 rtp 流,但是它应该连接到哪个端口?唯一的选择是 C 发送的端口。但是客户端是否在 nat 上保留该端口?还请讨论对称 nat 情况。
rtp 与 nat 的连接
网络工程
纳特
网络电话
传输协议
2021-08-01 16:03:26
2个回答
基本上有两个选项可以由 NAT 处理。
首先,NAT 实现可以使用应用程序级网关来实现RTP
. 在这种情况下,它将在 NAPT 映射中创建一个新条目。在该映射中,面向客户端的端口应该是发出信号的端口,面向服务器的端口可以是随机的。创建新映射后,ALG 会使用该新映射的面向服务器的数据覆盖 RTP 消息中的端口和 IP。这对客户端是透明的,但 NAT 实现需要跟上协议。
其次,如果 NAT 网关支持,客户端可以使用协议来了解其面向服务器的 ip 并在发送信号之前分配端口RTP
。执行此操作的最常见协议是PCP
和UPnP
。这需要在客户端进行工作/增加复杂性,但更通用,因为只有客户端需要更新其协议实现并且也可以将其用于其他协议。
对于 RTP 流量,解决 NAT 的常用方法是:服务器公布当前呼叫的公共 ip 和端口,然后等待第一个 RTP 数据包从客户端到达此 ip 和端口。在该服务器启动后,将 RTP 流量发送到源 ip 和到达数据包的端口(而不是源 ip|local| 和 NATed 客户端宣布的端口)