可以将ADC的技术架构理解为一个分层、模块化、高度可扩展的软件系统,其核心思想是将网络功能从操作系统内核中剥离,通过用户空间的软件模块来实现,从而获得更高的灵活性、性能和可编程性。

现代ADC的技术架构通常可以分为以下几个关键层次:
ADC技术架构分层图
+------------------------------------------------------+
| 应用层 |
| +-----------------+ +-----------------+ |
| | 负载均衡策略 | | SSL卸载策略 | |
| | (Round Robin, | | (证书管理, | |
| | Least Conn, | | 加密/解密) | |
| | IP Hash) | +-----------------+ |
| +-----------------+ |
| +-----------------+ +-----------------+ |
| | 缓存策略 | | 压缩策略 | |
| | (静态/动态缓存) | | (Gzip/Brotli) | |
| +-----------------+ +-----------------+ |
+------------------------------------------------------+
^ ^
| API调用 | 配置下发
| |
+------------------------------------------------------+
| 控制平面 |
| +-------------------------------------------------+ |
| | 引擎/策略管理器 | |
| | - 负载均衡引擎 | |
| | - SSL/TLS引擎 | |
| | - 缓存引擎 | |
| | - 压缩引擎 | |
| | - 安全策略引擎 (WAF, DoS) | |
| | - 路由决策中心 | |
| +-------------------------------------------------+ |
| +-------------------------------------------------+ |
| | 配置与管理模块 | |
| | - REST API / CLI / GUI | |
| | - 配置数据库 | |
| | - 状态监控与日志 | |
| +-------------------------------------------------+ |
+------------------------------------------------------+
|
| (下发指令/状态同步)
v
+------------------------------------------------------+
| 数据平面 |
| +-------------------------------------------------+ |
| | 内核旁路 | |
| | +-----------------+ +-----------------+ | |
| | | DPDK / XDP | | eBPF / Kernel BPF | | |
| | | (数据包处理) | | (数据包过滤/重定向)| | |
| | +-----------------+ +-----------------+ | |
| +-------------------------------------------------+ |
| | 用户空间 | |
| | +-------------------------------------------------+ |
| | | 网络协议栈 | |
| | | (TCP/IP, UDP, HTTP/1.1, HTTP/2, gRPC, QUIC) | |
| | +-------------------------------------------------+ |
| | +-------------------------------------------------+ |
| | | 连接跟踪 | |
| | | (记录会话状态, 维护健康检查) | |
| | +-------------------------------------------------+ |
| | +-------------------------------------------------+ |
| | | 数据处理模块 | |
| | | (数据包解析/重组, 负载均衡决策, SSL/TLS处理) | |
| | +-------------------------------------------------+ |
| | +-------------------------------------------------+ |
| | | I/O多路复用 | |
| | | (epoll, kqueue, io_uring) | |
| | +-------------------------------------------------+ |
+------------------------------------------------------+
|
| (物理/虚拟网络接口)
v
+------------------------------------------------------+
| 物理/虚拟网络 |
| (Ethernet, Virtual TAP, veth pair) |
+------------------------------------------------------+
各层详细解析
应用层
这是ADC功能策略的体现层,用户通过配置界面或API来定义这些策略。
- 负载均衡策略:定义流量如何分发到后端服务器,如轮询、最少连接、源IP哈希等。
- SSL/TLS策略:配置SSL证书、加密套件、协议版本(如禁用TLS 1.0/1.1)等。
- 缓存策略:定义哪些URL路径或文件类型可以被缓存,以及缓存的有效期。
- 压缩策略:启用对特定类型的响应(如HTML, CSS, JS)进行Gzip或Brotli压缩。
- 安全策略:配置Web应用防火墙规则、防DDoS攻击策略、访问控制列表等。
控制平面
这是ADC的“大脑”,负责管理所有策略、状态和配置。
- 引擎/策略管理器:这是核心组件,它接收来自应用层的策略配置,并将其翻译成数据平面可以执行的指令,它协调各个功能引擎(如LB引擎、SSL引擎)协同工作。
- 配置与管理模块:
- API/CLI/GUI:提供用户接口,用于配置、监控和管理ADC。
- 配置数据库:存储所有当前的配置信息,确保状态的一致性。
- 状态监控与日志:收集性能指标(如QPS、连接数、延迟)、错误日志和事件,用于运维和故障排查。
关键职责:

