后端网络【免费下载链接】h2oH2O - the optimized HTTP/1, HTTP/2, HTTP/3 server项目地址https://gitcode.com/gh_mirrors/h2/h2o点击查看免费下载quicly 是 H2O HTTP 服务器内部使用的 IETF QUIC 协议实现从零编写、专为嵌入 H2O 而设计为其 HTTP/3 能力提供传输层基石。本文以 deps/quicly/README.md 为主线完整覆盖其构建、依赖、测试与cli命令行工具的客户端/服务端用法并结合仓库源码补充默认传输参数、选项语义与 H2O 集成细节帮助你从“能编译”走向“能调试、能调参、能理解”。quicly 是什么定位与设计目标根据 deps/quicly/README.md 的定义quicly 是一份IETF QUIC 协议实现IETF QUIC protocol implementation其最显著的特点是从零from the ground up编写并非对既有实现的移植或封装首要使用场景是嵌入 H2O HTTP 服务器为 H2O 提供 QUIC / HTTP/3 传输能力采用MIT License开源许可许可证全文见 deps/quicly/LICENSE。从仓库结构看quicly 的代码集中在 deps/quicly/lib核心实现与 deps/quicly/include/quicly公共头文件并依赖两个关键子库picotlsdeps/quicly/deps/picotls负责 TLS 1.3 握手与加解密quicly 通过ptls_*API 完成 QUIC 所需的传输层安全klibdeps/quicly/deps/klib提供哈希表、字符串、列表等基础容器。在协议版本方面从 deps/quicly/include/quicly.h 可以看到 quicly 定义了QUICLY_PROTOCOL_VERSION_1QUIC v1、QUICLY_PROTOCOL_VERSION_DRAFT29与QUICLY_PROTOCOL_VERSION_DRAFT27三个版本常量而 deps/quicly/lib/defaults.c 中默认上下文的initial_version为QUICLY_PROTOCOL_VERSION_1即以正式版 QUIC v1 作为默认协商版本同时保留对早期草案版本的兼容解析。构建 quicly前置条件构建 quicly 需要拉取子模块quicly 通过 git submodule 管理 picotls、klib 等依赖首次获取源码后必须执行git submodule update --init --recursiveOpenSSL 1.0.2 或以上版本README 明确给出这一版本下限。deps/quicly/CMakeLists.txt 在构建期即通过FIND_PACKAGE(OpenSSL REQUIRED)强制要求 OpenSSL并对OPENSSL_VERSION 1.0.2的情况直接报错中止。标准构建步骤cmake . makeCMake 脚本中还包含几个值得注意的默认行为默认 Release 构建CMAKE_BUILD_TYPE未指定时自动设为Releasedeps/quicly/CMakeLists.txt与 CMake 默认的 Debug 行为不同使用-stdc99 -Wall -g -DQUICLY_USE_TRACER1编译开启内置跟踪器支持Linux 下额外追加-D_GNU_SOURCE -pthreaddeps/quicly/CMakeLists.txt。指定非标准位置的 OpenSSL如果 OpenSSL 安装在非标准目录可以通过PKG_CONFIG_PATH环境变量告知 CMake 其 pkg-config 文件位置PKG_CONFIG_PATH/path/to/openssl/lib/pkgconfig cmake .构建产物一览构建完成后make会生成多个目标对应 deps/quicly/CMakeLists.txt目标说明libquiclyquicly 核心静态库lib/frame.c、lib/quicly.c、lib/cc-cubic.c、lib/loss.c等 14 个源文件cli可同时充当 QUIC 客户端与服务端的命令行工具见下文test.t单元测试可执行文件覆盖t/下的各模块测试simulator基于t/simulator.c的丢包/拥塞仿真程序examples-echo基于examples/echo.c的最小回显示例udpfwt/udpfw.c实现的 UDP 转发工具用于测试模拟丢包、延迟运行测试安装 Perl 测试依赖quicly 的测试体系依赖 Perl 生态Test::More、Net::EmptyPort、JSON等依赖清单见 deps/quicly/cpanfile需要先用cpanm安装# 使用系统 Perl 时加 --sudo curl -sL https://cpanmin.us | perl - --sudo --self-upgrade cpanm --installdeps --notest --sudo . # 使用用户级 Perl 时去掉 --sudo curl -sL https://cpanmin.us | perl - --self-upgrade cpanm --installdeps --notest .执行测试make checkcheck是 CMake 自定义目标deps/quicly/CMakeLists.txt它通过prove依次执行构建目录与t/目录下的所有*.tPerl 测试脚本并确保cli、udpfw、test.t已先构建完成。测试覆盖两大类单元测试t/simple.c、t/cc.c、t/frame.c、t/loss.c、t/ranges.c、t/rate.c、t/local_cid.c、t/remote_cid.c、t/sentmap.c、t/maxsender.c、t/pacer.c、t/jumpstart.c、t/stream-concurrency.c等逐模块验证帧解析、拥塞控制、丢包恢复、连接迁移等内部逻辑端到端测试如 deps/quicly/t/e2e.t会实际拉起cli服务端再以客户端发起请求。例如t/e2e.t中的 hello 用例执行$cli -e $tempdir/events -p /12 127.0.0.1 $port期望输出hello world并进一步检查事件日志能否被 misc/qlog-adapter.py 转换为标准 qlog 格式——这也是用端到端测试验证协议实现正确性的典型做法。使用 cli 运行 quiclycli源码位于 deps/quicly/src/cli.c是一个既可作为客户端、也可作为服务端的命令行程序。其行为由是否提供证书与私钥决定客户端模式只需给出对端主机名与端口号./cli host port例如连接本地 4433 端口并请求/12路径./cli -p /12 127.0.0.1 4433服务端模式需要提供证书、私钥文件以及要绑定的监听地址与端口./cli -c server.crt -k server.key 0.0.0.0 4433-c证书文件PEM 格式-k私钥文件绑定地址0.0.0.0表示监听所有 IPv4 接口端口 4433 为 QUIC/UDP 端口。仓库中可直接用于测试的证书/密钥对位于 deps/quicly/t/assets/server.crt 与 deps/quicly/t/assets/server.key也有 ECDSA 密钥对 deps/quicly/t/assets/ec256-key-pair.pem此外 deps/quicly/misc/quic-interop-runner 目录也提供了用于互操作测试的server.crt/server.key。查看全部选项./cli --helpusage()函数deps/quicly/src/cli.c会打印完整帮助包括下文列出的全部参数。cli 命令行选项全览根据./cli --help的输出即src/cli.c中的usage()可将选项按用途分类如下连接与运行模式选项说明host port位置参数客户端模式为对端地址服务端模式为监听地址与 UDP 端口-c cert-file服务端证书文件缺省时以客户端身份运行-k key-file服务端私钥文件与-c搭配-a alpnALPN 标识符可重复指定多个候选如h3-p path客户端请求的路径可多次指定-P path客户端请求的路径并将响应保存到文件可多次指定-O抑制输出压测时使用安全与握手选项说明-V使用系统默认 CA 证书校验对端-W public-key-file使用 RFC 7250 裸公钥客户端模式下指定期望的服务端公钥-s session-file会话票据session ticket的加载/存储文件用于 0-RTT 与会话恢复-N客户端强制启用 HelloRetryRequest-N即enforce_retry-n客户端强制启用版本协商-E展开 Client Hello发送多个 Initial 包以放大握手--ech-config fileECHEncrypted Client Hello配置列表文件置空文件可发送 ECH grease--ech-key file与--ech-config对应的 ECH 私钥-x named-group椭圆曲线命名组默认secp256r1-y cipher-suiteTLS 密码套件默认使用全部传输与流控制选项说明-b bytes发送/接收 UDP socket 缓冲区大小字节-u size初始 UDP 数据报负载大小-U size最大 UDP 数据报负载大小-M bytes单流最大数据量max stream data默认 1 MB-m bytes连接级最大数据量max data默认 16 MB-X最大双向流数量默认 100-I ms空闲超时默认 600,000 ms10 分钟--max-crypto-bytes NCRYPTO 流最大长度限制-B cid-key服务端 CID 加密密钥缺省随机生成-R服务端强制要求 Retry 数据包--sockfd fd使用指定的已创建 UDP socket 文件描述符-G启用 UDP 通用分段卸载GSO拥塞控制与丢包恢复选项说明-C algo[:iw[:p]]拥塞控制算法reno默认、cubic、cubic-legacy、pico、cuback可附加初始拥塞窗口包数默认 10与是否启用 pacing--jumpstart-default wnd新连接 jumpstart 拥塞窗口包数--jumpstart-max wnd会话恢复连接的最大 jumpstart 拥塞窗口--rapid-start开启 rapid start--disable-ecn关闭 ECN 支持默认开启--disregard-app-limited应用受限时也增大 CWND-f fraction将 ACK 频率提高到 CWND 的指定比例默认 0-r ms初始 PTO探测超时-S n推测性 PTO 次数-K n每发送 n 个包执行一次密钥更新--no-normalize-cc-mtu禁用拥塞窗口增长的包大小归一化调试与诊断选项说明-v/-vv详细输出-vv额外输出逐包 hexdump-e file事件日志文件可被 qlog-adapter 转换-l file记录流量密钥traffic secrets--exit-after-handshake握手结束后立即退出不发送应用数据--calc-initial-secret dcid给定 DCID 计算 Initial 阶段的客户端/服务端流量密钥--decrypt-packet secret[:dcid-len]给定流量密钥解密 QUIC 包并打印明文--encrypt-packet secret对未加密包按给定密钥加密输出-h打印帮助默认参数与调优源码中的两个内置 profilecli 的默认传输参数并非硬编码在cli.c而是来自 deps/quicly/lib/defaults.c 中的两个全局上下文quicly_spec_context采用 IETF 规范建议值deps/quicly/lib/defaults.cquicly_performant_context面向 HTTP 场景的延迟优化 profile主要差异在于使用QUICLY_LOSS_PERFORMANT_CONF的丢包恢复配置。cli 在main()中以ctx quicly_spec_context;作为起点deps/quicly/src/cli.c。两个 profile 的传输参数一致关键默认值如下对应-m、-M、-X、-I等选项的覆盖目标参数默认值max_data连接级流控16 MBmax_stream_data.bidi_local1 MBmax_stream_data.bidi_remote11 MBmax_stream_data.uni1 MBmax_streams_bidi100max_streams_uni0max_idle_timeout30,000 msmax_udp_payload_size1472 字节initial_egress_max_udp_payload_size1280 字节initcwnd_packets10 包max_crypto_bytes65,536 字节pre_validation_amplification_limit3放大攻击防护倍数handshake_timeout_rtt_multiplier400initial_versionQUIC v1enable_ratio.jumpstart开255enable_ratio.rapid_start关0enable_ratio.ecn开255enable_ratio.pacing关0理解这些默认值有助于解读./cli --help中“default”标注的来源例如-m的 16 MB、-M的 1 MB、-X的 100 流都与quicly_spec_context一一对应。实际接入 H2O 时这些参数同样以quicly_spec_context为蓝本在 src/main.c 中H2O 为每个 HTTP/3 listener 分配quicly_context_t时即执行*quic quicly_spec_context;再按配置覆盖。在 H2O 中的角色HTTP/3 的传输引擎quicly 之于 H2O 的核心价值体现在 HTTP/3 支持上。从 src/main.c 的集成代码可以看到完整的调用关系H2O 直接包含quicly.h并持有quicly_context_t、quicly_conn_t等对象src/main.c建立监听时通过quicly_amend_ptls_context()完善 TLS 上下文src/main.c并设置h2o_http3_alpn进行 ALPN 协商src/main.c服务端在收到 SNI 后可按证书配置动态切换拥塞控制算法quicly_set_cc()src/main.cHTTP/3 的 QPACK 动态表默认取 16 KB 编码/解码表src/main.c基于 UDP 的收包、Retry 校验、地址令牌验证与 QUIC 连接接受逻辑集中在on_http3_accept、validate_token等函数src/main.c。协议层之上的 HTTP/3 语义帧、QPACK、服务端逻辑位于 lib/http3frame.c、qpack.c、common.c、server.cquicly 则负责其下的传输与安全层。因此可以说H2O 的 HTTP/3 quiclyQUIC 传输 picotlsTLS 1.3 lib/http3HTTP 语义。小结quicly 是一个 MIT 许可、为 H2O 量身打造的 IETF QUIC 实现。通过git submodule update --init --recursive cmake . make即可完成构建make check跑通单元与端到端测试随后用cli一行命令就能搭起 QUIC 服务端或客户端。深入源码后还能看到cli的每个调优开关背后都对应 deps/quicly/lib/defaults.c 中的具体参数而 H2O 正是基于quicly_spec_context这个默认 profile叠加 src/main.c 中的集成逻辑将 quicly 变成本项目 HTTP/3 能力的传输基石。若要继续深入建议从 deps/quicly/include/quicly.h 的公开 API 与 deps/quicly/t 的测试用例入手前者定义协议常量与回调类型后者展示了每个模块的预期行为。赞分享后端网络【免费下载链接】h2oH2O - the optimized HTTP/1, HTTP/2, HTTP/3 server项目地址https://gitcode.com/gh_mirrors/h2/h2o点击查看免费下载相关推荐ngtcp2实现IETF QUIC协议的深度探索ngtcp2实现IETF QUIC协议的深度探索 项目介绍 ngtcp2 是一个致力于实现互联网工程任务组IETF定义的QUIC协议的开源项目。QUIC协网络通信CANN/ops-nn Swish激活函数算子aclnnSwish 查看源码 https://link.gitcode.com/i/4103db1e75f48bf2ca780e9bf98d9fae 产人工智能算子库深度学习CANNAscendquiche 实践指南用 Rust 构建 IETF QUIC 与 HTTP/3 应用quiche 实践指南用 Rust 构建 IETF QUIC 与 HTTP/3 应用 本篇技术指南以 Cloudflare 出品的 quiche 开源仓库主文网络通信后端上一篇Granite-4.1-8B工具调用终极教程3步实现天气查询/API集成等实用功能下一篇async-http-client与Quarkus原生应用终极性能优化指南创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
