ICE收集要连接的候选 IP/端口目标列表。每个对等点收集这些,然后每个对等点按顺序对每个候选者运行连接检查,直到检查通过或检查失败。
当 Alice 尝试连接到 Bob 时,她以某种方式获得了可能的方式列表 - 由 Bob 确定 - 她可以连接到 Bob。ICE 称这些候选人。Bob 可能会说,例如:“我的本地套接字的 192.168.1.1:1024/udp,我的外部 NAT 绑定(通过 STUN 找到)是 196.25.1.1:4454/udp,您可以在 1.2 调用媒体中继(中间盒) .3.4:6675/udp”。Bob 将其放入一个 SDP 数据包(对这些不同候选者的描述),并以某种方式将其发送给 Alice。(在 SIP 中,ICE 的原始用例中,SDP 承载在 SIP INVITE/200/ACK 交换中,建立 SIP 会话。)
ICE 是可插拔的,您可以配置候选人的精确性质/数量。您可以尝试直接链接,然后向STUN服务器请求绑定(这会在您的 NAT 中打一个洞,并告诉您该洞的外部 IP/端口,您将其放入会话描述中),然后返回要求TURN服务器中继您的数据。
ICE 的一个缺点是你的同行交换SDP描述,你可能喜欢也可能不喜欢。另一个是 TCP 支持仍处于草案形式,这对您来说可能是也可能不是问题。[更新:ICE 现在正式成为RFC 6544。 ]
游戏经常使用 UDP,因为旧数据没用。(这就是 RTP 通常在 UDP 上运行的原因。)一些 P2P 应用程序经常使用中间盒或中间盒网络。
IRC 使用中间盒网络:IRC 服务器形成网络,客户端连接到附近的服务器。从一个客户端到另一个客户端的消息可能会通过服务器网络传播。
如果做不到这一切,你可以看看 BitTorrent 的架构,看看他们是如何处理 NAT 问题的。正如 CodeShadow 在下面的评论中指出的那样,BitTorrent 依赖于网络中可访问的对等点:在某种意义上,一些对等点形成了中间盒网络。如果这些中间盒可以充当中继器,那么您将拥有类似 IRC 的架构,但它是动态设置的。