1. libpnet

libpnet 使用 Rust 提供跨平台的低级网络 API。它包含四个关键组件:


2. 为什么使用 libpnet

使用低级网络编程的原因有很多,使用 Rust 进行低级网络编程的原因更多。这里列出一些。

2.1. 开发传输层协议

着手开发新传输层协议通常有两种方式:

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

另一个选择是用 C 编写 - 这将带来很好的性能,但随之而来的是许多其它问题:

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

2.2. 网络工具

许多网络工具(比如 ping 和 traceroute)依赖于能够操作网络层和传输层头部,但标准网络栈(比如 std::io::net 提供的)不支持。

2.3. 数据链路层

直接在数据链路层操作数据包有诸多好处,查看数据包在网络上传输时的原始形式。这样做有很多用途,包括网络诊断、数据包捕获和流量整形。


3. 文档

最新构建的文档在 https://docs.rs/pnet/


4. 使用

为使用 libpnet,向 Cargo.toml 添加如下内容:

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

在运行测试套件时,一些网络测试可能失败 - 解决该问题的最简单方法是以 root 或管理员用户的身份运行 cargo test。通常可以避免这种情况,但是需要引入更多的操作。

4.1. Windows

在 Windows 上构建有三个要求:


5. 官方示例

https://github.com/libpnet/libpnet/tree/main/examples


6. 示例:发送 Reset 报文