目录

ylong_http — OpenHarmony 原生 Rust HTTP 协议栈

简介

ylong_http 是 OpenHarmony 官方原生的 Rust 网络协议栈,为系统应用与三方应用提供完整的 HTTP/1.1、HTTP/2、HTTP/3 客户端能力,包括连接池管理、TLS 握手、代理转发、重试/重定向等核心功能。本仓库在原有开源基线之上,面向赛题场景完成了三项能力补齐与性能优化工作。

项目背景

赛题启动时,ylong_http 存在三项明确的能力缺口:

  1. HTTPS 代理能力缺失:原代理链路仅支持客户端经由明文 TCP 到达 HTTP 代理,无法对接 https://proxy:port 形式的 HTTPS 代理;代理侧 OpenSSL FFI 层缺少私钥加载与校验接口,TlsConfigBuilderProxyBuilder 均不具备代理专属 TLS 配置(mTLS、ALPN 协商等)能力。

  2. 代理逻辑与核心连接器高度耦合:代理地址判断、CONNECT 隧道协商、代理侧 TLS 握手等逻辑全部内联在 HttpConnector 中,没有统一的代理抽象接口;HTTP/1 编码层通过反查 is_proxy: bool 决定请求行格式,协议语义不清晰,扩展新代理协议需在核心流程中堆叠分支。

  3. HTTPS 代理场景性能与 libcurl 存在差距:原实现对每次请求均重新执行 TCP/TLS/H2 三次握手,缺少代理侧 H2 连接复用与 TLS 会话恢复,在 HTTPS 代理基准场景下吞吐与延迟均落后于 libcurl,赛题要求实现 20%+ 性能提升。

我们的工作

针对上述三项缺口,按赛题子任务顺序完成了如下工作:

子任务 1 · 补齐 HTTPS 代理支持

  • OpenSSL FFI 扩展:新增 SSL_CTX_use_PrivateKey_file / SSL_CTX_check_private_key FFI 绑定,打通代理侧 mTLS 所需的底层密钥加载与校验链路。
  • TlsConfigBuilder 扩展:新增 private_key_file() 接口,支持客户端证书 + 私钥完整材料的配置,并在 build() 中执行一致性校验。
  • ProxyBuilder 代理专属 TLS 配置:新增 tls_ca_cert()tls_client_cert()tls_private_key()tls_cipher_list()tls_alpn_protos() 等细粒度接口,代理侧与目标站 TLS 配置严格隔离。
  • 双层 TLS 建链:在 async_impl/connector 中实现了 ProxyStream(代理阶段 I/O)与 MixStream(目标阶段 I/O)分层,支持 HTTP/HTTPS 目标均可经由 HTTPS 代理(含 H2 CONNECT 隧道)转发:
TCP → TLS(代理) [ProxyStream::Tls] → CONNECT → TLS(目标) [MixStream::Https]

子任务 2 · 代理功能模块化重构

  • ProxyStrategy trait:新增 async_impl/proxy_strategy.rs,定义统一的代理策略接口(connect()forward()try_forward_with_cached_session() 等),HttpProxy / HttpsProxy 各自实现,新增代理协议只需实现该 trait,核心连接器无需改动。
  • ProxyFactory 工厂:根据代理 scheme 自动创建对应策略实例,HttpConnector 收敛为调度器,不再内联代理细节。
  • RequestRoute 枚举:用 Direct / ForwardProxy / Tunnel 取代 is_proxy: bool,HTTP/1 编码层只消费路由语义,彻底消除代理类型与编码格式的隐式耦合。
  • **OuterProxyH2Pool**:代理侧 H2 session 复用池,支持按连接负载感知选择(H2LoadSnapshot),避免重复握手。

子任务 3 · HTTPS 代理场景性能优化

优化项 机制
代理侧 H2 连接复用 OuterProxyH2Pool 缓存并复用代理 H2 session,新请求直接在已有连接上开 CONNECT stream
TLS 会话恢复 Session Ticket/ID 写回前移至 poll_shutdown(),避免替换连接与写回产生竞态
H2 连接生命周期管理 ConnLifecycle(Alive/Draining/Dead)+ 跳感知的替换策略,消除向僵死连接发送请求
负载感知连接选择 多 session 下按 H2LoadSnapshot 指标选取压力最低的连接
死连接透明重试 幂等方法(GET/HEAD/PUT/DELETE 等)遇 ConnectionAborted 自动新建连接重发
ChannelChunk 缓冲复用 H2 Tunnel 写入侧引入缓冲回收池,减少频繁申请释放

基准测试环境:基于 Docker Compose 的三容器隔离环境(bench_client / bench_proxy / bench_origin),通过 tc netem 统一注入 RTT,同一条件下对比 ylong 与 libcurl。

代表性结果(c128 并发 / 128 KB 负载 / RTT 20 ms 复合场景):RPS 较 libcurl **+77.6%**,P99 延迟 **-86.9%**;综合各场景平均 RPS 提升超过 **20%**,达成赛题目标。

目录结构

.
├── ylong_http/                # 协议层:URI、Header、Body 编解码,H1/H2/H3 帧处理
├── ylong_http_client/         # 客户端层:连接池、connector、代理策略、TLS 适配
│   └── src/
│       ├── async_impl/        # 异步客户端实现
│       │   ├── client.rs      # Client / ClientBuilder
│       │   ├── pool.rs        # 连接池(H2 生命周期、负载感知)
│       │   ├── proxy_strategy.rs  # 代理策略(ProxyStrategy / ProxyFactory / OuterProxyH2Pool)
│       │   ├── mix.rs         # 流类型(ProxyStream / MixStream / H2TunnelStream)
│       │   ├── connector/     # 连接建立与代理调度
│       │   ├── conn/          # 协议收发(HTTP/1、HTTP/2、HTTP/3)
│       │   └── ssl_stream/    # 异步 TLS 适配层
│       └── util/
│           ├── c_openssl/     # OpenSSL FFI 封装(含私钥加载与校验)
│           ├── config/        # 配置选项(TlsConfigBuilder、ProxyBuilder 等)
│           └── information.rs # ConnData / RequestRoute
└── ylong-curl-proxy-benchmark/ # 基准测试框架(Docker 三容器 + ylong/curl 驱动)

许可证

本项目遵循 Apache License 2.0

关于

基于 ylong-http 现有架构,使用 Rust 补齐 HTTPS 代理功能

142.8 MB
邀请码
    Gitlink(确实开源)
  • 加入我们
  • 官网邮箱:gitlink@ccf.org.cn
  • QQ群
  • QQ群
  • 公众号
  • 公众号

版权所有:中国计算机学会技术支持:开源发展技术委员会
京ICP备13000930号-9 京公网安备 11010802047560号