Skip to content

Latest commit

 

History

History
37 lines (17 loc) · 2.19 KB

HTTP2.0.md

File metadata and controls

37 lines (17 loc) · 2.19 KB

HTTP1.0

HTTP/1.0 版的主要缺点是,每个TCP连接只能发送一个请求。发送数据完毕,连接就关闭,如果还要请求其他资源,就必须再新建一个连接。TCP连接的新建成本很高,因为需要客户端和服务器三次握手,并且开始时发送速率较慢(slow start)。

HTTP1.1

1997年1月,HTTP/1.1 版本发布,只比 1.0 版本晚了半年。它进一步完善了 HTTP 协议,一直用到了20年后的今天。

1.1 版的最大变化,就是引入了持久连接(persistent connection),即 TCP 连接默认不关闭,可以被多个请求复用。

1.1 版还引入了管道机制(pipelining),即在同一个 TCP 连接里面,服务端可以并行响应多个内容。

虽然1.1版允许复用 TCP 连接,但是同一个 TCP 连接里面,所有的数据通信是按次序进行的。服务器只有处理完一个回应,才会进行下一个回应。要是前面的回应特别慢,后面就会有许多请求排队等着。这称为"队头堵塞"(Head-of-line blocking)。

为了避免这个问题,只有两种方法:一是减少请求数,二是同时多开持久连接。这导致了很多的网页优化技巧,比如合并脚本和样式表、将图片嵌入CSS代码、域名分片(domain sharding)等等。如果HTTP协议设计得更好一些,这些额外的工作是可以避免的。

1.1版采用分块传输编码,产生一块数据,就发送一块,采用"流模式"(stream)取代"缓存模式"(buffer)。

HTTP2.0

1、数据格式

HTTP/1.1 版的头信息肯定是文本(ASCII编码),数据体可以是文本,也可以是二进制。HTTP/2 则是一个彻底的二进制协议,头信息和数据体都是二进制,并且统称为"帧"(frame):头信息帧和数据帧。

2、非堵塞

HTTP/2 复用TCP连接,在一个连接里,客户端和浏览器都可以同时发送多个请求或回应,而且不用按照顺序一一对应,这样就避免了"队头堵塞"。

3、实时双工

双向的、实时的通信,就叫做多工(Multiplexing)

HTTP/2 允许服务器未经请求,主动向客户端发送资源,这叫做服务器推送(server push)