前言
如果说 HTTP/1.0 解决了“能不能传图片”的问题,那么 HTTP/1.1 解决的就是“传得快不快、稳不稳”的问题。自 1997 年发布以来,它统治了互联网近 20 年,至今仍是许多服务的核心协议。
一、 连接效率:从“短连接”到“持久连接”
1. 持久连接 (Persistent Connection)
- 痛点:HTTP/1.0 每下载一个文件都要经历“三次握手 -> 传输 -> 四次挥手”,对于现代网页数十个请求来说,开销巨大。
- 改进:默认开启
Connection: keep-alive。只要不明确断开,多个 HTTP 请求可以复用同一个 TCP 通道。 - 并发机制:浏览器针对同一域名,默认允许同时建立 6 个 TCP 持久连接。
2. 管线化 (Pipelining) —— 昙花一现的尝试
- 背景:持久连接仍需“一问一答”,前面的响应不回来,后面的请求只能等着。
- 尝试:允许一次性发送多个请求,不等响应。
- 夭折原因:服务器必须按顺序返回响应。如果第一个请求处理慢,依然会导致队头阻塞 (Head-of-Line Blocking) 。
二、 传输与灵活性:解决动态内容与断点下载
1. 分块传输 (Chunk Transfer)
- 场景:动态生成的网页(如搜索结果)在传输前无法确定总长度。
- 方案:引入
Transfer-Encoding: chunked。 - 机制:将数据分割成小块,每块标注长度,最后发送一个零长度块表示结束。
2. 断点续传 (Range Request)
-
场景:下载大文件中断后不想从头再来。
-
方案:
- 请求头:
Range: bytes=500-1000(我要第 500 到 1000 字节)。 - 响应头:
Content-Range: bytes 500-1000/2000(这是你要的那段数据)。
- 请求头:
三、 缓存与虚拟主机:更智能的网络环境
1. 缓存进阶
HTTP/1.1 引入了更强大的缓存控制策略:
- 强缓存:
Cache-Control(如max-age),比 1.0 的Expires更灵活。 - 协商缓存:
Etag/If-None-Match,基于文件指纹判断内容是否更新,比Last-Modified更精准。
2. 虚拟主机技术 (Host 字段)
- 痛点:HTTP/1.0 默认一个 IP 只能对应一个域名。
- 改进:请求头增加
Host字段。 - 意义:让一台物理服务器可以承载成百上千个不同的域名(虚拟主机),极大节省了 IP 资源。
四、 总结:HTTP/1.1 的历史地位
HTTP/1.1 是目前互联网的基石,它的出现带来了:
- 更少的连接开销(持久连接)。
- 更灵活的内容分发(分块传输、断点续传)。
- 更高效的资源利用(Host 字段、缓存增强)。
⚠️ 最后的顽疾: 尽管 HTTP/1.1 优化到了极致,但它依然无法完美解决 “队头阻塞” 的问题。这一重任,最终交给了后来采用多路复用技术的 HTTP/2。