HTTP 的发展要追溯到万维网的发明,1989 年,当时在 CERN 工作的 Tim Berners-Lee 博士写了一份关于建立一个通过网络传输超文本系统的报告。这个系统起初被命名为 Mesh,在随后的 1990 年项目实施期间被更名为万维网(World Wide Web)。
万维网在现有的 TCP 和 IP 协议基础之上建立,由四个部分组成:
最初的 HTTP 协议并没有版本号,0.9 实际上是为了跟后续的 1.0 版本作区分。总的来说 0.9 版本十分简陋,功能单一。
特点:
不足:
一个典型的请求:
GET /mypage.html
一个典型的响应:
<html>
这是一个非常简单的 HTML 页面
</html>
在 0.9 基础上做了扩展,支持传输更多类型的内容。
特点:
不足:
一个典型的文本类型的请求和响应
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 消除了大量歧义内容并引入了多项改进
特点:
不足:
通过同一个连接实现的请求响应:
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 就不得不提 SPDY,SPDY 是 Google 开发的一个开放网络协议,旨在通过减少延迟来加快网页加载速度。SPDY 在许多方面是 HTTP/2 的先驱,并直接影响了 HTTP/2 的设计和实现。
特点:
不足:
首部压缩的例子:
静态表包括了一些常用的首部字段名称和值。例如:
:authority
:method: GET
content-type: application/json
动态表最初是空的,但会随着连接的使用而填充。假设我们有一个请求,其中包括一个不常见的首部字段:
custom-header: example-value
这个字段可以添加到动态表中,并分配一个索引,例如索引 41。
我们可以使用静态表和动态表中的索引来表示这些字段:
:method: GET
在静态表中,索引为 2:authority: www.example.com
可以使用索引 1 和哈夫曼编码来压缩 www.example.com
custom-header: example-value
在动态表中,索引为 41最终的首部压缩结果:
www.example.com
www.example.com
HTTP/3 是基于 QUIC 协议的 HTTP 版本,致力于进一步提高性能。
特点:
不过 HTTP/3 的改动相对来说是最大的,目前看推广的覆盖率并没有之前的速度快。