network-programming - iOS10 中的多点连接错误 "Send BINDING_REQUEST failed"

标签 network-programming ios9 ios10 multipeer-connectivity mpc

我在 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 的目的是发现对等点应使用哪个地址与其他对等点直接通信。
收集候选人地址
收集候选人地址的第一阶段:
  • 其接口(interface)地址
  • 在 NAT 的公共(public)端翻译地址(服务器反射候选)
  • (可选):TURN 服务器上的地址(中继候选人)

  • 为了获得公共(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
    
    结论
    因此,总而言之,在更多细节之前可能的原因:
  • 无法连接 STUN 服务器;
  • 测试地址对时正常失败;

  • 建议:
  • 查看有关 ICE 阶段的信息以了解 ICE 实现在 ios10 和其他版本之间的差异。
  • This thread是一些关于mpc的bug的讨论,可能对你有所启发。

  • 引用:
  • ICS RFC
  • NAT
  • 关于network-programming - iOS10 中的多点连接错误 "Send BINDING_REQUEST failed",我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41313951/

    相关文章:

    swift - ios中的导航栏高度增加和减少

    C unix 套接字编程 read() 问题

    python - 如何将字符串写入远程机器上的文件?

    ios - -canOpenURL : failed for URL: "testapp23://" - error: "(null)"

    ios - 传输安全已阻止明文 HTTP

    swift - Xcode 7 中的 UIStackView 和 UICollectionView 有什么区别?

    ios - 在 WKWebView 和 HTTPCookieStorage 之间复制 cookie - 找不到 302 cookie

    speech-recognition - iOS 10的语音识别限制

    ios - Objective-C:2个iPad之间的通信

    linux - 父级和预 fork 子级之间的文件描述符共享