MAC帧格式用法介绍(『MAC帧格式)

一、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;

Published by

风君子

独自遨游何稽首 揭天掀地慰生平