HTTP Keep Alive是如何实现的?它是否内部使用TCP Keep Alive?如果不是,服务器如何检测客户端是否存活?
我知道这是一个老问题,但仍然:
HTTP Keep-Alive 是一个功能,允许 HTTP 客户端(通常是浏览器)和服务器(Web 服务器)在同一个 TCP 连接上发送多个请求/响应对。这减少了第二个、第三个等 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连接发送请求。
HTTP Keep-Alive 是 HTTP 协议的一个特性。实现 Keep-Alive 特性的 Web 服务器需要定期检查连接/套接字(用于传入的 HTTP 请求)自上次发送 HTTP 响应以来经过的时间范围(如果存在相应的 HTTP 请求) 。如果在配置的 Keep-Alive 时间(秒)内未收到任何 HTTP 请求,则 Web 服务器关闭连接。在 Web 服务器进行“关闭”之后,将无法再进行进一步的 HTTP 请求。另一方面,TCP Keep-Alive 在 TCP 层中由操作系统管理。HTTP Keep-Alive 和 TCP Keep-Alive 是完全不相关的事情。
HTTP keep-alive,又称为HTTP持久连接,是一种指令,允许单个TCP连接保持打开状态以进行多个HTTP请求/响应。
默认情况下,HTTP连接在每个请求后关闭。当有人访问您的站点时,他们的浏览器需要创建新的连接来请求组成您网页的所有文件(例如:图像、JavaScript和CSS样式表),这个过程可能导致页面加载时间长。
启用keep-alive标题可以通过一个连接提供所有网页资源。Keep-alive还减少了服务器上的CPU和内存使用。
来源:https://www.imperva.com/learn/performance/http-keep-alive/