第一部分:以太网的第一性原理 - “有组织的广播风暴”
要从根本上理解以太网,我们需要回到它最初要解决的问题:如何让连接在同一根物理介质(如同轴电缆)上的多台计算机,能够相对有序地、避免冲突地共享信道进行通信?
1. 核心模型:带有地址的广播 (Addressed Broadcast)
广播是物理基础: 在最原始的以太网中(共享介质,如集线器Hub环境),任何一台计算机发送的数据帧,都会被所有连接在同一网络段的计算机接收到。这是一种物理上的广播。
MAC地址是身份标识: 为了让数据能被正确的计算机接收,每张网卡(NIC)在出厂时都被烧录了一个全球唯一的48位物理地址,这就是MAC地址 (Media Access Control Address)。
收发规则:
发送方: 在要发送的数据前面,加上一个“信封”,信封上写着接收方的MAC地址(目标地址)和自己的MAC地址(源地址)。
接收方: 每台计算机都会查看所有到达的数据帧的“信封”。如果目标MAC地址是自己的MAC地址(或广播地址`FF:FF:FF:FF:FF:FF`),它就拆开信封,将数据交给上层处理;如果不是,就直接丢弃这个数据帧。
这个“广播发送,凭地址接收”的机制,是以太网通信的第一性原理。
2. 核心机制:CSMA/CD - “先听后说,边说边听,冲突退让”
问题: 在共享介质上,如果两台计算机同时说话,信号就会碰撞、损坏,谁也听不清。
CSMA/CD (Carrier Sense Multiple Access with Collision Detection)是早期以太网解决这个问题的优雅方案:
Carrier Sense (载波侦听): “先听再说”。计算机在发送数据前,先监听一下信道是否空闲。如果别人正在说,就等待。
Multiple Access (多路访问): 允许多台计算机共享同一个信道。
Collision Detection (冲突检测): “边说边听”。计算机在发送数据的同时,会监听自己发送出去的信号。如果它监听到信号与自己发出的不一致,就知道发生了碰撞 (Collision)。
冲突处理 (退避算法): 一旦检测到碰撞,所有发生碰撞的计算机会:
1. 立即停止发送。
2. 发送一个特殊的Jamming信号,以强化冲突,确保网络上所有设备都知道发生了碰撞。
3. 执行一个二进制指数退避算法 (Binary Exponential Backoff):各自等待一个随机的时间,然后再尝试重新发送。随机性是关键,它避免了大家在同一时刻再次尝试而导致连续碰撞。
现代演进: 如今,网络几乎都使用交换机 (Switch)代替了集线器(Hub)。交换机是更智能的设备,它内部有一张MAC地址表,知道哪个MAC地址的设备连接在哪个物理端口上。当交换机收到一个数据帧时,它会查看目标MAC地址,然后只将该帧转发到对应的目标端口,而不是广播到所有端口。
这使得现代以太网大多工作在全双工、无冲突的点对点模式下。但CSMA/CD的机制和MAC地址寻址的原理,依然是以太网协议的底层DNA。
第二部分:以太网协议详解 - 分层解构
以太网的实现严格遵循OSI七层网络模型中的底下两层。
1. 物理层 (Physical Layer - PHY) - OSI 第1层
职责: 负责将数字比特流与物理介质上的电信号(或光信号)进行相互转换。
关键技术:
介质: 双绞线(如CAT5e, CAT6,使用RJ45接口)、光纤、同轴电缆。
编码: 将二进制数据编码成适合在物理介质上传输的信号。例如:
曼彻斯特编码 (Manchester Coding): 在早期10Mbps以太网中使用。将时钟信息编码进数据流,便于时钟恢复。
4B/5B, 8B/10B: 在100Mbps和1Gbps以太网中使用。将4/8位数据编码成5/10位符号,以保证直流平衡(0和1的数量大致相等)和足够的信号跳变,便于接收方进行时钟恢复。
PAM (Pulse Amplitude Modulation): 在更高速的以太网(如2.5G, 5G, 10G)中,使用多电平脉冲幅度调制,在一个符号周期内传输多个比特,以提高频谱效率。
PHY芯片: 在FPGA应用中,通常会有一颗专门PHY芯片。FPGA通过一个标准的MII/GMII/RGMII接口与PHY芯片连接。FPGA负责处理数字逻辑,PHY芯片负责处理模拟和电气部分。
2. 数据链路层 (Data Link Layer) - OSI 第2层
这是以太网协议的核心,由两个子层构成。
A. MAC子层 (Media Access Control)
职责: 负责组装和解析以太网帧 (Ethernet Frame),并实现CSMA/CD等介质访问控制逻辑。以太网帧结构 (Ethernet II Frame): 这是最常用的帧格式。
字段 (Field) | 长度 (Bytes) | 描述 |
Preamble (前导码) | 7 | 一串交替的`10101010`。用于接收方进行时钟同步和锁定。 |
SFD (帧起始定界符) | 1 | `10101011`。标志着前导码结束,以太网帧的正式内容开始。 |
Destination MAC | 6 | 目标MAC地址 |
Source MAC | 6 | 源MAC地址 |
EtherType (类型) | 2 | 标识上层协议的类型。例如,`0x0800`表示上层是IP协议,`0x0806`表示是ARP协议。这个字段是连接数据链路层和网络层的桥梁。 |
Payload (数据) | 46 - 1500 | 上层协议(如IP包)的数据。如果数据不足46字节,MAC层会自动进行填充 (Padding) |
FCS (帧校验序列) | 4 | CRC32校验码。从目标MAC到数据字段的所有内容计算出的循环冗余校验码,用于检测传输错误。 |
帧间隙 (Interframe Gap - IFG): 在发送完一帧后,发送方必须等待至少相当于96个比特时间的空闲时间,才能发送下一帧。
B. LLC子层 (Logical Link Control)
职责: 在早期的以太网标准中,LLC用于提供不同网络层协议的复用和一些控制功能。但在现代主要基于IP的以太网中,LLC的作用已被大大简化,通常被认为是透明的。
第三部分:FPGA中的以太网实现
在FPGA中实现一个完整的以太网接口,通常意味着我们需要构建一个MAC核。根据速度和功能需求,有不同的实现方案。
1. 关键组件与设计
一个典型的FPGA以太网设计包含以下部分:PHY接口 (MII/GMII/RGMII): 这是连接FPGA和外部PHY芯片的物理接口。我们需要编写逻辑来严格遵循这些接口的时序规范。
MII (Media Independent Interface): 10/100Mbps,使用16根信号线,比较老旧。
GMII (Gigabit MII): 1Gbps,使用25根信号线,引脚多。
RGMII (Reduced GMII): 1Gbps,是GMII的简化版,通过双边沿采样 (DDR)技术,将引脚数量减少到12根,是目前FPGA设计中最常用的千兆以太网接口。
接收路径 (RX Path): `PHY接口 -> RX FIFO -> RX MAC FSM`
1. 数据接收: 从RGMII接口接收4位(或8位)数据块。
2. 前导码和SFD检测: 状态机检测到`0xD5`(SFD的编码)后,开始接收真正的MAC帧。
3. 数据存储: 将接收到的目标MAC、源MAC、类型、数据等存入RX FIFO。
4. FCS校验: 在接收的同时,并行计算CRC32校验和。
5. 帧处理: 帧接收完毕后,将计算出的CRC与帧末尾的FCS进行比较。如果匹配,则通知上层逻辑“有一个有效的IP包/ARP包到达RX FIFO”;如果不匹配,则直接丢弃该帧。
发送路径 (TX Path): `TX FIFO -> TX MAC FSM -> PHY接口`
1. 数据准备: 上层应用逻辑(如一个UDP/IP协议栈)将要发送的数据(如UDP载荷)、目标IP地址等信息放入TX FIFO。
2. 帧封装: TX MAC FSM从FIFO中取出数据,并根据上层指令(如ARP查找后得到的目标MAC地址)为其添加前导码、SFD、目标/源MAC地址、EtherType字段。
3. FCS计算: 在发送的同时,并行计算CRC32校验和。
4. 发送FCS:在数据发送完毕后,将计算出的CRC附加在帧的末尾。
5. 帧间隙控制: 发送完一帧后,控制状态机进入等待状态,确保满足IFG的要求。