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

Ste*_*mer 14 networking ios ios7 nsurlsession ios8

最近几天我试图从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钉扎完全关闭,错误仍然会发生.

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

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

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

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

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

dga*_*ood 2

根据我的经验,这类问题通常会导致大量数据包丢失,特别是在蜂窝网络上,多路径干扰和其他问题的微小变化都可能导致流量可靠与否的差异。

我想到的另一种可能性是低质量的 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/

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