协议簇: Media Access Control(MAC) Frame 解析

Media Access Control(MAC) Frame 解析

前言

千里之行,始于足下。 因为个人从事网络协议开发,一直想深入的学习一下协议族,从这篇开始,我将开始记录分享我学习到的网络协议相关的知识

简介

引用百度百科的描述:

数据链路层是OSI参考模型中的第二层,介乎于物理层和网络层之间。数据链路层在物理层提供的服务的基础上向网络层提供服务,其最基本的服务是将源自网络层来的数据可靠地传输到相邻节点的目标机网络层

由于 Ethernet 的历史原因,这一层需要兼容各种不同的物理层,因此具体的协议也比较多。 但是好在他们的帧格式是统一的,这篇文章我们将就本人机器上看到的帧来学习一下。

Frame 格式

我们先用一张图来描述一下 MAC 层帧的格式:
MAC Frame 格式
由图可以看出,每个 MAC 帧是由以下几个部分构成的:

  1. Preamble
  2. SFD(Start Frame Delimiter)
  3. Destionation Address: 这个帧的目标机器的地址
  4. Soruce Address: 这个帧的源机器的地址
  5. Length/Type:用来表示此字段之后用户数据的长度。这里的用户数据就是上图中 LENGTH/TYPE 字段之后的数据。 其中包含可以包含 padding, FCS(Frame Check Sequence), 和 Extension.
  6. FCS(Frame Check Sequence)包含一个循环冗余检验值用来检测数据的网络链路中可能发生的数据错误
  7. 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格式

  1. Address 是一个长度为 48 bit 小段编码的 MAC 地址.
  2. 第一个 bit (小端编码):
    (1) 对于源地址,该位被保留,设置为 0
    (2) 对于目标地址,该位代表代表地址类型. 可能的值有如下两种:
    1> 该位为 0, 代表他是一个 individual address. 目标地址是一个特定的网络设备
    2> 该位为 1,代表他是一个 group address.这里又细分为两类:Multicast-Group Address:目标地址代表一个特定的逻辑网络设备的集合. Broadcast Address: 目标地址代表所有当前连接到当前 LAN 的网络设备.
  3. 第二个 bit (小段编码):1 代表该地址是一个本地配置的地址,0 代表是全局配置的地址. 对于广播地址,该位总是被设置为 1

LENGTH/TYPE

该字段的长度为 2 byte,它的具体意义取决于它的实际值.

  1. 如果该字段的值小于或等于 0x05DC, 那么该字段的意义是: 表示该字段之后紧随其后的 MAC 用户数据的字节长度。也就是第一张图中 MAC CLINET DATA 字段占用的数据长度.
  2. 如果该字段的值大于或等于 0x0600, 那么该字段的意义是:Ethertype of the MAC client protocol, 个人理解,这种情况下,该字段代表的是当前

MAC Client Data

该字段用来承载实际上要在网络中发送的数据(当然不是我们 socket 中发送的数据, socket 中发送的数据需要经过tcp,ip 层的包装之后才能放在 该字段中发送)

它有最大长度的限制. MAC 帧一共有三种,他们分别对应的最大长度如下所示:

Frame typeMax data size
Basic Frame1500
Q-tagged Frame1504
Envelop Frame1982

规范中指出,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 抓包的结构.

Wireshark Ethernet Frame
该数据包对应的字节数据为: dc a3 33 c4 1e 5a d0 ab d5 23 a5 0a 08 00

