iOS10中的多点连接错误"发送BINDING_REQUEST失败"

12
我在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].

非常感谢您的任何意见!

1个回答

16

错误的原因和意义

NAT

为了解释错误的原因和意义,我们需要从NAT开始(如果您对此熟悉,则可以跳过此部分)。

NAT是一种将相同的“全局”IP地址映射到同一本地网络中多个设备上的方法,即多个设备共享同一个地址(可能在不同的时间、可能使用不同的端口-- NAPT),通过这种方式,我们可以节省大量的“全局”地址并减轻ipv4地址的用尽。由于这个原因,设备的本地地址只能在局域网内使用,不能在外部使用。想要发送到外部的数据包将经过NAT设备(始终是路由器),该设备将修改标题中的地址为全局地址。还有一点是不同局域网中的设备可能使用相同的IP地址。

                 |
                 | /------------  'Global'
          X1':x1'|/               Address
           +------------+         
           |    NAT     |
           +------------+
                 |
                 | /------------  Local
             X:x |/               Address
             +--------+
             |        |
             | Agent  |
             |        |
             +--------+

ICE

现在,我们希望对等方能够直接通信,因此我们需要知道对等方的地址。但是正如我们所知道的,NAT的使用使得设备的地址仅是局部地址,无法在Internet外部使用并且无法使用它进行通信。 ICE的目的是发现对等方应该使用哪个地址与其他对等方直接通信。

收集候选地址

第一阶段是收集候选地址:

  • 其接口的地址
  • NAT公共端口转换后的地址(服务器反射候选者)
  • (可选):在TURN服务器上的地址(中继候选者)

为了获取公共端口地址,设备将向公共服务器(称为STUN服务器,位于LAN之外)发送“绑定请求”,服务器将返回称为“绑定响应”的地址。

连接检查

当设备拥有它们的地址时,它们将通过信令通道将地址列表发送给另一个对等方。 当对等方(我们称之为'R')从我们的设备(我们称之为'L')接收到地址列表时,R将收集自己的地址并响应自己的列表。 在此过程的结束时,会产生候选对。 为了查看哪些配对可以工作,每个代理都安排一系列检查,使用“绑定请求”和“绑定响应”。

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

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

结论

综上所述,在更详细的解释之前,可能的原因如下:

  • 无法连接到STUN服务器;
  • 测试地址对失败时的普通故障。

建议:

  • 查看ICE阶段的信息以了解iOS10和其他平台之间的ICE实现差异。
  • 该主题是有关mpc漏洞的一些讨论,可能会给您带来启发。

参考资料:


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接