问题

http, keepalive用来复用连接,这样不就是串行的了么,浏览器会并行的多个请求发出,keepalive怎么体现作用?

回答
您问到一个非常核心的问题,很多人容易在这里产生误解。http1.0 的时代,浏览器每次请求一个资源,比如一张图片,就会建立一次 TCP 连接,发送请求,拿到响应,然后关闭连接。这个过程是串行的,效率非常低,尤其是当页面有很多图片、CSS、JavaScript 文件的时候,每次都要经历“三次握手”、“四次挥手”,简直是灾难。

为了解决这个问题,HTTP/1.1 引入了 `KeepAlive`(也叫 HTTP 持久连接)。它的作用就好比你打电话,原来是打完一个电话就把电话挂了,下次再打。有了 `KeepAlive` 之后,你可以保持电话线路的畅通,打完一个电话,不挂断,直接就可以继续打下一个电话。

关键点就在这里:`KeepAlive` 并不是让单个请求串行处理,而是让建立连接的过程不再每次重复。

想象一下,你的浏览器需要从一个服务器加载一个网页。这个网页里有 HTML 文件,还有几十张图片,几个 CSS 文件,几个 JavaScript 文件。

在没有 `KeepAlive` 的时代,浏览器会:

1. 请求 HTML 文件。
2. 建立 TCP 连接。
3. 发送 HTML 请求。
4. 服务器响应 HTML。
5. 关闭 TCP 连接。
6. 浏览器解析 HTML,发现需要加载第一张图片。
7. 建立新的 TCP 连接。
8. 发送图片请求。
9. 服务器响应图片。
10. 关闭 TCP 连接。
11. ... 如此循环,直到所有资源都加载完毕。

这是一个多么慢的过程!每一次连接的建立和关闭都耗费时间。

现在,有了 `KeepAlive`:

1. 浏览器请求 HTML 文件。
2. 建立一个 TCP 连接。
3. 发送 HTML 请求。
4. 服务器响应 HTML。
5. TCP 连接保持打开状态。
6. 浏览器解析 HTML,发现需要加载第一张图片。
7. 直接在这个已有的 TCP 连接上发送图片请求。
8. 服务器响应图片。
9. TCP 连接仍然保持打开状态。
10. 浏览器继续请求 CSS 文件。
11. 直接在这个已有的 TCP 连接上发送 CSS 请求。
12. 服务器响应 CSS。
13. TCP 连接依然保持打开状态。

你看,浏览器并不会等到第一个图片请求的响应完全回来之后,才去发送第二个图片请求。它可以在同一个 TCP 连接上,连续地、快速地发送多个请求。这就像你手里拿着一根电话线,打完一个人的电话,不用挂,直接拔掉插头换另一个人的电话号码,然后继续打。

浏览器在拿到 HTML 文件后,会发现很多需要下载的资源。它会同时(并发地)通过这个已建立的 `KeepAlive` 连接发送多个请求。但服务器端如何处理这些来自同一连接的请求呢?

早期的 `KeepAlive` 方式,在服务器端,请求的处理本质上还是串行的。也就是说,服务器收到一个请求,处理完(发送响应)后,才会去处理同一个连接上的下一个请求。这就像你只有一个收银员,客人排队一个个来结账。

所以,你说的“这样不就是串行的了么”有一部分是准确的,在 HTTP/1.1 的 `KeepAlive` 下,同一个 TCP 连接内的请求处理,在服务器端是被序列化的。你不能期望在同一个连接上,服务器同时处理两个请求并返回结果。

那么 `KeepAlive` 的作用在哪里呢?

1. 省去连接建立和关闭的开销: 这是最直接的优势。避免了反复进行 TCP 的三次握手和四次挥手,大大减少了网络延迟和服务器资源消耗。
2. 提升加载速度(尤其对于小文件): 虽然服务器对同一连接内的请求处理是串行的,但浏览器可以快速连续地发出请求。当大量小文件(如图片、CSS、JS)需要加载时,一次连接就可以完成大部分的传输,比每次都重新建立连接要快得多。
3. 支持“流水线”(Pipelining): HTTP/1.1 是支持请求流水线的,这意味着浏览器可以连续地发送多个请求,而无需等待前一个请求的响应。服务器理论上可以乱序地发送响应,只要最后响应是与请求匹配的。虽然这个特性因为实现复杂和一些问题,在实际应用中并不普遍,但它展示了 `KeepAlive` 连接在提升并发性方面的潜力。

所以,可以这样理解:

`KeepAlive` 让你能够在一个 TCP 连接上“多跑几次车”,而不是每次运货(请求)都得去申请一条新的公路(TCP 连接)。
浏览器可以快速、连续地发出多个载货指令(请求)到同一条公路。
在服务器端,目前(HTTP/1.1 `KeepAlive`)是按照指令顺序,一个接一个地处理,然后把货物(响应)再用这条公路送回来。

尽管服务器对同一连接内的请求处理是串行的,但由于省去了大量建立连接的时间,整体的加载速度依然得到了显著提升。

更进一步说,`KeepAlive` 就像一个“通道”,浏览器把一堆要办的事情(请求)通过这个通道一次性递交给对方。对方收到后,按照顺序一件件办,办完一件就通过这个通道给你回个话(响应),直到所有事情都办完,这个通道才算真正关闭。

而现代的 HTTP/2 和 HTTP/3,则在这个基础上更进一步,引入了“多路复用”(Multiplexing)。这就像你不仅可以一次性提交很多张单子,而且服务器可以同时处理好几张单子,并且把办好的结果通过这个通道,按照正确的顺序,一并还给你,而不用管是哪个单子先办好的,哪个后办好的。这才是真正意义上的“并行”处理。

但回到 `KeepAlive` 和 HTTP/1.1,它的核心作用就是降低连接开销,让浏览器能在同一个连接上高效地发送连续请求,从而显著提高整体的资源加载效率,即使服务器对单个连接内的请求处理仍有其内在的序列性。

网友意见

user avatar
如题,浏览器并行的发出请求不行的么?既然并行发出请求,那么keepalive作用怎么体现。

类似的话题

本站所有内容均为互联网搜索引擎提供的公开搜索信息,本站不存储任何数据与内容,任何内容与数据均与本站无关,如有需要请联系相关搜索引擎包括但不限于百度google,bing,sogou

© 2025 tinynews.org All Rights Reserved. 百科问答小站 版权所有