HTTP协议演进:从0.9到HTTP/3
HTTP协议是互联网通信的基石,经历了多个版本的演进,不断优化和扩展,以满足现代Web应用的需求。
HTTP/0.9 单行协议
HTTP协议的最初版本,称为HTTP/0.9,并未具备版本号,后来版本号被定为0.9以区分后续版本。
- 请求由单行指令构成
- 以唯一可用方法 GET 开头,其后跟目标资源的路径(一旦连接到服务器,协议、服务器、端口号这些都不是必须的)。
GET /mypage.html
<!--相应只包含响应文档本身 -->
<html>
这是一个非常简单的 HTML 页面
</html>
HTTP/1.0 构建可扩展性
随着互联网的发展,HTTP/1.0引入了更多的特性,使其更具可扩展性和灵活性
- 协议版本信息现在会随着每个请求发送(
HTTP/1.0被追加到了 GET 行)。 - 状态码会在响应开始时发送,使浏览器能了解请求执行成功或失败,并相应调整行为(如更新或使用本地缓存)。
- 引入了 HTTP 标头的概念,无论是对于请求还是响应,允许传输元数据,使协议变得非常灵活,更具扩展性。
- 在新 HTTP 标头的帮助下,具备了传输除纯文本 HTML 文件以外其他类型文档的能力(凭借
Content-Type标头)。
<!-- 请求页面 -->
GET /mypage.html HTTP/1.0
User-Agent: NCSA_Mosaic/2.0 (Windows 3.1)
200 OK
Date: Tue, 15 Nov 1994 08:12:31 GMT
Server: CERN/3.0 libwww/2.17
Content-Type: text/html
<html>
一个包含图片的页面
<img src="/myimage.gif" />
</html>
<!-- 获取图片 -->
GET /myimage.gif HTTP/1.0
User-Agent: NCSA_Mosaic/2.0 (Windows 3.1)
200 OK
Date: Tue, 15 Nov 1994 08:12:32 GMT
Server: CERN/3.0 libwww/2.17
Content-Type: text/gif
(这里是图片内容)
HTTP/1.1 标准化协议
HTTP/1.1引入了许多重要的改进,进一步提高了性能和效率。其中的一些关键特性包括:
- 连接可以复用,节省了多次打开 TCP 连接加载网页文档资源的时间。
- 增加管线化技术,允许在第一个应答被完全发送之前就发送第二个请求,以降低通信延迟。
- 支持响应分块。
- 引入额外的缓存控制机制。
- 引入内容协商机制,包括语言、编码、类型等。并允许客户端和服务器之间约定以最合适的内容进行交换。
- 凭借
Host标头,能够使不同域名配置在同一个 IP 地址的服务器上。
<!-- 所有请求通过一个连接实现 -->
GET /zh-CN/docs/Glossary/Simple_header HTTP/1.1
Host: developer.mozilla.org
User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10.9; rv:50.0) Gecko/20100101 Firefox/50.0
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8
Accept-Language: en-US,en;q=0.5
Accept-Encoding: gzip, deflate, br
Referer: https://developer.mozilla.org/zh-CN/docs/Glossary/Simple_header
200 OK
Connection: Keep-Alive
Content-Encoding: gzip
Content-Type: text/html; charset=utf-8
Date: Wed, 20 Jul 2016 10:55:30 GMT
Etag: "547fa7e369ef56031dd3bff2ace9fc0832eb251a"
Keep-Alive: timeout=5, max=1000
Last-Modified: Tue, 19 Jul 2016 00:59:33 GMT
Server: Apache
Transfer-Encoding: chunked
Vary: Cookie, Accept-Encoding
(content)
GET /static/img/header-background.png HTTP/1.1
Host: developer.mozilla.org
User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10.9; rv:50.0) Gecko/20100101 Firefox/50.0
Accept: */*
Accept-Language: en-US,en;q=0.5
Accept-Encoding: gzip, deflate, br
Referer: https://developer.mozilla.org/zh-CN/docs/Glossary/Simple_header
200 OK
Age: 9578461
Cache-Control: public, max-age=315360000
Connection: keep-alive
Content-Length: 3077
Content-Type: image/png
Date: Thu, 31 Mar 2016 13:34:46 GMT
Last-Modified: Wed, 21 Oct 2015 18:27:50 GMT
Server: Apache
(image content of 3077 bytes)
HTTP/2 更快、更稳定、更简单
HTTP/2在HTTP/1.1的基础上引入了更多的性能和安全改进。它采用二进制协议、多路复用、标头压缩等技术,提升了性能,同时保持了与HTTP/1.1的兼容性。
- HTTP/2 在 HTTP/1.1 有几处基本的不同:
- HTTP/2 是二进制协议而不是文本协议。不再可读,也不可无障碍的手动创建,改善的优化技术现在可被实施。
- 这是一个多路复用协议。并行的请求能在同一个链接中处理,移除了 HTTP/1.x 中顺序和阻塞的约束。
- 压缩了标头。因为标头在一系列请求中常常是相似的,其移除了重复和传输重复数据的成本。
- 其允许服务器在客户端缓存中填充数据,通过一个叫服务器推送的机制来提前请求。
后HTTP/2进化
- 对
Alt-Svc的支持允许了给定资源的位置和资源鉴定,允许了更智能的 CDN 缓冲机制。 - 客户端提示(
client hint) 的引入允许浏览器或者客户端来主动交流它的需求,或者是硬件约束的信息给服务端。 - 在
Cookie头中引入安全相关的的前缀,现在帮助保证一个安全的 Cookie 没被更改过。
HTTP/3 草案
传输层部分使用 QUIC (en-US) 而不是 TCP,以提供更快、更安全的连接。它修复了TCP的一些延迟问题,同时保持了HTTP/2的特性。
HTTP/3的特点包括:
- 使用QUIC传输协议,减少了连接建立的延迟。
- 引入了客户端提示机制,允许浏览器主动与服务器交流需求。
- 支持服务器推送,加速页面加载。
- 在安全性和性能方面都有所提升。