我新编写了一个简单的聊天应用程序,但我并不真正了解ICE候选人的背景。
当对等方创建连接时,他们将获得ICE候选者,并交换它们并将其最终设置为对等方连接。
所以我的问题是,ICE候选人来自何处,如何使用它们?
我注意到我的同事在自己的计算机上执行应用程序时,候选人数量减少了,这是为什么候选人数量不同的原因?
我新编写了一个简单的聊天应用程序,但我并不真正了解ICE候选人的背景。
当对等方创建连接时,他们将获得ICE候选者,并交换它们并将其最终设置为对等方连接。
所以我的问题是,ICE候选人来自何处,如何使用它们?
我注意到我的同事在自己的计算机上执行应用程序时,候选人数量减少了,这是为什么候选人数量不同的原因?
Answers:
@Ichigo的答案是正确的,但要大得多。每个ICE都包含您网络的“节点”,直到到达外部为止。通过这种方式,您可以将这些ICE发送给其他对等方,以便他们知道可以通过哪些连接点到达您。将其视为一栋大建筑物:一个在建筑物中,需要告诉另一个(不熟悉的人)如何穿过建筑物。同样在这里,如果我有很多网络设备,则传入连接需要以某种方式找到通往计算机的正确方法。通过提供所有节点,RTC连接本身会找到最短的路由。因此,当您连接到旁边的计算机(连接到同一路由器/交换机/任何设备)时,它将使用所有ICE并确定最短的计算机,而这恰好就是通过该点。您的同事获得的ICE候选人减少与它必须通过的设备数量有关。请注意,计算机内部的每个具有IP地址的网络适配器(我有来自hyper-v的vEthernet交换机),它也会为其创建一个ICE。
ICE
是协议的缩写,您发送的是ICE candidates
。
ICE代表“交互式连接建立”,它是NAT(网络地址转换器)中使用的一种技术establishing communication for VOIP, peer-peer, instant-messaging, and other kind of interactive media.
通常,ice候选人提供有关将要交换数据的ip地址和端口的信息。
它的格式如下
a =候选:1 1 UDP 2130706431 192.168.1.102 1816 typ host
这里UDP
指定要使用的协议,typ host
指定冰候选类型,主机表示候选对象是在防火墙内生成的。如果wireshark
用于监视流量,则可以看到用于数据传输的端口与冰候选人中存在的端口相同。
另一种类型是relay
,表示在防火墙外进行通信时可以使用此候选对象。
根据您使用的浏览器,它可能包含更多信息。很多时候,我已经看到8-12个冰候选人是由浏览器生成的。
Ichigo有一个很好的答案,但是没有强调每个候选人的使用方式。我认为MarijnS95的答案是完全错误的:
每个ICE都包含您网络的“节点”,直到到达外部为止
通过提供所有节点,RTC连接本身会找到最短的路由。
首先,他指的是ICE候选人,但是那部分还不错。也许我是在误解他,但是他说“直到它到达外面”,他才使客户(发起交易的同伴)看起来像是洋葱的最内层,并建议ICE候选人帮助您剥开洋葱皮。直到您到达“互联网”为止,在这里可以到达做出响应的对等方,或者剥去另一只洋葱也可以。这不是真的。如果启动对等方无法通过传输地址到达响应对等方,则它将丢弃该候选方,并将尝试其他候选方。它不会在候选位置中的任何位置存储任何节点。ICE候选者在与响应对等方进行任何通信之前生成。候选冰块不会帮助您剥落众所周知的NAT洋葱。关于我从他的答案中得到的第二个引号,他使ICE似乎在最短路径算法中使用,其中ICE RFC中根本没有出现“最短”算法。
从RFC8445术语表中:
ICE使代理能够发现有关其拓扑的足够信息,从而有可能找到一条或多条路径来建立数据会话。
ICE的目的是发现可以使用的地址对。ICE进行此操作的方法是系统地尝试所有可能的对(以仔细排序的顺序),直到找到一个或多个可行的对为止。
候选人,候选人信息:一种运输地址,是接收数据的潜在联系点。候选者还具有属性-它们的类型(服务器自反,中继或主机),优先级,基础和基础。
传输地址: IP地址和传输协议(例如UDP或TCP)端口的组合。
因此,有了它,就定义了(ICE)候选对象(可能是可能接收数据的IP地址和端口,这可能不起作用),并说明了选择过程(第一个有效的传输地址对))。注意,它不是节点或洋葱皮的列表。
由于“收集候选者”的过程,不同的用户可能具有不同的冰候选者。有不同类型的候选,有些是从本地接口获得的。如果您的设备上有一个额外的虚拟接口,则会生成一个额外的ICE(我没有对此进行测试!)。如果您想知道如何“收集” ICE候选人,请阅读2.1。收集候选人
我希望切开洋葱神话不会让你哭泣。不要冰洋葱。切成小方块。