#parser #networking #tcp-udp #no-alloc

不使用 std mutnet

无安全隐患和无分配的,不使用 std 的网络协议解析和原地操作库

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解析器实现

MIT/Apache

725KB
16K SLoC

mutnet

mutnet 是一个无安全隐患和无分配的、零依赖、不使用 std 的网络协议解析和原地操作库。

Crates.io Documentation MSRV

支持的协议

  • 以太网 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中的贡献,都将如上所述双重许可,不附加任何额外条款或条件。

无运行时依赖