这里我们逐一分析一下:

  1. Wireshark 没有抓到 Start Frame Delimiter 和 Preamble 字段的数据,只有 SFD 字段之后的数据被解析出来.
  2. 每个 MAC Address 长度为 48 bit,也就是 6 个字节,下来我们先解析一下地址
  3. dc a3 33 c4 1e 5a 便是 Destination Address 字段的数据,0xdc 小段编码的第一位为 0,那么该地址类型是 Individual Address. 第二位为 0,那么该地址是一个全局配置的 MAC 地址.
  4. dc a3 33 c4 1e 5a 对应的 MAC 地址是 dc:a3:dd:c4:1e:5a
  5. d0 ab d5 23 a5 0a 便是 Source Address。 这里与 Destination Address 的前两个 bit 相同,不再解析. MAC 地址值为 d0🆎d5:23:a5:0a. 因为这个 wireshak 包是我的机器给远程服务器发送 TCP 数据的包,因此这个 MAC 地址便是我本机的 MAC 地址. 使用 ipconfig /all 确认一下
    源 MAC 地址
    果然一致
  6. 08 00 对应于 Length/Type 字段。 因为该值大于 0600, 那么该字段代表上层协议的类型. RFC894 规定 IP 协议的下层 MAC 协议中的 Type 字段应该设置为 08 00。 也就意味着我们这个 MAC 帧中的 MAC Client Data 包含一个 IP 包.
  7. 这里因为我们还不想涉及到 IP 协议的知识,暂且略过 MAC Client Data 字段的分析
  8. 对于后续的 Pad, FCS, Extension 字段貌似无法在 Wireshark 包中看到,这里也只能暂且作罢. 如果有读者知道如何查看这几个字段的数据,还请告知,感谢

END!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/499685.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

协议簇:Ethernet Address Resolution Protocol (ARP) 解析

简介 前面的文章中,我们介绍了 MAC Frame 的帧格式。我们知道,在每个 Ethernet Frame 中都分别包含一个 48 bit 的源物理地址和目的物理地址. 对于源地址很容易理解,该地址可以直接从硬件上读取. 但是对于一个网络节点,他怎么知道…

协议簇:IPv4 解析

简介 IP 是一种无连接的协议. 操作在使用分组交换的链路层(如以太网)上。此协议会尽最大努力交付数据包。 尽最大努力意味着: IP 协议不保证数据的可靠传输, 没有流量控制机制, 不保证传输序列(意味着 IP 数据包会在传输过程中乱序), 没有…

协议簇:ICMP 解析

简介 ICMP 是 Internet Control Message Protocol 的简写. 它主要用来调试网络通信环境中存在的问题. 比如,当 IP 数据包总是无法正常的发送到目的地址, 当网关没有足够的 buffer 来转发对应的数据包 等问题. 值得一提的是,它属于网络层,不属…

协议簇:TCP 解析: 基础

简介 本文我们将从 RFC 学习一下 RFC793 中描述的 TCP 协议. 这将区别于通常讲解计算机网络书籍中所描述的 TCP. 但他们必然是相统一的,不会互相冲突. 系列文章 协议簇:TCP 解析:基础 协议簇:TCP 解析:建立连接 协议…

协议簇:TCP 解析: 建立连接

简介 接前文 协议簇:TCP 解析: 基础, 我们这篇文章来看看 TCP 连接建立的过程,也就是众所周知的”三次握手“的具体流程. 系列文章 协议簇:TCP 解析:基础 协议簇:TCP 解析:建立连接 协议簇&a…

协议簇:TCP 解析: 连接断开

简介 接前文 协议簇:TCP 解析: 建立连接, 我们这篇文章来看看 TCP 连接断开的过程,也就是众所周知的”四次挥手“的具体流程. 系列文章 协议簇:TCP 解析:基础 协议簇:TCP 解析:建立连接 协议…

协议簇:TCP 解析: Sequence Number

简介 序列号(Sequence Number) 是 TCP 协议中非常重要的一个概念,以至于不得不专门来学习一下。这篇文章我们就来解开他的面纱. 在 TCP 的设计中,通过TCP协议发送的每个字节都对应于一个序列号. 由于每个字节都有自己的序列号&a…

协议簇:TCP 解析:TCP 数据传输

简介 前面,我们分别介绍了 TCP 基础知识以及连接的建立和关闭,以及最重要的 Sequence Number 的概念. 本篇文章,我们来介绍一下 TCP 如何传输数据. 系列文章 协议簇:TCP 解析:基础 协议簇:TCP 解析&…

CodeTank iOS App Technical Support

