環境
- 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
RFC894:https://www.rfc-editor.org/rfc/pdfrfc/rfc894.txt.pdf
《TCP/IP詳解 卷1:協議》:http://www.52im.net/topic-tcpipvol1.html
目標
資料包可以透過網路介面進行傳輸,需要限制最大的長度,乙太網協議裡預設是 1500。
檢視 MTU
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
3771 16 0 0 0 0
其中第一行 mtu 1500
,表示傳輸的資料幀最大為 1500,不包括之前定義的 MAC 地址和型別。
傳送資料
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"),
};
let buffer = [0; 1500 + 6 + 6 + 2];
// 再增長一位就超過最大值了,要報錯:Message too long
// let buffer = [0; 1500 + 6 + 6 + 2 + 1];
sender.send_to(&buffer, None).unwrap().unwrap();
}
總結
瞭解 MTU 是最大傳輸單元,預設是 1500,不包含 MAC 地址和型別。