HTTP 长连接和短连接
你说的应该是 HTTP 长连接和短连接。它们指的是:一次 TCP 连接是否被多次 HTTP 请求复用。
1. 短连接
短连接就是:一次 HTTP 请求-响应结束后,TCP 连接就关闭。
流程大致是:
TCP 三次握手
→ 发 HTTP 请求
→ 收 HTTP 响应
→ TCP 四次挥手关闭
特点:
- HTTP/1.0 默认就是短连接。
- 每个请求都要重新建立 TCP 连接。
- 优点:实现简单,连接用完就释放,不会长期占用服务器资源。
- 缺点:频繁握手、挥手,延迟高,开销大。
- 适合:低频请求、一次性接口调用。
比如你偶尔请求一个 API,短连接没什么问题。
2. 长连接
长连接就是:TCP 连接建立后不立即关闭,后续多个 HTTP 请求复用同一条连接。
流程大致是:
TCP 三次握手
→ 请求1 / 响应1
→ 请求2 / 响应2
→ 请求3 / 响应3
→ ...
→ 超时或主动关闭
特点:
- HTTP/1.1 默认使用长连接,也叫持久连接。
- HTTP/1.0 需要显式加:
Connection: keep-alive
- HTTP/1.1 默认就是 keep-alive,如果要关闭,显式加:
Connection: close
- 服务器通常会设置超时时间,比如 5 秒、60 秒内没有新请求就关闭。
- 也可能限制一条连接最多处理多少个请求。
优点:
- 减少 TCP 握手和挥手次数。
- 降低延迟,提高吞吐量。
- 对网页加载大量图片、CSS、JS 很友好。
缺点:
- 服务器需要维护更多打开的连接。
- 连接可能被中间代理、防火墙、负载均衡器断开。
- 需要合理设置超时和最大请求数。
3. 对比
| 维度 | 短连接 | 长连接 |
|---|---|---|
| TCP 连接 | 一次请求后关闭 | 多次请求复用 |
| HTTP 版本 | HTTP/1.0 默认 | HTTP/1.1 默认 |
| 开销 | 每次都要握手挥手 | 只在开始和结束时开销 |
| 延迟 | 较高 | 较低 |
| 服务器资源 | 连接释放快 | 长期占用连接 |
| 适用场景 | 低频、一次性请求 | 高频、多次请求 |
4. 常见配置
Nginx 里常见:
keepalive_timeout 65;
keepalive_requests 1000;
Apache 里常见:
KeepAlive On
MaxKeepAliveRequests 100
KeepAliveTimeout 5
浏览器和服务器之间也会协商:
Connection: keep-alive
Keep-Alive: timeout=5, max=100
5. 注意几个误区
长连接不等于 WebSocket
HTTP 长连接仍然是 请求-响应 模式,客户端不发请求,服务器一般不能主动推消息。
WebSocket 是握手后升级协议,变成 全双工,双方可以随时发消息。
HTTP/1.1 长连接仍有队头阻塞
HTTP/1.1 虽然能复用 TCP 连接,但请求-响应基本还是串行的。前一个响应慢,后面的可能被阻塞。
HTTP/2 在一个 TCP 连接上做多路复用,多个请求可以并行,解决了 HTTP 层面的队头阻塞。但 TCP 层仍可能有队头阻塞,HTTP/3 用 QUIC 进一步解决。
长连接不是永久连接
服务器、客户端、代理都可能主动关闭。通常会设置超时时间,空闲太久就断开。
总结
- 短连接:一次请求一次连接,简单但开销大。
- 长连接:一条 TCP 连接反复发多个 HTTP 请求,省去重复握手,性能更好。
- HTTP/1.0 默认短连接,HTTP/1.1 默认长连接。
- 长连接只是 HTTP 连接复用,不是 WebSocket,也不是服务器主动推送。
浙公网安备 33010602011771号