首页 > 其他分享 >协议分析之以太网协议

协议分析之以太网协议

时间:2023-06-23 13:22:47浏览次数:38  
标签:分析 协议 pcap ether MAC ethhdr 数据包 以太网

工作原理

以太网协议是一种局域网通信协议,它通过物理层和数据链路层的协同工作,使用媒体访问控制地址和载波监听/冲突检测协议来实现计算机之间的稳定数据传输。在数据传输过程中,以太网会将数据封装成数据帧,并根据目标MAC地址来识别需要接收数据的计算机。通过这种方式,以太网协议能够保证数据的准确性和完整性,并实现计算机之间的通信与数据传输。主要涉及到物理层和数据链路层:

物理层:以太网使用双绞线或同轴电缆等介质进行数据传输。发送端将数据转换为比特流,并通过物理层将比特流转换为电信号并发送到传输介质中。接收端则将电信号重新转换成比特流。以此来实现物理层数据传输。

数据链路层:以太网使用MAC(媒体访问控制)地址识别不同计算机。当计算机发送数据时,会将目标MAC地址、源MAC地址、以及数据传输类型等信息封装成数据包,并通过物理层发送到介质中。在接收端,数据包被逐层解析,根据MAC地址来识别数据包是否为自己所需的数据。以此来实现数据链路层的数据传输。

数据结构

帧前导码:在每一帧数据的开头,都有7个字节的前导码,用来供接收方同步数据传输时钟。

目的MAC地址:6个字节的MAC地址,指示数据包要发送到的目标设备的物理地址。

源MAC地址:6个字节的MAC地址,指示数据包发送者的物理地址。

类型/长度 :2个字节。在IEEE 802.3中可以表示两种类型的值。当值小于等于0x05DC时,表示数据包的长度,当值大于0x05DC时,表示此帧所包含的协议类型。例如,0x0800表示IPv4协议,0x86DD表示IPv6协议。

数据(Data):46~1500字节之间的变长字段。包括上层协议的头部和数据。假如数据长度小于46字节,以太网协议会自动在尾部进行填充,使其达到最小长度。

帧校验码FCS:帧校验码是由以太网接收器计算出来的,并与帧的其他部分一起传输。它用来检查接收到的帧数据是否正确,如果不正确则会丢弃。

结合工具Wireshark、Winhex联合分析

首先使用Wireshark抓取数据包,然后导出数据包,单独选择一个,点击右上角文件,选择导出特定分组。

然后选择好存储位置后,保存类型选择pcap形式,保存即可。

接下来使用winhex进行数据包分析。

如图所示:首先是24B的头文件标识,接着是16个字节的数据包包头。包头信息有秒,微秒,以及数据包长度。

秒:0x647EC8C4=1686030532;微秒:0x0005C2CE=377550,这里信息与Wireshark里面数据对比一致。

长度:0x00000060=96,与Wireshark里面数据对比一致。(注意:这里的存储方式是小端方式存储,因此读取数据要从后往前读取)

目的MAC地址:5C:FB:3A:CC:67:07

目的MAC由6个字节组成,前三个字节是标识网卡的制造商,由IEEE分配,称为OUI(组织唯一标识符),即厂商代码;后三个字节由网卡制造商为其网卡分配一个唯一的编号,称为扩展标识符(唯一性)。通过在线的MAC厂商查询,就可以查询到该数据包厂商信息- Chongqing Fugui Electronics Co.,Ltd.,结果如下图所示:

源MAC地址:58:69:6C:5E:BE:EC

类型:0x0800,即网际协议Ipv4

这里的目的MAC,源MAC和类型都与Wireshark里面的数据一致,同样在wireshark里面可以看到厂商信息与刚刚通过在线工具查询的信息一致。

QT(C语言)分析

QT的安装配置,以及项目的新建这里就不详细说了,可以参考其他博主的步骤。

环境配置:需要去pro文件里面添加一个系统库:unix|win32: LIBS += -lpcap。

运行结果:

完整代码:

#include <stdio.h>
#include <stdlib.h>
#include <pcap.h> //需要安装libpcap库

