10 个版本 (5 个重大更改)
0.6.1 | 2024 年 3 月 24 日 |
---|---|
0.6.0 | 2024 年 3 月 24 日 |
0.5.2 | 2023 年 12 月 6 日 |
0.5.1 | 2023 年 11 月 30 日 |
0.1.0 | 2023 年 9 月 19 日 |
#396 在 解析器实现
725KB
16K SLoC
mutnet
mutnet 是一个无安全隐患和无分配的、零依赖、不使用 std 的网络协议解析和原地操作库。
支持的协议
- 以太网 II
- IEEE 802.1Q VLAN 标签
- ARP(以太网和 IPv4 的请求和响应)
- IPv4
- IPv6(无 Jumbograms)
- IPv6 扩展(分段、跳转选项、目的地选项、路由)
- TCP
- UDP
安全性与恐慌
mutnet 使用 #[forbid(unsafe_code)]
确保没有不安全代码。
所有解析、查找和操作方法的恐慌缺失通过 Kani 验证器进行验证。
用法
您可以使用提供的 parse_network_data(...)
方法,或者根据需要链式连接协议解析步骤来创建自己的解析器。
每一层的 数据访问和操作方法都在 traits 中实现。请参阅 docs.rs 了解所有可用方法 traits 的列表。
IPv6 扩展
为了防止对 IPv6 扩展头的“无限”解析,任何解析 IPv6 扩展的方法都需要一个限制要解析的扩展数量的 const 泛型参数。
解析时避免复制
当解析一个新的层(new(...)
& new_from_lower(...
)时,底层数据缓冲区被移动到一个新的类型/结构体。如果使用数组作为初始 new(...)
调用的参数,这将导致数据的完整复制。为了避免这种情况,请使用智能指针(如 Vector)的(可变)引用。
长度变化
要更改协议的长度(例如,向IPv4添加选项),则头部需要增长或缩小。通常,将头部数据移动到有效载荷之前可以减少需要移动(复制)的数据。为了移动头部数据,需要在网络数据开始之前预留一些空空间。这个空间称为预留空间。mutnet期望用户在使用长度修改方法时提供结构良好的数据。
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| Headroom | Network Data |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
示例
fn print_eth_source(data: &[u8]) {
let eth = DataBuffer::<_, Eth>::new(data, 0).unwrap();
println!("Eth source: {:?}", eth.ethernet_source());
}
更多内容请参阅 parse_from_iface.rs。
路线图
- 更多协议,请参阅 协议路线图
- TLV迭代器
- IPv4选项迭代器
- 将IPv6扩展插入现有IPv6扩展层
- Vlan & IPv6扩展层插入和删除
协议路线图
- ICMP
- ICMPv6
限制
每个解析数据缓冲区只能出现一次任何层。
设计
设计 列出了关于此crate设计的一些细节。
特性
error_trait
:使用不稳定core::error:Error
,仅在nightly版本中可用std
:使用std(默认启用)- 所有其他特性仅供开发使用
许可
mutnet许可采用Apache License, Version 2.0或MIT许可证,由您选择。
贡献
除非您明确声明,否则根据Apache-2.0许可证定义的,您提交的任何有意包含在此crate中的贡献,都将如上所述双重许可,不附加任何额外条款或条件。