1、48|电子制作 2023 年 1 月信息工程0 引言随着云计算、大数据、物联网等技术的广泛应用,数据规模呈现爆炸式增长,导致对于网络带宽、延时等性能的依赖性日益增强。网络带宽每年以 23 倍的速度增长,目前 10G 网络已普及到各个领域,40G/100G 甚至 400G 网络也在数据中心等流量集中的关键领域开始大规模运用。而TCP/IP 协议族作为一种网络协议标准,占据着网络协议主流标准地位,其应用最为广泛。传统的 TCP/IP 网络协议处理由操作系统内核完成分组转发、校验、传输控制、数据分片等流程,并且对于大数据量的网络传输,会产生频繁的 I/O 中断以及数据拷贝,大幅增加处理器上下文切换开
2、销和系统总线负载1,2。根据 Thumb 定律,处理 1bit 网络数据需要消耗 1Hz 的 CPU 处理周期,网络带宽的快速增长必将消耗大量的处理器资源,最终导致网络 IO 成为系统性能瓶颈。为解决高速网络通信中,对于 TCP/IP 网络协议的处理导致的处理器资源过载问题,通信技术领域提出了多种网络协议优化技术,其中 TOE(TCP/IP Offload Engine,TCP/IP 卸载引擎)技术3,通过将传统 TCP/IP 网络协议的处理流程由操作系统内核卸载至网卡,由网卡硬件执行协议栈处理,从根本上减轻了处理器工作负载,释放出更多的处理器资源。TOE 技术的应用不仅能够降低主机处理器资源
3、消耗,同时能够提升网络吞吐量及缩短网络延时4,具有 TOE 功能的网络设备将成为未来数据中心构建高性能、低功耗网络基础设施的首选。而基于 FPGA 设计实现 TOE 网卡兼具灵活性及成本优势,适应于数据中心网络环境。基于 FPGA 硬件化实现 TCP/IP 协议栈,需要综合考虑FPGA 资源占用率、网络性能以及可支持的连接数。目前,商用 TOE 网卡支持的连接数在千条量级,基于 FPGA 的 TOE网卡使用多 TCP/IP 协议栈实例实现多连接,支持的连接数相对更少,且资源占用率较高。此外,对于大数据块的通信传输,主机仍然需要与 TOE 网卡进行频繁的交互,跟踪、控制数据发送的过程,占用了大量
4、的处理器资源、降低了数据吞吐量,对于多连接情景、大数据量传输,情况将更加严重。云计算、大数据等业务场景下,多连接,大数据量传输频繁发生,在进行 TCP/IP 协议卸载的同时,还需要减少主机对于数据传输的管控频次,进一步降低网络 IO 对于处理器资源的占用,充分释放 PCIe 带宽优势,从而提升网络性能。本文提出了一种基于 FPGA 构建 TCP/IP 卸载引擎的设计方法,采用数据发送通道与接收通道分离的架构,由协议共享模块统一管理连接状态及网络通信事件,控制数据收发过程,能够处理万条量级的网络连接。同时,设计了一种大数据块自动分片传输机制,有效降低大数据块发送的延时及对处理器资源的占用。1 设
5、计与实现 1.1 系统架构TCP/IP 卸载引擎面向多连接 TCP/IP 网络传输,以可扩展的架构形式实现 TCP/IP 协议处理的硬件化,从而大幅提高传输协议处理性能,降低对于主机处理器资源的消耗。TOE 引擎设计采用发送路径与接收路径相互独立的基础架构。发送路径包括处理组包等工作的发送协议引擎以及发送数据缓冲区;接收路径包括处理拆包等工作的接收协议引擎以及接收数据缓冲区。协议引擎采用流水线模式,用于处理TCP/IP 协议,数据缓冲区 Buffer 用于缓存网络发送或接口的数据。发送路径与接收路径共享连接状态等公共信息,为保证公共信息的一致性,采用一种基于模块的锁方法,有效降低 FPGA 资
6、源消耗。发送、接收引擎相互独立且使用流水线模式,具备良好的多链接并行处理能力;同时基于 FPGA 片外存储实现发送/接收缓冲区,能够容纳数以万计的链接并存。基于 FPGA 的 TCP/IP 卸载引擎设计框架5如图 1 所示,TCP/IP 卸载引擎由发送接口、发送缓冲 Tx Buffer、发送引擎组成发送路径;由接收接口、接收缓冲 Rx Buffer、接收引擎组成接收路径。发送路径与接收路径相互独立,共享TCP 状态管理器、事件引擎等公共组件能力。1.2 缓存控制每个 TCP 连接在建立时都会被分配一个发送缓存 Tx 基于 FPGA 的 TCP/IP 协议卸载引擎设计杨阳,周思远,王舒鹏(扬州万
7、方科技股份有限公司,江苏扬州,225006)摘要:为解决高速、高并发、大数据量以太网通信中,TCP/IP网络协议处理导致的处理器资源过载、网络延时等问题,本文提出了一种基于FPGA构建TCP/IP卸载引擎的设计方法,采用数据发送通道与接收通道分离的架构,由协议共享模块统一管理连接状态及网络通信事件,控制数据收发过程。同时,设计了一种大数据块自动分片传输机制,有效降低大数据块发送的延时及对处理器资源的占用。实验结果表明,基于FPGA的TCP/IP协议卸载引擎在高并发网络通信场景下,能够高效处理网络通信协议,网络通信带宽保持较为稳定状态,512字节数据量的网络延时小于1s。关键词:FPGA;TCP
8、/IP协议;TOE;高并发;网络通信DOI:10.16589/11-3571/tn.2023.01.017wwwele169com|49信息工程Buffer 以及一个接收缓存 Rx Buffer。Tx Buffer 为环形缓冲区,根据应用场景预先配置环形缓冲区容量及数量。尤其对于数据中心分布式存储场景,如 Glusterfs 存储集群采用128KB 数据条带、Ceph 存储集群采用 4MB 数据分片,在此类场景下,缓冲区容量设置为 128KB 及以上,可以有效降低主机与卸载引擎的交互消耗。Tx Buffer 缓存负载数据用于超时确认重发及流量控制。发送缓存控制器用于维护发送缓存状态表,包括读取
9、、写入、删除、更新操作。发送缓存状态表用于记录对应发送缓存的状态,属性包括:(1)SessionID:TCP 链接对应的会话 ID;(2)Add:发送缓存地址;(3)Producer:生产者指针,标识应用写入发送缓存的尾部地址;(4)Consumer:消费者指针,标识已经被发送并确认的数据尾部地址;(5)Send Window:发送窗口大小;(6)ACK:ACK 号;(7)Transmitted:已发送指针,标识已经被发送尚未被确认的数据尾部地址;(8)Active:标识对应的发送缓存是否处于激活使用状态。图 2 所示为发送缓存示意图,从外部网络接收的数据将由接收引擎进行校验拆包等协议处理操作
10、后,放入接收缓存 Rx Buf-fer,通知接收缓存控制器移动 Producer 指针。在应用程序通过 DMA 操作取走接收数据后,Consumer 指针将会被移动。对于乱序发送的数据段,接收引擎根据计算其段序号计算 Offset,放入乱序段数据后,移动对应的 Length指针,乱序段数量、及 Offset 相对 Producer 的偏移量是预先设定的,当数量或偏移量超出设定范围时,相关数据段将被丢弃,发送端由于发送确认超时,将重新发送。Rx Buffer 同样采用环形缓冲区,根据应用场景预先配置环形缓冲区容量及数量。Rx Buffer 缓存接收负载数据。接收缓存控制器用于维护接收缓存状态表,
11、包括读取、写入、删除、更新操作。接收缓存状态表用于记录对应接收缓存的状态,属性包括:(1)SessionID:TCP 链接对应的会话 ID;(2)Add:接收缓存地址;(3)Producer:生产者指针,标识接收数据的尾部地址;(4)Consumer:消费者指针,标识被应用取走的数据尾部地址;(5)Offset:乱序段偏移地址;(6)Length:乱序段长度;(7)Active:标识对应的接收缓存是否处于激活使用状态。图 3 所示为接收缓存示意图,从外部网络接收的数据将由接收引擎进行校验拆包等协议处理操作后,放入接收缓存 Rx Buffer,通知接收缓存控制器移动 Producer 指针。在应
12、用程图 1 TCP/IP 协议卸载引擎设计框架图图 2 发送缓存示意图50|电子制作 2023 年 1 月信息工程序通过 DMA 操作取走接收数据后,Consumer 指针将会被移动。对于乱序发送的数据段,接收引擎根据计算其段序号计算 Offset,放入乱序段数据后,移动对应的 Length 指针,乱序段数量、及 Offset 相对 Producer 的偏移量是预先设定的,当数量或偏移量超出设定范围时,相关数据段将被丢弃,发送端由于发送确认超时,将重新发送。1.3 连接状态管理TCP/IP 协议的网络连接状态包括 Port 状态、Conne ction 状态,Port 状态包括 Listeni
13、ng、Active、Closed,Connection 状 态 包 括 CLOSED,SYN-SENT,SYN-RE-CEIVED 等,连接状态管理由 TCP 状态管理器完成。TCP状态管理器基于表数据结构管理 Port 及 Connection 状态,同时维护 SessionID 与由源 IP 地址、目的 IP 地址、源Port、目的 Port 组成的四元组之间的映射。如图 4 所示为TCP 状态管理器对于 Connection 状态表的管理,Port 状态表采用同样的管理方式。由于 TOE 中的接收引擎、发送引擎、发送接口的工作流程中都涉及了状态表的查询、更新等操作。状态表作为多模块共享数
14、据结构,一方面需要保证并行访问能力及数据一致性;另一方面为适应多连接、高性能网络应用场景,需要提高访问操作性能,降低资源消耗。状态表采用 FPGA 片上双端口 BRAM存储,提供数据共享及高性能数据操作;状态管理器通过模块读写锁机制,为访问共享状态表的模块分别创建对应的锁结构,包括读写锁 RWLock 及表项索引,从而避免为每一个表项创建锁,降低存储资源消耗。外部模块通过相应的访问接口首先获取锁状态,对于同一表项的访问操作,需要进行加锁操作,加锁成功后进行读写操作。1.4 计时器TOE 根据 TCP 协议使用四个计时器,包括重传计时器Retransmission Timer、坚持计时器 Per
15、sistent Timer、保活计时器 Keeplive Timer、时间等待计时器 Timer_Wait Timer。计时器实现基于表结构,通过遍历操作计时。计时器表结构每一表项代表一个 TCP 连接会话,表属性包括会话ID 用于唯一标识 TCP 连接;时间戳 Timestamp 用于记录遍历次数;活跃标志 Active 用于表示该连接是否在计时中。对计时器表结构的操作包括两种:一是设置/清空计时器;二是遍历计时器表。针对预先设置的 TOE 支持连接数,计时器表包含对应数量的表项,一个硬件时钟周期执行一个表项遍历,在连接计时器有效的情况下,如果 Timestamp图 3 接收缓存示意 图 4
16、 TCP 状态管理器实施框图wwwele169com|51信息工程大于 0,则减 1,当 Timestamp 为 0 时,触发相应事件并撤销计时。1.5 事件引擎根 据 TCP 协 议,TOE 定 义 了 TX、RT、ACK、ACK-NODELAY、SYN、SYN-ACK、FIN、RST 事 件,事 件 包 括SessionID、类型,并携带相关参数,用于构建网络包。图5 所示为事件引擎的设计框图,TOE 事件来源于接收引擎、定时器,以及发送接口,事件引擎相应的设置 3 个 FIFO 队列用于事件缓存。调度器根据预定义调度策略进行事件调度处理,默认为优先级策略,为避免接收路径背压导致数据丢失,设置接收引擎事件为高优先级,优先调度。事件路由针对不同的事件类型将事件路由至不同的后续模块。对于 ACK 事件,由 ACK-DELAY 模块进行处理,该模块检查ACK-DELAY计时器相应的计时表项是否为Active,如果是,ACK 事件会与之前被延迟发送的 ACK 事件合并,由输出模块传送至发送引擎;如果计时表项不是激活状态,则该表项被设置为 Active,ACK 事件延迟发送。对于除 SYN