1个不稳定版本

使用旧的Rust 2015

0.23.0 2020年1月7日

#23 in #transport-layer


用于 pnet_macros_bandwhich_for…

MIT/Apache

54KB
596

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/](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,请确保以“Install Npcap in WinPcap API-compatible Mode”安装)
  • 您必须将来自WinPcap开发者包Packet.lib文件放置在名为lib的目录中,在该存储库的根目录下。或者,您可以使用%LIB%/$Env:LIB环境变量中列出的任何位置。对于64位工具链,它在WpdPack/Lib/x64/Packet.lib中,对于32位工具链,它在WpdPack/Lib/Packet.lib中。

依赖关系