随机和偶然的网络错误(NSURLErrorDomain 代码=-1001 和 NSURLErrorDomain 代码=-1005)

Random and occasional network error (NSURLErrorDomain Code=-1001 and NSURLErrorDomain Code=-1005)

最近几天我尝试从 d00m 调试网络错误。我开始 运行 out of ideas/leads 我希望其他 SO 用户拥有可能有用的宝贵经验。我希望能够提供所有相关信息,但我个人无法控制服务器环境。

用户在我们的应用程序中注意到几个 "network errors" 就开始了整个事情。该错误似乎是随机发生的,没有任何与互联网连接、iOS 版本或后端更新相关的明显模式。幕后发生的两个错误是:

Error Domain=NSURLErrorDomain Code=-1001 "The request timed out."

更频繁:

Error Domain=kCFErrorDomainCFNetwork Code=-1005 "The network connection was lost.

在调试了几天之后,我成功地通过触发大约 1 次来重现这些错误(随机发生)。向我们的后端发出 10 个随机(GET 和 POST)请求,每个请求之间有一个随机睡眠计时器(设置为 1-20 秒)。但是,它只发生在期间。我最近几天经历的是,当 "period of error" 开始时,我每隔一两次就会收到两个错误之一 运行 代码(意味着错误率为 1/10 或1/20 请求)。这个错误率持续几个小时,然后错误消失几个小时,然后又重新开始。

关于设置的一些小知识:

最近几天我写下的一些发现:

我的直觉说这与iOS中的服务器环境和HTTP实现有关。然而,我无法找到一个可以证明任何事情的令人信服的模式。我已经使用一个简单的 Rails 脚本进行了相同的设置,当下一个 "error period" 发生时,我将准备好尝试在 iOS 之外重现它。发生这种情况时我会更新问题。

我不是在寻找涉及重置 wifi 设置、关闭模拟器或类似内容的解决方案,因为我不认为这在生产环境中是可行的解决方案。我也考虑过 GitHub 问题中提到的 retry-loop-fix,但我认为这是最后的手段。

如果您需要更多信息,请告诉我。

根据我的经验,此类问题通常指向大量数据包丢失,尤其是在蜂窝网络中,多路径干扰和其他问题的微小变化可能会导致流量是否可靠通过。

我想到的另一种可能性是 NAT 实施质量低下,万一您的服务器的超时间隔太长,导致 NAT 放弃 TCP 连接,这种情况不太可能发生。

无论哪种方式,唯一可以确定发生了什么的方法是进行数据包跟踪。为此,请通过有线连接将 Mac 连接到互联网,通过 Wi-Fi 启用网络共享,然后将 iOS 设备连接到该 Wi-Fi 网络。然后 运行 Wireshark 并告诉它监视网桥接口。此处说明:

http://www.howtogeek.com/104278/how-to-use-wireshark-to-capture-filter-and-inspect-packets/

从那里,您应该能够准确地看到发送的内容和时间。这可能对理解失败的原因大有帮助。

好的,我在调查类似问题上浪费了很多时间。

1005 可能是由已知的 iOS 错误引起的,并且有几个修复程序。例如添加 header "Connection" 的值为 "close"。 More info

1001 是另一回事。就我而言,问题是服务器上的防火墙很奇怪(坏?)。当短时间内有很多(不是那么多)请求时,它正在禁止设备。

如果您遇到类似问题,我相信您可以轻松进行测试。

  1. 循环发送大量(取决于防火墙设置)请求(假设 1 秒内发送 50 个)。
  2. Close/Kill 应用程序(这将关闭与服务器的连接)
  3. (可选)稍等片刻(比如说 60 秒)
  4. 再次启动应用并尝试发送请求

如果您现在所有下一个请求都超时,您可能遇到了同样的问题,您应该与服务器人员交谈。

PS:如果您无法访问服务器,您可以向用户提供信息,告知他应该在设备上重启 wifi 以退出超时循环。在某些情况下,这可能是最后的手段。