2. 报文处理硬件架构

理解 SmartNIC 的报文处理能力,不能只看“有多少个 ARM 核”或“支持多少 Gbps”,而要沿着一条报文从光模块进入、到被 CPU 或主机消费的完整路径去看。这条路径上的每一级——PHY/MAC、packet processor、硬件加速引擎、ARM 核、DMA 与内存子系统——都决定了报文在什么位置被识别、被修改、被丢弃或被转发。本节把这条数据通路拆开,说明各部件如何协同完成线速收发。

一、从 SerDes 到 MAC:报文进入芯片的第一站

光模块或电口送来的高速串行信号首先进入 PHY 层。PHY 内部包含 SerDes、时钟数据恢复(CDR)、均衡与编解码逻辑,把串行比特流恢复成对齐的符号流,再交给 MAC 层。以 100GbE 为例,典型实现是 4 条 25Gbps lane 组成一个 100G 端口,PHY 完成 lane 对齐与通道绑定后,MAC 侧看到的是一个连续的以太网帧流。

MAC 层负责帧定界、前导码与 SFD 识别、FCS 校验、以及基本的流控(PAUSE/PFC)。这里有一个关键判断点:FCS 校验失败或长度非法的帧,通常在 MAC 或紧邻的解析模块就被丢弃,不会继续占用后续 packet processor 的处理带宽。MAC 还会把帧按端口打上来源标识(port ID),这个标识会随报文一路传递,成为后续转发、镜像、统计的依据。

二、Packet Processor:解析、匹配与动作决策

报文离开 MAC 后进入 packet processor(也称 parser + match-action pipeline)。它的工作可以概括为三步:解析、查表、执行动作。

  • 解析(Parse):按协议栈逐层剥离头部,识别 EtherType、VLAN、IPv4/IPv6、TCP/UDP、VXLAN/Geneve 等,提取出五元组、隧道 ID、元数据字段。解析结果写入一个内部报文描述符(descriptor),而不是反复访问报文本体。
  • 匹配(Match):用解析出的字段去查 ACL、流表、路由表、隧道解封装表等。匹配可以是精确匹配、最长前缀匹配或通配匹配,取决于表类型。
  • 动作(Action):命中后执行转发、丢弃、镜像、计数、修改头部(如改 VLAN、改目的 MAC、做 encap/decap)、或者把报文重定向到某个队列或 ARM 核。

这一级是“线速”能否成立的核心。若报文在 pipeline 中需要多次串行查表,或者表项过大导致 SRAM 访问冲突,吞吐就会下降。因此实际设计中,parser 与 match-action 通常做成多级流水,每级只做有限工作,用流水线深度换取时钟频率与吞吐。

三、硬件加速引擎:把重复劳动从 ARM 核手里拿走

如果所有报文都交给 ARM 核处理,核很快会被校验和、加解密、正则匹配等重复操作占满。硬件加速引擎的作用就是把这些固定模式的操作卸载掉。常见引擎包括:

  • 校验和卸载:IP/TCP/UDP checksum 的验证与重算,在报文修改后自动更新。
  • 加解密与认证:IPsec、MACsec、TLS 记录层的对称加解密与完整性校验。
  • 正则/模式匹配:用于 DPI、流分类、特征识别。
  • 压缩/解压:部分场景下用于隧道或存储流量。

加速引擎一般挂在 packet processor 之后、ARM 核之前,或者与 ARM 核并行。报文描述符里会带一个“是否需要加速”的标志位,pipeline 根据标志把报文送入对应引擎,处理完再回到主路径。这样 ARM 核看到的已经是校验和正确、已解密或已分类的报文,只需做控制面或复杂业务逻辑。

四、ARM 核、队列与 DMA:报文如何交给主机

ARM 核在数据面中通常承担两类角色:一是运行控制面协议栈(如路由协议、管理代理),二是处理无法完全卸载的慢路径报文。真正的高速数据面报文,更多是经由队列和 DMA 直接送到主机内存,ARM 核只负责配置队列、维护描述符环、处理异常。

