两个对称 NAT 后面的对等方之间的 ICE 协商是否会导致需要两个 TURN 服务器?

Will ICE negotiations between peers behind two symmetric NAT's result in requiring two TURN servers?

我读过 RFC6577 and RFC8445,但我觉得 TURN can 的使用方式与使用方式之间有点脱节ICE 实际上 如何利用 relay candidates.

TURN RFC 描述了使用单个 TURN 服务器在客户端和对等端之间传送数据。 TURN 服务器上的 transport address 通过 TURN 消息接受来自客户端的数据流,而 relayed transport address 通过 UDP 接受来自对等方的数据流。这听起来不错 - 一个 TURN 服务器和双向数据流。

但是在阅读有关ICE 的文章时,我觉得这从来没有发生过。调用者和被调用者都在潜在的两个 TURN 服务器上独立分配,然后将各自的 relayed transport addresses 发送给对方。更像是 I can be reached via this relayed transport address 之类的东西。然后进行连接检查,因此,这里最终使用了两个 TURN 服务器,其中数据仅在一个方向上通过每个参与者分配的 TURN 服务器的 relayed transport address 流动。

这是真的吗?

在 TURN RFC 中,它表示如下:

The client can arrange for the server to relay packets to and from certain other hosts (called peers) and can control aspects of how the relaying is done. The client does this by obtaining an IP address and port on the server, called the relayed transport address. When a peer sends a packet to the relayed transport address, the server relays the packet to the client. When the client sends a data packet to the server, the server relays it to the appropriate peer using the relayed transport address as the source.

但是,我看不到通过 ICE 协商,数据会通过传输地址从客户端流向对等方的情况。调用者和被调用者都在 TURN 服务器上独立分配并发送 relayed transport addresses 给对方。

基本上,TURN 可以 进行双向数据流,但是在两个对称 NAT 之间使用 ICE,它 不会。这是正确的吗?

有点复杂....请耐心等待。仅阅读 TURN RFC 是不够的,您还需要来自 RFC 5245 在 ICE 上的上下文。

以下情况是基准情况:

  1. 客户端A分配一个中继地址8.8.8.8:43739,发送给客户端B
  2. 客户端B发送一个UDP包到8.8.8.8:43739
  3. TURN 服务器将数据包包装在一条 stun 消息中,将其发送给客户端 A

现在正如您所说,通常客户端 B 也会分配自己的中继地址并将其发送给 A。为什么不是一直使用(或一半时间)?候选人的优先级毕竟是平等的。 然而,决定选择哪对的 candidate pair priority 包括一个作为决胜局的因素:

      pair priority = 2^32*MIN(G,D) + 2*MAX(G,D) + (G>D?1:0)
Where G>D?1:0 is an expression whose value is 1 if G is greater than
D, and 0 otherwise.

这意味着使用调用者(假设其控制代理)中继地址的对比使用被调用者中继地址的对具有更高的优先级。

另外,这里游戏中还有一个候选端口客户端B用来发送到端口8.8.8.8:43739。这通常来自本地候选人之一,并且 TURN 服务器看到(并放入数据指示中)客户端 B 的 public (post-nat) ip。在客户端 A 上,这将显示作为远程 srflx 候选者 -- 比中继候选者具有更高的优先级,因此将被使用。

现在,如果 B 在对称 NAT 后面(我 认为 ),TURN 服务器将看到来自客户端 B 的端口与客户端 A 已为其添加权限的任何端口不同。这通常意味着 TURN 服务器将丢弃数据包并且该对将无法工作。

如果客户端 A 不在对称 NAT 后面,则将在另一个方向重复基线过程。优先级略低,但在延迟方面相同,因此用户不会注意到。

如果两个客户端(现在我们终于在您询问的情况下)都在对称 NAT 之后,则两者都不起作用,将使用中继中继对。这种情况相当罕见(可能 <1%),即使两个客户端都在不同的 TURN 服务器上,延迟影响通常也微不足道。