本文目录导读:

HTTP/1.1 默认就是持久连接(Persistent Connection),也叫 Keep-Alive,这是它与 HTTP/1.0 的一个关键区别。
HTTP/1.1 允许在同一个 TCP 连接上发送和接收多个 HTTP 请求/响应,而不是每个请求都重新建立和关闭连接。
核心实现机制
-
默认行为(无需额外头)
- 在 HTTP/1.1 中,所有连接默认都是持久的,除非明确使用
Connection: close头来关闭它。 - 服务器发送完响应后,不会主动断开 TCP 连接,它会等待客户端在这个连接上发送下一个请求。
- 在 HTTP/1.1 中,所有连接默认都是持久的,除非明确使用
-
显式标志(可选但推荐)
- 虽然默认是持久连接,但客户端和服务器仍然可以通过
Connection: keep-alive头来显式声明。 - 但更重要的是,HTTP/1.1 引入了一个更精确的控制头:
Keep-Alive。keep-alive: timeout=5, max=100表示:timeout=5:服务器希望这个空闲连接最多保持 5 秒。max=100:服务器希望在这个连接上最多处理 100 个请求后关闭。
- 虽然默认是持久连接,但客户端和服务器仍然可以通过
-
如何判断请求/响应结束(防止死等)
- 持久连接的关键挑战是:客户端如何知道一个响应数据已经完整发送完毕,以便解析它并发送下一个请求?
- HTTP/1.1 主要依赖
Content-Length和Transfer-Encoding: chunked。- Content-Length:响应头中明确告诉客户端数据长度(以字节为单位),客户端读到这个长度的数据后,就知道响应结束。
- Transfer-Encoding: chunked:如果服务器无法提前知道数据长度(例如动态生成的数据,如数据库查询、实时流),会使用这种编码,它将数据分成一个个“块”(chunk),每个块前面有该块的长度信息,最后以一个长度为 0 的块结束。
- 这两种机制都不需要关闭连接就能明确标记数据边界,从而支持持久连接。
与 HTTP/1.0 的区别
| 特性 | HTTP/1.0 | HTTP/1.1 |
|---|---|---|
| 默认连接行为 | 非持久(每个请求一个 TCP 连接) | 持久(默认 keep-alive) |
| 启用持久连接 | 必须显式添加 Connection: keep-alive |
默认启用,可通过 Connection: close 禁用 |
| 效率 | 每次请求都需要 TCP 三次握手、慢启动,效率低 | 复用连接,减少握手和慢启动开销,效率高 |
| 数据传输 | 通常依赖 Content-Length 或关闭连接标记结束 |
支持 Content-Length 和 Transfer-Encoding: chunked |
为什么持久连接重要?
- 减少延迟:避免了每个请求都进行 TCP 三次握手和四次挥手的时间。
- 提高网络利用率:减少了 TCP 连接的建立/关闭次数,以及由此产生的网络拥塞。
- 支持管道化(Pipelining):虽然实际中很少用(已被 HTTP/2 的多路复用取代),但持久连接是 HTTP/1.1 管道化的基础。
- 资源开销更低:服务器和客户端不需要为每个请求维护大量连接,节省了 CPU 和内存。
HTTP/1.1 实现持久连接的核心是:
- 默认行为:连接默认保持打开。
- 明确边界:依靠
Content-Length或Transfer-Encoding: chunked来界定每次请求/响应的边界,无需关闭连接。 - 控制头:通过
Connection: close放弃持久化,或通过Keep-Alive头微调超时和最大请求数。
如果你在使用 HTTP/1.1(比如浏览网页、调用 REST API),实际上已经自动享受了持久连接带来的性能提升。
版权声明:除非特别标注,否则均为本站原创文章,转载时请以链接形式注明文章出处。