二、以太网基础:OSI模型与TCP/IP分层、以太网帧格式、MAC地址与IP地址区别
在FPGA上实现以太网帧解析与封装功能之前,必须对以太网协议栈的底层结构有精确的理解。FPGA不同于CPU,它没有操作系统来屏蔽底层细节,所有字节、比特、时序都需要硬件逻辑直接处理。因此,本节将围绕三个核心主题展开:OSI模型与TCP/IP分层的映射关系、IEEE 802.3以太网帧的逐字段格式、以及MAC地址与IP地址在功能与使用场景上的本质区别。这些知识是后续编写RTL代码、设计FIFO缓冲、计算CRC校验的基础。
2.1 OSI模型与TCP/IP分层:FPGA视角的协议栈映射
核心原理:分层模型的意义
OSI(开放系统互联)七层模型是国际标准化组织提出的网络通信概念框架,而TCP/IP四层模型是实际互联网运行所遵循的协议栈。在FPGA以太网设计中,我们最关心的是从物理层到传输层的实现边界。FPGA通常负责物理层(PHY芯片控制)、数据链路层(MAC控制器)以及部分网络层和传输层的处理(如IP校验和计算、UDP端口过滤)。
从硬件实现角度看,每一层都有明确的职责边界:物理层处理差分信号、时钟恢复、码元同步;数据链路层负责帧定界、MAC地址过滤、CRC校验;网络层处理IP地址路由和分片重组;传输层则管理端口号和会话状态。FPGA的优势在于可以并行处理这些层级的逻辑,例如在接收路径上,MAC层解析帧头的同时,IP层可以预取数据载荷。
判断方法:如何确定FPGA需要实现哪些层
在设计FPGA以太网功能前,需要根据应用场景确定协议栈的裁剪范围。判断依据如下:
- 纯MAC层应用:仅需要收发原始以太网帧,例如工业现场总线协议(EtherCAT、PROFINET RT),此时FPGA只需实现MAC控制器和PHY接口。
- IP层处理:需要支持ARP、ICMP、IP分片重组,例如实现一个简易的TCP/IP卸载引擎(TOE)。
- 传输层处理:需要处理TCP/UDP端口、会话管理,例如高速数据采集系统使用UDP传输波形数据。
- 应用层逻辑:通常由软核处理器(如MicroBlaze、NIOS II)或外部CPU完成,FPGA硬逻辑不直接处理HTTP等应用协议。
对于本课程后续的帧解析与封装功能,核心工作集中在数据链路层,但必须预留IP层和传输层的解析接口,以便扩展。
案例拆解:一个UDP数据包的跨层封装过程
假设FPGA需要发送一个UDP报文,数据内容为8字节的传感器读数。整个封装过程如下:
- 应用层:传感器数据被组织为8字节有效载荷(例如温度、湿度各4字节)。
- 传输层:添加UDP头(8字节),包括源端口(0x1000)、目的端口(0x2000)、长度(16字节)、校验和(可选)。
- 网络层:添加IP头(20字节),包括版本(IPv4)、源IP(192.168.1.10)、目的IP(192.168.1.20)、协议号(17表示UDP)、总长度(28字节)。
- 数据链路层:添加以太网头(14字节),包括目的MAC(0x00:11:22:33:44:55)、源MAC(0xAA:BB:CC:DD:EE:FF)、类型(0x0800表示IPv4)。
- 物理层:添加前导码(7字节0x55)和SFD(1字节0xD5),然后由PHY芯片进行编码和信号发送。
在FPGA实现中,这个封装过程通常通过状态机控制,每个状态对应一个协议层的头部添加。接收方向则相反,逐层剥离头部并校验。
eth_tx_header_gen模块负责生成MAC头,ip_tx_header_gen模块负责生成IP头。这样便于维护和复用,也方便后续添加VLAN标签或IPv6支持。
常见误区与总结复盘
- 误区一:认为FPGA必须实现完整的TCP/IP协议栈。实际上,大多数FPGA应用只需实现UDP/IP子集,TCP状态机复杂且资源消耗大,通常留给软核处理器。
- 误区二:混淆了PHY芯片和MAC控制器的职责。PHY负责物理信号编码(如1000BASE-X的8B/10B编码),MAC负责帧的组装与解析。FPGA内部实现的是MAC逻辑,PHY通常使用外部芯片(如RTL8211、88E1512)。
- 误区三:忽略CRC校验的时序要求。CRC-32计算需要与数据流同步进行,不能等整个帧接收完再计算,否则需要额外的缓冲。
2.2 以太网帧格式:逐字段深度解析
核心原理:IEEE 802.3帧结构
标准以太网帧(DIX Ethernet II)由以下字段组成,FPGA解析时必须严格按字节顺序处理:
| 字段 | 长度(字节) | 值/说明 | FPGA处理方式 |
|---|---|---|---|
| 前导码(Preamble) | 7 | 0x55 重复7次,用于时钟同步 | PHY芯片处理,MAC层通常忽略 |
| SFD(帧起始定界符) | 1 | 0xD5,标识帧开始 | PHY芯片检测,MAC层以此为起始 |
| 目的MAC地址 | 6 | 接收方MAC,可为单播/多播/广播 | MAC层过滤:不匹配则丢弃 |
| 源MAC地址 | 6 | 发送方MAC | 用于学习或转发决策 |
| 类型/长度(Type/Length) | 2 | ≥0x0600表示类型(如0x0800=IPv4);<0x0600表示长度 | 决定上层协议解析路径 |
| 数据(Payload) | 46-1500 | 上层协议数据,不足46字节需填充 | 存入FIFO或直接转发 |
| FCS(帧校验序列) | 4 | CRC-32校验值,覆盖MAC头+数据 | 接收时校验,发送时生成 |
判断方法:类型/长度字段的识别
FPGA在解析以太网帧头时,需要根据类型/长度字段的值决定后续处理路径。判断逻辑如下:
- 若字段值 ≥ 0x0600(1536),则视为EtherType,表示上层协议类型。常见值包括:0x0800(IPv4)、0x0806(ARP)、0x86DD(IPv6)、0x8100(VLAN标签)。
- 若字段值 ≤ 0x05DC(1500),则视为帧长度(IEEE 802.3原始格式),此时需要依赖LLC/SNAP头进一步判断上层协议。
在实际FPGA设计中,绝大多数场景使用EtherType格式(DIX Ethernet II),因此可以直接根据该字段跳转到对应的IP解析模块或ARP模块。
案例拆解:接收一个ARP请求帧的解析流程
假设FPGA收到一个目的MAC为广播地址(FF:FF:FF:FF:FF:FF)、类型字段为0x0806的帧。解析步骤如下:
- 前导码与SFD:PHY芯片完成时钟同步后,将SFD之后的字节流送入MAC接收引擎。
- MAC头解析:提取目的MAC(FF:FF:FF:FF:FF:FF),判断为广播帧,不进行地址过滤,继续处理。
- 类型字段判断:读取0x0806,识别为ARP协议,将数据载荷送入ARP解析模块。
- ARP内容解析:检查硬件类型(1表示以太网)、协议类型(0x0800表示IP)、操作码(1表示请求)。若目标IP匹配本机IP,则生成ARP应答帧。
- FCS校验:在帧接收过程中同步计算CRC-32,帧结束时比较校验值。若错误则丢弃整个帧。
这个流程在FPGA中通过状态机实现,每个状态对应一个字段的解析,状态转移条件由字段值决定。
常见误区与总结复盘
- 误区一:忽略最小帧长64字节的限制。当上层数据不足46字节时,必须填充0x00到最小长度,否则接收方会认为帧不完整而丢弃。
- 误区二:FCS计算范围错误。CRC-32只覆盖目的MAC到数据字段,不包括前导码和SFD。发送时FCS在数据之后追加,接收时校验通过后应剥离FCS再向上层传递。
- 误区三:对VLAN标签处理不当。若类型字段为0x8100,则帧头实际为18字节(增加4字节VLAN标签),FPGA解析时需要额外处理。
2.3 MAC地址与IP地址区别:硬件寻址与逻辑寻址
核心原理:两种地址的本质差异
MAC地址是烧录在网络接口硬件中的物理地址,由IEEE分配OUI(组织唯一标识符)前缀,全球唯一。IP地址是网络层逻辑地址,由管理员或DHCP服务器分配,用于在不同网络间路由。在FPGA设计中,MAC地址通常作为参数配置在寄存器中,而IP地址则参与ARP协议解析和路由决策。
关键区别在于:MAC地址在数据链路层使用,帧在局域网内传输时,目的MAC地址决定下一跳设备;IP地址在网络层使用,决定数据包从源到目的的逻辑路径。当数据包跨越路由器时,源MAC和目的MAC会逐跳改变,但源IP和目的IP保持不变。
判断方法:FPGA中地址过滤与路由决策
FPGA在接收帧时,需要根据MAC地址进行第一层过滤。判断逻辑如下:
- 单播帧:目的MAC与本地MAC完全匹配才接收。
- 广播帧:目的MAC为FF:FF:FF:FF:FF:FF,必须接收。
- 多播帧:目的MAC的最高字节最低位为1(如01:00:5E:xx:xx:xx),根据多播组过滤。
对于IP地址,FPGA通常不执行完整路由,而是通过ARP表将目的IP映射到目的MAC。如果ARP表未命中,则发送ARP请求广播,等待应答后更新表项。
案例拆解:跨网段通信的地址转换过程
假设FPGA设备A(IP: 192.168.1.10, MAC: AA:BB:CC:DD:EE:01)需要发送数据到设备B(IP: 192.168.2.20, MAC: 11:22:33:44:55:66),两者不在同一子网。过程如下:
- 判断目的IP是否在同一子网:A将目的IP与自身子网掩码(255.255.255.0)进行与运算,发现192.168.2.0 ≠ 192.168.1.0,不在同一子网。
- 查找默认网关:A将数据帧的目的MAC设置为网关的MAC(00:0C:29:AA:BB:CC),源MAC为自己的MAC,目的IP仍为B的IP。
- 网关转发:网关收到帧后,剥离MAC头,根据目的IP查询路由表,将帧重新封装,目的MAC改为B的MAC,源MAC改为网关出口MAC。
- B接收:B收到帧后,目的MAC匹配自身,目的IP匹配自身,完成接收。
在FPGA实现中,这个流程需要维护一个ARP缓存表(通常用CAM或简单RAM实现),并支持ARP请求/应答状态机。
常见误区与总结复盘
- 误区一:认为MAC地址可以修改。虽然某些网卡支持MAC地址覆盖,但FPGA设计中应保持MAC地址唯一性,避免网络冲突。
- 误区二:混淆了ARP请求的广播域。ARP请求是二层广播,只能在同一VLAN内传播,无法跨路由器。
- 误区三:忽略MAC地址的字节序。以太网传输时,MAC地址按字节顺序发送,但某些协议(如Modbus TCP)可能使用不同的字节序,FPGA解析时需注意。