我阅读了rfc6577和rfc8445,但我觉得如何使用 can can can 在如何使用之间有点脱节实际上使用relay candidates
。
转弯RFC描述了一个转弯服务器在客户端和对等方之间的渡轮数据。转向服务器上的transport address
通过转向消息接受来自客户端的数据流,而relayed transport address
通过UDP接受来自PEER的数据流。这听起来很棒 - 一个转弯服务器和双向数据流。
但是,在阅读有关冰的文章时,我觉得这从来没有发生过。呼叫者和Callee都可以独立于两个转动服务器分配,然后将其各自的relayed transport addresses
彼此发送。更像是I can be reached via this relayed transport address
的东西。然后发生连接性检查,因此,两个转弯服务器最终在此处被使用,其中数据仅在每个参与者分配的转向服务器的relayed transport address
方向上流动。
这是真的吗?
从转向RFC开始,它说以下内容:
客户端可以安排服务器转速数据包与某些其他主机(称为同行),可以控制继电器完成了。客户通过获得IP地址和服务器上的端口,称为继电器传输地址。当同伴时将数据包发送到继电器传输地址,服务器中继数据包给客户。客户将数据包发送到服务器,服务器使用继电器将其传递到适当的对等运输地址作为来源。
但是,我看不到一个方案,通过冰谈判,数据将永远流过从客户到同行的传输地址。呼叫者和Callee都在转弯服务器上独立分配,并将relayed transport addresses
彼此发送到以访问。
基本上,turn can can do双向数据流,但是在两个对称nat之间进行冰,它 wont wont 。这是正确的吗?
它有点复杂。仅读取回合RFC还不够,您也需要RFC 5245的上下文。
以下方案是基线情况:
- 客户a分配继电器地址8.8.8.8:43739,将其发送给客户b
- 客户b将UDP数据包发送到8.8.8.8:43739
- 转动服务器将数据包包裹在昏迷消息中,将其发送给客户端
现在,正如您所说,通常客户B还将分配自己的继电器地址并将其发送给A。为什么不始终使用(或一半的时间)?毕竟,候选人的优先级是相等的。但是,确定选择哪个对的候选人对优先级包括一个被用作打决的因素:
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.
这意味着使用呼叫者(假设其控制代理)继电器地址的对对callees继电器地址的优先级更高。
此外,游戏中还有另一个候选人,用于端口客户端B用于发送到端口8.8.8.8:43739。这通常是来自本地候选人之一,转弯服务器看到(并将其放入数据指示)客户端B的公众(nat)IP。比中继候选人具有更高的优先级,因此将被使用。
现在,如果B位于对称的NAT(i Think )后面,则转向服务器将看到与客户端B不同的端口,与客户A添加了许可的任何内容。这通常意味着转弯服务器将删除数据包,而该对将无法正常工作。
如果客户端A不在对称NAT后面,则基线过程将在另一个方向上重复。优先级稍小,但在延迟方面相同,因此用户不会注意到。
如果两个客户端都是(现在我们终于在您要问的情况下)是对称NAT的背后,则将使用,并且将使用一个中继 - 列表对。这是相当罕见的(< 1%),即使两个客户都在不同的转弯服务器上,潜伏期的影响通常都微不足道。