网络通信基础:OSI七层模型、TCP/IP协议栈、以太网帧格式、MAC地址与IP地址、ARP协议原理
FPGA 网络通信开发的核心,是让硬件逻辑能够正确解析、构造并转发符合协议规范的数据报文。无论是设计一个千兆以太网 MAC 控制器,还是实现 TCP/IP 卸载引擎,开发者都必须对网络协议的分层结构、地址体系以及地址解析机制有精确的理解。本章将围绕五个关键知识点展开:OSI 七层模型与 TCP/IP 协议栈的对应关系、以太网帧的字节级格式、MAC 与 IP 地址的职责划分,以及 ARP 协议在硬件实现中的状态机转换逻辑。这些内容将直接决定 FPGA 逻辑中寄存器配置、FIFO 数据通路设计以及状态机编码的合理性。
4.1 OSI 七层模型与 TCP/IP 协议栈的工程映射
OSI 参考模型将网络通信划分为七个层次,每一层只负责特定的功能模块,层与层之间通过标准接口交互。在 FPGA 开发中,我们并不需要完整实现七层协议,而是聚焦于物理层、数据链路层和网络层的硬件逻辑。TCP/IP 协议栈将 OSI 的高三层(应用、表示、会话)合并为应用层,将数据链路层和物理层合并为网络接口层,形成了更贴近实际工程实现的四层模型。
从硬件设计的角度看,各层职责可以清晰地映射到 FPGA 内部模块:物理层对应 PHY 芯片的接口逻辑(如 GMII、RGMII、SGMII),数据链路层对应 MAC 控制器(处理帧校验、流量控制、地址过滤),网络层对应 IP 协议处理模块(负责路由查找、校验和计算),传输层则对应 TCP/UDP 卸载引擎。理解这种映射关系,有助于开发者在系统架构设计阶段合理划分模块边界,避免将软件协议栈的思维模式直接套用到硬件逻辑中。
4.2 以太网帧格式的字节级解析
以太网帧是数据链路层的数据封装单位,FPGA 的 MAC 控制器直接与帧结构打交道。一个标准的 Ethernet II 帧包含以下字段:前导码(7 字节 0x55)、帧起始定界符(1 字节 0xD5)、目的 MAC 地址(6 字节)、源 MAC 地址(6 字节)、类型/长度字段(2 字节)、负载数据(46-1500 字节)、帧校验序列 FCS(4 字节 CRC32)。
在 FPGA 逻辑设计中,前导码和 SFD 通常由 PHY 芯片自动处理,MAC 控制器从目的 MAC 地址开始接收数据。类型字段的值决定了上层协议类型:0x0800 表示 IPv4,0x0806 表示 ARP,0x86DD 表示 IPv6。负载数据的最小长度是 46 字节,如果上层数据不足,需要填充到最小帧长 64 字节(不含前导码)。FCS 字段由发送端计算并附加,接收端通过 CRC 校验判断帧是否在传输过程中损坏。
| 字段名称 | 长度(字节) | FPGA 处理方式 | 关键注意事项 |
|---|---|---|---|
| 前导码 + SFD | 8 | PHY 自动处理 | RGMII 接口需注意时钟对齐 |
| 目的 MAC | 6 | 地址过滤模块比较 | 支持单播/广播/组播过滤 |
| 源 MAC | 6 | 学习并存储 | 用于 MAC 地址表维护 |
| 类型/长度 | 2 | 协议分发 | 0x0800=IP,0x0806=ARP |
| 负载数据 | 46-1500 | FIFO 缓存 | 最小 46 字节,不足需填充 |
| FCS | 4 | CRC32 校验 | 发送时计算,接收时验证 |
4.3 MAC 地址与 IP 地址的职责划分
MAC 地址是数据链路层的物理地址,长度为 48 位,通常表示为 6 组十六进制数(如 00:1A:2B:3C:4D:5E)。MAC 地址在全球范围内唯一标识一块物理网卡,由 IEEE 分配厂商代码(OUI),后 24 位由厂商自行分配。在 FPGA 设计中,MAC 地址存储在寄存器中,用于帧的源地址填充和目的地址过滤。
IP 地址是网络层的逻辑地址,IPv4 长度为 32 位,表示为点分十进制(如 192.168.1.100)。IP 地址用于跨网络的寻址,它标识的是主机在网络中的位置,而非物理设备本身。当数据包在不同网段间转发时,IP 地址保持不变,而 MAC 地址会随着每一跳的转发而更新。这种"逻辑地址不变、物理地址逐跳变化"的机制,是网络通信能够跨越复杂拓扑的基础。
4.4 ARP 协议原理与硬件状态机设计
ARP(Address Resolution Protocol)用于根据 IP 地址解析对应的 MAC 地址。当主机需要向同一网段内的另一台主机发送数据时,它必须知道目的主机的 MAC 地址。ARP 协议通过广播请求、单播应答的方式完成地址解析。ARP 报文格式包含硬件类型(1 表示以太网)、协议类型(0x0800 表示 IP)、硬件地址长度(6)、协议地址长度(4)、操作码(1=请求,2=应答)、发送方 MAC、发送方 IP、目标 MAC、目标 IP。
在 FPGA 中实现 ARP 协议,核心是设计一个有限状态机(FSM),管理 ARP 请求的发送、接收、应答和缓存表更新。典型的 ARP 状态机包含以下状态:IDLE(空闲)、WAIT_RESPONSE(等待应答)、SEND_REQUEST(发送请求)、UPDATE_CACHE(更新缓存)。当上层模块需要发送 IP 数据包时,首先查询 ARP 缓存表;如果缓存未命中,则触发 ARP 请求发送流程,同时启动超时计数器;收到 ARP 应答后,更新缓存表并通知上层模块继续发送。
// ARP 状态机核心状态定义(Verilog 伪代码)
localparam IDLE = 3'd0;
localparam CHECK_CACHE = 3'd1;
localparam SEND_REQUEST = 3'd2;
localparam WAIT_RESPONSE = 3'd3;
localparam UPDATE_CACHE = 3'd4;
localparam SEND_REPLY = 3'd5; // 收到 ARP 请求时自动应答
// 状态转移条件
always @(posedge clk or negedge rst_n) begin
if (!rst_n) state <= IDLE;
else begin
case (state)
IDLE: if (tx_request_valid) state <= CHECK_CACHE;
CHECK_CACHE: if (cache_hit) state <= IDLE; // 直接发送数据
else state <= SEND_REQUEST;
SEND_REQUEST: state <= WAIT_RESPONSE;
WAIT_RESPONSE: if (arp_rx_valid && arp_op == 2) state <= UPDATE_CACHE;
else if (timeout_cnt == TIMEOUT_MAX) state <= IDLE;
UPDATE_CACHE: state <= IDLE;
SEND_REPLY: state <= IDLE;
endcase
end
end
4.5 案例拆解:基于 FPGA 的 ARP 应答模块设计
在某工业以太网数据采集项目中,FPGA 需要作为从设备响应主站的 ARP 请求。系统约束如下:FPGA 工作在 125MHz 时钟,使用 RGMII 接口连接 PHY 芯片,MAC 地址固定为 00:11:22:33:44:55,IP 地址为 192.168.1.200。初始现象是主站无法 ping 通 FPGA,通过 Wireshark 抓包发现 FPGA 对 ARP 请求无响应。
分析判断过程:首先检查 PHY 芯片的链路状态寄存器,确认链路已建立;其次检查 FPGA 接收通路,确认 ARP 请求帧能够正确接收并解析;最后检查发送通路,发现发送 FIFO 的写使能信号在应答帧发送期间被错误拉低,导致数据丢失。进一步定位发现,状态机在 SEND_REPLY 状态时,发送完成信号与 FIFO 读使能的时序存在竞争冒险。
实际操作步骤:修改状态机,在进入 SEND_REPLY 状态前先等待发送 FIFO 为空,然后一次性写入完整的 ARP 应答帧;同时增加发送完成中断标志,确保帧发送完毕后才返回 IDLE 状态。修改后,主站能够正常 ping 通 FPGA,ARP 应答延迟从原来的不可用降低到 12 个时钟周期(约 96ns)。
4.6 常见误区与设计复盘
在 FPGA 网络通信开发中,初学者容易混淆 MAC 地址和 IP 地址的使用场景。MAC 地址用于同一网段内的帧转发,IP 地址用于跨网段的路由选择。当 FPGA 需要与不同网段的主机通信时,必须通过默认网关转发,此时帧的目的 MAC 地址是网关的 MAC 地址,而非最终目的主机的 MAC 地址。另一个常见误区是忽略 ARP 缓存表的老化机制,导致网络拓扑变化后通信中断。
从工程实践的角度,建议在 FPGA 设计中采用模块化的 ARP 处理单元,将 ARP 请求解析、应答生成、缓存表管理、超时重传等功能分离。缓存表建议使用双端口 RAM 实现,支持同时读写操作。对于需要高可靠性的应用,可以增加 ARP 请求重传次数和退避算法,避免网络拥塞时请求丢失导致的通信失败。