之前HTTP/1
和HTTP2
的传送门HTTP各版本区别
关于HTTPS
和TLS
流程的在这里HTTPS简介
HTTP3协议是什么
HTTP/3
是 超文本传输协议(HTTP
) 的第三版,是继 HTTP/2
之后的最新版本协议,旨在提高网络传输效率、减少延迟、解决 HTTP/2
的队头阻塞问题,并提升在不稳定网络环境下的性能。
HTTP/3
的最大特点是它基于 QUIC
协议,这是一种运行在 UDP
(用户数据报协议) 之上的传输协议,而不是传统的 TCP
。
关键特性
1.基于 QUIC 协议:
- QUIC 是一种运行在 UDP 之上的传输层协议,提供可靠性、拥塞控制和多路复用。
- 与传统的 TCP+TLS 模型相比,QUIC 内置了加密和连接建立优化。
2.无队头阻塞(Head-of-line Blocking)问题:
- HTTP/2 虽然支持多路复用,但其底层依赖 TCP。如果 TCP 出现丢包,整个连接都会受到影响。
- QUIC 使用独立的数据流,即使某个数据包丢失,也不会阻塞其他流的数据传输。
3.更快的连接建立:
- 使用 0-RTT 或 1-RTT 连接建立,加速 HTTPS 会话启动。
- 避免了 TCP 的“三次握手”,显著减少了延迟。
4.内置加密:
- QUIC 内置 TLS 1.3,使得所有 HTTP/3 通信都是加密的。
- 增强了安全性并简化了协议栈。
5.更高的性能:
- 针对丢包的快速恢复机制。
- 对长距离、高延迟网络有更好的适应性。
优劣性
HTTP/3 的优势
- 低延迟: 快速的握手和多路复用减少了传输延迟。
- 更强的可靠性: 即使在网络状况较差的环境中,也能保证更高的传输效率。
- 易于部署: QUIC 在用户态实现,不需要操作系统内核更新。
HTTP/3 的不足
- 部署支持问题: 不同设备、网络和中间设备(如防火墙)对 QUIC 支持尚不一致。
- 实现复杂性: QUIC 的实现比传统的 TCP 更复杂,可能导致调试和维护成本上升。
应用场景
- 浏览器支持:目前主流浏览器(如
Chrome
、Firefox
、Edge
)已经支持HTTP/3
。 - 服务器支持:许多现代
Web
服务器(如Nginx
、Apache
、Cloudflare
)开始支持 HTTP/3,但需要手动配置。
使用场景:
- 高延迟网络(如移动网络、卫星网络)。
- 需要低延迟体验的应用(如实时通信、在线游戏)。
- 全球分布式服务(如 CDN、视频流服务)。
Q/A
HTTP/3 的主要特点,与 HTTP/2 相比有什么区别
- HTTP/3 基于 QUIC 协议,解决了 HTTP/2 的队头阻塞问题,采用 UDP 协议,内置加密和更快的连接建立等。
HTTP/3 如何解决 HTTP/2 的队头阻塞问题
- QUIC 的独立数据流设计,丢失的数据包只会影响当前流,其他流的数据可以继续传输。
HTTP/3 的内置加密机制和其对性能的影响
- HTTP/3 使用 QUIC 内置的 TLS 1.3,减少了协议层之间的交互,提升了安全性和传输效率,但加密计算开销可能增加。
HTTP/3 的多路复用是如何实现的,与 HTTP/2 的实现有何不同
- HTTP/3 的多路复用基于 QUIC 的流,每个流独立传输,丢包只影响单一流;HTTP/2 的多路复用在 TCP 层次,丢包会导致队头阻塞。
实践
用nodejs和支持http/3的库来搭建一个HTTP/3的服务:
1.安装支持 QUIC 的 http3 库
yarn add http3
2.创建 HTTP/3 服务
const http3 = require("http3");
const fs = require("fs");
// 加载 TLS 证书
const options = {
key: fs.readFileSync("server.key"), // 私钥文件
cert: fs.readFileSync("server.crt"), // 证书文件
allowHTTP1: true, // 支持 HTTP/1.1 以兼容老旧浏览器
};
// 创建 HTTP/3 服务器
const server = http3.createServer(options, (req, res) => {
if (req.method === "GET" && req.url === "/") {
res.end("Hello, HTTP/3! 🚀");
} else {
res.statusCode = 404;
res.end("Not Found");
}
});
// 启动服务器
const PORT = 4433;
server.listen(PORT, () => {
console.log(`HTTP/3 server is running at https://localhost:${PORT}`);
});
3.配置完TLS配置文件之后访问4433端口就能打开访问了,在浏览器中查看协议列就能找到显示为 h3的接口请求了。