ICE 连通性检查 - 通过 TURN 的 STUN 绑定响应

ICE Connectivity Check - STUN Binding Responses through TURN

假设我们有如下本地和远程候选人:

本地候选人 - relay UDP 1.2.3.4 40000

远程候选人 - srflx UDP 192.0.0.1 50000

这描述了以下拓扑:

[ Device A <-> NAT <-> TURN ] <-> [ NAT <-> Device B ]

来自 RFC:

The agent constructs a candidate pair whose local candidate equals
the mapped address of the response, and whose remote candidate equals
the destination address to which the request was sent.

据我了解,Device A 将从其 TURN 中继发送 STUN 绑定到 Device B 的服务器自反传输地址。 Device B 将看到 TURN 服务器的 relayed-transport-address,将其放入 XOR-MAPPED-ADDRESS 字段,然后发回响应。

Device A 尝试确定这是一个有效的连接检查时,它会根据其 local/remote 个候选者检查响应。

对于 local 候选人检查:

它查看 STUN 响应的 XOR-MAPPED-ADDRESS,在本例中为 1.2.3.4 40000。这是设备 B 看到消息的源地址。这与它的本地候选人相匹配,因此我们在这里很好。

对于远程候选人检查:

Device A 如何检查 remote candidate equals the destination address to which the request was sent.

据我所知,这是一个只有在 allocation/permission 阶段配置的 TURN 服务器知道的传输地址。如果我不得不猜测,我认为它与包含 XOR-PEER-ADDRESS.

的 SEND INDICATION 有关

if (local candidate == XOR-MAPPED-ADDRESS &&
    remote candidate == XOR-PEER-ADDRESS)
       pair is valid

这是正确的吗?

我认为有效的定义与响应的有效性脱钩。这可以通过验证消息完整性和匹配事务 ID 来检查。如果您得到的响应在这个意义上是有效的,那么您就构建了有效对。

现在...

This matches its local candidate, thus we are good here.

这与中继候选人的本地地址匹配。

For the remote candidate check:

您一直在通过 TURN 服务器发送 stun 消息,在发送指示中指定异或对等地址,并且还在响应的数据指示中接收异或对等地址。

另请参阅 https://datatracker.ietf.org/doc/html/rfc5245#section-7.1.3.2.2 了解完整详情。有点含糊,因为 TURN 是在别处指定的。