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

时间:2015-09-10 12:15:01

标签: ios networking ios7 ios8 nsurlsession

过去几天我试图从d00m调试网络错误。我开始缺乏想法/潜在客户,我希望其他SO用户拥有可能有用的宝贵经验。我希望能够提供所有相关信息,但我个人并不能控制服务器环境。

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

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

且更频繁地:

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

经过几天的调试后,我设法通过触发大约重现这些错误(随机发生)。向我们的后端发出10个随机(GET和POST)请求,每个请求之间有一个随机睡眠定时器(设置为1-20秒)。但是,它只发生在一些时期。我过去几天所经历的是,当一个错误的时期"开始,我每运行一次或两次错误就会得到一个错误(意味着错误率为1/10或1/20请求)。此错误率持续几个小时,然后错误消失了几个小时,然后它开始全部结束。

有关设置的一些快速事实:

  • 发生在设备和模拟器上
  • 发生在iOS 8.4和iOS 7.1上 - 虽然v.8.4是我用来测试的主要版本。
  • 我们将NSURLSession用于我们的网络请求。我们还包含AFNetworking(更新到最新版本),但我们只使用安全部分进行SSL固定。即使SSL钉扎完全关闭,错误仍然会发生。

我在过去几天写下了一些调查结果:

  • 似乎只发生在我们的生产环境中,它们具有与我们的暂存环境不同的配置。这让我认为它可能与herehere讨论的keep-alive错误有关。但是,我们的操作部门已经设置了一个新的临时环境,它发送与生产环境相同的keep-alive标头,但这并没有在登台环境中发生错误。
  • 我们的Android版应用无法使用相同的请求设置重现错误。此外,我们还没有收到有关网络错误的任何客户问题"在Android应用中。

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

我没有寻找涉及重置wifi设置,关闭模拟器或类似设备的解决方案,因为我认为这不是生产环境中可行的解决方案。我也考虑过在GitHub问题中提到的重试循环修复,但我认为这是最后的手段。

如果您需要更多信息,请与我们联系。

2 个答案:

答案 0 :(得分: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/

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

答案 1 :(得分:0)

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

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

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

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

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

如果现在所有下一个请求都超时,则可能是您遇到了同样的问题,应该与严重的人讨论。

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