一、MAC帧概述
MAC帧是数据在OSI模型中的第二层——数据链路层(Data Link Layer)的一种数据格式,用于数据链路之间的数据传输。它由标头和数据两部分组成,标头(Header)包含了数据帧的控制信息,数据(Data)则包含了要传输的具体数据。MAC帧的长度通常为46-1500字节。
二、MAC帧格式
MAC帧格式的具体构成如下:
+——+——+——+——+——+——+——+——+——+——+——+——+——+——+——+——+——+——+——+——+——+——+——+——+——+——+——+——+ | 前导码 | 目的MAC地址 | 源MAC地址 | 类型/长度 | 数据 | CRC | | | 48位 | 48位 | 16位 | 最长1500字节 | 32位 | +——+——+——+——+——+——+——+——+——+——+——+——+——+——+——+——+——+——+——+——+——+——+——+——+——+——+——+——+——+
三、前导码(Preamble)
前导码是MAC帧的第一个字段,由7个字节(56位)的01序列组成,它的目的是给接收方预热,使接收方的时钟开始同步化。因为前导码是一个固定的7字节,所以接收方看到了7个字节的01序列,就可以知道一帧的开始了。
四、目的MAC地址和源MAC地址
目的MAC地址和源MAC地址分别占6个字节,共48位。它们分别指示了数据的目的地和来源,以便于网络中的设备可以正确地接收并处理数据。目的MAC地址由网络层IP数据报中的目的IP地址转换而来,可以向全局广播(Broadcast address),即全部设备均能接收该数据。而源MAC地址是发送该数据的设备的MAC地址。
五、类型/长度字段
类型/长度字段占16位,标志着MAC帧数据部分的类型或长度。当值小于或等于1500时,它指示的是数据长度;当值大于1500时,它指示的是数据的类型。
六、数据
数据部分是MAC帧的主体,最长为1500字节。数据的具体格式与类型字段密切相关,不同类型的数据具有不同的格式和解析方式。常见的数据类型有IP数据报、ARP数据包、RARP数据包等。
七、CRC校验码
CRC校验码是用于检验帧在传输过程中是否发生失真的一种校验方式。它占用MAC帧的最后一个字段,通常是32位。在发送端,通过对整个MAC帧的计算得到CRC值,并将其添加到MAC帧的末尾。接收端则同样通过CRC校验,来检测接收到的数据是否正确,从而避免因数据传输过程中的误码而导致的数据错误。
八、完整代码示例
#include #pragma pack(1) // 结构体按1字节对齐 // 前导码 typedef struct { uint8_t p1; // 第一个字节为01 uint8_t p2; // 第二个字节为01 uint8_t p3; // 第三个字节为01 uint8_t p4; // 第四个字节为01 uint8_t p5; // 第五个字节为01 uint8_t p6; // 第六个字节为01 uint8_t p7; // 第七个字节为01 } Preamble; // MAC地址 typedef struct { uint8_t addr[6]; // 48位MAC地址 } MacAddress; // 类型/长度字段 typedef struct { uint16_t value; // 值 } TypeLength; // MAC帧 typedef struct { Preamble preamble; // 前导码 MacAddress dest_addr; // 目的MAC地址 MacAddress source_addr; // 源MAC地址 TypeLength type_length; // 类型/长度字段 uint8_t data[1500]; // 数据 uint32_t crc; // CRC校验码 } MacFrame;