HTTP/1.0 的通信
- 每完成一次请求和响应,TCP 连接就会断开。
HTTP/1.1 的通信
- TCP 连接有 RTT(Round Trip Time,就是往返时延的),每次请求一个资源就要有一次 RTT,用户可是等不得这种慢节奏的响应。
- 到了 1.1,tcp 可以持久连接了,请求同域名下的 n 个资源,可以节约(n-1)*rtt 的时间
- http 管道技术虽然实现了客户端向服务器并行发送多个请求,但是 1.1 有严格的串行返回机制(前一个响应没有完成,下一个响应就不能返回),如果第一个响应时间很长,那么后面的响应处理完了也没法发送,只能被缓存起来,占用服务器内存。
SPDY
- 谷歌推出的传输协议,最终演变成 HTTP/2
HTTP/2.0
二进制分帧层,多向请求与响应,优先级与依赖性,首部压缩,服务器推送
二进制分帧层
- tcp 连接在客户端和服务器间建立了一条运输的通道,可以双向通信
- 当一端要向另一端发送消息的时候,把这个拆成几部分(帧),然后通过发起一个流来对这些帧进行发送,最后在另一端将同一个流的帧组合
- 就好比搬家,先把桌子拆成零件,再通过几次的搬运,到了新家,再把桌子重新拼装起来
多向请求与响应(多路复用)
- 一端发送消息会先对消息进行拆分,与此同时,也会给同一个消息拆分出来的帧带上一个编号(stream ID),这样另一端接受这些帧后就可以根据编号进行组合
优先级和依赖性
- 流可以有一个优先级属性
首部压缩
- 在客户端和服务器各自维护一个首部表,表中用索引代表首部名,上一次发送,两端都会记住已发送哪些首部,下一次传输只用传输差异的数据,相同的数据直接用索引表示即可。
服务器推送
- 服务器可以对一个客户端请求发送多个响应,也就是说,除了对最初请求的响应外,服务器还可以额外向客户端推送资源
由上可得 http/2
- 通过二进制分帧和多路复用机制,有效解决了 1.x 下请求/响应延迟的问题
- 新的首部压缩技术使得 1.x 首部信息臃肿的问题得到解决
- 优先级和依赖性与服务器推送使得我们可以更有效地利用好这个单一的 tcp 连接