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

问题描述 投票:14回答:2

最近几天,我尝试从d00m调试网络错误。我已经开始用尽所有想法/线索,我希望其他SO用户拥有可能有用的宝贵经验。我希望能够提供所有相关信息,但是我个人并不能控制服务器环境。

整个过程始于用户注意到我们应用中的几个“网络错误”。该错误似乎是随机发生的,没有与互联网连接,iOS版本或后端更新有关的任何明显模式。发生在幕后的两个错误是:

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

并且更频繁地:

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

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

有关设置的一些事实:

  • 在设备和模拟器上发生
  • 在iOS 8.4和iOS 7.1上发生-尽管v.8.4是我用于测试的主要版本。
  • 我们将NSURLSession用于我们的网络请求。我们还包括了AFNetworking(已更新到最新版本),但是我们仅将安全部分用于SSL固定。即使完全禁用SSL固定,仍然会发生错误。

[过去几天我写下的一些发现:

  • 这似乎仅在我们的生产环境中发生,该生产环境与暂存环境具有一些不同的配置。这使我认为它可能与keep-alivehere中讨论的here错误有关。但是,我们的运维部门已经建立了一个新的登台环境,发送与生产环境相同的keep-alive标头,但这并未使登台环境发生错误。
  • 我们的Android版本的应用无法使用相同的请求设置来重现该错误。此外,我们尚未在Android应用中收到任何有关“网络错误”的客户问题。

我的直觉是,这与服务器环境和iOS中的HTTP实现有关。但是,我无法找到令人信服的模式来证明一切。我已经使用一个简单的Rails脚本进行了相同的设置,并且当下一个“错误时段”出现时,我准备尝试在iOS环境之外进行再现。发生这种情况时,我将更新问题。

我不是在寻找涉及重置wifi设置,关闭模拟器或类似方法的解决方案,因为我认为这在生产环境中不可行。我也考虑过按GitHub问题所述进行retry-loop-fix,但我认为这是不得已的方法。

请让我知道是否需要更多信息。

ios networking ios7 ios8 nsurlsession
2个回答
2
投票

根据我的经验,这类问题通常会导致大量数据包丢失,尤其是在蜂窝网络上,在这种情况下,多径干扰和其他问题的细微变化可能会在可靠地通过与否之间产生区别。

另一个想到的可能是劣质的NAT实现,在不太可能的情况下,服务器的超时间隔足够长,以致NAT不能通过TCP连接放弃。

两种方法中,唯一可以确定是怎么回事的方法就是进行数据包跟踪。为此,请通过有线连接将Mac连接到Internet,启用通过Wi-Fi的网络共享,然后将iOS设备连接到该Wi-Fi网络。然后运行Wireshark并告诉它监视网桥接口。说明在这里:

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

从那里,您应该能够准确看到正在发送的内容和时间。这对于理解失败的原因可能有很长的路要走。


0
投票

好吧,我浪费了很多时间研究类似问题。

1005可能是由已知的iOS错误引起的,并且进行了一些修复。例如添加标题“连接”的值为“关闭”。More info

1001是一个不同的故事。就我而言,问题是服务器上的防火墙很奇怪(不好?)。在短时间内有很多(不是很多)请求时,它是禁止设备。

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

  1. 循环发送大量(取决于防火墙设置)请求(假设1秒内发送50个请求。)>]
  2. 关闭/杀死应用程序(这将关闭与服务器的连接)
  3. (可选)请稍等(例如60秒)
  4. 再次启动应用程序,然后尝试发送请求
  5. 如果现在所有下一个请求都超时,则可能有相同的问题,应该与服务器管理员交谈。

PS:如果您无权访问服务器,则可以为用户提供以下信息,他应该在设备上重新启动wifi以退出该超时循环。在某些情况下,这可能是最后一次重犯。

© www.soinside.com 2019 - 2024. All rights reserved.