以太网数据帧的格式分析

一、 以太网数据帧的格式分析

大家都知道我们目前的局域网大多数是以太网,但以太网有多种标准,其数据帧有多种格式,恐怕有许多人不是太清楚,本文的目的就是通过帧格式和Sniffer捕捉的数据包解码来区别它们。

以太网这个术语一般是指数字设备公司(Digital Equipment)、英特尔公司(Intel)和施乐公司(Xerox)在1982年联合公布的一个标准(实际上它是第二版本,第一版本早在1972年就在施乐公司帕洛阿尔托研究中心PARC里产生了)。它是目前TCP/IP网络采用的主要的局域网技术。它采用一种称作CSMA/CD的媒体接入方法,其意思是带冲突检测的载波侦听多路接入(Carrier Sense, Multiple Access with Collision Detection)。它的速率为10 Mb/s,地址为48 bit。

1985年,IEEE(电子电气工程师协会) 802委员会公布了一个稍有不同的标准集,其中802.3针对整个CSMA/CD网络,802.4针对令牌总线网络,802.5针对令牌环网络。这三者的共同特性由802.2标准来定义,那就是802网络共有的逻辑链路控制(LLC)。不幸的是,802.2和802.3定义了一个与以太网不同的帧格式,加上1983年Novell为其Netware开发的私有帧,这些给以太网造成了一定的混乱,也给我们学习以太网带来了一定的影响。

1、通用基础

阅读终点,创作起航,您可以撰写心得或摘录文章要点写篇博文。去创作
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 2
    评论
在C++中解析以数据帧的过程和C语言类似,但是可以使用更加便捷的STL容器和面向对象的设计方式。 下面是一个用C++编写的解析以数据帧的示例代码: ```cpp #include <iostream> #include <fstream> #include <vector> using namespace std; // 定义以数据帧类 class EthernetFrame { public: EthernetFrame() {} EthernetFrame(const char* data, size_t size) { if (size < sizeof(EthernetFrame)) { throw "Invalid data size!"; } memcpy(&m_header, data, sizeof(m_header)); m_payload.assign(data + sizeof(m_header), data + size); } // 获取目的MAC地址 string getDestination() const { char mac[18]; sprintf(mac, "%02x:%02x:%02x:%02x:%02x:%02x", m_header.destination[0], m_header.destination[1], m_header.destination[2], m_header.destination[3], m_header.destination[4], m_header.destination[5]); return mac; } // 获取源MAC地址 string getSource() const { char mac[18]; sprintf(mac, "%02x:%02x:%02x:%02x:%02x:%02x", m_header.source[0], m_header.source[1], m_header.source[2], m_header.source[3], m_header.source[4], m_header.source[5]); return mac; } // 获取类型字段 uint16_t getType() const { return ntohs(m_header.type); } // 获取载荷数据 const vector<char>& getPayload() const { return m_payload; } private: // 定义以数据帧头部结构体 struct Header { uint8_t destination[6]; uint8_t source[6]; uint16_t type; } __attribute__((packed)); Header m_header; vector<char> m_payload; }; int main() { // 打开文件,读取以数据帧 ifstream file("ethernet_frame.bin", ios::binary); if (!file.is_open()) { cerr << "Failed to open file!" << endl; return -1; } // 读取以数据帧 file.seekg(0, ios::end); size_t size = file.tellg(); file.seekg(0, ios::beg); vector<char> data(size); file.read(data.data(), size); // 解析以数据帧 EthernetFrame frame(data.data(), size); cout << "Destination MAC address: " << frame.getDestination() << endl; cout << "Source MAC address: " << frame.getSource() << endl; cout << "Type: 0x" << hex << frame.getType() << endl; // 处理以数据帧 // TODO: 根据数据帧中的字段值进行相应的处理 // 关闭文件 file.close(); return 0; } ``` 在这个示例代码中,我们定义了一个名为EthernetFrame的类,用于存储以数据帧的各个字段值。在类的构造函数中,我们将读取到的二进制数据按照以数据帧的格式解析,并将各个字段的值存储到类的成员变量中。 在类中,我们定义了一些用于获取各个字段值的方法,如getDestination()、getSource()和getType()等。这些方法返回的都是一个字符串或整数类型的值,方便调用者使用。 在主函数中,我们首先打开文件,读取以数据帧的二进制数据,然后使用EthernetFrame类解析数据帧,并将各个字段的值打印出来。最后,我们可以根据数据帧中的字段值进行相应的处理。 需要注意的是,由于以数据帧头部的长度为14字节,因此在读取数据时需要先跳过这14个字节,才能读取到数据帧的有效载荷。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

wzw200

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值