#传输协议 #数据链路 #传输层 #底层 #数据包 #传输 #网络

无需 std pnet

使用 Rust 编程语言实现的跨平台、底层网络

50 个版本 (破坏性更新)

0.35.0 2024年5月30日
0.34.0 2023年7月19日
0.33.0 2023年2月3日
0.31.0 2022年6月1日
0.0.1 2014年11月20日

#30 in 网络编程

Download history 22424/week @ 2024-05-02 28524/week @ 2024-05-09 20850/week @ 2024-05-16 21067/week @ 2024-05-23 20141/week @ 2024-05-30 20488/week @ 2024-06-06 18827/week @ 2024-06-13 22612/week @ 2024-06-20 31764/week @ 2024-06-27 24975/week @ 2024-07-04 27785/week @ 2024-07-11 28254/week @ 2024-07-18 26646/week @ 2024-07-25 27520/week @ 2024-08-01 25840/week @ 2024-08-08 23799/week @ 2024-08-15

每月下载量 108,475
用于 171 个 Crates(直接使用 133 个)

MIT/Apache

290KB
5.5K SLoC

libpnet Crates.io 许可证 文档

构建状态: 构建状态

讨论和支持

libpnet 提供了一个跨平台的 API,用于使用 Rust 实现底层网络。

有四个关键组件

  • packet 模块,允许安全地构建和操作数据包;
  • pnet_macros crate,为数据包模块提供基础设施;
  • 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.35.0"

libpnet应该与Rust的最新稳定版本兼容。

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

Windows

在Windows上构建有三个要求:

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

依赖项

~3–13MB
~119K SLoC