iOS和Go - 使用NSURLSession保持活跃

hun*_*ley 10 web-services http go ios nsurlsession

在我的iOS应用程序中,我有一个搜索功能,可以从服务器获取结果.当用户更新其查询时,搜索更新会立即生效,因此会导致连续发出多个请求.

所以我的问题是,如何确保在这些连接上使用TCP keep-alive?我希望减少尽可能多的延迟,因此在第一个请求之后保持连接并重新用于以下请求非常重要.

我正在使用NSURLSession,我听说它默认使用keep-alive,但我怎么知道呢?在服务器上记录请求显示每个连续请求之间没有区别,但我不希望从头信息中看到任何更改.

这里有什么帮助?我在我的服务器上使用Go,因此它可能需要在该方面进行一些额外的配置.

Rob*_*ier 8

我相信你会混淆TCP keep-alive和HTTP keep-alive(持久连接).这些是不相关的概念.从您的问题来看,您可能意味着HTTP持久连接.

在HTTP/1.1中,持久连接是默认连接NSURLSession,几乎每个HTTP/1.1客户端都使用它.你必须要求关掉它们.您可以Connection: close在HTTP标头中检查,或者在服务器端,您可以检查该Close字段http.Request.但我相信你会得到持久的联系.这意味着您不必为每个请求重新协商TLS隧道(或至少TCP TCP三次握手).(虽然如果你发出并行请求,你仍然需要协商多个连接.HTTP/1.1一次只能处理一件事,并NSURLSession会尝试使用连接池来缩短响应时间.)

TCP保持活动是完全不同的事情.它会向另一方发送定期"ping"以确保它仍然可以访问.您可以通过多种方式丢失网络连接,直到下次尝试通信时才知道它,正常的症状是连接只是挂起而您需要将其计时.从理论上讲,TCP keep-alive只是发现这一点的工具,但我几乎从未发现它是实用的.很难正确配置(特别是在Cocoa中).您几乎总是需要为您的应用程序构建更高级别的"ping"功能,而不是依赖于此.

但是为了解决你的问题,HTTP/1.1可能对你来说很好,但是你需要仔细管理你的响应.如果你对每个字母提出新请求并发回大量回复,那么这将会很糟糕.您将保持所有连接池忙于下载您将要丢弃的内容.您需要首先关注好的算法.至少,您可能只希望一次发送一些结果,并在API中提供"分页"方法,以便为同一搜索请求更多结果.


Hea*_*ers 7

要确定TCP正在做什么,您可以启用CFNETWORK_DIAGNOSTICS.来自文档:

在正常开发期间,您可以通过Xcode的方案编辑器设置此环境变量.如果您需要调查Xcode之外的问题,可以使用清单1中所示的代码以编程方式设置它.

清单1以编程方式启用CFNetwork诊断日志记录

setenv("CFNETWORK_DIAGNOSTICS", "3", 1);
Run Code Online (Sandbox Code Playgroud)

您应该在应用程序启动序列的开头执行此操作.通常把它放在main的开头就足够了,但如果你有使用CFNetwork的C++静态初始化器,你必须先在它们之前运行它.

当您第一次使用CFNetwork或任何使用CFNetwork的框架(如Foundation)时,CFNetwork诊断日志记录将启动,此时它将打印如清单2所示的消息.

清单2 CFNetwork诊断日志记录启动消息的示例

2014-10-28 14:23:37.115 QTestbed[2626:60b] CFNetwork diagnostics log file created at: /private/var/mobile/Applications/76531F40-3291-4565-8C75-0438052C83BC/Library/Logs/CrashReporter/CFNetwork_com.example.apple-samplecode.QTestbed_2626.nwlrb
Run Code Online (Sandbox Code Playgroud)