{"id":35643927,"url":"https://github.com/78/quic-h3-client","last_synced_at":"2026-01-05T12:05:39.753Z","repository":{"id":326526409,"uuid":"1105944374","full_name":"78/quic-h3-client","owner":"78","description":"A pure python implemented QUIC HTTP/3 Client","archived":false,"fork":false,"pushed_at":"2025-11-28T11:53:17.000Z","size":163,"stargazers_count":2,"open_issues_count":0,"forks_count":0,"subscribers_count":0,"default_branch":"main","last_synced_at":"2025-11-30T19:09:17.988Z","etag":null,"topics":[],"latest_commit_sha":null,"homepage":null,"language":"Python","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":null,"status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/78.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":null,"code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null,"zenodo":null,"notice":null,"maintainers":null,"copyright":null,"agents":null,"dco":null,"cla":null}},"created_at":"2025-11-28T11:40:24.000Z","updated_at":"2025-11-29T02:18:22.000Z","dependencies_parsed_at":null,"dependency_job_id":null,"html_url":"https://github.com/78/quic-h3-client","commit_stats":null,"previous_names":["78/quic-h3-client"],"tags_count":null,"template":false,"template_full_name":null,"purl":"pkg:github/78/quic-h3-client","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/78%2Fquic-h3-client","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/78%2Fquic-h3-client/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/78%2Fquic-h3-client/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/78%2Fquic-h3-client/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/78","download_url":"https://codeload.github.com/78/quic-h3-client/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/78%2Fquic-h3-client/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":28216578,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","status":"online","status_checked_at":"2026-01-05T02:00:06.358Z","response_time":57,"last_error":null,"robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":true,"can_crawl_api":true,"host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":[],"created_at":"2026-01-05T12:03:32.760Z","updated_at":"2026-01-05T12:05:39.739Z","avatar_url":"https://github.com/78.png","language":"Python","funding_links":[],"categories":[],"sub_categories":[],"readme":"# HTTP/3 Client Pure Python Implementation\n\n一个从零实现的 QUIC/HTTP/3 轻型客户端（仅进行 API HTTP 请求），学习研究用。\n\n## 📋 目录\n\n- [项目简介](#项目简介)\n- [已实现功能](#已实现功能)\n- [未实现功能](#未实现功能)\n- [快速开始](#快速开始)\n- [项目结构](#项目结构)\n- [注意事项](#注意事项)\n\n---\n\n## 项目简介\n\n这是一个完全从零实现的 HTTP/3 客户端，遵循以下标准：\n- **RFC 9000**: QUIC: A UDP-Based Multiplexed and Secure Transport\n- **RFC 9001**: Using TLS to Secure QUIC\n- **RFC 9002**: QUIC Loss Detection and Congestion Control\n- **RFC 9114**: HTTP/3\n- **RFC 9204**: QPACK: Header Compression for HTTP/3\n\n### 设计目标\n\n- ✅ 轻量级实现，适合嵌入式设备\n- ✅ 支持 TLS 1.3 加密和 0-RTT 会话恢复\n- ✅ 完整的丢包检测和重传机制\n- ✅ QPACK 头部压缩（静态表 + 动态表解码）\n- ✅ 多流并发请求\n\n### 适用场景\n\n- 需要快速连接建立的场景（0-RTT）\n- 学习和研究 QUIC/HTTP/3 协议\n\n---\n\n## ✅ 已实现功能\n\n### QUIC 协议层\n\n#### 连接管理\n- ✅ **连接建立**: Initial → Handshake → 1-RTT 完整流程\n- ✅ **TLS 1.3 加密**: \n  - AEAD-GCM-128/256 加密\n  - X25519 密钥交换\n  - 证书验证\n- ✅ **0-RTT 会话恢复**: Session Ticket 支持，加速后续连接\n- ✅ **Key Update**: RFC 9001 Section 6，支持 1-RTT 密钥轮换\n  - 主动发起密钥更新（`initiate_key_update()`）\n  - 处理对端发起的密钥更新\n  - Key Phase bit 正确设置和检测\n  - 过渡期密钥管理（支持新旧密钥并存）\n- ✅ **优雅关闭**: CONNECTION_CLOSE 帧处理\n- ✅ **Stateless Reset**: 检测和处理无状态重置包\n- ✅ **Connection ID 管理**: \n  - NEW_CONNECTION_ID 帧发送和接收\n  - RETIRE_CONNECTION_ID 帧处理（自动和手动）\n  - 根据 `retire_prior_to` 自动退休旧连接 ID\n- ✅ **路径验证**: \n  - PATH_CHALLENGE (0x1a) 帧发送和接收\n  - PATH_RESPONSE (0x1b) 帧自动响应\n  - 主动路径验证 API (`send_path_challenge()`, `validate_path_async()`)\n  - 支持网络切换场景的路径探测\n\n#### 流控制\n- ✅ **连接级流控**: MAX_DATA 帧\n- ✅ **流级流控**: MAX_STREAM_DATA 帧\n- ✅ **流限制**: MAX_STREAMS_BIDI/UNI 帧\n\n#### 丢包检测与恢复\n- ✅ **RTT 估算**: 基于 RFC 9002 的 RTT 平滑算法\n- ✅ **丢包检测**: \n  - 时间阈值检测（9/8 × RTT）\n  - 包数阈值检测（3 个包）\n- ✅ **PTO 探测**: Probe Timeout 机制，防止连接卡死\n- ✅ **ACK 处理**: 发送和接收 ACK 帧\n- ✅ **帧重传**: CRYPTO 和 STREAM 帧自动重传\n\n#### 拥塞控制\n- ✅ **CWND 窗口管理**: 基于 RFC 9002 的拥塞窗口控制\n- ✅ **Slow Start**: 慢启动算法，初始窗口 14720 字节（10 × MTU）\n- ✅ **Congestion Avoidance**: 拥塞避免阶段线性增长\n- ✅ **AIMD**: 加性增乘性减算法（NewReno 风格）\n- ✅ **Recovery 状态**: 丢包时的拥塞恢复机制\n- ✅ **Persistent Congestion**: 持续拥塞检测和窗口重置\n\n#### 帧类型支持\n- ✅ PADDING (0x00)\n- ✅ PING (0x01)\n- ✅ ACK (0x02)\n- ✅ CRYPTO (0x06)\n- ✅ NEW_TOKEN (0x07)\n- ✅ STREAM (0x08-0x0f)\n- ✅ MAX_DATA (0x10)\n- ✅ MAX_STREAM_DATA (0x11)\n- ✅ MAX_STREAMS_BIDI (0x12)\n- ✅ MAX_STREAMS_UNI (0x13)\n- ✅ NEW_CONNECTION_ID (0x18)\n- ✅ RETIRE_CONNECTION_ID (0x19)\n- ✅ PATH_CHALLENGE (0x1a)\n- ✅ PATH_RESPONSE (0x1b)\n- ✅ CONNECTION_CLOSE (0x1c)\n- ✅ CONNECTION_CLOSE_APP (0x1d)\n- ✅ HANDSHAKE_DONE (0x1e)\n- ✅ DATAGRAM (0x30/0x31) - RFC 9221 扩展\n\n#### DATAGRAM 扩展 (RFC 9221)\n- ✅ **max_datagram_frame_size**: Transport Parameter 协商\n- ✅ **DATAGRAM 帧**: 发送和接收不可靠数据报\n- ✅ **可配置支持**: 通过 `enable_datagram` 参数启用\n- ✅ **异步接收**: `recv_datagram()` 异步 API\n\n### HTTP/3 协议层\n\n#### 流管理\n- ✅ **Control Stream**: 初始化和 SETTINGS 交换\n- ✅ **QPACK Encoder Stream**: 接收服务器动态表更新\n- ✅ **QPACK Decoder Stream**: 发送解码指令\n- ✅ **请求流**: 双向流，支持并发请求\n\n#### QPACK 头部压缩\n- ✅ **静态表编码**: 发送请求时使用静态表索引\n- ✅ **静态表解码**: 解码响应头中的静态表引用\n- ✅ **动态表解码**: 完整支持服务器动态表更新和解码\n- ✅ **Huffman 解码**: 响应头中的 Huffman 编码解码\n- ✅ **Section Acknowledgment**: 发送解码确认\n\n#### HTTP/3 帧\n- ✅ **HEADERS (0x01)**: 请求/响应头\n- ✅ **DATA (0x00)**: 请求/响应体\n- ✅ **SETTINGS (0x04)**: 协议设置\n- ✅ **GOAWAY (0x07)**: 优雅关闭流程（RFC 9114 Section 5.2）\n- ✅ **MAX_PUSH_ID (0x0d)**: 推送 ID 限制\n\n#### 功能特性\n- ✅ **并发请求**: 单连接多流并发\n- ✅ **流重组**: 处理乱序到达的数据\n- ✅ **优雅关闭**: GOAWAY 帧支持，完整的 graceful shutdown API\n- ✅ **Wireshark 支持**: SSLKEYLOGFILE 格式密钥日志\n\n---\n\n## ❌ 未实现功能\n\n### 高优先级（建议实现）\n\n---\n\n### 中优先级（可选实现）\n\n#### 🟡 高级拥塞控制算法\n- ❌ **Cubic**: 基于立方函数的拥塞控制算法\n- ❌ **BBR**: Google 的基于带宽和 RTT 的拥塞控制算法\n\n**当前状态**: 已实现基于 RFC 9002 的 NewReno 风格拥塞控制（Slow Start + AIMD）\n\n**影响**: 在某些网络环境下，高级算法可能提供更好的性能\n\n---\n\n### 低优先级（可选实现）\n\n#### 🟢 Server Push\n- ❌ **PUSH_PROMISE (0x05)**: 推送承诺帧处理\n- ❌ **Push Stream**: 推送流处理\n\n**当前状态**: 仅定义常量，无实际处理逻辑。MAX_PUSH_ID 设置为 0，明确禁用 Server Push。\n\n**说明**: 虽然 HTTP/3 (RFC 9114) 协议层面仍然支持 Server Push，但在实际应用中已经很少使用：\n- 服务器难以准确判断客户端需要哪些资源，容易浪费带宽\n- 主流浏览器和客户端实现已经很少支持或默认禁用此功能\n- 现代 Web 开发更倾向于使用其他优化技术（如预加载、预连接等）\n\n**影响**: 无法接收服务器推送资源（实际应用中通常不需要）\n\n\n#### 🟢 QPACK 动态表编码\n- ❌ **客户端动态表**: 使用动态表压缩请求头\n- ❌ **动态表管理**: 插入、复制、容量设置\n\n**当前状态**: 只用静态表 + 字面量\n\n**影响**: 请求头压缩率不够高（但对嵌入式设备影响小）\n\n#### 🟢 Huffman 编码\n- ❌ **请求头 Huffman 编码**: 发送请求时压缩字符串\n\n**当前状态**: 只有解码，编码用原始字符串\n\n**影响**: 对嵌入式设备影响很小\n- API 请求头通常很短，Huffman 压缩收益有限（可能只节省几个字节）\n- 编码需要额外的 CPU 和内存开销，收益不明显\n- 2Mbps 带宽对 API 请求已足够\n- 解码已实现，不影响接收服务器响应\n\n#### 🟢 ECN 支持\n- ❌ **ACK_ECN (0x03)**: 显式拥塞通知\n\n**影响**: 无法利用 ECN 信号优化传输\n\n---\n\n### 扩展功能（可选）\n\n#### ✅ DATAGRAM 帧 (已实现)\n- ✅ **RFC 9221**: DATAGRAM 扩展支持\n- ✅ `max_datagram_frame_size` Transport Parameter 协商\n- ✅ 发送和接收 DATAGRAM 帧 (0x30/0x31)\n- ✅ 异步接收 API (`recv_datagram()`, `recv_datagram_nowait()`)\n\n**用途**: WebRTC、实时游戏等低延迟场景\n\n**用法**:\n```python\n# 创建连接时启用 DATAGRAM\nclient = QuicConnection(\"example.com\", 443, enable_datagram=True)\n\n# 检查是否可用\nif client.datagram_available:\n    # 发送数据报\n    client.send_datagram(b\"Hello!\")\n    \n    # 异步接收数据报\n    data = await client.recv_datagram(timeout=5.0)\n```\n\n#### ⚪ WebTransport\n- ❌ **WebTransport over HTTP/3**: 双向流传输\n\n**当前状态**: EXTENDED_CONNECT 设置已改为 0（嵌入式设备不需要）\n\n---\n\n## 🚀 快速开始\n\n### 安装依赖\n\n```bash\npip install -r requirements.txt\n```\n\n### 基本使用\n\n```bash\n# 单个请求\npython main.py api.tenclass.net\n\n# 指定路径和端口\npython main.py cloudflare-quic.com -p 443 --path /\n\n# 并发请求\npython main.py -c api.tenclass.net --paths /health /api/status\n\n# 0-RTT 模式（首次连接保存会话）\npython main.py api.tenclass.net -s session.json\n\n# 使用保存的会话（0-RTT）\npython main.py api.tenclass.net -s session.json\n```\n\n### 运行示例\n\n以下是一个完整的运行示例，展示访问 www.taobao.com 的 HTTP/3 请求：\n\n```bash\n$ python main.py www.taobao.com --path / -q\nHTTP/3 Client - Keys will be written to quic_keys.log (Wireshark SSLKEYLOGFILE format)\nMode: SINGLE REQUEST\nTarget: https://www.taobao.com:443/\nPress Ctrl+C to exit\n\n============================================================\nHTTP/3 Client\n============================================================\n    Key log file: quic_keys.log\n\n[1] Connecting to www.taobao.com:443...\n\n[2] Starting QUIC handshake...\n\n[3] Handshake result: SUCCESS ✅\n\n    === Handshake Summary ===\n    Initial packets received: 1\n    Handshake packets received: 5\n    Initial CRYPTO: 90 bytes\n    Handshake CRYPTO: 5566 bytes\n\n[4] Sending HTTP/3 GET request to /...\n----------------------------------------\n\n[5] HTTP/3 Response:\n----------------------------------------\n\n    === Response for / ===\n    Status: 200\n\n    Headers:\n      :status: 200\n      timing-allow-origin: Tengine\n      content-type: text/html; charset=utf-8\n      vary: accept-encoding\n      date: Fri, 01 Jan 2025 12:00:00 GMT\n      vary: Accept-Encoding\n      x-server-id: xxx...\n      x-air-hostname: xxx...\n      x-air-trace-id: xxx...\n      cache-control: max-age=0, s-maxage=139\n      x-node: xxx...\n      x-eagleeye-id: xxx...\n      x-wh-action: crossEngineRewrite\n      x-retmsg: ok\n      x-content-type: text/html; charset=utf-8\n      vary: Ali-Detector-Type, X-Host, x-accept-terminal, x-document-bundle, Accept-Encoding, Origin\n      streaming-parser: open\n      x-retcode: SUCCESS\n      etag: W/\"xxx...\"\n      x-readtime: 367\n      x-via: xxx...\n      x-air-source: proxy\n      x-xss-protection: 1; mode=block\n      ups-target-key: xxx...\n      x-protocol: HTTP/1.1\n      eagleeye-traceid: xxx...\n      strict-transport-security: max-age=31536000\n      s-brt: 368\n      s-rt: 370\n      via: xxx...\n      age: 77\n      ali-swift-global-savetime: xxx...\n      x-cache: HIT TCP_MEM_HIT dirn:-2:-2\n      x-swift-savetime: Fri, 01 Jan 2025 12:00:00 GMT\n      x-swift-cachetime: 139\n      x-air-pt: pt0\n      timing-allow-origin: *\n      eagleid: xxx...\n\n    Body (90674 bytes):\n      \n\n\u003c!DOCTYPE html\u003e\u003chtml lang=\"zh-CN\"\u003e\u003chead\u003e\u003cmeta charSet=\"utf-8\"/\u003e\u003cmeta http-equiv=\"X-UA-Compatible\" content=\"IE=edge,chrome=1\"/\u003e\u003cmeta name=\"renderer\" content=\"webkit\"/\u003e\u003cmeta name=\"viewport\" content=\"width=1200\"/\u003e\u003cmeta name=\"ice-meta-count\" content=\"0\"/\u003e\u003ctitle\u003e淘宝\u003c/title\u003e\u003cmeta name=\"description\" content=\"淘宝网 - 亚洲较大的网上交易平台，提供各类服饰、美容、家居、数码、话费/点卡充值… 数亿优质商品，同时提供担保交易(先收货后付款)等安全交易保障服务，并由商家提供退货承诺、破损补寄等消费者保障服务，让你安心享受网上购物乐趣！\"/\u003e\u003cmeta name=\"keywords\" content=\"淘宝,掏宝,网上购物,C2C,在线交易,交易市场,网上交易,交易市场,网上买,网上卖,购物网站\n      ... (86303 more bytes)\n\n[7] Closing connection...\n----------------------------------------\n\n    === Final Statistics ===\n    UDP packets received: 77\n    Bytes received: 100876\n    Packets sent: 83\n    Initial packets: 1\n    Handshake packets: 5\n    1-RTT packets: 72\n\n============================================================\n```\n\n### 代码示例\n\n```python\nimport asyncio\nfrom client import QuicConnection\n\nasync def main():\n    client = QuicConnection(\"api.example.com\", 443, debug=True)\n    await client.connect()\n    \n    # 发送 GET 请求\n    response = await client.request(\"GET\", \"/api/data\")\n    print(f\"Status: {response['status']}\")\n    print(f\"Body: {response['body']}\")\n    \n    # 优雅关闭连接\n    await client.graceful_shutdown()\n\nasyncio.run(main())\n```\n\n---\n\n## 📁 项目结构\n\n```\nhttp3-client/\n├── client/              # QUIC 客户端核心实现（组件化架构）\n│   ├── connection.py    # 主协调器：连接管理、数据包处理、UDP 协议封装\n│   ├── crypto_manager.py # 密钥派生、加密/解密、Key Update\n│   ├── flow_controller.py # 流控：MAX_DATA、MAX_STREAM_DATA\n│   ├── ack_manager.py   # ACK 帧生成和跟踪\n│   ├── frame_processor.py # 帧解析和分发\n│   ├── h3_handler.py    # HTTP/3 协议层：QPACK、请求/响应处理\n│   └── loss_detection.py # 丢包检测、PTO、拥塞控制\n├── quic/                # QUIC 协议实现\n│   ├── crypto/          # 加密相关\n│   ├── frames/          # 帧构建和解析\n│   └── packets/         # 数据包构建和解析\n├── h3/                  # HTTP/3 协议实现\n│   ├── frames.py        # HTTP/3 帧处理\n│   ├── qpack.py         # QPACK 头部压缩\n│   └── streams.py       # 流管理\n├── tls/                 # TLS 1.3 实现\n│   ├── handshake.py     # TLS 握手\n│   └── session.py       # 会话管理\n├── utils/               # 工具函数\n│   └── keylog.py        # Wireshark 密钥日志\n└── main.py              # 主入口\n```\n\n---\n\n## ⚠️ 注意事项\n\n### 嵌入式设备限制\n\n1. **EXTENDED_CONNECT**: 已设置为 0，不支持 WebTransport\n2. **带宽限制**: 针对 2Mbps 环境优化\n3. **内存占用**: 动态表容量限制为 4096 字节\n4. **并发流**: 默认限制较低，适合简单 API 请求\n5. **Server Push**: MAX_PUSH_ID 设置为 0，明确禁用服务器推送（实际应用中已很少使用）\n\n### 已知限制\n\n1. **连接迁移**: 已支持 PATH_CHALLENGE/PATH_RESPONSE 路径验证，但网络切换时可能需要手动重建 socket\n2. **无 Server Push**: MAX_PUSH_ID 设置为 0，不支持服务器推送（符合实际应用趋势）\n3. **QPACK 编码**: 只使用静态表，压缩率有限\n4. **拥塞控制算法**: 使用基础的 NewReno 算法，未实现 Cubic/BBR 等高级算法\n\n### 调试功能\n\n- 启用 `debug=True` 查看详细日志\n- 使用 `-k` 参数生成密钥日志文件，可在 Wireshark 中解密流量\n- 支持 SSLKEYLOGFILE 环境变量\n\n### 性能建议\n\n- 对于嵌入式设备，建议：\n  - 使用 0-RTT 会话恢复减少握手时间\n  - 限制并发流数量\n  - 适当调整流控窗口大小\n  - 监控 RTT 和丢包率\n\n---\n\n## 📚 参考标准\n\n- [RFC 9000](https://www.rfc-editor.org/rfc/rfc9000.html): QUIC: A UDP-Based Multiplexed and Secure Transport\n- [RFC 9001](https://www.rfc-editor.org/rfc/rfc9001.html): Using TLS to Secure QUIC\n- [RFC 9002](https://www.rfc-editor.org/rfc/rfc9002.html): QUIC Loss Detection and Congestion Control\n- [RFC 9114](https://www.rfc-editor.org/rfc/rfc9114.html): HTTP/3\n- [RFC 9204](https://www.rfc-editor.org/rfc/rfc9204.html): QPACK: Header Compression for HTTP/3\n- [RFC 9221](https://www.rfc-editor.org/rfc/rfc9221.html): An Unreliable Datagram Extension to QUIC\n\n---\n\n## 📝 更新日志\n\n### 最新更新\n- ✅ 实现 DATAGRAM 扩展（RFC 9221）\n  - 添加 `max_datagram_frame_size` Transport Parameter\n  - 支持发送 DATAGRAM 帧 (0x30/0x31)\n  - 支持接收 DATAGRAM 帧并通过回调处理\n  - 添加 `send_datagram()` 方法发送不可靠数据报\n  - 添加 `recv_datagram()` 和 `recv_datagram_nowait()` 接收 API\n  - 添加 `datagram_available` 和 `max_datagram_size` 属性\n  - 通过 `enable_datagram=True` 参数启用\n- ✅ 实现 PATH_CHALLENGE 和 PATH_RESPONSE（RFC 9000 Section 19.17-19.18）\n  - 支持发送和接收 PATH_CHALLENGE (0x1a) 帧\n  - 自动响应服务器发送的 PATH_CHALLENGE，发送 PATH_RESPONSE (0x1b) 帧\n  - 实现 `send_path_challenge()` 方法主动发送路径挑战\n  - 实现 `validate_path_async()` 方法进行异步路径验证\n  - 支持网络切换场景的路径探测和验证\n  - 在 `--chat` 测试中添加路径验证测试（10 秒等待期）\n- ✅ 实现 GOAWAY（RFC 9114 Section 5.2）\n  - 支持发送和接收 GOAWAY 帧\n  - 实现 `send_goaway()` 方法发送 GOAWAY 帧\n  - 实现 `graceful_shutdown()` 方法进行完整的优雅关闭流程\n  - 收到 GOAWAY 后正确处理流 ID 限制\n  - 支持等待待处理请求完成后再关闭连接\n- ✅ 实现 RETIRE_CONNECTION_ID（RFC 9000 Section 19.16）\n  - 支持发送和接收 RETIRE_CONNECTION_ID 帧\n  - 根据 NEW_CONNECTION_ID 的 `retire_prior_to` 自动退休旧连接 ID\n  - 正确处理对端发起的连接 ID 退休请求\n  - 添加测试函数 `test_retire_connection_id()` 和 `--test-retire-cid` 参数\n- ✅ 实现 Key Update（RFC 9001 Section 6）\n  - 支持主动发起 1-RTT 密钥轮换\n  - 支持处理对端发起的密钥更新\n  - Key Phase bit 正确设置和检测\n  - 过渡期密钥管理，确保数据包正确解密\n- ✅ 实现拥塞控制（Slow Start + Congestion Avoidance + AIMD）\n- ✅ 实现 Stateless Reset 检测和处理\n- ✅ 完善 QPACK 动态表解码\n- ✅ 优化流重组逻辑\n\n---\n\n## 📄 许可证\n\n本项目仅供学习和研究使用。\n\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2F78%2Fquic-h3-client","html_url":"https://awesome.ecosyste.ms/projects/github.com%2F78%2Fquic-h3-client","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2F78%2Fquic-h3-client/lists"}