常用网站字体,超炫个人业务网站源码,手机网站建站教程,wordpress模板开发HTTP/2 虽然具有多个流并发传输的能力#xff0c;但是传输层是 TCP 协议#xff0c;依然存在缺陷#xff1a; 队头阻塞#xff0c;HTTP/2 是基于 TCP 协议来传输数据的#xff0c;TCP 是字节流协议#xff0c;TCP 层必须保证收到的字节数据是完整、连续的#xff0c;当「… HTTP/2 虽然具有多个流并发传输的能力但是传输层是 TCP 协议依然存在缺陷 队头阻塞HTTP/2 是基于 TCP 协议来传输数据的TCP 是字节流协议TCP 层必须保证收到的字节数据是完整、连续的当「前 1 个字节数据」没有到达时后收到的字节数据只能存放在内核缓冲区里只有等到这 1 个字节数据到达时这些数据才会作为一个整体发送给应用层这就是 HTTP/2 队头阻塞问题。 TCP 和 TLS 握手时延TCP 三次握手和 TLS 四次握手共有 3-RTT 的时延 连接迁移需要重新连接。我们是基于四元组源 IP、源端口、目的 IP、目的端口来确认一条 TCP 连接的那么网络环境变化后就会导致 IP 地址或端口变化于是 TCP 只能断开连接然后在新的网络环境中重新建立连接造成了时间成本 为了解决TCP的问题HTTP/3 就在传输层 改用 UDP并基于 UDP 在「应用层」实现了 QUIC 协议来保证数据的可靠传输。 QUIC 协议的特点 无队头阻塞QUIC 连接上的多个 Stream 之间是分离的互相独立的QUIC 能够正确区分。某个流发生丢包了只会影响该流其他流不受影响 对于HTTP/2如果一个B丢失了那么之后到来的A和C都不能正确接收了只有等这个缺失的B到来后才会将ABC统一发给HTTP层对于HTTP/3如果一个B丢失了QUIC会正常接收之后的A和C并把它们交给HTTP/3层无需等待这个缺失的B到来 建立连接速度快因为 QUIC 内部包含 TLS 1.3建立连接和密钥协商只需要1个RTT。当HTTP/3 第二次连接时有效负载数据与第一个数据包一起发送可以做到 0-RTT 连接迁移QUIC 协议 没有使用四元组而是使用 连接 ID 来标记通信的两端客户端和服务器可以各自选择一组 ID 来标记自己因此即使移动设备的 IP 地址变化了只要仍保有上下文信息比如连接 ID、TLS 密钥等就可以复用原连接不再需要重新建立连接 帧格式变化 HTTP/3 同 HTTP/2 一样采用二进制帧的结构不同的地方在于 HTTP/2 的二进制帧里需要定义 Stream而 HTTP/3 自身不需要再定义 Stream直接使用 QUIC 里的 Stream 所以HTTP/3 的帧格式就非常简单 头部压缩算法 HTTP/3 在头部压缩算法这一方面也做了升级升级成了 QPACK。 QPACK 也采用了静态表、动态表及 Huffman 编码。 对于静态表的变化HTTP/2 中的 HPACK 的静态表只有 61 项而 HTTP/3 中的 QPACK 的静态表扩大到 91 项。对于动态表的变化当编码方的更新动态表的请求出现丢包的时候解码方动态表就不能及时更新从而无法正确解码下一个报文。而QPACK专门设置了两个单向流一条用于编码方 向 解码方 发送请求另一条用于 解码方 发送更新完成的响应。在收到响应之后编码方才会发送下一个报文。这样就保证在下一次请求发送之前解码方的动态表已经完成了更新。