#packet #networking #protocols #bit-fields #low-level #binary-data

pnet_macros_bandwhich_fork

为二进制数据格式提供自动位操作

1 个不稳定版本

使用旧的 Rust 2015

0.23.0 2020 年 1 月 7 日

#57 in #位域

MIT/Apache

110KB
2.5K SLoC

libpnet Crates.io 许可 文档

Linux ∪ OS X 构建状态:Linux ∪ OS X 构建状态

Windows 构建状态:Windows 构建状态

讨论和支持:#libpnet on freenode / #rust-networking on irc.mozilla.org / #rust on irc.mozilla.org.

libpnet 为使用 Rust 的低级别网络提供了跨平台 API。

有四个关键组件

  • packet 模块,允许安全地构建和操作数据包;
  • pnet_macros 包,为数据包模块提供基础设施;
  • transport 模块,允许实现传输协议;
  • datalink 模块,允许直接发送和接收数据链路数据包。

为什么?

有很多理由使用低级别网络,使用 Rust 来实现更是如此。这里列举了一些原因:

开发传输协议

开发新的传输层协议通常有两种方法

  • 使用脚本语言如Python编写;
  • 使用C语言编写;

前者非常适合尝试新想法和快速原型设计,但在实际应用中并不理想。虽然通常可以从这些实现中获得合理的性能,但它们通常比C语言实现慢得多,且不适合任何“重型工作”。

下一个选项是使用C语言编写 - 这将为您带来出色的性能,但也会带来一系列其他问题

  • 内存安全性不足 - 这是C语言基于网络的堆栈中安全漏洞和其他错误的巨大来源。忘记边界检查或在使用后释放指针是非常容易的。
  • 线程安全性不足 - 您必须非常小心,以确保正确使用锁,并且使用正确。
  • 缺乏高级抽象 - 脚本语言(如Python)的吸引力之一是更高级的抽象,它使API更简单,编程更轻松。

使用libpnet和Rust,您可以兼顾两者的优点。高级抽象、内存和线程安全性,以及C的性能。

网络工具

许多网络工具,如ping和traceroute,依赖于能够操纵网络和传输头,而这在标准网络堆栈(如由std::io::net提供的)中是不可能的。

直接在数据链路层工作,以查看“在线”的包,这可能很有用。这有许多用途,包括网络诊断、数据包捕获和流量整形。

文档

最新构建的API文档可以在此处找到:https://docs.rs/pnet/

用法

要在项目中使用libpnet,请将以下内容添加到您的Cargo.toml中

[dependencies.pnet]
version = "0.23.0"

libpnet应能在任何Rust渠道(稳定版、Beta版或Nightly版)上运行,从Rust 1.15开始。当使用Rust的Nightly版本时,您可能希望向Cargo传递--no-default-features --features nightly,以启用更快的构建时间。

在运行测试套件时,有一些网络测试可能会失败 - 最简单的方法是以root或管理员用户运行cargo test。这通常可以避免,但这更复杂。

Windows

在Windows上构建有三个要求

  • 您必须使用使用MSVC工具链的Rust版本
  • 您必须安装WinPcapnpcap(使用版本WinPcap 4.1.3进行了测试)(如果使用npcap,请确保以“安装Npcap以兼容WinPcap API模式”安装)
  • 您必须将WinPcap开发者包中的Packet.lib放在此存储库根目录下的一个名为lib的目录中。或者,您可以使用%LIB%/$Env:LIB环境变量中列出的任何位置。对于64位工具链,它在WpdPack/Lib/x64/Packet.lib中,对于32位工具链,它在WpdPack/Lib/Packet.lib中。

依赖项

~5.5MB
~117K SLoC