Quiet
  • 主页
  • 归档
  • 分类
  • 标签
  • 链接
  • 关于我

bajiu

  • 主页
  • 归档
  • 分类
  • 标签
  • 链接
  • 关于我
Quiet主题
  • 网络协议

HTTP/3详解

bajiu
网络协议

2024-11-11 14:13:00

之前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的接口请求了。

上一篇

在Hexo博客中配置Gitalk插件实现评论功能

下一篇

微信小程序生成二维码

©2025 By bajiu.