// 以太网头部结构体
struct ether_header {
    u_int8_t ether_dhost[6]; // 目标MAC地址
    u_int8_t ether_shost[6]; // 源MAC地址
    u_int16_t ether_type;    // 以太网类型(IP、ARP等)
};
int main(int argc, char* argv[]) {
    char errbuf[PCAP_ERRBUF_SIZE];
    pcap_t* handle; // pcap会话句柄
    struct bpf_program filter; // 过滤器规则
    char filter_exp[] = "ether proto 0x0800"; // 只捕获IP协议的数据包
    bpf_u_int32 mask; /* 子网掩码 */
    bpf_u_int32 net; /* 网络地址 */
    struct pcap_pkthdr header; // 数据包头部信息
    const u_char* packet; // 实际的数据包内容
    struct ether_header* ethhdr; // 以太网头部指针
    // 打开默认网卡
    handle = pcap_open_live("ens33", BUFSIZ, 1, 1000, errbuf);
    if (handle == NULL) {
        fprintf(stderr, "Could not open device %s: %s\n", "ens33", errbuf);
        return EXIT_FAILURE;
    }

    // 编译过滤器规则
    if (pcap_compile(handle, &filter, filter_exp, 0, net) == -1) {
        fprintf(stderr, "Could not parse filter %s: %s\n", filter_exp, pcap_geterr(handle));
        pcap_close(handle);
        return EXIT_FAILURE;
    }
    // 设置过滤器规则
    if (pcap_setfilter(handle, &filter) == -1) {
        fprintf(stderr, "Could not install filter %s: %s\n", filter_exp, pcap_geterr(handle));
        pcap_freecode(&filter);
        pcap_close(handle);
        return EXIT_FAILURE;
    }
    // 持续读取数据包并进行解析
    while (1) {
        packet = pcap_next(handle, &header); // 读取下一个数据包
        ethhdr = (struct ether_header*)packet; // 转换为以太网头部指针
        // 解析以太网协议
        printf("Source MAC address: %02x:%02x:%02x:%02x:%02x:%02x\n",
               ethhdr->ether_shost[0], ethhdr->ether_shost[1],
               ethhdr->ether_shost[2], ethhdr->ether_shost[3],
               ethhdr->ether_shost[4], ethhdr->ether_shost[5]);
        printf("Destination MAC address: %02x:%02x:%02x:%02x:%02x:%02x\n",
               ethhdr->ether_dhost[0], ethhdr->ether_dhost[1],
               ethhdr->ether_dhost[2], ethhdr->ether_dhost[3],
               ethhdr->ether_dhost[4], ethhdr->ether_dhost[5]);
        printf("Ethernet type: %d\n", ethhdr->ether_type);
    }

    // 关闭pcap会话
    pcap_freecode(&filter);
    pcap_close(handle);
    return EXIT_SUCCESS;
}

 

标签:分析,协议,pcap,ether,MAC,ethhdr,数据包,以太网
From: https://www.cnblogs.com/yeahh/p/17499038.html

相关文章

  • 互联网面试常见100题精析-题目剖析、解题思路、代码分析、问题扩展
       关于本书  本书目前共整理了105道高频面试算法题目,全部采用漫画图解的方式。该教程目前共有11w人阅读。面向算法小白和初中阶读者。所有代码均在leetcode上测试运行。    资源整理自网络,源地址:https://github.com/geekxh/hello-algorithm         ......
  • NLP实战必读-基于Python的文本分析实战
    本书介绍   从新闻和演讲到社交媒体上的非正式聊天,自然语言是最丰富、利用最少的数据来源之一。它不仅源源不断地供给,总是在环境中变化和适应;它还包含传统数据源无法传达的信息。解锁自然语言的关键是通过文本分析的创造性应用。本书展示了数据科学家用应用机器学习模型构建语......
  • MySQL事务四大隔离级别分析
    什么是事务?事务,由一个有限的数据库操作序列构成,这些操作要么全部执行,要么全部不执行,是一个不可分割的工作单位。事务的四大特性原子性:事务作为一个整体被执行,包含在其中的对数据库的操作要么全部都执行,要么都不执行。一致性:指在事务开始之前和事务结束以后,数据不会被破坏,......
  • 机器学习基础教材-《统计学习与数据分析介绍》
    本书介绍    本入门级统计教科书主要讲解发展和培养统计思维所需的基本概念和工具。它提供了描述性,归纳性和探索性的统计方法,并指导读者完成定量数据分析的过程。在实验科学和跨学科研究中,数据分析已成为任何科学研究的组成部分。诸如判断数据的可信度,分析数据,评估所获得结果的......
  • 计算机学科必读-现代中央处理器的性能分析与调试-分享
    本书介绍    本书主要对那些处理性能关键的应用程序和进行低级优化的软件开发人员编写。仅举几个领域为例:高性能计算、游戏开发、数据中心应用(如脸书、谷歌等)。但本书的范围并不限于上述行业。    本书对于任何想要更好地理解他们的应用程序的性能并知道如何对其进行诊......
  • graalvm 新的免费许可协议
    就在最近oracle发布了一个新的graalvm发行版(oraclegraalvm),同时也调整了许可模型,大致上是除非你收费基于graalvm开发的应用,基本上oraclegraalvm分发版本的可以免费使用,包含了不少新特性当前版本的特性profile指南优化,提供了更多的编译优化支持G1GC支持了压缩的对象头......
  • 动态图表示学习及动态图分析论文整理分享
       本项目总结了动态图表示学习的有关论文,并给出了详细的中文方法描述、数据集、创新点等。该项目在持续更新中,分享给需要的朋友。目录内容截图......
  • 数据仓库-数据分析
    我们将探讨留存分析在数据仓库中的重要性以及如何计算和解读新增留存率。首先,让我们来了解一下留存分析的概念。留存分析是衡量产品对用户价值的重要指标之一。它通过分析某一特定时间段内的新增用户或活跃用户,在后续时间段内继续使用产品的情况,来评估产品的用户黏性和持久性。在......
  • 让您的Nginx支持Http 3.0 协议
    Http3.0其实从最开设到正式的使用,已经过去了不少时间了,这块也是关系到我们现在数据安全一块很重要的发展,后续我们应该不在会有明文加密的协议的存在了吧,只是在加密的基础上,不断的升级现在的加密方法与技术升级,从而更高的保障我们的数据传输的高效与安全。并且我们也会在这路上......
  • 人人可用的开源数据可视化分析工具
    DataEase人人可用的开源数据可视化分析工具。什么是DataEase?DataEase是开源的数据可视化分析工具,帮助用户快速分析数据并洞察业务趋势,从而实现业务的改进与优化。DataEase支持丰富的数据源连接,能够通过拖拉拽方式快速制作图表,并可以方便的与他人分享。DataEase的功能包......