HTTP的版本升级
HTTP/0.9
HTTP/0.9诞生于1991年,主要用于学术交流,仅仅用它在网络间传输HTML超文本的内容,因此,它的实现很简单。有以下三个特点:
- 只有一个
请求行
,没有请求头和请求体。 - 服务器也没有返回头信息,服务器只返回数据即可。
- 返回的文本内容是以ASCII字符流来传输的。
随着万维网的发展和浏览器的盛行,浏览器中展示的不单单是HTML文件,还新增了CSS、JS、图片、音视频等文件,因此,支持多文件类型下载是HTTP/1.0的核心需求。
HTTP/1.0
请求头和响应头
为了满足多文件类型下载的需求,浏览器和服务器之间需要进行更多的交流,因此,请求头诞生了。
HTTP/1.0使用请求头
和响应头
来进行协商,浏览器会通过请求头告诉服务器它期待服务器返回什么类型的文件、采取什么形式的压缩、提供什么语言的文件以及文件的具体编码。
accept: text/html
accept-encoding: gzip, deflate, br
accept-Charset: ISO-8859-1,utf-8
accept-language: zh-CN,zh
服务端通过响应头来表明自己实际使用的方法方式。
content-encoding: br
content-type: text/html; charset=UTF-8
其他典型特性
- HTTP/1.0还引入了
状态码
,状态码是通过响应行的方式来通知浏览器的。常见的404、500。 - HTTP/1.0提供了
Cache机制
,用于缓存已经下载过的资源。 - HTTP/1.0还在请求头中加入了
UserAgent
字段,用于统计客户端的类型和数量。
总的来说,HTTP/1.0相对于老版本,主要扩展了功能。 而接下来的HTTP/1.1则主要是提高了速度。
HTTP/1.1
改进持久连接
HTTP/1.0在每次通信,都需要经历TCP连接、传输HTTP数据和断开TCP连接这三个阶段。在当时,传输的文件比较小,这样做什么问题。但是随着一个页面可能要加载几百个外部引用资源,如果每个文件都要经历这样的阶段,那么开销会非常大。因此HTTP的持久连接极其重要。 在HTTP/1.1,可以在一个TCP请求上传输多个HTTP请求,只要浏览器或者服务器没有明确要断开连接,那么该TCP连接会一直保持。这样减少了TCP建立和断开连接的开销,减小了服务器的压力。 目前,对于同一个域名,默认允许同时建立6个TCP持久连接。
HTTP管线化
持久连接虽然能够减少TCP的连接次数,但是它需要等待前面的请求返回之后,才能进行下一次请求。如果TCP通道内的某个请求因为某些原因没有及时返回,就会阻塞后面所有的请求,这就是著名的队头阻塞
问题。
HTTP/1.1尝试使用管线化技术来解决队头阻塞的问题,但是效果却不理想,只得放弃。
虚拟主机
之前,每个ip只能绑定一个域名,但是HTTP/1.1之后,新增了虚拟主机的概念,一个ip可以绑定多个域名。同时,请求头里增加了一个新的参数Host
,用来表示当前请求的是该IP下的哪个域名。
动态内容的支持
HTTP/1.1 通过引入 Chunk transfer 机制来解决这个问题,服务器会将数据分割成若干个任意大小的数据块,每个数据块发送时会附上上个数据块的长度,最后使用一个零长度的块作为发送数据完成的标志。这样就提供了对动态内容的支持。
客户端Cookie和安全机制
HTTP/1.1还加入了Cookie和安全机制。