0211-使用 dummy 傳送資料

波尔發表於2024-08-09

環境

  • Time 2022-11-20
  • WSL-Ubuntu 22.04
  • Rust 1.65.0
  • pnet 0.31.0

前言

說明

參考:https://docs.rs/pnet_datalink/0.31.0/pnet_datalink/linux

目標

前面使用了 pnet 自己模擬的一個資料鏈路層的傳送和接收過程。
現在使用 linux 的 dummy 來模擬資料的傳送和接收。

新建網路介面

新建一個網路介面:

root@jiangbo12490:~# ip link add mydummy type dummy
root@jiangbo12490:~# ip -s link show mydummy
8: mydummy: <BROADCAST,NOARP> mtu 1500 qdisc noop state DOWN mode DEFAULT group default qlen 1000
    link/ether 36:e0:f1:2a:e8:45 brd ff:ff:ff:ff:ff:ff
    RX:  bytes packets errors dropped  missed   mcast
             0       0      0       0       0       0
    TX:  bytes packets errors dropped carrier collsns
             0       0      0       0       0       0

其中 ip link add 命令可以新增一個網路介面,type 指定了型別。
使用 ip -s link show mydummy 檢視了網路介面的當前狀態。

啟用網路介面

root@jiangbo12490:~# ip  link set mydummy up
root@jiangbo12490:~# ip -s link show mydummy
8: mydummy: <BROADCAST,NOARP,UP,LOWER_UP> mtu 1500 qdisc noqueue state UNKNOWN mode DEFAULT group default qlen 1000
    link/ether 36:e0:f1:2a:e8:45 brd ff:ff:ff:ff:ff:ff
    RX:  bytes packets errors dropped  missed   mcast
             0       0      0       0       0       0
    TX:  bytes packets errors dropped carrier collsns
           140       2      0       0       0       0

ip link set mydummy up 是啟用網路介面。
啟動後檢視狀態,可以看到已經傳送了兩個包了,長度 140 位元組。

監聽網路介面

可以使用 tcpdump 命令監聽網路介面上的流量,又叫抓包。

root@jiangbo12490:~/git/game# tcpdump -e -vv -i mydummy
tcpdump: listening on mydummy, link-type EN10MB (Ethernet), snapshot length 262144 bytes


傳送資料

use pnet_datalink::{linux, Channel};

fn main() {
    let interfaces = linux::interfaces();

    let dummy: Vec<_> = interfaces
        .into_iter()
        .filter(|e| e.name == "mydummy")
        .collect();

    let config = linux::Config::default();
    let channel = linux::channel(&dummy[0], config);
    let (mut sender, mut _reader) = match channel {
        Ok(Channel::Ethernet(tx, rx)) => (tx, rx),
        _ => panic!("Not a valid channel returned"),
    };

    sender.build_and_send(1, 14, &mut |_| {});
}

tcpdump 的顯示

root@jiangbo12490:~/git/game# tcpdump -e -vv -i mydummy
tcpdump: listening on mydummy, link-type EN10MB (Ethernet), snapshot length 262144 bytes

20:55:41.681667 00:00:00:00:00:00 (oui Ethernet) > 00:00:00:00:00:00 (oui Ethernet), 802.3, length 0:  [|llc]

tcpdump 顯示了資訊,證明資料包確實傳送到了網路介面上。
也可以使用 ip -s link show mydummy 檢視,資料包增加了一個。

總結

使用了 linux dummy 網路介面來進行資料的傳送。

附錄

相關文章