一、以太网帧格式概述
以太网是一种常见的局域网传输协议,其数据传输基于帧(Frame)的形式。每个以太网帧由头部和数据部分组成。头部包括源地址、目的地址、类型字段等信息。数据部分长度为46~1500字节,最后还有一个4字节的帧校验序列(FCS)。以下是以太网帧的基本格式。
+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+-----+-----+ | 前导码 | 目的地址(6字节) | 源地址(6字节) | 类型(2字节) | 数据(46~1500字节) | FCS(4字节) | +--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+-----+-----+
其中前导码是一组特定的01二进制位序列,用于表示数据帧即将来临。每个帧的开始都需要有64比特的前导码,其它都是0。目的地址和源地址都是6字节,用于表示帧的接收者和发送者。类型字段代表数据部分的类型,例如0x0800表示IPv4。
二、以太网帧格式详解
1、前导码部分
前导码是以太网帧开始标识的一组特定的01二进制位序列,其作用是使所有实体(station)对以太网帧的开始时间达成一致。在每个数据帧前面都需要添加一定长度的前导码。
+--------+--------+--------+--------+--------+--------+--------+--------+ | 0 | 1 | 0 | 1或0 | 1或0 | 1或0 | 1或0 | 1或0 | +--------+--------+--------+--------+--------+--------+--------+--------+
前导码的最后一位可能为1或0。如果最后一位是1,则表示这个帧的长度在64字节以下,如果最后一位是0,则表示这个帧的长度在64字节以上。
2、目的地址&源地址部分
目的地址和源地址都是6字节,分别用于表示帧的接收者和发送者的MAC地址。一个以太网帧终端可以看作两根单向纤维,分别从发送端终端出发,一路跨越各种中继器,最终到达接收端终端。每个中继器都先接收数据,然后再重新以新的传输介质转发出去。在每个中继器接收到数据之后,都会检查这个数据包的目的MAC地址,如果这个MAC地址是本中继器上某个设备的MAC地址,那么该数据包就会被投递给这个设备。如果这个MAC地址和本中继器上任何一个设备的MAC地址都不匹配,那么该数据包就会被广播给全部设备(除了发送端设备)。
3、类型字段
类型字段占据2字节,用于指示以太网帧中数据部分的类型。其中IPv4的类型字段为0x0800,IPv6的类型字段为0x86dd。如果数据部分不是IP数据包,则该字段的含义由协议进行定义。
4、数据部分
数据部分长度为46~1500字节,是以太网帧中最长的部分。它可以包含各种不同类型的数据,如IPv4、IPv6、ARP、RARP等。在发送数据之前,首先需要对数据进行分组,每个分组的长度都必须小于MTU(Maximum Transmission Unit),最常见的MTU是1500字节。如果超过MTU,则需要进行分片分组。
5、FCS字段
帧校验序列(FCS)是以太网协议的核心部分,用于检查以太网帧的完整性。FCS是一个4字节的序列,由发送方计算,并附加在数据帧的末尾,接收方收到数据后再重新进行一次FCS校验,来检查数据的完整性和正确性。如果检验结果不一致,则该数据帧就被视为无效。
三、代码示例
// 定义以太网帧的结构体 struct eth_frame { uint8_t dest_mac[6]; // 目的MAC地址 uint8_t src_mac[6]; // 源MAC地址 uint16_t eth_type; // 数据类型 uint8_t data[1500]; // 数据部分 uint32_t fcs; // 帧校验序列 }; // 定义构造以太网帧的函数 void build_eth_frame(struct eth_frame *frame, uint8_t *src_mac, uint8_t *dest_mac, uint16_t eth_type, uint8_t *data, uint32_t data_len) { for (int i = 0; i < 6; i++) { frame->src_mac[i] = src_mac[i]; frame->dest_mac[i] = dest_mac[i]; } frame->eth_type = eth_type; memcpy(frame->data, data, data_len); frame->fcs = 0; // 计算FCS // ... }
四、总结
以太网帧格式是以太网协议的核心部分,它规定了以太网的数据传输格式。以太网帧格式提供了MAC地址、数据类型和FCS等重要信息,并且在实际数据传输过程中具备很好的抗干扰能力和容错能力。了解以太网帧格式对于理解计算机网络和进行网络编程是非常有帮助的。