0214-最大传输单元 MTU

环境

  • 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 地址和类型。

附录

posted @   jiangbo4444  阅读(26)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· 单线程的Redis速度为什么快?
· SQL Server 2025 AI相关能力初探
· AI编程工具终极对决:字节Trae VS Cursor,谁才是开发者新宠?
· 展开说说关于C#中ORM框架的用法!
历史上的今天:
2020-08-09 【JavaScript】Object 静态方法(一)
点击右上角即可分享
微信分享提示