#传输协议 #数据链路 #低级 #数据包 #网络 #传输 #协议

已删除 rikopnet

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

1 个不稳定发布

0.34.0 2023年12月14日

#20#数据链路

MIT/Apache

290KB
5.5K SLoC

libpnet Crates.io 许可 文档

构建状态: 构建状态

讨论和支持

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.34.0"

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

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

Windows

在 Windows 上构建有三个要求

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

依赖项

~3–14MB
~135K SLoC