smoltcp 技术文档
路径:
components/starry-smoltcp类型:库 crate 分层:组件层 / TCP/IP 协议栈本体 版本:0.12.0文档依据:Cargo.toml、README.md、src/lib.rs、tests/netsim.rs、examples/*、benches/bench.rs、fuzz/fuzz_targets/*
smoltcp 是仓库中引入并维护的一份独立 TCP/IP 协议栈源码。它提供的是事件驱动的协议状态机、接口层、设备抽象和报文表示,而不是 ArceOS/StarryOS 直接面向系统调用或应用的网络模块。在本仓库里,真正把它接到驱动、等待模型、地址族抽象和系统接口上的,是 ax-net 与 ax-net-ng。
最关键的边界是:smoltcp 负责协议与报文,不负责操作系统策略。路由装配、阻塞/非阻塞等待、超时、Unix socket、vsock、文件描述符映射与系统调用兼容,都不属于它的职责。
1. 架构设计分析
1.1 设计定位
从 README.md 与 src/lib.rs 顶层文档可见,smoltcp 的目标十分稳定:
- 独立、事件驱动
- 面向 bare-metal / 实时系统
- 结构尽量简单、显式、可文档化
- 大量能力通过编译期特性控制,而不是运行时探测
它想解决的是“没有完整宿主操作系统时,如何提供一个可用且可裁剪的 TCP/IP 协议栈”,而不是“如何给应用提供 Berkeley socket 兼容层”。
1.2 分层结构
src/lib.rs 已把其分层描述得很清楚:
| 层次 | 模块 | 作用 |
|---|---|---|
| socket layer | socket | TCP/UDP/ICMP/raw/DNS 等 socket 状态机与缓冲 |
| interface layer | iface | 地址配置、邻居发现、路由与 socket 分发 |
| physical layer | phy | Device、RxToken、TxToken 与若干中间件 |
| wire layer | wire | 报文解析、表示、emit 与 pretty print |
| support | storage、time | ring buffer、packet buffer、时间表示等基础设施 |
对上层系统来说,这些层次共同组成了一套“网络原语工具箱”:越往下越接近报文本身,越往上越接近可被内核封装复用的协议状态机。
1.3 编译期配置是第一公民
smoltcp 的另一个核心特征,是它强依赖编译期配置。Cargo.toml 中的 feature 大体分为三类:
- 功能类:
proto-ipv4、proto-ipv6、socket-tcp、socket-udp、socket-dns、async等 - 介质类:
medium-ethernet、medium-ip、medium-ieee802154 - 规模类:
iface-max-route-count-*、fragmentation-buffer-size-*、assembler-max-segment-count-*等
此外,README.md 明确说明可以用 SMOLTCP_* 环境变量在构建时覆盖这些容量参数。也就是说,分析 smoltcp 行为不能只看源码,还必须看 feature 组合和构建配置。
1.4 在本仓库中的实际启用方式
ax-net 和 ax-net-ng 都没有使用 smoltcp 的默认 feature,而是显式打开了一组更贴近内核场景的能力:
alloclogasyncmedium-ethernetmedium-ipproto-ipv4proto-ipv6socket-rawsocket-icmpsocket-udpsocket-tcpsocket-dns
这说明在本仓库里,smoltcp 的定位不是 host-side 演示库,而是内核内 IP/TCP/UDP 协议引擎。
1.5 与 ax-net / ax-net-ng 的边界
在 ArceOS / StarryOS 中,smoltcp 的职责到以下范围为止:
- 提供
tcp::Socket、udp::Socket、dns::Socket等状态机 - 要求上层提供
phy::Device、时钟和SocketSet - 提供
Interface::poll、poll_at等协议推进机制 - 不提供
bind/accept4/sendmsg一类系统接口语义 - 不理解
axpoll、ax-task、ax-fs-ng、Unix socket、vsock 这些系统层概念
因此,ax-net / ax-net-ng 不是“薄薄一层壳”,而是在把协议栈本体接到操作系统语义上。