Rust in Everything
基于 rustls 0.23.46

全景

这一部分先回答「rustls 是什么、不是什么」,再看调用方怎么驱动它,最后把握手主线和记录主线从头到尾各走一遍。每一步只讲到能看清全貌的深度,细节链到 02 到 05 的页面。实验都在 M2 Max、macOS 27、rustc 1.99.0 上跑,rustls 0.23.46,握手在进程内存里或 127.0.0.1 上完成。

  1. rustls 解决什么问题:README 的定位;「不实现」清单逐条在代码里核实,CA:TRUE 的自签名证书当叶子报 CaUsedAsEndEntity;内存握手 ring 约 220 µs、aws-lc-rs 默认(X25519MLKEM768)约 250 µs、只用 X25519 约 210 µs;剥离后最小程序 1.64 MB 对 3.07 MB;和 OpenSSL 4.1.0 在回环上的吞吐都约每秒一千次,CPU 对照为什么不能当库的结论。
  2. sans-IO:五个方法各只做一件事;握手期间有待发字节时 wants_read 为假;漏掉 write_tls 循环空转、漏掉 process_new_packets 报 message buffer full、发送缓冲满了 write_all 报 WriteZero;Stream / StreamOwned 一次 write_all 背后的五次套接字调用;没有 close_notify 的 EOF 是 UnexpectedEof。
  3. 一次握手:两轮、九条记录,用 KeyLogFile 的密钥逐条解开:四条加密的握手消息合在一条 526 字节的记录里,票据用掉了服务端应用密钥的序列号 0;服务端不支持 X25519 时多一轮 HelloRetryRequest,下一次连接靠 kx_hint 直接猜中。
flowchart TB
  why[rustls 解决什么问题] --> sans[sans-IO]
  sans --> one[一次握手]
  sans --> rec["02 记录层"]
  one --> hs["03 握手"]
  why --> crypto["05 密码学提供者"]
  one --> ver["04 证书校验"]

💬 关联讨论

发起讨论
加载中...