HTTP 保持活动状态和 TCP 保持活动状态

Posted

技术标签:

【中文标题】HTTP 保持活动状态和 TCP 保持活动状态【英文标题】:HTTP Keep Alive and TCP keep alive 【发布时间】:2012-03-09 05:10:53 【问题描述】:

HTTP Keep Alive 是如何实现的?它是否在内部使用 TCP Keep Alive?如果不是,服务器如何检测客户端是死的还是活的?

【问题讨论】:

【参考方案1】:

HTTP Keep-Alive 是 HTTP 协议的一个特性。实现 Keep-Alive 功能的 Web 服务器必须定期检查连接/套接字(对于传入的 HTTP 请求)自发送最后一个 HTTP 响应以来的时间跨度(以防有相应的 HTTP 请求)。如果在配置的保持活动时间(秒)之前没有收到 HTTP 请求,则 Web 服务器将关闭连接。 Web 服务器完成“关闭”后,将无法再进行 HTTP 请求。另一方面,TCP Keep-Alive 由操作系统在 TCP 层进行管理。 HTTP Keep-Alive 和 TCP Keep-Alive 是完全不相关的东西。

【讨论】:

【参考方案2】:

我知道这是一个老问题,但仍然:

HTTP Keep-Alive 是一项允许 HTTP 客户端(通常是浏览器)和服务器(Web 服务器)通过同一 TCP 连接发送多个请求/响应对的功能。这减少了第 2 次、第 3 次、... HTTP 请求的延迟,减少了网络流量等。

TCP keepalive 是一个完全不同的野兽。它通过发送小数据包来保持 TCP 连接打开。此外,当发送数据包时,这用作检查,以便在连接断开时立即通知发送方(请注意,否则情况并非如此 - 直到我们尝试通过 TCP 连接进行通信之前,我们不知道它是否正常)。

回答有关 HTTP Keep-Alive 的问题:

How is HTTP Keep Alive implemented? 

简单地说,HTTP 服务器不会在每次响应后关闭 TCP 连接,而是等待一段时间,如果其他 HTTP 请求也会通过它。一段时间后,它仍然会关闭它。

Does it internally use TCP Keep Alive? 

不,至少我看不出有什么意义。

If not, how does the server detect if the client is dead or alive?

它不需要——它不需要。如果客户端发送请求,它将得到响应。如果客户端没有通过 TCP 连接发送任何内容(可能是因为连接已死),那么超时将关闭连接;客户端当然会注意到这一点,并在需要时通过另一个 TCP 连接发送请求。

【讨论】:

【参考方案3】:

http keep-alive 只是让 tcp 的存活时间更长,以便传输多个 http 请求。keep-alive 超时后,tcp 连接将被关闭。 tcp keep-alive只是保持tcp连接的一种机制,或者检查tcp连接是否关闭

【讨论】:

【参考方案4】:

HTTP keep-alive,也称为 HTTP 持久连接,是一种允许单个 TCP 连接为多个 HTTP 请求/响应保持打开状态的指令。

默认情况下,HTTP 连接在每次请求后关闭。当有人访问您的网站时,他们的浏览器需要创建新的连接来请求构成您网页的每个文件(例如图像、javascript 和 CSS 样式表),这一过程可能会导致页面加载时间过长。

启用 keep-alive 标头允许您通过单个连接提供所有网页资源。 Keep-alive 还可以减少服务器上的 CPU 和内存使用量。

来源:https://www.imperva.com/learn/performance/http-keep-alive/

【讨论】:

以上是关于HTTP 保持活动状态和 TCP 保持活动状态的主要内容,如果未能解决你的问题,请参考以下文章

Facebook 聊天 tcp 连接如何保持活动状态?

iOS 应用程序如何在后台无限期地保持 TCP 连接处于活动状态?

Python urllib2 与保持活动状态

Worklight 在用户注销时保持 HTTP 请求处于活动状态

Bootstrap:手动输入url时根据路由保持活动状态

RestSharp:底层连接已关闭:服务器关闭了预期保持活动状态的连接