ylong_http 是一个用 Rust 编写的 HTTP 协议栈,核心亮点是其 高性能 HTTPS 代理模块 。 该项目最初为 OpenHarmony 系统构建,在 HTTPS 代理 方向完成了以下关键能力: - TLS 代理通信 :基于 OpenSSL 实现,支持代理服务器单向/双向证书验证 - 灵活的 TLS 配置 :支持客户端证书、私钥、算法套件等自定义配置 - 模块化代理架构 :将代
版权所有:中国计算机学会技术支持:开源发展技术委员会
京ICP备13000930号-9
京公网安备 11010802047560号
ylong_http
简介
ylong_http 构建了完整的 HTTP 能力,支持用户使用 HTTP 能力完成通信场景的需求。
ylong_http 使用 Rust 编写,为 OpenHarmony 的 Rust 能力构筑提供支持。
ylong_http 在 OpenHarmony 中的位置
ylong_http 向 OpenHarmony 系统服务层中的网络协议栈模块提供 HTTP 协议支持,经由网络协议栈模块帮助上层应用建立 HTTP 通信能力。
以下是对于上图关键字段的描述信息:
APP:需要使用上传下载能力的直接面向用户的上层应用。request:提供上传下载能力的系统组件。netstack:提供网络协议栈功能的系统组件。ylong_http:提供 HTTP 能力的系统组件。ylong_http_client:ylong_http下的模块之一,提供 HTTP 客户端能力。ylong_http:ylong_http下的模块之一,提供 HTTP 的基础能力。ylong_runtime:ylong提供的 Rust 异步运行时库。tokio:业界常用的第三方 Rust 异步运行时库。OpenSSL:业界常用的第三方 TLS 实现库。ylong_http 的内部架构:
ylong_http内部当前分为两个主要模块:ylong_http_client客户端模块和ylong_http协议组件模块。ylong_http_client模块负责提供 HTTP 客户端功能,能够支持用户发送 HTTP 请求,并接收 HTTP 响应,内部又分为三个主要部分:sync_impl:同步的 HTTP 客户端实现,该客户端实现不依赖于任何运行时,可以直接在线程模型上运行,但是整体使用同步阻塞策略。async_impl:异步的 HTTP 客户端实现,该客户端实现需要使用 Rust 的异步运行时组件。异步 HTTP 客户端利用 Rust 的异步能力,具有优异的性能表现。Util:同步和异步的 HTTP 客户端部分实现共通,例如自动重定向、HTTP 代理等。sync_impl和async_impl接口原型基本一致(主要是 Rust 异步语法与同步语法的差异),所以用户可以在较小的代码改动量下完成同步和异步逻辑的切换。sync_impl和async_impl的整体架构相同,分为如下模块:Client:对外提供 HTTP 客户端的基本接口,例如配置客户端的相关选项,发送 HTTP 请求等。ConnectionPool:主要负责大量连接管理,管理所有Dispatcher的生命周期,包括启动、运行、停止。HTTP 协议是基于连接的通信协议,涉及连接复用、连接管理等功能。Dispatcher:主要负责单一连接管理,管理单个连接的启动、运行、停止、传输。每个连接都被一个Dispatcher管辖,由Dispatcher决定当前待发送的请求是不是使用它管理的连接。Connections:连接对象,可以是 TCP 连接、TLS 连接或者是更加泛化的连接对象,在该连接上进行消息传输和接收,是Client和 HTTP 协议的底座。Connector:负责创建连接对象。Connector 也是一个 trait,用户可以使用它来定义创建连接时的行为。Util中包含了同步和异步的 HTTP 客户端共通的能力,例如:Redirect:HTTP 自动重定向能力。当 HTTP 响应返回重定向相关的状态码时,HTTP 客户端会进行自动重定向,并自动发送新的请求到下一跳。Proxy:HTTP 代理能力。发送 HTTP 请求时,向代理发送而非直接发送给原始服务器,然后由代理服务器返回原始服务器的响应。本分支在此基础上新增了完整的 HTTPS 代理 TLS 支持。Proxy (HTTPS):(新增) HTTPS 代理客户端完整支持,包括代理层 TLS 单/双向证书验证、H1/H2 CONNECT 隧道、代理连接池隔离等。Pool:通用连接池实现,支持多个同步或异步连接的管理,便于上层同步或异步客户端复用已有连接,减少连接重复创建次数,提高性能。OpenSSL_adapter:HTTPS 需要在 HTTP 的基础上使用 TLS 能力,在 OpenHarmony 上使用的是 OpenSSL,所以需要对 OpenSSL 的接口进行 Rust 封装。ylong_http模块负责提供 HTTP 的基础能力,例如 HTTP2 的 HPACK、HTTP3 的 QPACK 等,主要包含以下关键模块:Request:HTTP 请求基础能力,根据RFC9110规定实现了 HTTP 请求的所有内容和行为。HTTP 请求主要用于向指定服务器发送请求。Response:HTTP 响应基础能力,根据RFC9110规定实现了 HTTP 响应的所有内容和行为。HTTP 响应主要是服务器针对客户端请求的回应。Body: HTTP 消息体能力,根据RFC9110规定实现了 HTTP 消息体的所有内容和行为。HTTP 消息体保存主要数据内容,以便客户端和服务器通信。 HTTP 消息体在协议中有多种形式,在ylong_http库中有对应实现,例如EmptyBody对应于空消息体,TextBody对应于明文消息体,ChunkBody对应于分块消息体,Mime对应于 Multipart 消息体。H1:HTTP1 的所有基础能力,例如 HTTP1 格式的请求和响应的编码器和解码器等。H2:HTTP2 的所有基础能力,例如 HTTP2 格式的请求和响应的编码器和解码器、HTTP2 帧编码器和解码器、HPACK等。H3:HTTP3 的所有基础能力,例如 HTTP3 格式的请求和响应的编码器和解码器、QPACK 等。HTTPS 代理模块开发
本章节描述基于原项目为竞赛新增的 HTTPS 代理功能模块。
赛事任务概述
本分支完成了 ylong_http 客户端 HTTPS 代理模块开发,目标任务如下:
子任务1:HTTPS 代理支持
双层 TLS 架构
HTTPS 代理在已有 HTTP 能力之上新增了代理层的 TLS 加密,形成”代理 TLS + 目标 TLS”的双层安全通道:
执行流程:
CONNECT host:port请求建立隧道Proxy TLS 与 Origin TLS 是两套完全独立的配置,互不污染。连接池 Key 会区分 proxy endpoint、认证身份和 proxy TLS identity,避免不同配置的 TLS 会话混淆。
新增代理 TLS 配置项(共 18 个)
所有配置方法均通过
HttpProxyBuilder提供,以proxy_为前缀:proxy_tls_configproxy_ca_fileproxy_ca_pathproxy_add_root_certificateproxy_client_certificate_fileproxy_client_certificate_chain_fileproxy_client_private_key_fileproxy_client_private_key_file_with_passwordproxy_min_tls_versionproxy_max_tls_versionproxy_cipher_listproxy_cipher_suiteproxy_http1_alpnproxy_alpn_protocolsproxy_sniproxy_verify_hostnameproxy_tls_session_reuseproxy_danger_accept_invalid_certs使用示例
差异化错误处理
代理 TLS 错误提供精确的上下文定位,区分两种错误类型:
proxy_tls_setup_error:TLS 配置加载失败(证书/私钥文件不存在、格式错误等)proxy_tls_handshake_error:TLS 握手阶段失败(证书验证失败、算法套件不匹配等)错误信息包含代理地址、错误原因和完整错误上下文,便于快速排查问题。
独立计时体系
新增
proxy_tls_start/proxy_tls_end计时点,独立于 origin TLS 计时。配合原有的TimeGroup体系,可完整追踪从建立代理连接到完成请求的全链路耗时:子任务2:代理功能模块化
模块架构
将原有松散的代理逻辑重构为清晰的三层模块架构:
ProxyRoute trait — 核心路由抽象
三种具体路由实现:
is_proxiedis_tunnelDirectRoutefalsefalseHttpForwardRoutetruefalseHttpTunnelRoutetruetrue一次选路,多组件共享
整个请求生命周期中
match_route只执行一次,路由结果通过ProxyRouteRef(Arc<dyn ProxyRoute>)在 Client、Pool、Connector 之间共享,消除重复匹配:可扩展性设计
新增代理协议(如 SOCKS5)无需改动 Client、Pool、H1 encoder 等核心组件,只需:
ProxyRoutetrait 定义路由行为Proxies中注册新规则重构对比(以闭合 enum 方案 vs trait 多态方案):
显式化 H1 Request Target Form
新增
RequestTargetForm枚举,显式区分 H1 请求的两种目标形式:Origin:GET /path HTTP/1.1(直连和隧道场景)Absolute:GET http://origin/path HTTP/1.1(HTTP 代理转发场景)消除了 H1 encoder 中基于
is_proxy && scheme == HTTP的隐式推断,提升代码可读性和正确性。子任务3:性能对比
实验环境与测试设置
被测与对照:
tools/proxy_perf_driver内置本地拓扑;--mode both同参数双侧采集测试拓扑:
正式矩阵参数(Stage121 aligned):
warm_client_per_worker(每 worker 常驻 Client,目标 100% 连接复用)get_1kbimprovement = (ylong_rps - libcurl_rps) / libcurl_rps;正式目标 ≥ +20%测试场景:
口径说明:
占优场景总览
RPS 优势 — 吞吐量领先 libcurl
为什么 RPS 更高?
P50 优势 — 中位延迟更低(c8)
为什么 P50 更低?
match_route+ trait 多态直达 connectorP99 优势 — 尾部延迟控制(CONNECT)
为什么 P99 尾部更稳?
优化策略总结
① 连接复用与 Pool 精确命中
warm_client_per_worker:每 worker 常驻 Client,CONNECT/mTLS 100% connection reuse② Stage121 aligned worker 热路径优化
③ 模块化架构不拖累性能
util/proxy抽取后仍是一次match_route+ ProxyRoute trait 多态ProxyRouteRef,无HttpProxyExecutor等过渡 wrapper性能分析工具链
tools/proxy_perf_drivertrigger-elevated-wpr-profile.ps1export-xperf-*.ps1/pyanalyze-vtune-client-tids.ps1编译构建
若使用 GN 编译工具链, 在
BUILD.gn的deps段下添加依赖。添加后使用 GN 进行编译和构建:若使用 Cargo 编译工具链, 在
Cargo.toml下添加依赖。添加后使用cargo进行编译和构建:Feature 配置
syncasynchttp1_1http2tokio_basec_openssl_3_0c_openssl_1_1c_boringssl__tls常用编译命令:
测试
SDV 功能验证
覆盖场景:
库级单测
性能测试
目录
修改记录
本分支在原始代码基础上做了如下关键修改(共 20 个 curated commit):
feat: establish HTTPS proxy foundationtest: harden HTTPS proxy baseline coveragefeat: complete proxy TLS and timing controlstools: build proxy performance harness gatestest: close proxy verification and DNS boundariesfeat: modularize async proxy executor and H2 tunnelperf: align OpenSSL proxy benchmark baselineperf: evaluate H1 warm path candidatestools: add proxy tracing and elevated WPR harnesstest: close HTTPS proxy follow-up matrixtools: add WPR/xperf and SSL role diagnosticstools: expand CPU stack profiling exportsdocs: record runtime and readiness boundary analysistools: add async worker diagnosticsdocs: consolidate profiling refresh and scaling matrixtools: add VTune client thread attributionperf: align warm worker benchmark and final profiling evidencedocs: add HTTPS proxy product reportdocs: map curated proxy history nodesrefactor: restructure https proxy routing核心新增文件
ylong_http_client/src/util/proxy/route.rsylong_http_client/src/util/proxy/tls.rsylong_http_client/src/util/proxy/tunnel.rsylong_http_client/src/util/proxy/http.rsylong_http_client/src/util/proxy/no_proxy.rsylong_http_client/src/util/proxy/mod.rsylong_http_client/src/async_impl/connector/proxy.rsylong_http_client/tests/sdv_async_https_proxy.rstools/proxy_perf_driver/核心修改文件
ylong_http_client/src/util/config/settings.rsylong_http_client/src/util/monitor/time_group.rsylong_http_client/src/async_impl/client.rsylong_http_client/src/async_impl/pool.rsylong_http_client/src/util/pool.rsylong_http_client/src/util/c_openssl/ssl/stream.rs用户指南
详细内容请见用户指南
许可证
本项目基于 Apache License 2.0 协议开源。