Media Access Control(MAC) Frame 解析
前言
千里之行,始于足下。 因为个人从事网络协议开发,一直想深入的学习一下协议族,从这篇开始,我将开始记录分享我学习到的网络协议相关的知识
简介
引用百度百科的描述:
数据链路层是OSI参考模型中的第二层,介乎于物理层和网络层之间。数据链路层在物理层提供的服务的基础上向网络层提供服务,其最基本的服务是将源自网络层来的数据可靠地传输到相邻节点的目标机网络层
由于 Ethernet 的历史原因,这一层需要兼容各种不同的物理层,因此具体的协议也比较多。 但是好在他们的帧格式是统一的,这篇文章我们将就本人机器上看到的帧来学习一下。
Frame 格式
我们先用一张图来描述一下 MAC 层帧的格式:
由图可以看出,每个 MAC 帧是由以下几个部分构成的:
- Preamble
- SFD(Start Frame Delimiter)
- Destionation Address: 这个帧的目标机器的地址
- Soruce Address: 这个帧的源机器的地址
- Length/Type:用来表示此字段之后用户数据的长度。这里的用户数据就是上图中 LENGTH/TYPE 字段之后的数据。 其中包含可以包含 padding, FCS(Frame Check Sequence), 和 Extension.
- FCS(Frame Check Sequence)包含一个循环冗余检验值用来检测数据的网络链路中可能发生的数据错误
- Extension:只有在 100M 半双工情况下才会使用
接下来,我们详细描述一下各个字段所代表的意义
Preamble
它的长度为 7 byte. 是用来让PLS电路达到其稳态同步与接收包的定时(这里附上官方英文描述: that is used to allow the PLS circuitry to reach its steady-state
synchronization with the received packet’s timing)
Start Frame Delimiter (SFD)
它的长度为 1 byte,且是一个固定值 10101011。它紧随 Preamble 字段,它之后的字节就是 MAC Frame 的内容了.
Address
紧跟 SFD 字段的就是该 MAC Frame 的源地址和目标地址.
它的格式如下:
- Address 是一个长度为 48 bit 小段编码的 MAC 地址.
- 第一个 bit (小端编码):
(1) 对于源地址,该位被保留,设置为 0
(2) 对于目标地址,该位代表代表地址类型. 可能的值有如下两种:
1> 该位为 0, 代表他是一个 individual address. 目标地址是一个特定的网络设备
2> 该位为 1,代表他是一个 group address.这里又细分为两类:Multicast-Group Address:目标地址代表一个特定的逻辑网络设备的集合. Broadcast Address: 目标地址代表所有当前连接到当前 LAN 的网络设备. - 第二个 bit (小段编码):1 代表该地址是一个本地配置的地址,0 代表是全局配置的地址. 对于广播地址,该位总是被设置为 1
LENGTH/TYPE
该字段的长度为 2 byte,它的具体意义取决于它的实际值.
- 如果该字段的值小于或等于 0x05DC, 那么该字段的意义是: 表示该字段之后紧随其后的 MAC 用户数据的字节长度。也就是第一张图中 MAC CLINET DATA 字段占用的数据长度.
- 如果该字段的值大于或等于 0x0600, 那么该字段的意义是:Ethertype of the MAC client protocol, 个人理解,这种情况下,该字段代表的是当前
MAC Client Data
该字段用来承载实际上要在网络中发送的数据(当然不是我们 socket 中发送的数据, socket 中发送的数据需要经过tcp,ip 层的包装之后才能放在 该字段中发送)
它有最大长度的限制. MAC 帧一共有三种,他们分别对应的最大长度如下所示:
Frame type | Max data size |
---|---|
Basic Frame | 1500 |
Q-tagged Frame | 1504 |
Envelop Frame | 1982 |
规范中指出,Ethernet 至少支持上述三种帧类型中的一种
Pad
为了 CSMA/CD 协议能正常工作,协议对帧的最小值也进行的限制.
如果需要 pad, 那么它应该被添加在 MAC Client Data 和 FCS 字段之间.
Pad 的长度计算方法为 max (0, minFrameSize – (clientDatasize + 2 *addressSize + 48)) bit. 这里的 48 bit 的来历是: 2 字节的 Length/Type 字段和 4 字节的 FCS 字段.
FCS
该字段包含一个长度为 4 byte 的循环冗余检验码, 关于该算法这里不再赘述.
Extension
略
实践
在简单的描述了 MAC 帧格式之后,我们来尝试着分析一个本人机器上 Wireshark 抓包的结构.
该数据包对应的字节数据为: dc a3 33 c4 1e 5a d0 ab d5 23 a5 0a 08 00
这里我们逐一分析一下:
- Wireshark 没有抓到 Start Frame Delimiter 和 Preamble 字段的数据,只有 SFD 字段之后的数据被解析出来.
- 每个 MAC Address 长度为 48 bit,也就是 6 个字节,下来我们先解析一下地址
- dc a3 33 c4 1e 5a 便是 Destination Address 字段的数据,0xdc 小段编码的第一位为 0,那么该地址类型是 Individual Address. 第二位为 0,那么该地址是一个全局配置的 MAC 地址.
- dc a3 33 c4 1e 5a 对应的 MAC 地址是 dc:a3:dd:c4:1e:5a
- d0 ab d5 23 a5 0a 便是 Source Address。 这里与 Destination Address 的前两个 bit 相同,不再解析. MAC 地址值为 d0🆎d5:23:a5:0a. 因为这个 wireshak 包是我的机器给远程服务器发送 TCP 数据的包,因此这个 MAC 地址便是我本机的 MAC 地址. 使用 ipconfig /all 确认一下
果然一致 - 08 00 对应于 Length/Type 字段。 因为该值大于 0600, 那么该字段代表上层协议的类型. RFC894 规定 IP 协议的下层 MAC 协议中的 Type 字段应该设置为 08 00。 也就意味着我们这个 MAC 帧中的 MAC Client Data 包含一个 IP 包.
- 这里因为我们还不想涉及到 IP 协议的知识,暂且略过 MAC Client Data 字段的分析
- 对于后续的 Pad, FCS, Extension 字段貌似无法在 Wireshark 包中看到,这里也只能暂且作罢. 如果有读者知道如何查看这几个字段的数据,还请告知,感谢
END!