为了账号安全,请及时绑定邮箱和手机立即绑定

iOS 和 Go - 使用 NSURLSession 保持活动状态

iOS 和 Go - 使用 NSURLSession 保持活动状态

Go
Qyouu 2021-10-04 16:14:57
在我的 iOS 应用程序中,我有一个从服务器获取结果的搜索功能。当用户更新他们的查询时,搜索会更新,因此这会导致连续发出多个请求。所以我的问题是,如何确保在这些连接上使用 TCP keep-alive?我想尽可能减少延迟,因此在第一个请求之后保持连接并在后续请求中重用连接非常重要。我正在使用 NSURLSession,我听说它默认使用 keep-alive,但我怎么知道呢?在服务器上记录请求显示每个连续请求之间没有区别,但我不希望仅从标头信息中看到任何变化。这里有什么帮助吗?我在我的服务器上使用 Go,所以它可能也需要在该端进行一些额外的配置。
查看完整描述

2 回答

?
白猪掌柜的

TA贡献1893条经验 获得超10个赞

我相信您将 TCP 保持连接与 HTTP 保持连接(持久连接)混淆了。这些是不相关的概念。从您的问题来看,您的意思可能是 HTTP 持久连接。

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

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

但是把它解决你的问题,HTTP/1.1 可能对你来说很好,但是你需要仔细管理你的响应。如果你对每封信都提出一个新的请求并发回大量的回复,那么这会很糟糕。您将让所有连接池忙于下载您要扔掉的东西。你需要首先关注好的算法。至少,您可能只想一次发送几个结果,并在您的 API 中提供“分页”方法,以便为同一搜索请求更多结果。


查看完整回答
反对 回复 2021-10-04
  • 2 回答
  • 0 关注
  • 216 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信