MAC帧格式

本文深入解析了MAC帧的基本格式,包括FrameControl字段的详细解读,如Type、Subtype、ToDS/FromDS等子字段的功能与意义。同时,介绍了Duration/ID、Address、SequenceControl、FrameBody和FCS字段的作用,以及它们在不同场景下的应用。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

MAC帧基本格式如下图所示:

4.1  Frame Control字段

Frame Control各字段含义如下

 - Protocol Version:  目前为0

 - Type:                帧类别, 有下面三种, 每个类别又有一些子类别(见Subtype)

 - Subtype:           帧子类别, 与Type共同来决定一个帧的类型, 详细如下表所示

 - To DS/From DS:     指示帧目的地是否为DS(分布式系统),

                                  可以简单地理解为是否【发往/来自】AP

 - More fragments:    指示是否还有分片(除去最后一个分片)

 - Retry:                     指示当前帧是否为重传帧, 接收方收到后会删掉重复帧

 - Power management:  指示STA的电源管理模式, 1表示STA在数据交换完成后进入省电模式,

                                      对于AP恒为0

 - More data:         指示AP为进入省电模式的STA进行帧缓存(来自DS)

 - WEP:                 指示frame body是否使用WEP加密

 - Order:                指示将进行严格次序(StrictlyOrdered)传送

Type的取值如下

 - 00: 管理帧(Management Frame)

 - 01: 控制帧(Control Frame)

 - 10: 数据帧(Data Frame)

 - 11: 保留未使用

Subtype取值如下

To DS/From DS取值如下

4.2 其他字段

MAC帧其他字段含义如下

 - Duration/ID:      持续时间/ID字段

 - Address:          由帧类型决定使用哪几个地址字段, 通常有三个, SA、DA和BSSID

 - Sequence Control: 包含两个子字段,

                                    4位的分片编号(Fragment Number)和12位的顺序编号(Sequence Number)

 - Frame Body:       帧主体也称数据字段(Data field), 用于传递上层有效载荷(Payload), 可为0

 - FCS:              帧校验序列, 采用循环冗余校验(CRC)码, 计算范围包括MAC头中所有字段及帧主体

Duration/ID可以用在下面三个场景中

 - Duration第15位置0, 用于设定NAV, 数值代表预计使用介质的微秒数

 - 在CFP帧中, 第14位置0, 第15位置1, 其他值为0, 字段值为32768, 让其他没有收到Beacon帧的STA公告无竞争周期

 - 在PS-Poll帧中, 第14、15位同时置1, 用于从省电模式醒来的STA发送AID(关联标识符)以取得在AP中的缓存帧

duration/id的三种类型:

Address有如下五种类型

 - BSSID, 基本服务集标识符

 - DA,    目的地址

 - SA,    源地址

 - RA,    接收端地址

 - TA,    发送端地址

Sequence Control格式如下,顺序编号4096的模数,从0开始,每处理一个上层封包就加1

若上层封包分片处理,所有帧分片采用相同顺序编号;对于重传帧,顺序编号不变

### MAC格式详解 MAC是数据链路层的核心组成部分之一,其主要功能是在同一物理介质上的设备之间传输数据。以下是关于MAC格式的具体结构和组成的详细介绍。 #### 1. 头 (Frame Header) MAC的头部包含了多个关键字段,用于控制数据包的传递过程以及提供必要的元信息。具体如下: - **目标MAC地址 (Destination MAC Address)** 长度为48位(6字节),表示接收方的硬件地址。这是用来唯一标识网络接口卡(NIC)的地址[^3]。 - **源MAC地址 (Source MAC Address)** 同样长度为48位(6字节),表示发送方的硬件地址。它帮助接收端知道是谁发送的数据包[^3]。 - **类型/长度字段 (Type/Length Field)** 这是一个2字节的字段,具有双重含义: - 如果值大于等于1536,则表示这是一个**类型字段**,定义了上层协议的类型。例如,“0800”代表IPv4协议,“0806”代表ARP协议,“0838”代表RARP协议[^1]。 - 如果值小于1536,则表示这是一个**长度字段**,指明后续数据部分的实际大小(单位为字节)。 #### 2. 数据部分 (Payload / Data) 这一部分承载着来自更高层协议的有效负载数据。它的最小长度通常为46字节,最大长度则取决于具体的以太网标准(如传统以太网的最大长度为1500字节)。如果实际数据不足46字节,则会在填充区域补齐至最低要求[^3]。 #### 3. 填充区 (Padding) 当有效载荷少于规定的最小尺寸时,填充区会被用来补充额外的无意义比特序列,使得整个达到所需的最短长度。这有助于保持信号同步并满足某些硬件的要求。 #### 4. 校验序列 (FCS – Frame Check Sequence) 位于MAC的最后一部分,由4字节构成,采用循环冗余检验算法(CRC)计算得出。接收者可以利用这些信息验证接收到的数据是否完整无误。如果有任何错误发生,在大多数情况下都会丢弃有问题的[^3]。 ```python # Python伪代码展示如何解析简单的MAC结构 class MacFrame: def __init__(self, dst_mac, src_mac, type_length, payload): self.dst_mac = dst_mac # 目标MAC地址 self.src_mac = src_mac # 源MAC地址 self.type_length = type_length # 类型或长度字段 self.payload = payload # 数据部分 def calculate_fcs(self): # 计算FCS import binascii data_bytes = bytes.fromhex(''.join([self.dst_mac.replace(':', ''), self.src_mac.replace(':', ''), format(self.type_length, '04X'), ''.join(format(byte, '02X') for byte in self.payload)])) crc_value = binascii.crc_hqx(data_bytes, 0xFFFF).to_bytes(2, 'little') return int.from_bytes(crc_value, 'big') frame_example = MacFrame(dst_mac="08:00:27:AE:F3:E9", src_mac="08:00:27:03:FB:19", type_length=0x0800, payload=b'\xDE\xAD\xBE\xEF') print(f"FCS Value: {frame_example.calculate_fcs():04X}") ``` --- ###
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值