iOS和Go - 使用NSURLSession保持连接

11
在我的iOS应用中,我有一个搜索功能,可以从服务器获取结果。随着用户查询的更新,搜索实时更新,因此会产生连续几个请求。那么我的问题是,如何确保这些连接使用TCP keep-alive?我想尽可能地减少延迟,因此在第一次请求之后维护连接并在以下请求中重复使用很重要。我正在使用NSURLSession,并且听说它默认使用keep-alive。但是我怎么确认呢?记录在服务器上的请求显示每个连续的请求没有任何区别,但我不希望仅从标头信息中就看不到任何差异。有任何帮助吗?我在服务器端使用Go,所以可能需要在该方面进行一些额外的配置。
2个回答

12
我认为你把TCP keep-alive和HTTP keep-alive(持久连接)混淆了。这些概念是无关的。从你的问题中可以看出,你可能指的是HTTP持久连接。
在HTTP/1.1中,持久连接是默认的,并且被NSURLSession和几乎所有的HTTP/1.1客户端使用。你必须要求关闭它们。你可以检查HTTP头中的Connection: close,或者在服务器端,你可以检查http.Request的Close字段。但是我肯定你正在获取持久连接。这意味着你不必为每个请求重新协商TLS隧道(或至少是TCP三次握手)。(虽然如果你进行并行请求,仍然会有多个连接需要协商。HTTP/1.1一次只能处理一件事情,而NSURLSession将尝试使用连接池来提高响应时间。)
TCP keep-alives是完全不同的东西。它会定期发送“ping”到另一侧,以确保它仍然可达。有很多方法可以失去网络连接,直到下一次尝试通信才知道,正常的症状是连接挂起,需要超时。理论上,TCP keep-alive只是发现这个问题的工具,但我几乎从未发现它实用。它很难正确配置(特别是在Cocoa中)。你几乎总是需要为你的应用程序构建更高级别的“ping”功能,而不是依赖它。
但回到你的问题,HTTP/1.1对你来说可能已经足够了,但你需要仔细管理你的响应。如果你为每一个字母都做一个新的请求并发送一个庞大的响应,那么这将工作得很糟糕。你会让所有连接池忙于下载你要扔掉的东西。你需要首先专注于好的算法。至少,你可能只想一次发送几个结果,并在你的API中提供“分页”方法来请求更多的相同搜索结果。

感谢提供有用的信息。自从问题被提出以来,我已经在算法方面做出了一些重大改进,最重要的是实现了一个计时器,这样当用户停止输入一段时间后,搜索才会发送请求。但是我对你提到的“分页”方法很好奇 - 你能解释一下你的意思吗? - Hundley
1
@hundley 分页意味着如果有超过一定数量的结果,只返回第一批结果,后续批次通过附加一个请求变量来检索“页面”。想想谷歌搜索结果是如何分批返回的。当然,这只在结果数量很大的情况下才有意义。您的“等待暂停”是一种非常常见且非常有帮助的技术。 - Rob Napier

7
为了确切了解TCP在做什么,您可以启用CFNETWORK_DIAGNOSTICS。根据文档所述:

During normal development you can set this environment variable via Xcode's scheme editor. If you need to investigate problems outside of Xcode, you can set it programmatically using the code shown in Listing 1.

Listing 1 Programmatically enabling CFNetwork diagnostic logging

setenv("CFNETWORK_DIAGNOSTICS", "3", 1);

You should do this right at the beginning of the app's launch sequence. Normally putting this at the start of main is sufficient, but if you have C++ static initialisers that use CFNetwork you'll have to run it before them.

CFNetwork diagnostic logging starts up when you first use CFNetwork—or any framework, like Foundation, that uses CFNetwork—at which point it will print a message like that shown in Listing 2.

Listing 2 An example of the CFNetwork diagnostic logging startup message

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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接