HTTP版本之间的比较
HTTP协议
HTTP协议(超文本传输协议,HyperText Transfer Protocol),用于提供一种接收和发布HTML页面的方法,默认使用80端口(HTTPS默认使用443端口)。HTTP协议基于TCP连接,因为TCP连接慢启动的特性,所以连接的重用比重新建立连接要好。
HTTP1.0
HTTP1.0是一种无状态,无连接的应用层协议,规定浏览器和服务器保持短暂连接,浏览器每次请求都要断开TCP连接。
HTTP1.0的的两个特点是短连接和队头阻塞(head of line blocking)。
- 短连接:HTTP1.0短链接指定是浏览器每次请求需要与服务器建立一个TCP新连接。这样每次请求都要经历建立连接,启动和释放连接过程,连接无法复用,这样网络的利用率比较低。
- 队头阻塞:由于HTTP1.0规定下一个请求必须在前一个请求到达之前才能发送,所以假设前一个请求一直不到达,下一个请求就不发送,同样后面的健康请求也阻塞。
HTTP1.1
HTTP1.1为了解决HTTP1.0的缺点,引入了一些新的特性:
- 长连接: 允许HTTP设备在事务处理结束后保持TCP连接在打开状态,以便未来的HTTP请求重用现在的连接,直到客户端或者服务器决定将其关闭为止。服务端按照FIFO原则来处理不同请求。
- Host Header:1.1扩充了请求头Host-Header,1.0版本不支持Host请求字段,导致WEB浏览器无法使用主机头名明确表示访问服务器上的WEB站点,这样无法使WEB服务器在同一个IP地址和端口号上使用不同的主机名来创建多个虚拟的WEB站点。而1.1改变了这个缺陷。
- 缓存处理:加入了新的字段
cache-control
,支持断点续传。 - 请求管道化:基于HTTP1.1的长连接,使得请求管线化成为可能。管线化使得请求能“并行”传输,比如响应主体是一个html页面,页面中包含了许多
img
,这里keep-alive
起了很大的作用,能够“并行发送多个请求”。但是服务器必须按照客户端的先后顺序一次送回相应结果。可见,HTTP1.1
还是无法解决队头阻塞(head of line blocking
)的问题。同时“管道化”技术存在各种各样的问题,所以很多浏览器要么根本不支持它,要么就直接默认关闭,并且开启的条件很苛刻…而且实际上好像并没有什么用处。实际上比如谷歌浏览器采用另一种做法,允许我们同时打开6-8个TCP连接。 - 范围请求:可以返回部分内容,响应码206(Partial Content)
HTTP2.0
多路复用:
- 流:已经建立连接上的双向字节流。
- 消息:与逻辑消息对应的完整的一系列数据帧。
- 帧(Frame):
HTTP2.0
通信的最小单位。
上图可以看出所有的
HTTP2.0
通信都在一个TCP连接上完成,这个连接可以承载任意数量的双向数据流。每个数据流以消息的形式发送,而消息由一个或者多个帧组成。这些帧可以乱序发送,然后按照stream id
重新组装。此外,多路复用可能导致关键请求被阻塞,
HTTP2.0
中每个数据流都可以设置优先级和依赖。可以看出,多路复用在一个TCP上进行任意数量的
HTTP
请求,这个强大的功能则是基于“二进制分帧”的特性。头部压缩:
在
HTTP1.x
中,头部元数据都是以纯文本的形式发送的,通常会给每个请求增加500-800字节的负荷。比如说
cookie
,默认情况下,浏览器会在每次请求的时候,把cookie
附在header
上面发送给服务器。(由于cookie
比较大且每次都重复发送,一般不存储信息,只是用来做状态记录和身份认证)HTTP2.0
使用encoder
来减少需要传输的header
大小,通讯双方各自cache
一份header fields
表,既避免了重复header
的传输,又减小了需要传输的大小。高效的压缩算法可以很大的压缩header
,减少发送包的数量从而降低延迟。服务器推送:
服务器可以额外向客户端推送资源,无需客户端明确请求。