HTTP的演变


万维网的四个部分

  • 一个文件格式去代表超文本文档——HTML
  • 一个简单的协议去交换这些文档——HTTP
  • 一个客户端去展示和编辑这些文档——浏览器
  • 一个服务器用于访问这些文档

HTTP0.9——一行协议

HTTP0.9极其的简单,请求只包含单行,并且只可能使用一个GET方法,后面跟随路径和资源名,一旦连接到服务器之后,协议,服务器,端口号是不需要的,因此请求中没有URL

1
GET /mypage.html

响应也是极其简单的,只包含响应内容

1
2
3
<html>
A very simple HTML page
</html>

由于HTTP0.9没有HTTP头部,所以只能传输HTML文件.由于没有状态码和错误码,如果出现了任何问题,那么一个特定的HTML文件将生成,来展示问题的描述信息.

HTTP1.0——构建扩展性

  • 每个请求添加了版本信息,如GET 资源 HTTP/1.0
  • 响应的开头包含了响应码行,这允许浏览器去识别请求成功或者失败,并由此适配出合适的行为,比如在成功的时候更新资源,在失败的时候使用本地缓存.
  • HTTP头部的概念引入到请求和响应.元数据可以被传输,因此协议变得极其灵活和可扩展.
  • 由于有了Content-Type头部,除了HTML之外的其他类型资源也可以传输.

HTTP的请求和响应如下:

1
2
3
4
5
6
7
8
9
10
11
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>
A page with an image
<IMG SRC="/myimage.gif">
</HTML>

随后发生的请求和响应:

1
2
3
4
5
6
7
8
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
(image content)

HTTP1.1——标准协议

HTTP1.1提供了许多改进.

  • 一个连接可以被复用,用于节省时间.在请求资源时,不需要再建立多个连接
  • 管道化.允许在第一个请求还没有完成传输时发送第二个请求,这个降低了通讯的延迟
  • 支持大块的响应
  • 引入了额外的缓存控制机制
  • 客户端和服务器支持内容协商,包括语言,编码,类型的协商.
  • 新增了Host头部,使得一个服务器(一个IP)可以拥有不同的域名.

一个典型的HTTP1.1请求示例,所有的请求都通过一个TCP连接:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
GET /en-US/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/en-US/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/en-US/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)

HTTPS

1994年网景公司在TCP/IP栈上的顶部创造了一个额外的加密层——SSL.SSL1.0没有公开,而SSL2.0和它的后继者SSL3.0用于电子商务网站的建立.HTTPS加密信息,保证它们在客户和服务器之间的真实性,SSL最终标准化并演变成了TLS.随后,由于互联网的普及性,HTTPS不再只用于电子商务场景中,比如用于私人信息的保护,比如电话簿,用户位置,邮箱等.

HTTP2.0——用于提升性能

HTTP2.0和HTTP1.1的不同之处:

  • HTTP2.0是一个二进制协议而不是文本协议.它不可以被手动读取和创造.它允许优化提升技术的实现
  • HTTP2.0是一个多路复用协议.并行请求可以在同一个连接上被创建.
  • HTTP2.0进行了头部压缩.由于一些请求经常发送一些相同的头部信息,这个特性减少了传输重复数据的开销
  • HTTP2.0允许服务器推送数据到客户端客户端缓存.

HTTP3.0——在QUIC上的HTTP

下一个主要的HTTP版本,HTTP3与早期的HTTP有相同的语义,但是使用QUIC代替TCP来做运输层传输.QUIC使得HTTP连接拥有更低的延迟,和HTTP2一样,它是一个多路复用协议,但是HTTP2运行在单个TCP连接上,因此包丢失检测和重传处理可能阻塞连接上的所有流.而QUIC运行多个流在UDP之上,并且为每个流实现了单独的包丢失检测和重传,一旦错误发生,只有发生错误的流的数据包会发生阻塞.

参考资料

https://developer.mozilla.org/en-US/docs/Web/HTTP/Basics_of_HTTP/Evolution_of_HTTP


本博客所有文章除特别声明外,均采用 CC BY-SA 4.0 协议 ,转载请注明出处!