76

我新写了一个简单的聊天应用程序,但我并没有真正了解 ICE Candidates 的背景。

当对等体创建连接时,他们会获得 ICE 候选者,然后交换它们并将它们最终设置为对等体连接。

所以我的问题是,ICE 候选人来自哪里,他们是如何使用的,他们都真的被使用了吗?

我注意到我的同事在他的机器上执行应用程序时获得的候选人较少,这可能是不同数量的候选人的原因?

4

3 回答 3

103

@Ichigo 的答案是正确的,但它有点大。每个 ICE 都包含您网络的“一个节点”,直到它到达外部。通过这种方式,您将这些 ICE 发送给其他对等方,因此他们知道他们可以通过哪些连接点到达您。将其视为一座大型建筑物:一个人在建筑物内,需要告诉另一个人(不熟悉的人)如何穿过它。同样在这里,如果我有很多网络设备,传入连接需要以某种方式找到连接我的计算机的正确方式。通过提供所有节点,RTC 连接自己找到最短路径。因此,当您连接到您旁边的计算机时,它连接到同一个路由器/交换机/其他任何东西,它使用所有 ICE 并确定最短的,那就是直接通过那个点。您的同事获得的 ICE 候选人较少与它必须通过的设备数量有关。请注意,您计算机中的每个网络适配器都有一个 IP 地址(我有一个来自 hyper-v 的 vEthernet 交换机),它也会为它创建一个 ICE。

于 2014-01-14T00:12:42.963 回答
90

ICE代表交互式连接建立,它是一种用于 NAT(网络地址转换器)的技术,用于establishing communication for VOIP, peer-peer, instant-messaging, and other kind of interactive media.

通常,ice Candidate 会提供有关将要交换数据的 ipaddress 和端口的信息。

它的格式如下

a=候选:1 1 UDP 2130706431 192.168.1.102 1816类型主机

这里UDP指定要使用的协议,typ host指定候选冰的类型,主机表示候选是在防火墙内生成的。如果您用于wireshark监控流量,那么您可以看到用于数据传输的端口与 ice-candidates 中的端口相同。

另一种类型是relay,表示当要在防火墙外进行通信时可以使用此候选。

根据您使用的浏览器,它可能包含更多信息。很多时候我看到浏览器生成了 8-12 个冰候选。

于 2014-01-12T04:54:58.550 回答
3

Ichigo有一个很好的答案,但没有强调如何使用每个候选人。我认为MarijnS95的回答是完全错误的:

每个 ICE 都包含您网络的“一个节点”,直到它到达外部

通过提供所有节点,RTC 连接自己找到最短路径。

首先,他的意思是 ICE 候选人,但那部分很好。也许我误解了他,但通过说“直到它到达外面”,他让客户(发起方)看起来像是洋葱的最内层,并建议 ICE 候选人帮助你剥层直到你到达“互联网”,在那里可以到达响应的对等方,也许剥另一个洋葱来到达它。这不是真的。如果发起节点未能通过传输地址到达响应节点,它会丢弃该候选者并尝试不同的候选者。它不会在候选中的任何位置存储任何节点。ICE 候选者是在与响应对等方进行任何通信之前生成的。冰候选人不能帮助您剥掉众所周知的 NAT 洋葱。同样关于我从他的回答中引用的第二条引述,他认为 ICE 似乎用于最短路径算法,其中 ICE RFC 中根本没有出现“最短”。


来自RFC8445术语列表:

ICE 允许代理发现有关其拓扑的足够信息,以潜在地找到一条或多条路径,通过这些路径它们可以建立数据会话。

ICE 的目的是发现哪些地址对有效。ICE 这样做的方法是系统地尝试所有可能的配对(以仔细排序的顺序),直到找到一个或多个有效的配对。

候选人,候选人信息:作为接收数据的潜在联系点的传输地址。候选人也有属性——他们的类型(服务器自反、中继或主机)、优先级、基础和基础。

传输地址: IP 地址和传输协议(如 UDP 或 TCP)端口的组合。


所以你有它,(ICE)候选人被定义(一个IP地址和端口可能是一个接收数据的地址,这可能不起作用),并且解释了选择过程(第一个有效的传输地址对)。请注意,它不是节点或洋葱皮的列表。

由于“收集候选人”的过程,不同的用户可能有不同的ICE候选人。候选有不同的类型,有些是从本地界面获取的。如果您的设备上有一个额外的虚拟接口,那么将生成一个额外的 ICE(我没有测试这个!)。如果您想知道 ICE 候选人是如何“聚集”的,请阅读2.1。召集候选人


我希望打破洋葱神话没有让你哭泣。不要冰你的洋葱。把它们切块

于 2020-09-05T21:52:01.300 回答