目录
http2和http3的区别
传输层协议
HTTP/2:
基于 TCP(传输控制协议)实现
HTTP/3:
在 HTTP/3 中,弃用 TCP 协议,改为使用基于 UDP 协议的 QUIC 协议实现
- QUIC(Quick UDP Internet Connections)协议(传输层协议)
QUIC协议
介绍
QUIC 协议实现在用户态,建立在内核态的 UDP 的基础之上,集成了 TCP 的可靠传输特性+ TLS1.3 协议,保证了用户数据传输的安全
- 具有建连快,连接迁移的优秀特性
- 解决了tcp的队头阻塞问题
- 实现了更好的拥塞/流量控制算法
连接建立与握手
HTTP/2:
需要进行 TCP 三次握手,然后再进行 TLS(传输层安全)握手
- 总共可能需要多次往返才能建立安全连接
建立安全连接的过程
首先,当客户端使用域名访问服务器时,需要借助DNS服务器来获取ip地址
传统http的建连需要TCP和TLS两个过程
- 三次握手需要1 RTT
- 交换秘钥需要2 RTT -- 客户端发起握手,服务端确认TLS版本+发送证书,客户端内部进行验证+生成对称密钥+加密发送,服务器确认
对于一个小请求(用户数据量较小)而言,传输数据只需要 1 个 RTT
RTT
RTT -- (Round-Trip Time,往返时延)
- 从发送方发送一个数据包开始,到接收到接收方返回的应答包为止的总时间
建连为什么需要两个过程
原因
因为TCP 和 TLS 没办法合并
TCP 是内核态协议:传统的 TCP 协议实现是在内核中的,属于操作系统内核的一部分,应用层无法修改其行为
TLS 是用户态协议:TLS 是应用层协议,运行在用户空间,比如浏览器或应用程序内
二者在物理上就不同(内核态/用户态),所以无法合并
解决
如果把tcp挪到用户态呢?
- 不可行,没法弃用内核里的 TCP
所有操作系统和网络设备(防火墙、路由器等)都已经高度适配和优化了 TCP 协议,内核级别实现是几十年演进的结果
想在用户态重写 TCP,意味着你得重新实现拥塞控制、重传机制、滑动窗口、头部格式、与 OS 协同等等,成本极高,而且还不一定跑得过内核版 TCP
更关键的是,没法让全球其他服务器配合你一起改内核,这不现实
既然干不掉,那就自定义一个传输层协议放在用户态.如何呢?
- 当然可行,既然 TCP 合并不了 TLS,那就自己造个轮子
- 在用户态实现后,再结合 TLS.就可以把两个建连过程合二为一了
- 这就是 QUIC协议 的实现思路
HTTP/3:
QUIC 协议将握手和加密过程合并,初次建连只需一次往返即可建立安全连接,减少了连接建立的延迟
- 并且,后续再次建连可以使用 0-RTT 特性
QUIC协议的1-RTT 建连
必要性
如果客户端与服务端初次建连(之前从未进行通信过),或者长时间没有通信过(0-RTT 过期了),只能进行 1-RTT 建连
<
- 只有先进行一次完整的 1-RTT 建连,后续一段时间内的通信才可以进行 0-RTT 建连