随机和偶然的网络错误(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 8.4 和 iOS 7.1 - 尽管 v. 8.4 是我用于测试的主要版本。
- 我们使用
NSURLSession
进行网络请求。我们还包含 AFNetworking(已更新到最新版本),但我们仅将安全部分用于 SSL Pinning。即使完全关闭 SSL 固定,错误仍然存在。
最近几天我写下的一些发现:
- 这似乎只发生在我们的生产环境中,它与我们的暂存环境有一些不同的配置。这让我认为它可能与 here and here 所讨论的
keep-alive
错误有关。然而,我们的运营部门已经设置了一个新的登台环境,发送与生产环境相同的 keep-alive
header,但这并没有使登台环境发生错误。
- 我们的 Android 版本的应用无法使用相同的请求设置重现错误。此外,我们还没有在 Android 应用中收到关于 "network errors" 的任何客户问题。
我的直觉说这与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 秒内发送 50 个)。
- Close/Kill 应用程序(这将关闭与服务器的连接)
- (可选)稍等片刻(比如说 60 秒)
- 再次启动应用并尝试发送请求
如果您现在所有下一个请求都超时,您可能遇到了同样的问题,您应该与服务器人员交谈。
PS:如果您无法访问服务器,您可以向用户提供信息,告知他应该在设备上重启 wifi 以退出超时循环。在某些情况下,这可能是最后的手段。
最近几天我尝试从 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 8.4 和 iOS 7.1 - 尽管 v. 8.4 是我用于测试的主要版本。
- 我们使用
NSURLSession
进行网络请求。我们还包含 AFNetworking(已更新到最新版本),但我们仅将安全部分用于 SSL Pinning。即使完全关闭 SSL 固定,错误仍然存在。
最近几天我写下的一些发现:
- 这似乎只发生在我们的生产环境中,它与我们的暂存环境有一些不同的配置。这让我认为它可能与 here and here 所讨论的
keep-alive
错误有关。然而,我们的运营部门已经设置了一个新的登台环境,发送与生产环境相同的keep-alive
header,但这并没有使登台环境发生错误。 - 我们的 Android 版本的应用无法使用相同的请求设置重现错误。此外,我们还没有在 Android 应用中收到关于 "network errors" 的任何客户问题。
我的直觉说这与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 秒内发送 50 个)。
- Close/Kill 应用程序(这将关闭与服务器的连接)
- (可选)稍等片刻(比如说 60 秒)
- 再次启动应用并尝试发送请求
如果您现在所有下一个请求都超时,您可能遇到了同样的问题,您应该与服务器人员交谈。
PS:如果您无法访问服务器,您可以向用户提供信息,告知他应该在设备上重启 wifi 以退出超时循环。在某些情况下,这可能是最后的手段。