【LWIP】05——数据链路
数据链路,指的是OSI参考模型中的数据链路层,例如以太网、无线局域网这些通信手段都可以称之为数据链路。TCP/IP对数据链路层及以下的部分都未作定义,因为TCP/IP以这两层的功能是透明的为前提。然而,数据链路的知识对于理解TCP/IP与网络起着重要的作用。
一、数据链路层&物理层
众所周知,在计算机这个大的领域,各个设备之间使用二进制0、1来表示信息,然而实际的通信介质(例如网线)之间处理的却是电压的高低、光的亮灭等模拟信号,将这些信号(模拟量)与0、1(数字量)进行转换是物理层的责任,而数据链路层则将0、1这些二进制数据集合成一个名叫“帧”的数据结构进行处理。在嵌入式领域中,负责数据链路层工作的称之为MAC控制器;负责处理模拟量和数字量转换的芯片/模块称之为PHY。
一般情况下,在嵌入式的以太网应用场景中,MAC控制器都集成在MCU控制器中,采用"外挂"Phy芯片的方式。其中MAC控制器和PHY之间有两套接口,分别是数据接口和管理接口。
- 数据接口:用于传输网络数据包,常见有三种接口方式MII/RMII/RGMII。
- 管理接口:用于MAC控制器管理PHY芯片,通常使用两条线进行控制,一条称为MDIO(数据线);另外一条称为MDC(时钟线)。
对于数据接口,使用不同的连接方式,需要MCU提供的引脚数量有所不同,同时数据的传输速率也有所不同(例如RGMII支持千兆);对于管理接口,常用于MAC控制器查询网络连接状态、或查询/配置工作速率及工作模式。
二、MAC地址
MAC地址用于识别数据链路中互联的节点。它是一个物理地址,由12个16进制数表示(48位,6个字节),通常被烧录在硬件板卡的ROM中。在理想情况下,全球每张网卡的MAC地址是唯一的。
MAC地址的格式为:XX:XX:XX:XX:XX:XX 。举个例子,例如 7C:10:C9:AE:AD:82 这个地址就是一张网卡的MAC地址。
在这个地址中:
- 前三个字节代表的是组织中的厂商编号(例如Intel、TP-Link等厂商),例如7C:10:C9代表的是这个网卡来自厂商华硕(ASUSTekCOMPU)。
- 后三个字节代表的是厂商自行分配的编号,例如AE:AD:82代表的是厂商自行分配的编号。
三、以太网
在众多数据链路中,最著名、使用最广泛的莫过于以太网(Ethernet)。以太网最早是由美国的Xerox公司与前DEC公司设计的一种通信方式,当时命名为Ethernet,之后IEEE802.3委员会将其规范化。但是他们二者对以太网的帧结构定义还是有所不同的,所以一般称由IEEE802.3规范的以太网为802.3以太网;反之则称为普通以太网或Ethernet Ⅱ。本文主要介绍普通以太网。
下面来看看以太网的帧结构。

从上图可以看到以太网帧的格式包含前导码、帧起始界定符(SFD)、目标MAC、源MAC、以太网数据类型、数据以及帧校验字段。
- 前导码:由7个字节组成,用于同步发送方和接收方的时钟,通常是01交替的二进制序列。
- 帧起始界定符:由1个字节组成,它通常是一个特定的二进制值(如10101011),用于告诉接收方一个新的以太网帧即将开始。
- 目标MAC:由6个字节组成,用于指定接收方设备的MAC地址。
- 源MAC:由6个字节组成,用于指定发送方设备的MAC地址。
- 类型:由2个字节组成,用于指定封装的以太网数据类型。
- 数据:由46~1500个字节组成,是使用以太网实际传输的数据。数据字段可以包含上层协议的数据,如IP数据包、TCP数据段等。
- 帧校验:由4个字节组成,用于确保数据在传输过程中未发生错误。FCS是一个循环冗余校验(CRC)值,由发送方计算并附加在帧的尾部。接收方在接收到帧后,会重新计算CRC值并与FCS进行比较,以检测数据是否发生了错误。
由于前导码和帧起始界定符都是用于发送方和接收方进行同步,层级归属于物理层。我们在研究以太网帧时,只需要关注数据链路层的部分,也就是从目标MAC开始的数据。
综上,我们可以知道,以太网帧长度最长为1518字节(6+6+2+1500+4),最短为64字节(6+6+2+46+4)。
1518字节的最长以太网帧长度在早期由DEC、Intel、Xerox三家公司在制定;而60字节的最短帧长度则是为了为了在最早期的共享介质(同轴电缆)环境下,解决“碰撞检测”的物理极限问题。在共享介质的环境下,发送方在发送完一个帧之前,必须能够检测到可能发生的“碰撞”,也就是说必须制定一个最短的帧长度,能够满足发送方在最后一个数据发送完成之前还能接收到来自总线上的碰撞信号。那为什么是64个字节呢?以10Mbps的以太网,最准规定最大网络跨度为 2500米,算下来往返时间的两倍约为51.2us,总的比特数刚好为64字节。至于这个时间为什么要取信号往返时间的两倍呢?想象一下,当你的信号快要到达对方时,对方也开始发送,此时碰撞发生,碰撞信号会返回到你这里,接收到碰撞信号的时间最多是往返时间,而你还处于发送状态(可能才发送30左右字节?),完全可以监听到这次碰撞。
四、使用MAC地址通信
在同一网段即局域网中,设备之间的通信依赖MAC地址。当某一设备期望向其它设备发送消息,只需要知道对方的MAC地址即可完成一次单播通信 (目标MAC地址第一个字节最低位为0)。当然,也可以使用特殊的目标MAC地址实现组播通信(目标MAC地址第一个字节最低位为1)或广播通信(目标MAC地址为FF:FF:FF:FF:FF:FF)。
- 单播:与某一设备进行通信,只有目标MAC匹配的设备或节点能够接收到分组数据。
- 组播:与某一组的设备进行通信,只有位于这一组的设备能够接收到分组数据。
- 广播:当前链路中的所有设备都能够收到当前分组数据。