全景
这一部分先回答「rustls 是什么、不是什么」,再看调用方怎么驱动它,最后把握手主线和记录主线从头到尾各走一遍。每一步只讲到能看清全貌的深度,细节链到 02 到 05 的页面。实验都在 M2 Max、macOS 27、rustc 1.99.0 上跑,rustls 0.23.46,握手在进程内存里或 127.0.0.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 对照为什么不能当库的结论。 - sans-IO:五个方法各只做一件事;握手期间有待发字节时
wants_read为假;漏掉write_tls循环空转、漏掉process_new_packets报message buffer full、发送缓冲满了write_all报WriteZero;Stream/StreamOwned一次write_all背后的五次套接字调用;没有close_notify的 EOF 是UnexpectedEof。 - 一次握手:两轮、九条记录,用
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 证书校验"]
💬 关联讨论
发起讨论加载中...