我在 iOS 10 中的 MPC 应用程序中看到以下错误,我正在寻求一些帮助来解释它们。对等点连接后,会弹出以下几个错误。对等点最终连接,但它比 iOS 9 慢(似乎导致错误消息的事件发生在主线程上)。在 iOS < 10 上运行时,这些错误不会出现在应用程序中。
[ViceroyTrace] [ICE][ERROR] Send BINDING_REQUEST failed(C01A0041).
Not in connected state, so giving up for participant [47CD8292] on channel [0].
任何投入将不胜感激!
最佳答案
the reason and meaning of the error
NAT
为了解释错误的原因和意义,我们先从NAT说起(熟悉的可以跳过这部分)。
NAT 是一种为同一本地网络中的多个设备映射相同的“全局”IP 地址的方法,即多个设备共享相同的地址(可能在不同的时间,可能使用不同的端口 - NAPT),我们可以通过这种方式保存大量的“全局”地址和缓解 ipv4 地址的耗尽。也正因为如此,设备的本地地址只能在局域网内使用,不能在外面使用。要发送到外部的数据报将通过 NAT 设备(始终是路由器),该设备会将 header 中的地址修改为全局地址。还有一点是不同 LAN 中的设备可能使用相同的 IP 地址。
|
| /------------ 'Global'
X1':x1'|/ Address
+------------+
| NAT |
+------------+
|
| /------------ Local
X:x |/ Address
+--------+
| |
| Agent |
| |
+--------+
冰现在,我们想让对等点直接通信,所以我们必须知道对等点的地址。但是我们知道,NAT的使用使得设备的地址只是一个本地地址,不能在Internet之外使用,并且无法使用它进行通信。
ICE 的目的是发现对等点应使用哪个地址与其他对等点直接通信。
收集候选人地址
收集候选人地址的第一阶段:
为了获得公共(public)端地址,设备将向公共(public)服务器(称为 STUN 服务器,在 LAN 外部)发送“绑定(bind)请求”,服务器将返回称为“绑定(bind)响应”的地址。
连接检查
当设备拥有它们拥有的地址时,它们将通过信令 channel 发送给其他对等方。当对等点(我们称之为“R”)从我们的设备(我们称之为“L”)接收到地址列表时,R 将收集自己的地址并响应自己的列表。在此过程结束时,结果为 候选人对 .
要查看哪些对有效,每个代理都会安排一系列带有“绑定(bind)请求”和“绑定(bind)响应”的 CHECKS。
L R
- -
STUN request -> \ L's
<- STUN response / check
<- STUN request \ R's
STUN response -> / check
结论因此,总而言之,在更多细节之前可能的原因:
建议:
引用:
关于network-programming - iOS10 中的多点连接错误 "Send BINDING_REQUEST failed",我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41313951/