HTTP基本概念:超文本-传输-协议
是在计算机世界中两点之间传输文字,图片,视频等超文本数据的约定和规范。
HTTP 0.9版本:只有get请求,发出的请求没有请求头,没有版本号。已弃用
HTTP 1.0版本:新增了多种请求方式,新增了状态码:分别是信息响应(1XX),成功响应(2XX)、重定向响应(3XX)、客户端错误响应(4XX)和服务端错误响应(5XX),定义了消息头部等。存在的问题:每次发起一个请求都要新建一次TCP连接(三次握手)。而且是串行请求,做了无畏的TCP连接以及断开,增加通信开销。
HTTP 1.1版本:新增长连接通信方式,减少了TCP连接的重复建立和断开所造成的开销。可以在同一个TCP连接中,客户端可以发起多次请求,不必等其回来,就可以发送第二个请求。但是服务器还是按照顺序回应,因此存在队头阻塞问题:第一个请求处理的非常慢,即使第二个请求能够很快处理也不会去处理,导致客户端一直收不到数据。性能瓶颈:
- 请求头部未压缩就发送,只能压缩body部分。
- 请求时可能发送相同的头部,浪费较多。
- 服务器按顺序响应请求,如果服务慢则客户端一直收不到数据。
- 请求时没有优先级控制。
- 请求只能客户端请求,服务端被动相应。
HTTP 2.0版本:基于HTTPS,因此安全性也有了保障。2.0会压缩头部,如果同时发出多个请求,请求头是一样的,那么就会消除重复的部分,消除原理:在客户端和服务端同时维护了一张头信息表,所有字段都会存入这个表,生成索引号,以后不用发送相同字段,只需要发送索引号。2.0的报文采用二进制格式,头信息和数据都是二进制,统称为帧。相比于1.1文本形式增加了传输效率。每个请求或回应的数据称为数据流。每个数据流都有独一无二的编号,规定客户端发出的流编号为奇数,服务端为偶数。客户端可以指定流的优先级,优先级高的服务器优先响应。多路复用:在一个连接中并发多个请求或回应,而不是按照顺序一一对应。也就不会出现1.1中的对头阻塞问题,降低延迟,大幅度提高连接利用率。服务端也可以主动推送消息给客户端。举例来说,在浏览器刚请求 HTML 的时候,就提前把可能会用到的 JS、CSS 文件等静态资源主动发给客户端,减少延时的等待。存在缺陷:
- HTTP工作在应用层,多个HTTP请求复用一个TCP连接,下层的TCP不知道有多少请求复用,一旦发生了丢包现象,就会触发重传机制,此时所有HTTP请求都会等待丢失的包被重传回来。导致HTTP请求阻塞。
HTTP 3.0版本:为了解决2.0版本中的问题,3.0的下层采用UDP,因为UDP不管顺序以及是否到达,所以不会出现一个丢包全部重传问题。但是UDP是不可靠传输,还需要基于QUIC协议来实现类似TCP的可靠性传输。QUIC 有自己的一套机制可以保证传输的可靠性的。当某个流发生丢包时,只会阻塞这个流,其他流不会受到影响。