多重连接错误"在iOS10中发送BINDING_REQUEST失败"

rsw*_*ayz 11 network-programming mpc multipeer-connectivity ios9 ios10

我在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].
Run Code Online (Sandbox Code Playgroud)

任何投入将不胜感激!

Ton*_*ony 14

错误的原因和意义

NAT

为了解释错误的原因和含义,我们必须从NAT开始(如果您熟悉它,可以跳过这一部分).

NAT是一种为同一本地网络中的多个设备映射相同"全局"IP地址的方法,即多个设备共享相同的地址(可能在不同的时间,可能使用不同的端口 - NAPT),这样我们就可以节省很多'全球'地址,缓解了ipv4地址的耗尽.也正因为如此,设备的本地地址只能在局域网中使用,而不能在外部使用.想要发送到外部的数据报将通过NAT设备(总是路由器),它将把报头中的地址修改为全局地址.还有一点是不同LAN中的设备可能使用相同的IP地址.

                 |
                 | /------------  'Global'
          X1':x1'|/               Address
           +------------+         
           |    NAT     |
           +------------+
                 |
                 | /------------  Local
             X:x |/               Address
             +--------+
             |        |
             | Agent  |
             |        |
             +--------+
Run Code Online (Sandbox Code Playgroud)

现在,我们希望直接进行对等通信,因此我们必须知道对等方的地址.但正如我们所知,NAT的使用使设备的地址只是一个本地地址,无法在Internet外部使用,也无法使用它进行通信.ICE的目的是发现对等体应该使用哪个地址与其他对等体直接通信.

收集候选人地址

它收集候选人的第一阶段地址:

  • 其接口的地址
  • NAT公共端的翻译地址(SERVER REFLEXIVE CANDIDATES)
  • (可选):TURN服务器上的地址(继续使用的候选人)

为了获得公共端地址,设备将向公共服务器(称为STUN服务器,LAN外)发送"绑定请求",并将服务器发送回称为"绑定响应"的地址.

连通性检查

当设备具有其拥有的地址时,它们将通过信令信道发送给其他对等体.当peer(我们称之为'R')从我们的设备接收地址列表(我们称之为'L')时,R将收集自己的地址并响应自己的列表.在此过程结束时,它会导致候选对.要查看哪些对有效,每个代理都会使用"绑定请求"和"绑定响应"来安排一系列CHECKS.

L                        R
-                        -
STUN request ->             \  L's
          <- STUN response  /  check

           <- STUN request  \  R's
STUN response ->            /  check
Run Code Online (Sandbox Code Playgroud)

结论

总之,可能的原因还有更多细节:

  • 无法连接到STUN服务器;
  • 测试地址对时的正常失败;

建议:

  • 检查有关ICE阶段的信息,了解ios10与其他系统之间ICE实现的差异.
  • 这个帖子是关于mpc错误的一些讨论,这可能会激发你的灵感.

参考: