做网络安全设备的硬件架构,被问得最多的一个问题就是:数据面到底用什么处理?这个问题不是简单的“哪个好”,而是“怎么取舍”。从早期纯软件转发,到 CPU+DPDK 撑起几十G吞吐,再到现在 FPGA 和网络处理器(NP)在高端设备里越来越常见,每一步演进背后都是业务需求、开发成本、功耗和交付周期之间的拉扯。今天我想把这几条技术路线掰开揉碎聊一聊:它们各自适合什么场景,怎么互相配合,选型时该盯住哪些指标,以及我在实际项目中踩过哪些坑。
这个话题适合三类朋友看:一是刚入行做安全网关、防火墙、IDS/IPS 的软件工程师,二是正在做硬件选型或架构预研的产品/架构师,三是虽然不直接写代码,但需要跟硬件团队对接、评估项目周期的项目经理。看完你能对“为什么有的设备用 DPDK 就能搞定,有的非要上 FPGA 或 NP”有一个相对清晰的判断框架,而不是被厂商的 PPT 带着走。
1. 先搞清楚:安全设备的数据面到底在忙什么
1.1 不是所有流量都值得走同一条路
很多刚开始接触安全设备的工程师会有一个直觉:流量进来,CPU 处理一下,再出去,逻辑上很简单。但一旦把视角放到真实场景里,事情就变了。一台部署在核心位置的防火墙或 IPS,每天要面对的流量里混杂着加密连接、分片报文、畸形包、扫描探测,还有大量只穿行不过问的 TCP 会话。如果每个包都要经过操作系统的完整协议栈处理,先不说安全检测,光转发这一层就能把 CPU 拖垮。
所以做架构时,第一步不是纠结选 FPGA 还是 NP,而是把流量分成“快路径”和“慢路径”。快路径指的是洗流量、转发、五元组匹配、黑白名单、基础 QoS 这些规则明确、动作固定的处理,这类处理追求的是吞吐和低时延,适合用硬件加速或专用数据面来跑。慢路径指的是 TLS 卸载、应用识别、深度包检测、行为分析、威胁情报关联这类需要大状态、复杂逻辑、频繁更新的处理,这类处理需要灵活的软件环境,单纯靠硬件实现成本极高。
这个划分是整个架构的起点。很多项目失败,不是因为某个芯片算力不够,而是试图在一条路径上做完所有事情。比如非要在 FPGA 里维护几百万条会话状态的超时老化,或者非要在 CPU 上做全部小包的线速转发,都是对资源的最大浪费。
1.2 “快路径”和“慢路径”的划分才是架构核心
清晰划分快慢路径之后,才能决定哪些功能卸载、哪些功能保留在 CPU 上。卸载不是越彻底越好,而是要找到一个平衡点。比如加解密这种计算密集但逻辑固定的工作,非常适合卸载到硬件;但像特征规则库这种每周甚至每天都会变的检测逻辑,如果塞进硬件,升级一次就要重新编译、重新加载,运维会非常痛苦。
我见过一个真实案例:某团队为了把正则匹配性能提上去,把一整套 DPI 规则固化到了 FPGA 里,结果第二年规则迭代频率上来了,每次更新都要硬件团队配合做时序验证,原本两周一个迭代的节奏被拉长到两个月。后来他们重新设计,把“确定性强的固定特征”留在 FPGA,把“快速变化的复杂规则”上抛到 CPU 的 DPDK 数据面,整个系统才恢复正常的迭代节奏。
所以,讨论 CPU+DPDK、FPGA、NP 谁是未来之前,先想清楚你的设备里哪些能力是“多年不变的”,哪些能力是“天天都在变的”。这个判断决定了硬件卸载的边界,也决定了后续的选型方向。
2. CPU+DPDK:从绕开内核到吃满核
2.1 DPDK 解决的三件事:轮询、大页、零拷贝
DPDK 之所以在安全设备里流行,原因很直白:它让普通 x86 服务器也能跑出接近专用硬件的转发性能,同时保留了通用 CPU 的灵活性。它核心做了三件事,理解了这三件事,你就能理解为什么“上了 DPDK 不等于万事大吉”。
第一是轮询模式。传统网卡收包要靠中断通知 CPU,但高流量下中断风暴会耗尽 CPU 资源。DPDK 的 PMD(Poll Mode Driver)让 CPU 持续轮询网卡队列,减少了上下文切换和中断开销。代价是 CPU 核被占满,哪怕流量很小,轮询线程也会跑满一个核。所以 DPDK 部署通常要绑核,把专门的核心分配给指定的收包线程。
第二是大页内存。普通页 4KB,TLB 命中率在高吞吐场景下不够用,DPDK 采用 2MB 甚至 1GB 的大页,降低页表开销,保证数据包头和描述符能被快速访问。这块在部署时要注意系统预留,否则很多数据面性能问题其实是内存配置引起的。
第三是零拷贝。传统收发路径上,数据包从网卡 DMA 到内核缓冲区,再从内核拷贝到用户态,一次包要拷贝好几次。DPDK 通过用户态驱动直接操作网卡 DMA 出来的内存池,数据在整个处理链路里只被指针引用传递,不去复制,省下大量内存带宽和 CPU 周期。
这三件事叠加之后,一台普通双路服务器跑几十个 Gbps 的小包转发,是能做到的。很多安全厂商的量产 NGFW 和 IDS 产品,至今仍然以这个方案为核心,因为它开发效率高、规则更新快、人才好招。
2.2 什么场景下 CPU+DPDK 依然是正确答案
DPDK 方案的优势不是性能,而是灵活性。安全设备的检测逻辑是出了名的“多变”:新漏洞出来要加规则,新应用协议要加识别特征,合规要求变了要调整审计项。这些场景下,如果硬件逻辑已经固化,改动成本会非常感人。
所以我的判断标准是:如果业务要求“检测规则周级更新”且流量规模在几十 G 以内,CPU+DPDK 依然是性价比最高的选择。具体落地上,还要把工作分成几个层面来做:收包上,用 DPDK 做高速采集,直接接管物理网卡;会话管理上,在用户态维护流表,搞老化超时和哈希索引;检测引擎上,把正则匹配和协议解析做成可插拔模块,规则库走动态加载。
这里有个容易被忽略的细节:即使用了 DPDK,也不能把协议栈完全扔掉。比如你仍然需要处理 TCP 重组、IP 分片、会话跟踪,这些逻辑如果全部用裸 DPDK 流模式去拼,代码复杂度会直线上升。很多团队会保留一个带协议栈的数据面 SDK,或者自己维护一个轻量级的用户态 TCP 状态机来做重组,避免重复造轮子。
2.3 CPU+DPDK 的瓶颈,不是 CPU 不够快这么简单
DPDK 的瓶颈,业内讨论得很多,我根据自己的项目经验总结出三个最实际的,不是性能参数表上能看出来的。
第一个瓶颈是核间通信。多核处理流量时,同一个 TCP 流的数据包可能被哈希到不同的核上,导致会话状态被多个核竞争访问,锁竞争和 cache line bouncing 会让性能断崖式下跌。解决思路是让一个流始终绑定到同一个核上(RSS 或 flow director),但这也意味着单核成为了瓶颈上限。流数据少还好,一旦单核的处理能力不够,整机吞吐就卡死了。
第二个瓶颈是 PCIe 带宽。初看网卡宣称的 100G,实际 PCIe 通道可能只能支撑部分线速。CPU 要同时处理收包、内存读写、交互数据,PCIe 带宽一旦成为瓶颈,吞吐数据再好看也没用。所以选型时我会先做一份“平台带宽预算表”,把网卡带宽、PCIe 通道数、内存带宽一起算进去,而不是只看网卡端口速率。
第三个瓶颈是加解密和数据压缩这类重计算。安全设备里 IPSec、TLS 代理、SSL 解密是常规操作,一台 NGFW 如果开启全流量 TLS 解密,CPU 资源会被密码运算吃掉一大块。这时候你可以选择支持 cryptodev 的加速卡,或者把加解密卸载到后续会聊到的 FPGA/NP 上,否则光靠 CPU 很难兼顾加密和解密两头的性能。
提示:判断一个 DPDK 方案是否到了瓶颈,别只看“线速转发”的峰值。要在开启 ACL/规则匹配、加解密、会话管理等全部功能后再压测,那个数字才是真实的容量。
3. FPGA:用并行的确定性换编程的复杂度
3.1 FPGA 在安全设备里最常干的四件事
当流量规模从几十 G 涨到 100G/400G,或者对时延有硬性要求时,CPU+DPDK 的软件路径就变得吃力了。这时候 FPGA 开始进入视野。FPGA 的好处是“数据面并行”,它可以同时处理多个包、多个特征,而不是像 CPU 一样靠多核轮转。这种并行性让它在四类安全任务上非常吃香。
第一类是报文解析和过滤。以太网头、IP 头、TCP/UDP 头、甚至 VXLAN 和 GTP 隧道,解析逻辑相对固定,在 FPGA 里做成流水线非常合适。匹配五元组、丢弃畸形包、负载均衡哈希这些基础动作,可以在一个报文时钟周期内完成,时延是确定性的。
第二类是加解密卸载。IPSec、MACsec、TLS 的对称加解密在 FPGA 里有大量成熟的算法核,AES-NI 指令虽然在 CPU 上越来越强,但放到 400G 场景下,FPGA 的并行算力优势还是很明显。而且加解密操作不涉及复杂状态,天然适合硬件流水。
第三类是正则匹配和特征扫描。传统 DPI 的正则匹配在 CPU 上是逐个字节扫描,耗 CPU 且难并行。FPGA 可以布 DFA/NFA 状态机,把常用规则集映射到逻辑单元里,多个模式同时做匹配。华为、思科等厂商的某些设备,早期就是用这种思路加速规则匹配的。但要注意,规则量超过一定规模后,FPGA 的资源消耗和时序收敛会非常痛苦,所以要区分“固定特征”和“可变规则”,不要让 FPGA 承载全部规则库。
第四类是流量整形和限速。QoS、令牌桶、队列调度这类逻辑在 FPGA 里做非常简单,而且时延抖动极小。CPU 做 QoS 要用定时器和复杂的调度算法,到了高并发下很容易出现抖动,FPGA 则能用硬件计数器稳定输出。
3.2 一个典型的 FPGA 卸载流程长什么样
用 IPSec 网关来举例更直观。传统方案里,CPU 需要处理 ESP 解封装、解密、内层 IP 解析、ACL 匹配、再加密、封装,全流程走完对 CPU 是很大的负担。引入 FPGA 之后,流程变成:报文从光模块进入 FPGA,先做 ESP 头部解析,根据 SPI 索引查找 SA 上下文,然后解密,解出内层 IP 后做五元组 ACL 过滤,再进入下一步加密封装,最后从出方向端口发送。整个流水线里,CPU 只负责 SA 协商、密钥管理和异常上报,详情处理全部在 FPGA 内部完成。
实现这种流水线时,最核心的一点是“状态保存在哪里”。解密需要密钥和 SA 上下文,ACL 需要规则表,这些数据放在 FPGA 内嵌的 block RAM 或外部存储里,要设计好索引和更新机制。很多团队的教训是把规则表放得太深,导致更新一个 ACL 规则要把整片逻辑重新编译,这在生产环境里是不能接受的。好的做法是把规则表做成可读写寄存器空间或独立的 RAM 区,CPU 通过 PCIe 去更新表项,逻辑部分保持不变,才能实现“热更新”。
3.3 FPGA 不是万能药,这三个坑必须提前知道
FPGA 的灵活性和性能上限都很吸引人,但真要落地,三个坑摆在那里。
第一个坑是开发周期。FPGA 开发不是写 C 代码,要经过 RTL 设计、功能仿真、时序收敛、综合布线、上板调试,一个中等规模的卸载模块,从立项到稳定,往往要三到六个月。如果团队对 FPGA 不熟,这个周期还会翻倍。所以产品经理排期时,千万别把 FPGA 开发等同为普通软件开发。
第二个坑是迭代成本。规则库、协议栈、加密套件一旦需要变化,FPGA 的重编译和加载流程比软件慢得多。虽然现在有动态部分重配置技术,能做到按区域加载,但它对设计架构有极强的约束,不是每个模块都能拆出来独立重配的。如果一开始没规划好,后面每一次功能升级都是一场灾难。
第三个坑是 debug 难度。CPU 程序可以通过日志、断点、CPU profiler 快速定位问题;FPGA 一旦上板后出现交互协议错误,你得靠逻辑分析仪、ILA 硬核采样、长时间抓波形来排查,效率差距非常大。我见过一个团队为了查一个 PCIe DMA 时序问题,整整花了两周,最后发现是一个跨时钟域信号没做同步。
注意:FPGA 适合卸载“稳定、大流量、逻辑清晰”的任务。如果业务逻辑本身还在快速演进,建议先把功能在 CPU 侧跑通、稳定,再考虑移植到 FPGA。不要刚定完需求就直奔 FPGA,那样大概率会返工。
4. NP 网络处理器:被低估的确定性流水线
4.1 NP 的定位和内部结构
NP(Network Processor)这个概念在运营商级设备里历史悠久,但在安全设备圈子里讨论度远不如 FPGA 和 DPDK。其实 NP 是一条非常务实的路线,尤其在专注于“线速转发 + 策略执行”的场景里。它本质上是一颗为网络数据面设计的专用多核处理器,通常集成了很多专用硬件加速器(查找引擎、流量管理、加解密引擎、报文编辑引擎等),并用微码或专用数据面语言来编程。
如果把 FPGA 理解成“用逻辑搭硬流水线”,NP 更像是“一台网络专用的小型多核服务器”,它的灵活性比 FPGA 的开发模式高,又比通用 CPU 更贴近数据面逻辑。一颗 NP 芯片里往往跑着几十上百个核,每个核处理不同的数据面任务,中间通过硬件队列和硬件流量管理器来协作。值得一提的是,这些核还带专用指令集,比如包头解析、加解密查找、外部 TCAM/SRAM 访问,都是为了数据面场景定制的。
4.2 NP 与 FPGA、CPU+DPDK 的配合方式
NP 在安全设备里通常不是单独存在的,它更常见的形式是作为“数据面加速器”和 CPU 配合。控制面(路由协议、规则配置、会话管理)放在通用 CPU 上,数据面(转发、过滤、限速)放在 NP 上。这样 CPU 不用处理每一笔流量,只处理 NP 上抛的异常报文和新建会话。这种架构的好处是稳定和确定:NP 的流水线时延基本固定,不会被频繁中断、不会被操作系统调度起伏影响。
还有一类设备把 NP 和 FPGA 结合使用。NP 擅长做包头处理和流表查询,FPGA 擅长做特征匹配和复杂计算,两者一前一后组成流水线。数据进 NP,先完成转发决策和基础过滤,再送进 FPGA 做深包检测,全部硬线处理后,只有真正需要软件分析的流量才上抛 CPU。这种架构在中高端产品里已经很常见,相当于把快路径做得更纯粹,慢路径只兜底。
4.3 为什么很多团队会先放弃 NP
NP 的优势那么明显,为什么很多团队到了选型环节还是把它划掉?原因不在性能,而在生态和门槛。
首先是 SDK 封闭。NP 的底层编程环境大多由芯片厂商提供,数据面开发语言、编译器、调试工具都是厂商私有生态,团队一旦切入,替代成本非常高。你在大厂招聘市场很难找到精通某个 NP 平台的数据面工程师,培养周期也远比 DPDK 和 FPGA 长。
其次是更新和适配慢。因为厂商的 SDK 更新频率、驱动质量、文档完善度都不如通用软件生态,迭代速度会有明显妥协。如果你的安全业务高度依赖快速演进的应用识别和检测规则,NP 是一条偏“重”的路线。
最后是出货量和成本问题。NP 芯片的单颗成本通常不便宜,技术演进快,产品生命周期需要仔细评估。出货量不大时,整个供应链的把控能力会变得很弱。所以现在很多中小厂商宁可选择 FPGA,也不愿意碰 NP,因为 FPGA 至少在开发工具、人才流动、替换选择上还是相对开放的。
我的看法是:如果产品定位是运营商级或大型数据中心的高密转发和策略执行,且团队有决心长期投入,NP 值得认真评估。但如果你做的是企业级 NGFW,业务变化快,团队规模有限,NP 的优先级要往后放。
5. 三条路径如何选型:先列需求,再谈技术
5.1 一张表格理清三条路径的差异
选型前先看差异,这里是我自己在项目里常用的对比维度,不一定全面,但足够做第一层筛选:
| 维度 | CPU+DPDK | FPGA | NP |
|---|---|---|---|
| 开发难度 | 中,人才好招 | 高,硬件周期长 | 高,生态封闭 |
| 灵活性 | 高,规则更新容易 | 中,需重配置 | 低到中,依赖 SDK |
| 吞吐能力 | 中高,受限于 PCIe 和核数 | 高,支持更高线速 | 高,专为线速设计 |
| 时延确定性 | 低,受系统调度影响 | 高,流水线时延固定 | 高,硬件队列保障 |
| 状态维护能力 | 强,软件实现灵活 | 弱,大状态表成本高 | 中,可配合流表加速 |
| 适用场景 | 规则多变、中小流量 | 大流量、功能固定 | 运营商级大流量 |
| 迭代速度 | 快 | 慢 | 慢 |
这张表不是让你直接照抄,而是要结合自己产品的功能定位和团队能力来做决策。比如你只是做一个小型办公防火墙,吞吐 10G 以内,CPU+DPDK 就是唯一合理选项,没必要上 FPGA。
5.2 影响选型的四个关键因素
第一个因素是吞吐量需求。这个不用多说,100G 以上基本绕不开硬件卸载。但吞吐不是说峰值,而是开启全部安全功能之后的“最坏情况吞吐”,比如全流量启用 IPS 特征检测、全流量 TLS 解密时还能达到多少。很多设备标称 40G,实际开启检测之后掉到 5G,这种数字在选型时要问清楚。
第二个因素是规则变化频率。规则每天变,还是半年变一次?如果是前者,尽量把规则执行放在 CPU 侧或可动态加载的硬件区域内,不要把整条规则链烧死在 FPGA/NP 里。如果规则相对稳定,硬件卸载收益会非常大。
第三个因素是产品迭代节奏。你的团队能不能接受一个功能从需求提出到硬件上线需要三个月?如果产品和市场压力很大,硬件路线就会很危险。我见过不少团队为了“性能指标”硬上 FPGA,结果功能迭代跟不上,被竞争对手用软件方案抢了市场。
第四个因素是成本和功耗。硬件方案意味着 BOM 成本、功耗、散热、认证等一系列问题都要重新计算。一台 1U 设备能承受的功耗是有限的,如果增加 FPGA 芯片后散热压不住,整体架构还得重新设计,这些都是选型时必须前置评估的。
5.3 混合架构是更常见的选择
大多数成熟产品不会只押注一条路线,而是做成“CPU+DPDK 做控制面和慢路径,FPGA/NP 做快路径卸载”的混合架构。CPU 仍然是整个设备的大脑,负责协议学习、规则引擎、管理面、日志审计;FPGA 或 NP 则在数据面帮 CPU 扛下最大压力的那部分流量。
举个最常见的设计:入口流量先进 FPGA/NP,做包头解析和基础过滤,再送 CPU 做深度检测,CPU 处理完后再把流量交给 FPGA/NP 做封装发送。复杂的会话跟踪和状态管理放在 CPU 侧,纯转发和固定动作下沉到硬件,这样两者优势都能发挥出来。
这类方案开发上可以分阶段走:第一阶段先用 CPU+DPDK 把全套业务跑通;第二阶段把确定性最强的加解密或 ACL 过滤卸载到 FPGA;第三阶段再把快路径整体切到硬件流水线。每一步的改动都不至于推倒重来,团队也能逐步积累硬件经验。
6. 实操中的经验和小技巧
6.1 指标要用“最坏情况”来定,不要用“平均值”
做选型和技术评审时,最容易犯的错误是用厂商提供的优秀指标代替真实场景。比如一套 DPDK 转发方案,在纯转发测试里 64 字节小包能跑到 20Gbps,但当你叠加了规则匹配、会话老化、日志采样之后,吞吐可能直接腰斩。更严重的还在于规则库越大,性能衰减越明显。
我的习惯是:在立项阶段就定义一套“最坏情况基线”,例如“开启 5000 条 IPS 规则 + 全流量 TLS 解密 + 100 万并发会话时,设备需稳定提供 10Gbps 吞吐”。所有硬件选型和软件优化都围绕这个基线来做测算,而不是按官网上“最大吞吐40G”来倒推。这样形成的架构即使遇到流量突增,也有足够余量,不会上线后频繁踩性能雷。
6.2 硬件卸载不是越多越好,边界要留给自己
我之前提过一个原则:卸载要卸载“确定性强的任务”。但实操中,团队往往会为追求性能而无意识地扩大卸载范围。比如把会话超时老化也在硬件里做,把应用识别逻辑也往 FPGA 里塞,最后硬件资源爆炸,开发和维护成本也失控。
更好的做法是,在硬件设计早期就明确“上行接口”和“下发通道”的边界。CPU 和 FPGA/NP 之间定义一个清晰的“异常上抛”协议,硬件处理不了的流量、需要复杂逻辑判断的流量、需要审计上报的流量,都统一上抛到 CPU 处理。这条边界一旦确定,后续增加新功能时,优先在 CPU 侧实现,性能不够再考虑下沉到硬件,这样既能快速交付,又能渐进优化。
6.3 团队技能树决定架构上限
技术选型到最后,考验的其实是团队技能组合。DPDK 团队需要熟悉 Linux 内核、多核并发、网卡驱动,如果团队本身是应用开发出身,学习曲线会非常陡。FPGA 团队需要懂 RTL、时序约束、PCIe 协议,这些能力不是一两个月能补上的。NP 更是依赖原厂支持和深度技术积累。
我见过的成功项目,都不是一个人“全能”,而是把关键角色凑齐:一个懂数据面软件的架构师,一个懂硬件时序的 FPGA 工程师,一个能写驱动的底层软件工程师。这三个角色如果能互相理解,项目成功率会高很多。所以选型前先自查团队技能树,比看任何技术评估报告都重要。
6.4 最后两个小建议
第一,如果预算允许,买一台带网卡直通和 DPDK 支持的机器,自己先跑一轮基准测试。用 testpmd 或类似的工具验证网卡净化后的实际吞吐,再叠加你核心算法看掉多少性能。这一步能帮你筛掉很多“纸面高性能”的硬件。
第二,无论选了哪条路,都要预留“逃生通道”。比如 FPGA 方案里保留 CPU 侧同等功能的软件实现,哪怕平时不走。这样一旦硬件遇到难解的问题,可以临时切换到软件状态,不至于让整机变成一块砖。这个习惯救过我两次,建议你也养成。