队列是报文调度的基本单位。每个端口可以有多个发送队列和接收队列,队列与优先级、TC、VF 绑定。报文在 packet processor 中被分类后,被放入某个接收队列;DMA 引擎从队列中取出描述符,把报文数据写入主机内存中的缓冲区,并更新完成描述符。主机侧驱动通过轮询或中断感知新报文。

内存子系统在这里至关重要。DMA 读写的是主机内存,若内存带宽不足或缓存一致性处理不当,就会出现丢包或延迟抖动。SmartNIC 通常采用多通道 DDR 或 HBM 作为片上缓冲,配合 PCIe 的读写通道,形成“端口—片上缓冲—PCIe—主机内存”的数据通路。队列深度、缓冲区大小、PCIe 通道数共同决定了突发流量下的吸收能力。

SmartNIC 报文处理数据通路 PHY / SerDes CDR · 均衡 · lane 对齐 4×25G → 100GbE MAC 帧定界 · FCS 校验 PFC / PAUSE · port ID Packet Processor Parser Ether/VLAN/IP/TCP/VXLAN Match-Action ACL · 流表 · 路由 · 隧道 Descriptor 生成 元数据 · 动作标志 硬件加速引擎 Checksum 卸载 IPsec / MACsec 加解密 正则 / 模式匹配 压缩 / 解压 ARM 核 控制面协议栈 慢路径 / 异常处理 队列 / 调度 RX/TX Queue TC · 优先级 · VF 绑定 DMA 引擎 描述符环 · 缓冲区搬运 完成描述符更新 内存子系统 片上 DDR / HBM PCIe 读写通道 主机侧 驱动轮询/中断 → 从主机内存缓冲区读取报文 → 协议栈或应用消费 慢路径下发 FCS 错误 / 非法帧 → 丢弃

五、队列、端口与内存的协同关系

把上述部件串起来看,端口是物理入口,队列是逻辑调度单位,DMA 是搬运通道,内存是缓冲池。四者的协同关系可以这样理解:

  • 端口决定“从哪来”:每个端口有独立的 MAC 与统计计数器,port ID 随报文传递。
  • 队列决定“排在哪”:packet processor 根据分类结果把报文映射到某个 RX 队列,队列深度决定了能吸收多少突发。
  • DMA 决定“搬多快”:DMA 通道数与描述符环大小影响搬运效率,描述符环满时新报文只能丢弃或背压。
  • 内存决定“放得下多少”:缓冲区数量与大小决定了在途报文的上限,PCIe 带宽决定了主机侧能多快消费。

一个常见的教学示例参数是:100GbE 端口、4 个 RX 队列、每个队列 1024 个描述符、每个缓冲区 2048 字节。此时单队列可缓存的报文数约为 1024 个,若平均报文 512 字节,则单队列缓冲约 512KB,四队列合计约 2MB。这个量级决定了在主机短暂停顿(如 GC 或调度延迟)时,网卡能撑多久不丢包。实际值需以具体芯片手册和驱动配置为准,此处仅用于说明队列深度与缓冲能力的关系。

判断线速收发是否成立,可以按“端口速率 → pipeline 吞吐 → 队列深度 → DMA/PCIe 带宽 → 主机消费速率”逐级核对。任何一级成为瓶颈,都会在对应位置出现丢包计数或背压。

六、数据通路上的关键观察点

在实际调试或性能分析时,可以关注以下位置的状态与计数:

观察点典型指标异常含义
MAC 层FCS 错误数、PAUSE 帧数链路质量或对端流控
Packet Processorparser 错误、表项 miss 计数协议不支持或表项未命中
加速引擎引擎占用率、队列积压卸载能力不足或配置错误
RX 队列队列深度、丢弃计数主机消费慢或队列过浅
DMA/PCIe描述符环满次数、PCIe 重传搬运瓶颈或链路问题

这些观察点对应数据通路上的不同级,定位问题时可以按“先看端口计数,再看 pipeline 计数,最后看队列与 DMA 计数”的顺序缩小范围。理解这条通路,也就理解了 SmartNIC 为什么能在不占用主机 CPU 的情况下完成线速收发:每一级只做自己擅长的事,用硬件流水线替代软件逐包处理,用队列和 DMA 把报文高效地交给主机。