整理记录一下HTTP协议的发展历史及各版本差异
1、HTTP
HTTP(HyperText Transfer Protocol,超文本传输协议)是浏览器与服务端之间最主要的通信协议,是用于从万维网(WWW:World Wide Web )服务器传输超文本到本地浏览器的传送协议。是互联网上应用最为广泛的一种网络协议。所有的 WWW 文件都必须遵守这个标准。
HTTP 是一个基于 TCP/IP 通信协议来传递数据(HTML 文件, 图片文件, 查询结果等)。也要通过三次握手,四次挥手。
HTTP 是一个属于应用层的面向对象的协议,由于其简捷、快速的方式,适用于分布式超媒体信息系统。它于 1990 年提出,经过几年的使用与发展,得到不断地完善和扩展。
HTTP大致分为4个版本
- HTTP/0.9
- HTTP/1.0
- HTTP/1.1
- HTTP/2
2、HTTP/0.9
1991年HTTP正式诞生,当时的版本是0.9,定义了客户端发起请求,服务端相应请求的通信模式,默认是80端口,只有一个GET
命令。
GET /index.html
当TCP建立连接后,客户端向服务器发送请求,请求网页index.html
,协议规定,服务器只能返回HTML格式的字符串,发送完毕就关闭TCP连接。
3、HTTP/1.0
随着互联网的发展以及浏览器的出现,单纯的文本已经不满足需求了,需要传输更多的不同类型的文件,1996年HTTP更新1.0版本,针对上述问题进行改变。主要增加了一下几点
- 任何格式的内容都可以发送;
- 除了
GET
外,增加了POST/HEAD
命令,丰富了客户端与服务器端的交互方式; - HTTP请求和回应的格式改变,除了数据部分,每次通信必须要包括头信息,用来描述一些元数据,头信息是用键值对来描述。
这个版本对浏览器的表现有很好的辅助作用,但是也有一些问题。
- 每个TCP链接只能发送一个请求,数据发送完毕就关闭连接,要发送另一个还需要重新建立连接,而TCP建立连接很慢,需要三次握手,并且开始时发送效率较慢
slow start
HTTP/1.0每进行一次通信,都要经历建立连接 - 传输数据 - 断开链接
三个阶段,当一个页面引用了很多文件的时候,就会增加大量网络开销。
为了解决上述的链接问题,出现了HTTP1.1版本。
4、HTTP/1.1
1997年1月,HTTP/1.1版本发布,进一步完善了HTTP协议,一直用到如今。主要实现是当一个连接传输完成时,并没有马上关闭,而且继续复用,用它继续传输其他数据,这个链接保持到浏览器或者服务器要求断开链接为止。主要优化了以下几个点:
- 长连接:HTTP1.1 支持长连接,在一个TCP链接上可以传输多个HTTP请求和相应,减少了建立和关闭连接的消耗和延迟,弥补了1.0版本每次请求都要重新建立连接的问题。
- 缓存处理:HTTP1.1 中引入了更多的缓存控制策略来实现缓存。
- 带宽及网络连接优化:1.0版本不支持断点续传,某个对象只需要部分,但是会传输整个对象,1.1版本引入
range
头域,它允许只请求资源的某个部分(返回码206),这样就方便开发者可以充分利用带宽和连接(keep-alive)。 - 错误通知管理:1.1版本中新增了24个错误状态响应码。
- Host头处理:1.1版本的请求消息和响应消息都应支持Host头域,且请求中如果没有的话会报错
400 Bad Request
。
HTTP1.1修复了HTTP1.0的很多问题,但是1.1也有自身的问题。
- 虽然1.1允许复用TCP连接,但是同一个连接里面所有的数据通信是按次序进行的,服务器只有处理完一个请求,才会进行下一个,要是前面的很慢,后面的就会阻塞住:
"队头堵塞"(Head-of-line blocking)
- HTTP1.x在传输数据时,使用的是明文,无法保证数据的安全性。
- HTTP1.x在请求时,header里携带的内容过大,且每次请求的header基本不会改变,浪费性能。
- 浏览器为了减轻服务器的压力,限制了同一个域下的 HTTP 连接数,即 6 ~ 8 个,所以在 HTTP/1.1 下很容易看到资源文件等待加载的情况,对应优化的方式就是使用多个域名来加载图片资源。
- keep-alive使用过多也会给服务器增加压力,因为它在文件被请求后还保持了不必要的连接很长时间。
5、HTTP/2
HTTP/2主要继承了SPDY
协议,针对HTTP1.1版本效率不高的问题进行优化。
HTTP/2主要有以下几个特点:
- 二进制分帧:HTTP/2 将默认不再使用 ASCII 编码传输,而是改为二进制数据。二进制协议解析起来更高效。
- 多路复用 (Multiplexing):受益于二进制分帧,对于同一个域,客户端只需要与服务端建立一个连接即可完成通信需求,自然也不再受限于浏览器的连接数限制了,这种利用一个连接来发送多个请求的方式称为“多路复用”。
- 请求优先级:把 HTTP 消息分解为很多独立的帧之后,就可以通过优化这些帧的交错和传输顺序,每个流都可以带有一个 31 比特的优先值,根据优先值,控制资源的分配,将优先值最高的优先返回给客户端。
- header压缩:1.1版本每次请求都携带同样的header,HTTP2要求通信双方使用了一张
header fields 表
,对应header的字段,表在链接期间一直存在,后续只需要维护或替换表的内容即可,不需要重复请求携带。 - 服务端推送:服务端
(Server Push)
能通过 push 的方式将客户端需要的内容预先推送过去,也叫cache push
。服务端可以提前给客户端推送必要的资源,这样可以减少请求延迟时间,例如服务端可以主动把JS和CSS文件推送给客户端,而不是等到HTML解析到资源时发送请求。
6、补充
补充TCP协议和SPDY协议
6.1 TCP协议
HTTP是基于TCP实现的,在TCP建立之前,客户端和服务器直接需要进行三次握手,以确认双方的接收和发送能力。
- 第一次握手成功让服务端知道了客户端具有发送能力
- 第二次握手成功让客户端知道了服务端具有接收和发送能力
- 第三次握手让服务端知道客户端有接收能力。
TCP断开链接的时候需要进行四次挥手
- 第一次挥手:客户端告诉服务器我完事儿了
- 第二次挥手:服务端表示我知道了
- 第三次挥手:服务端表示我完事儿了
- 第四次挥手:客户端表示我知道了,毁灭吧。
6.2 SPDY协议
2009年,谷歌公布了SPDY协议
,主要解决HTTP/1.1效率的问题,主要特性都在HTTP/2里面继承。
HTTP/2和SPDY协议
的区别
- HTTP2.0 支持明文 HTTP 传输,而
SPDY
强制使用HTTPS
- HTTP2.0 消息头的压缩算法采用
HPACK
,而非 SPDY 采用的DEFLATE