假设我们有一个本地和远程候选人,如下所示:
本地候选人 - 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
尝试确定这是一次有效的连接检查时,它会根据其本地/远程候选对象检查响应。
对于本地候选人检查:
它查看 STUN 响应的 XOR-MAPPED-ADDRESS
,在本例中为 1.2.3.4 40000
。这是设备 B 看到消息的来源地址。这与其本地候选匹配,因此我们在这里很好。
对于远程候选人检查:
Device A
如何检查 remote candidate equals the destination address to which the request was sent.
?
据我所知,这是一个只有在分配/许可阶段配置的 TURN 服务器才知道的传输地址。如果我不得不猜测,我认为它与包含 XOR-PEER-ADDRESS
的 SEND INDICATION 有关。
即
if (local candidate == XOR-MAPPED-ADDRESS &&
remote candidate == XOR-PEER-ADDRESS)
pair is valid
这是正确的吗?
答案 0 :(得分:1)
我认为有效的定义与响应的有效性是分离的。这可以通过验证消息完整性和匹配交易 ID 来检查。如果你得到一个在这个意义上有效的响应,你就构造了有效的对。
现在...
<块引用>这与其本地候选匹配,因此我们在这里很好。
这与中继候选的本地地址相匹配。
<块引用>对于远程候选人检查:
您已经通过 TURN 服务器发送了 stun 消息,在发送指示中指定了一个 xor-peer-address,并且还在响应的数据指示中收到了一个 xor-peer-address。
另请参阅 https://datatracker.ietf.org/doc/html/rfc5245#section-7.1.3.2.2 以了解详细信息。由于 TURN 是在别处指定的,所以有点含糊。