首页 > 其他分享 >0213-数据链路层协议

0213-数据链路层协议

时间:2024-08-09 10:39:24浏览次数:6  
标签:协议 buffer interfaces 0213 let channel ff linux 链路层

环境

  • 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

目标

RFC894 介绍了数据链路层的一些情况。其中以太网帧的前 6 个字节是目的主机的 MAC 地址。
后面跟着的是源主机 MAC 地址,再后面两位是以太网帧的类型,需要使用 0800 标记,表示 IPv4。

接收数据

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 bytes = reader.next().unwrap();
    println!("reader: {:?}", 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"),
    };

    let mac = dummy[0].mac.unwrap();
    // 目的 MAC + 源 MAC + 类型 = 14 字节
    let mut buffer = [0; 14];
    buffer[0] = mac.0;
    buffer[1] = mac.1;
    buffer[2] = mac.2;
    buffer[3] = mac.3;
    buffer[4] = mac.4;
    buffer[5] = mac.5;

    // 源
    buffer[6] = mac.0;
    buffer[7] = mac.1;
    buffer[8] = mac.2;
    buffer[9] = mac.3;
    buffer[10] = mac.4;
    buffer[11] = mac.5;

    // 类型
    buffer[12] = 8;
    sender.send_to(&buffer, None).unwrap().unwrap();
}

tcpdump 的显示

21:27:41.811646 36:e0:f1:2a:e8:45 (oui Unknown) > 36:e0:f1:2a:e8:45 (oui Unknown), ethertype IPv4 (0x0800), length 14:  [|ip]

IP 命令显示

其中的 link/ether 表示 MAC 地址,在程序中将其写入到了源和目的地址,tcpdump 也看到了。

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
           756      14      0       0       0       0

总结

了解了数据链路层协议类型,除此之外,还有其它的类型,可以通过给的参考链接查看。

附录

标签:协议,buffer,interfaces,0213,let,channel,ff,linux,链路层
From: https://www.cnblogs.com/jiangbo4444/p/18350343

相关文章

  • 构建即时通讯应用:Spring boot高效集成WebSocket、Stomp协议完成前后端持续通信
    1.引入依赖在你的SpringBoot项目的pom.xml中添加以下依赖:<dependencies><!--SpringBootStarterThymeleaf--><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-st......
  • STM32之IIC协议
    物理层 1.从机数量选择地址限制:IIC协议本身没有严格规定总线上device最大数目,从理论上看,IIC能挂的device数目取决于能表示的最大地址空间,在7位地址模式下,减去0x00地址不可用,理论上可以挂2^7-1=127个设备。总线电容限制:由于器件的管脚都是有输入电容的,PCB上......
  • 自定义协议缓冲区(Protocol Buffers)在Xcode开发中的实战应用
    自定义协议缓冲区(ProtocolBuffers)在Xcode开发中的实战应用在当今的iOS开发中,数据的序列化和反序列化扮演着至关重要的角色。ProtocolBuffers(简称Protobuf),由Google开发,以其轻量、快速和简单的特点,成为了一种流行的跨平台数据交换格式。本文将带领你了解如何在Xcode中集......
  • TCP协议
    TCP(TransmissionControlProtocol)是一种面向连接的、可靠的传输层协议,用于在网络上可靠地传输数据。TCP协议的特点:面向连接:在通信开始之前,发送方和接收方需要建立一个连接,双方通过这个连接来进行数据的传输和通信(连接的建立和关闭采用三次握手和四次挥手);可靠性:TCP协议提供......
  • 开源协议
    1、GPL(GNUGeneralPublicLicense)商业软件不能使用GPL协议的代码。2、LGPL(GNULibraryor“Lesser”GeneralPublicLicense)商业软件可以使用,但不能修改LGPL协议的代码。3、ApacheLicense2.0ApacheLicence是对商业应用友好的许可。使用者也可以在需要......
  • python joblib.load 发生错误:协议 0 中的持久 ID 必须是 ASCII 字符串 在 GCP 云运行
    总体而言:我尝试使用Cloudbuild和Cloudrun构建BERT模型。我将模型(参数)和元数据(标签)保存在GCPCloudStorage中。但是,我遇到了通过joblib.load()加载metadata.bin文件的错误。我的metadata.bin文件包含UTF-8字符,但joblib.load需要ASCII字符。在......
  • 代理IP类型详细解析:那么多种协议的代理如何选?
    代理IP已经成为跨境业务的得力工具,但是仍有许多新手小白在初次接触到代理IP服务商时,不知道具体如何选择代理IP类型,面对五花八门的代理类型名称,往往需要付出一定的试错成本才知道哪个适合自己的业务。今天就来给大家科普科普,常见的代理类型有哪些?1.数据中心代理数据中心代理,......
  • 使用Cisco进行模拟配置OSPF路由协议
    OSPF路由协议1.实验目的1)理解OSPF2)掌握OSPF的配置方法3)掌握查看OSPF的相关信息2.实验流程开始→布置拓扑→配置IP地址→配置OSPF路由并验证PC路由的连通性→查看路由器路由信息→查看路由协议配置与统计信息→查看OSPF进程及区域信息→查看路由器OSPF数......
  • [翻译] RFC 1928: SOCKS 协议第 5 版
    https://luyuhuang.tech/2020/08/27/rfc1928.html文档声明本文档为互联网社区规范了一个互联网标准跟踪的协议,并征求讨论和改进建议.请参阅当前版本的“互联网官方协议标准(STD1)”以获取此协议的标准化的状态.本文档的发布不受限制.致谢本文描述的协议是其之前版本(......
  • 第15天:信息打点—主机架构&蜜罐识别&WAF识别&&端口扫描&协议识别&服务安全
    时间轴主要内容1、端口扫描-应用&协议2、WAF识别-分类&识别3、蜜罐识别-分类&识别解决:1、Web服务器&应用服务器差异性2、WAF防火墙&安全防护&识别技术3、蜜罐平台&安全防护&识别技术端口服务及渗透......