如何解决HTTP持久连接错误导致的超时问题?

an0*_*an0 7 nginx keep-alive nsurlconnection persistent-connection ios

我最近一直在努力解决HTTP超时问题.经过一个多月的调查,我很确定它是由错误的HTTP持久连接引起的.详情如下:

  1. 这是一个iOS应用程序.
  2. 大多数用户都在运行iOS 8.
  3. 我正在使用NSURLConnection.
  4. iOS 8有一个已知的keep alivebug,但我的是另一个问题.更具体地说,该错误导致NSURLErrorNetworkConnectionLost但我的错误是NSURLErrorTimedOut.但是,我不确定我的问题是否是由iOS 8的另一个错误引起的.
  5. 我的问题的行为:经过一段时间的使用 - 在成功发送一些HTTP请求并收到相应的响应之后 - 一个请求将导致NSURLErrorTimedOut,并且所有跟随(不是太远离最后一个请求重用持久连接)请求会导致NSURLErrorTimedOut.
  6. 一些工作解决方法:
    1. 杀死并重启应用.
    2. 在iPhone上关闭WiFi连接以强制使用3G/4G.
    3. 打开空气模式然后将其关闭.
  7. 我的分析:从行为来看,这个问题似乎是由一个糟糕的持久连接引起的.所有后续请求都继续使用此持久连接,因此全部失败NSURLErrorTimedOut.从解决方法中我们可以看到所有这些都有效,因为它们会导致丢弃坏的持久连接并创建新的持久连接.

我的问题:

  1. 还有其他人遇到过这个问题吗?
  2. 它是iOS 8的已知错误吗?
  3. 是否由服务器的一些非常规配置引起?我不控制服务器,但我知道他们使用的是nginx 1.6.1,他们的工程师正在和我一起调查这个问题.我应该要求他们提供哪些信息?
  4. 有没有办法强制NSURLConnection不重用当前的持久连接,而是创建一个新的连接,这样我可以在我的代码中检测到它之后解决这个问题?

更新:

我通过直接使用CFNetwork和控制Connection头文件成功地在iOS 8上缓解了这个问题.然而,在iOS 9上似乎问题变得更糟.

由于我希望Apple能够在iOS 9上修复它,我终于开了一个雷达:http://www.openradar.me/22770738.

如果你也遇到这个问题,请复制我的雷达,或者更好的是,如果你有一个更可靠的可重复样本,你可以发射你自己的雷达.

an0*_*an0 2

经过两周的研究,我可以给出问题3和4的答案:

  1. nginx服务器上的长连接超时设置为5s,应该不是原因。服务器工程师发现那些超时的请求实际上都被正常接收和响应。所以这更有可能是客户端问题。由于我有一个最小的可重现代码来排除我的代码作为原因,所以原因应该在 iOS 中。
  2. 我发现的唯一方法是使用CFNetwork. 更高级别的 API,例如NSURLConnectionorNSURLSessionConnection标头将被系统覆盖。