http相关
HTTP1.0
HTTP/1.0是无状态、无连接的应用层协议
每一次请求都需要建立一个TCP链接,服务器处理完之后立即断开连接
通过cookie/session等进行身份认证
HTTP1.0 存在问题
无法复用
每次发送请求,都需要进行一次tcp连接,tcp的连接释放过程比较费时,使得网络利用率较低
HTTP1.1
继承自1.0 比较简单 克服了1.0部分问题
长连接
新增Connection
字段, 通过设置为keep-alive保持tcp通道的不中断
管道传输
只要第一个请求发出去了,不必等其回来,就可以发第二个请求出去,可以减少整体的响应时间。
HTTP1.1缺陷
- 请求/响应头部未经压缩发送,头部信息越多延迟越大,只能压缩body部分
- 冗长的头部,每次发送相同的头部会造成较多浪费
- 队头阻塞: 服务器按照请求顺序进行响应,如果服务器响应慢,会导致客户端一直无法请求到数据
- 没有请求优先级控制
- 请求只能从客户端到服务端,服务端只能被动接受
- 带宽利用率不高
- tcp慢启动,tcp通道建立后会先慢慢传输数据,之后逐步加快传输·
- 多条tcp通道会竞争带宽 造成不必要的损失
HTTP2.0
头部压缩
同时发送多个请求,如果头部一样,协议会帮忙消除重复部分
HPACK
算法: 客户端和服务端共同维护一张头信息表,
HTTP/2 会压缩头(Header)如果你同时发出多个请求,他们的头是一样的或是相似的,那么,协议会帮你消除重复的部分。
这就是所谓的 HPACK
算法:在客户端和服务器同时维护一张头信息表,所有字段都会存入这个表,生成一个索引号,以后就不发送同样字段了,只发送索引号,这样就提高速度了。
二进制传输
HTTP2不再像HTTP1的纯文本形式的报文,而是以二进制格式
传输 统称为帧 头信息帧 数据帧 ,对机器友好,加快传输效率 无需再将明文的报文转成二进制,而是直接解析二进制报文
多路复用
所有请求用的同一个tcp通道
服务器端推送
性能优化 将可用资源优先推送出去
HTTP2.0 缺陷
队头阻塞
http2.0通过多路复用 steam
的方式修复了对http1.1中队头阻塞的问题,但还是存在tcp的队头阻塞
HTTP/2 是基于 TCP 协议来传输数据的,TCP 是字节流协议,TCP 层必须保证收到的字节数据是完整且连续的,这样内核才会将缓冲区里的数据返回给 HTTP 应用,那么当「前 1 个字节数据」没有到达时,后收到的字节数据只能存放在内核缓冲区里,只有等到这 1 个字节数据到达时,HTTP/2 应用层才能从内核中拿到数据,这就是 HTTP/2 队头阻塞问题。
HTTP 1.1管道解决了请求的队头阻塞,没有解决响应的队头阻塞,服务端需要按顺序响应接受到的请求
HTTP2 解决了http层的队头阻塞,但没有解决tcp层的队头阻塞 一旦丢包,会触发tcp的重传机制, 阻塞所有的http请求
- HTTP/1.1 中的管道( pipeline)虽然解决了请求的队头阻塞,但是没有解决响应的队头阻塞,因为服务端需要按顺序响应收到的请求,如果服务端处理某个请求消耗的时间比较长,那么只能等响应完这个请求后, 才能处理下一个请求,这属于 HTTP 层队头阻塞。
- HTTP/2 虽然通过多个请求复用一个 TCP 连接解决了 HTTP 的队头阻塞 ,但是一旦发生丢包,就会阻塞住所有的 HTTP 请求,这属于 TCP 层队头阻塞。
HTTP3 采用了udp 搭配QUIC协议
QUIC 有以下 3 个特点。
- 无队头阻塞
底层协议用的udp quic协议会控制只有对应的那一个请求收到影响
- 更快的连接建立
- TLS层包含在quic协议内 tls请求
- 连接迁移
1.移动端 2.vpn切换 HTTP2 中 连接根据四元组确定一条tcp连接 【源ip,源端接,目标ip,目标端口】
http3 连接id