- 策略下发:将用户配置的策略同步给数据平面。
- 状态聚合:收集数据平面的运行状态(如后端服务器的健康状态)。
- 决策辅助:为数据平面的复杂决策(如负载均衡算法)提供依据。
数据平面
这是ADC的“肌肉”,负责所有实际的数据包处理和转发,其性能是衡量ADC好坏的关键,现代ADC的数据平面架构主要分为两种模式:
A. 内核旁路 这是高性能ADC的主流架构,目标是绕过操作系统内核协议栈的开销,直接在用户空间处理数据包。
- 核心技术:
- DPDK (Data Plane Development Kit):由Intel主导,通过UIO/VFIO将网卡硬件直接绑定到用户空间,使用轮询模式替代中断驱动,极大地减少了数据包处理的延迟和CPU上下文切换,这是目前业界性能最高的方案。
- XDP (eXpress Data Path):Linux内核的一个子项目,允许在内核网络栈的早期阶段(驱动层)执行eBPF程序,实现超高速的数据包过滤和转发,性能极高,灵活性也强。
- 数据平面组件(在用户空间运行):
- 网络协议栈:用户空间实现的TCP/IP协议栈,如LwIP或自研协议栈,用于处理连接、拥塞控制等。
- 连接跟踪:维护客户端请求到后端服务器之间的映射关系,是实现会话保持的基础。
- 数据处理模块:解析应用层协议(HTTP头、Cookie等),根据控制平面下发的策略执行负载均衡、SSL/TLS加解密、缓存查找等操作。
- I/O多路复用:使用
epoll(Linux),kqueue(BSD) 或更现代的io_uring来高效地管理成千上万个并发连接。
B. 内核态 传统的ADC架构,数据包处理完全依赖操作系统内核。
- 工作方式:数据包通过网卡中断进入内核,经过内核协议栈处理,再通过
netfilter/iptables等框架进行过滤和NAT转换,最后发往后端。 - 优点:实现简单,与内核集成度高。
- 缺点:性能瓶颈明显,因为内核处理涉及多次内存拷贝和上下文切换,难以应对超大规模的流量。
物理/虚拟网络层
这是数据平面与外部网络交互的接口。

- 物理接口:直接连接物理网卡的接口。
- 虚拟接口:在虚拟化环境中,通过
TAP设备、veth pair或SR-IOV(直接I/O虚拟化)等技术,将ADC与虚拟机或容器网络连接起来。
核心技术组件详解
-
负载均衡算法
- 轮询:简单地将请求依次分配给每个服务器。
- 最少连接:将新请求分配给当前连接数最少的服务器,能有效处理长连接。
- 源IP哈希:根据客户端的IP地址进行哈希,确保来自同一IP的请求总是被发送到同一台服务器,适用于会话保持。
-
SSL/TLS卸载
- 过程:ADC在入口处终止SSL/TLS连接,解密来自客户端的加密请求,ADC与后端服务器之间建立普通的HTTP连接,将明文请求转发过去,响应则反向操作,由ADC加密后返回给客户端。
- 好处:将CPU密集型的加密/解密操作从前端服务器(通常是应用服务器)上卸载到专门的ADC设备上,解放应用服务器的资源,并简化后端服务器的配置。
-
健康检查
- 作用:持续监控后端服务器的可用性,自动将流量从故障服务器上移除。
- 方式:
- TCP检查:尝试建立TCP连接。
- HTTP检查:发送HTTP请求,检查返回的状态码(如200 OK)。
- 自定义检查:发送特定格式的请求,检查返回内容是否符合预期。
-
会话保持
- 作用:确保同一个用户的多次请求被发送到同一台后端服务器,这对于需要维护状态的应用(如购物车)至关重要。
- 实现方式:
- Cookie插入:ADC在响应中插入一个特殊的Cookie,后续请求携带此Cookie,ADC根据Cookie找到对应的服务器。
- URL重写:在URL后面添加一个后端服务器标识符。
- 源IP哈希:如上所述,基于客户端IP保持会话。
-
缓存
- 作用:存储后端服务器的响应(尤其是静态内容如下载文件、图片、CSS/JS),当后续请求相同时,直接从缓存返回,减轻后端压力,降低延迟。
- 类型:
- 静态缓存:缓存不常变化的文件。
- 动态缓存:缓存API响应等动态内容,通常有更复杂的缓存键(如URL + 请求头)和失效策略。
现代ADC的技术架构是一个以控制平面和数据平面分离为基础,以高性能内核旁路技术为核心,模块化、可编程的复杂系统。
- 控制平面负责“思考”(决策和配置)。
- 数据平面负责“行动”(处理和转发)。
这种架构使得ADC不再是一个简单的“四层/七层交换机”,而是一个功能强大、高度灵活的应用交付平台,能够为云原生、微服务、容器化等现代应用架构提供可靠、高效、安全的流量入口和服务保障,随着云原生技术的发展,ADC也正向着服务网格中的数据平面代理(如Envoy)和云原生Ingress控制器(如Istio Ingress Gateway, Nginx Ingress Controller)演进,但其核心的技术思想和分层架构依然一脉相承。