CodeTank iOS App Technical Support For All Email: z253951598outlook.com TEL: 86-17782749061 App Screen Shoots

CentOS 7 防火墙命令

查看防火墙状态 systemctl status firewalld如果已经开启,状态为 active 如果未开启,状态为 inactive 开启防火墙 systemctl start firewalld关闭防火墙 systemctl stop firewalld查看当前防火墙的配置 firewall-cmd --list-all这里,我…

Go Concurrency Patterns: Context

Go Concurrency Patterns: Context 原文地址:https://blog.golang.org/context Introduction 在 Go 语言实现的服务器上,我们总是使用 goroutine 来处理与客户端建立的连接, 给每个连接分配一个独立的 goroutine. 在请求的 handler 中也通常…

Go Concurrency Patterns: Timing out, moving on

原文地址:https://blog.golang.org/concurrency-timeouts 并发变成有它自己的风格. 一个非常好的例子就是 timeout. 虽然 go 的 channel 没有直接支持 timeout 机制,但是要实现它非常容易. 比如说,我们想从一个 channel ch 中接收数据&#…

Go Concurrency Patterns: Pipelines and cancellation

原文地址: https://blog.golang.org/pipelines 简介 Go 语言提供的并发原语使得可以很方便的构建数据流 pipeline,使用这样的 pipeline 可以高效的利用 I/O 和多 cpu 的优势. 这篇文章我们将展示如何构建并使用 pipeline. 什么是 pipeline ? 在 go 语…

QTcpSocket connectToHost 建立连接速度慢问题

问题场景 在使用 QT 开发一个客户端 App 的时候,我们通过 QTcpSocket 与后台服务器进程通信。 后台程序使用其他语言编写。 问题: 在客户端启用之后尝试建立与后台程序的 TCP 连接的时候,发现连接速度非常慢(肉眼可见的慢&#x…

WinSock I/O 模型 -- Select 模型

简介 Select 模型是 WinSock 中最常见的 I/O 模型,这篇文章我们就来看看如何使用 Select api 来实现一个简单的 TCP 服务器. API 基础 Select 模型依赖 WinSock API Select 来检查当前 Socket 是否可写或者可读。 使用这个 API 的优点是我们不需要使用阻塞的 So…

WinSock I/O 模型 -- WSAEventSelect 模型

简介 WSAEventSelect 模型也是 WinSock 中最常见的异步 I/O 模型。 这篇文章我们就来看看如何使用 WSAEventSelect api 来实现一个简单的 TCP 服务器. API 基础 WSAEventSelect WSAEventSelect 用来把一个 SOCKET 对象和一个 WSAEVENT 对象关联起来。 lNetworkEvents 表示…

WinSock I/O 模型 -- WSAAsyncSelect 模型

简介 WSAAsyncSelect 模型也是 WinSock 中常见的异步 I/O 模型。 使用这个模型,网络应用程序通过接收以 Windows 消息为基础的网络事件通知来处理网络请求。 这篇文章我们就来看看如何使用 WSAAsyncSelect api 来实现一个简单的 TCP 服务器. API 基础 要使用 W…

WinSock I/O 模型 -- OVERLAPPED I/O 模型

简介 OVERLAPPED I/O 模型也是 WinSock 中常见的异步 I/O 模型,相比于我们之前提到的 Select 模型,WSAAsyncSelect 模型 和 WSAEventSelect 模型有更好的性能. 为了方便描述,下文我们将称 Overlapped I/O 模型为 “重叠模型”. 重叠模型的…

WinSock I/O 模型 -- IOCP 模型

前言 IOCP 全称 Input/Ouput Completion Ports,中文中翻译一般为“完成端口”,本文中我们使用 IOCP 简写. IOCP 模型是迄今为止最为复杂的一种 I/O 模型,但是同时通过使用 IOCP 我们往往可以达到最佳的系统性能. 当你的网络应用程序需要管理…

GTank iOS App Technical Support

GTank iOS App Technical Support For All Email: z253951598outlook.com TEL: 86-17782749061 App Screen Shoots ​​