HTTP协议到目前为止,所有的版本可以分为HTTP 0.9、1.0、1.1、2.0、和3.0,其中普遍应用的是HTTP 1.1版本,正在推进是HTTP 2.0版本,以及未来的HTTP 3.0版本。
HTTP1.0规定浏览器和服务器保持短连接,浏览器每次请求都需要与服务器建立一个TCP连接。HTTP1.0还规定下一个请求必须在前一个请求响应到达之前才能发送,如果前一个请求的响应一直不到达,那么下一个请求就不发送,后面的请求就都阻塞了,所以HTTP1.0存在请求的队头阻塞。HTTP1.0还不支持断点续传,每次都会传送全部的页面和数据, 在只需要部分数据的情况下就会浪费多余带宽。
HTTP 1.1解决了1.0版本存在的问题,它可以保持长连接,避免每次请求都要重复建立TCP连接,提高了网络的利用率。HTTP 1.1 可以使用管道传输,支持多个请求同时发送,但服务器还是按照顺序先回应前面的请求,再回应后面的请求,如果前面的回应特别慢,后面就会有许多请求排队等着处理。所以,HTTP 1.1 还是存在响应的队头阻塞问题。另外,HTTP 1.1已经可以断点续传。
HTTP 2.0是HTTP协议的第一个主要修订版,它与前面的版本用于传递数据的方法有很大的差异。
HTTP2.0会压缩头部,如果同时有多个请求其头部一样或相似,那么协议会消除重复部分。
HTTP 2.0 将请求和响应消息编码为二进制,而不再使用之前的纯文本消息,增加了数据传输的效率。
HTTP 2.0可以在一个TCP连接中并发多个请求或回应,而不用按照顺序一一对应,从而彻底解决了HTTP层面队头阻塞的问题,大幅度提高了连接的利用率。
HTTP 2.0还在一定程度上改善了传统的请求应答工作模式,服务端不再是被动地响应,而是可以主动向客户端发送消息、推送额外的资源。
HTTP 2.0虽然通过多个请求复用一个TCP连接解决了HTTP的队头阻塞 ,但是一旦发生丢包,就会阻塞住所有的HTTP请求,这就属于TCP层队头阻塞。为了解决这个问题,HTTP 3.0直接放弃使用TCP,将传输层协议改成UDP,但是因为UDP是不可靠传输,所以这就需要QUIC实现可靠机制。
QUIC全称 “快速 UDP 互联网连接”,是由Google提出的使用UDP进行多路并发传输的协议。
QUIC 有自己的一套机制可以保证传输的可靠性的。当某一对请求响应发生丢包时,只会阻塞当前的请求响应,其他请求响应不会受到影响,因此完全不存在队头阻塞问题。
HTTP 3 .0使用了UDP作为传输层协议,能够减少三次握手的时间延迟,从而达到快速建立连接的效果。此外,QUIC协议可以使用连接ID来标记通信的两个端点,即使移动设备的网络发送变化,导致IP地址变化了,只要还有连接ID和TLS密钥等上下文信息,就可以复用原连接,从而实现连接迁移。