一、简介
HTTP协议早期版本,比如1.0,默认是不使用持久连接的,也就是每个请求/响应之后都会关闭TCP连接。这样的话,每次请求都需要重新建立连接,增加了延迟和资源消耗。Keep-Alive的作用是保持连接,让多个请求可以复用同一个TCP连接,减少建立和关闭连接的开销,在HTTP1.1中是默认支持 Keep-Alive的。
二、原理介绍
HTTP 中的 Keep-Alive(也称为持久连接或连接复用)的主要作用是允许在同一个 TCP 连接上发送和接收多个 HTTP 请求/响应,从而减少重复建立和关闭连接的开销。以下是它的核心作用和优势:
1、核心作用:
- 连接复用
默认情况下(如 HTTP/1.0),每个 HTTP 请求都会新建一个 TCP 连接,完成后立即关闭。Keep-Alive 会保持 TCP 连接打开一段时间,供后续请求复用。
例如:浏览器加载一个网页时,可以复用同一个连接下载 HTML、CSS、图片等资源,无需反复握手。
减少延迟 - 避免重复的 TCP 三次握手(建立连接)和四次挥手(关闭连接),降低网络延迟。
尤其对包含大量小文件(如网页资源)的场景优化明显。 - 节省资源
减少服务器和客户端的 CPU、内存消耗(避免频繁创建和销毁连接)。
缓解端口资源占用问题。
二、技术细节:
HTTP/1.1 默认支持 Keep-Alive(无需显式设置 Connection: keep-alive),而 HTTP/1.0 需要手动启用。
1、HTTP Keep-Alive 请求头字段 (客户端 → 服务器)
- Connection: keep-alive
客户端明确告知服务器希望保持连接(HTTP/1.1 默认启用,但 HTTP/1.0 需显式声明)。 - Keep-Alive: timeout=5, max=1000(可选)
客户端建议参数:
timeout: 空闲超时时间(秒)
max: 此连接允许的最大请求数
2、HTTP Keep-Alive 响应头字段 (服务器 → 客户端)
- Connection: keep-alive
服务器同意保持连接(HTTP/1.1 默认启用,HTTP/1.0 需显式返回)。 - Keep-Alive: timeout=5, max=1000(可选)
服务器实际使用的参数(可能覆盖客户端建议值)。
3、HTTP/1.1 与 HTTP/1.0 的区别
版本 | 默认行为 | 需要显式设置头? |
---|---|---|
HTTP/1.1 | 默认启用持久连接 | 关闭时需发送 Connection: close |
HTTP/1.0 | 默认关闭持久连接 | 启用需发送 Connection: keep-alive |
三、请求头与响应头示例
1、HTTP/1.1版本
- HTTP/1.1 请求(默认启用 Keep-Alive)
GET /api/data HTTP/1.1
Host: example.com
User-Agent: MyClient
Connection: keep-alive # 可选(HTTP/1.1 默认行为)
- HTTP/1.1 响应(服务器同意保持连接)
HTTP/1.1 200 OK
Content-Type: application/json
Content-Length: 1024
Connection: keep-alive # 可选(HTTP/1.1 默认行为)
Keep-Alive: timeout=5, max=1000
2、HTTP/1.0版本
- HTTP/1.0 请求(需显式启用)
GET /old-api HTTP/1.0
Host: example.com
Connection: keep-alive # 必须显式声明
- HTTP/1.0 响应(服务器同意保持连接)
HTTP/1.0 200 OK
Content-Type: text/html
Content-Length: 2048
Connection: keep-alive # 必须显式返回
Keep-Alive: timeout=5
3、关闭连接
- 客户端关闭连接,发送 Connection: close 请求头
Host: example.com
Connection: close
- 服务器强制关闭连接,返回 Connection: close 响应头
HTTP/1.1 200 OK
Connection: close
- 超时或达到最大请求数
当 超时或达到最大请求数,连接会被服务器或客户端主动关闭。
四、其他
1、HTTP的Keep-Alive和TCP的Keep-Alive机制对比
- HTTP Keep-Alive 是应用层机制,用于复用连接。
- TCP Keep-Alive 是传输层机制,通过发送心跳包检测连接是否存活,防止“半开连接”