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

Ios 随机和偶发网络错误(NSURerrorDomain代码=-1001和NSURerrorDomain代码=-1005),ios,networking,ios7,ios8,nsurlsession,Ios,Networking,Ios7,Ios8,Nsurlsession,最近几天,我尝试调试d00m中的网络错误。我的想法/潜在客户开始告罄,我希望其他用户能够获得可能有用的宝贵经验。我希望能够提供所有相关信息,但我个人无法控制服务器环境 整个过程始于用户注意到我们应用程序中的几个“网络错误”。错误似乎是随机发生的,没有任何与互联网连接、iOS版本或后端更新相关的明显模式。在幕后发生的两个错误是: Error Domain=nsurerrordomain code=-1001“请求超时。” 更频繁地: Error Domain=kCFErrorDomainCFNet

最近几天,我尝试调试d00m中的网络错误。我的想法/潜在客户开始告罄,我希望其他用户能够获得可能有用的宝贵经验。我希望能够提供所有相关信息,但我个人无法控制服务器环境

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

Error Domain=nsurerrordomain code=-1001“请求超时。”

更频繁地:

Error Domain=kCFErrorDomainCFNetwork code=-1005“网络连接丢失。

在调试了几天之后,我通过在每个请求之间(设置为1-20秒)使用随机睡眠计时器向后端发出大约10个随机(GET和POST)请求,成功地重现了这些错误(随机发生)。但是,它只在周期内发生。在过去几天中,我经历的是“错误期”开始时,我每运行代码一到两次就会收到两个错误中的一个(表示错误率为1/10或1/20请求)。此错误率持续几个小时,然后错误消失几个小时,然后重新开始

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

  • 发生在设备和模拟器上
  • 发生在iOS 8.4和iOS 7.1上-尽管我在测试中使用的主要版本是8.4
  • 我们对网络请求使用
    NSURLSession
    。我们还提供了AFNetworking(更新至最新版本),但我们仅将安全部分用于SSL固定。即使SSL固定完全关闭,错误仍然会发生
在过去几天里,我写下了一些发现:

  • 这似乎只发生在我们的生产环境中,生产环境与登台环境有一些不同的配置。这使我认为这可能与所讨论的
    keep alive
    错误有关。但是,我们的运营部门已经建立了一个新的登台环境,发送与登台环境相同的
    keep alive
    标题生产环境,但这不会导致在临时环境中发生错误
  • 我们的Android版应用程序无法使用相同的请求设置重现错误。此外,我们还没有收到任何关于Android应用程序中“网络错误”的客户问题
我的直觉告诉我,这与服务器环境和iOS中的HTTP实现有关。然而,我无法找到一个令人信服的模式来证明任何事情。我使用一个简单的Rails脚本进行了相同的设置,下一个“错误期”是什么时候“如果发生这种情况,我将准备尝试在iOS之外复制它。发生这种情况时,我将更新问题

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


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

根据我的经验,这些问题通常会导致大量数据包丢失,尤其是在蜂窝网络上,在蜂窝网络中,多径干扰和其他问题的微小变化可能会影响可靠传输的流量和不可靠传输的流量

另一种可能是NAT实现质量差,服务器的超时时间间隔长到足以导致NAT放弃TCP连接,这种情况不太可能发生

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


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

好吧,我花了很多时间研究类似的问题

1005可能是由已知的iOS错误引起的,并且有几个修复程序。例如,添加标题 值为“关闭”的“连接”。

1001是一个不同的故事。在我的例子中,问题是服务器上奇怪(坏?)的防火墙。当短时间内有很多(不是那么多)请求时,它禁止了该设备

我相信如果你面临类似的问题,你可以做简单的测试

  • 在循环中发送大量(取决于防火墙设置)请求(比如1秒内发送50个)
  • 关闭/杀死应用程序(这将关闭与服务器的连接)
  • (可选)等待一段时间(比如说60秒)
  • 再次启动应用程序并尝试发送请求
  • 如果您现在有了所有下一个请求的超时时间,那么您可能也有同样的问题,您应该和几个人谈谈


    PS:若你们并没有访问服务器的权限,你们可以给用户提供信息,让他重启设备上的wifi,退出超时循环。在某些情况下,这可能是最后的手段。

    你在使用WebSocket吗?没有基本的
    NSURLSession
    NSURLSessionDataTask
    hi Steffen,你解决了这个问题吗?@NadaGamal不,很遗憾没有。谢谢你的建议-如果这最终解决了这个谜团,我一定会调查这个问题并与你联系。