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

pnet_bandwhich_fork

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

2个版本

使用旧的Rust 2015

0.23.1 2020年1月8日
0.23.0 2020年1月7日

#19 in #数据链路

MIT/Apache

385KB
7.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通道(稳定版、测试版或nightly),从Rust 1.15开始。当使用Rust的nightly版本时,您可能希望将--no-default-features --features nightly传递给Cargo,以启用更快的构建时间。

在运行测试套件时,有一些网络测试可能会失败——解决这个问题的最简单方法是以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中。

依赖项

~0.6–1.8MB
~38K SLoC