APP下载

多端口TCP 协议处理电路的设计与实现*

2022-12-12乔庐峰陈庆华邹仕祥

通信技术 2022年10期
关键词:表项重传状态机

丁 帅,乔庐峰,陈庆华,刘 熹,邹仕祥

(中国人民解放军陆军工程大学,江苏 南京 210001)

0 引言

计算机系统中,传输控制协议(Transmission Control Protocol,TCP)通常集成在操作系统中,以软件方式实现。研究表明,这种软件实现的方式在协议处理、数据拷贝和中断处理中给系统带来了庞大的开销[1]。随着网络带宽不断增大,对服务器能力的要求不断增加,协议处理已经成为服务器的主要负荷之一。为了提高服务器的处理能力,目前通常采用增大单一服务器CPU 数量和多服务器并行处理等方式。为了进一步提高服务器同时服务的用户数量、提高处理的数据吞吐率,采用专用的TCP协议处理电路,以全硬件方式实现TCP 协议处理的功能成为研究的热点,由此推动了TCP 协议卸载引擎(TCP Offload Engine,TOE)技术的发展。

1 TOE 技术

TOE 技术的基本思想是采用专用硬件,如TOE网卡,实现原来由CPU 承担的TCP 协议处理功能[2]。如图1 所示,传统网卡主要实现网络的物理层和数据链路层处理功能,网络层和TCP 层功能由软件实现。TOE 网卡除实现传统网卡的处理功能外,还需要实现TCP 层和网络层协议处理功能。CPU 重点完成应用层及以上处理功能,从而可以大大降低CPU 负荷。TOE 可以采用专用集成电路(Application Specific Integrated Circuit,ASIC)、嵌入式处理器和现场可编程门阵列(Field Programmable Gate Array,FPGA)实现。利用ASIC 实现时,TOE 处理能力强,但灵活性较差;采用嵌入式处理器实现时,处理灵活,可拓展性强,但是其本质上还是以软件方式实现协议处理,性能提升有限;采用FPGA 实现时,可以在保证处理能力的前提下,保持足够的灵活性,且开发周期短,实现风险小[3]。本文采用的是基于FPGA 的实现方案。

图1 传统网卡与TOE 网卡

2 TCP 协议处理电路总体结构设计

本文设计的TCP 协议处理电路总体结构如图2所示,由TCP 发送控制电路、封装电路、校验和生成电路、窗口管理电路、定时器管理电路、哈希查找电路、TCP 接收控制电路、包重排序电路、发送和接收缓存组成。

图2 TCP 协议处理电路总体结构

TCP 发送控制电路包含TCP 发送电路和重传电路。TCP 发送电路负责根据上层应用提供的套接字(Socket)与目的主机实现建立连接、数据传输和释放连接的控制功能,产生TCP 头部信息并交给下级电路。TCP 封装电路根据TCP 发送电路在数据传输阶段提供的TCP 头和用户数据,组建完整的TCP报文段,并通过校验和生成电路计算位于TCP 头部的校验和字段,从而生成完整的TCP 报文段并通过发送缓存交给IP 层处理电路。重传电路利用定时器超时控制报文段重传,同时可根据返回的确认信息进行发送窗口管理,实现TCP 流量控制的功能。TCP 接收控制电路负责接收TCP 报文段,根据报文段类别,产生携带确认序号和接收窗口确认分组,发送给对端。接收分组排序电路可以对非按序到达的报文段进行本地缓冲,确保向上层按序交付数据。TCP 接收控制电路还可以利用哈希查找电路进行业务流区分,从而以时分复用方式同时支持多个连接。

3 TCP 协议处理电路的设计与实现

3.1 设计思路

TCP 协议有复杂的状态变迁流程,图3 是在正常情况下,服务器和客户机状态的变迁,不包含同时打开、关闭连接的服务[4]。TCP 协议处理电路需要采用全硬件方式实现TCP 协议处理功能。

图3 TCP 状态变迁

TCP 协议处理电路中的缓冲区分布和实现控制功能的状态机分布如图4 所示。发送状态机通过与前级电路的发送队列接口,读取待发送TCP 分段净荷,并读取与TCP 头部生成有关的控制信息,然后按照给定目的IP 地址和目的端口号完成与对端服务器建立连接、发送数据和释放连接的操作并接收对端确认(Acknowledgment,ACK)。定时器管理电路对发送分段进行定时,当一个分段出现超时后,它会触发该分段的重传操作。重传电路包含两个状态机,一个用于接收对端ACK,根据窗口大小字段,调节发送窗口大小实现流量和拥塞控制功能,并能给发送状态机提供必要的状态字段;另一个状态机用于数据段的超时重传。在发送数据时,发送状态机首先判断与应用层的接口数据队列和与重传电路的接口队列中是否有待发送数据指针,其次优先发送待重传数据。接收控制电路从与前级电路的接口队列中读取数据包,提取TCP 头部信息,按照给定源IP 地址和源端口号完成与客户机建立连接、接收数据和释放连接的操作。在数据包的接收过程中,通过应答发送状态机向对端发送相应的ACK 应答。包重排序状态机根据序号对数据包进行排序,再按序交付给应用层。当同时支持多个TCP 流时,哈希查找电路用于识别不同的TCP 连接,在时分复用状态下读取不同TCP 流的状态信息,对不同的流进行管理。

图4 TCP 协议处理电路中的缓冲区和状态机

3.2 双桶哈希查找电路

面向多业务流的连接管理需要采用哈希查找电路进行业务流识别,该电路位于接收控制电路端,用于识别上千条TCP 连接,并对各个连接的参数进行维护管理。哈希查找电路的工作原理是利用哈希函数建立关键字到哈希表地址空间的映射,即将关键字进行哈希散列运算,得到哈希值(Hash)。这种映射是一种压缩映射,不同的关键字可能会产生相同的Hash,从而导致哈希冲突。为了减少哈希冲突,可以使用多桶哈希的技术,本方案采用双桶哈希表结构。

双桶哈希技术通过增大哈希表的位宽,使得一个Hash 对应的存储空间中可以同时存储2 个关键字及其对应的结果信息来减少哈希冲突。本设计中哈希查找电路的关键字是当前连接的源IP 地址、目的IP 地址、源端口号和目的端口号,标识为一个Socket。输出的结果信息是每个业务流对应唯一的连接号(Connection_id)。

哈希查找电路实现的功能有业务流添加操作,业务流识别操作和业务流删除操作。

业务流添加操作是在Hash 对应的存储中写入当前Socket、Connection_id 表项。发送电路完成建立连接的操作后,哈希查找电路会进行业务流添加操作,利用哈希函数计算Socket 得到Hash,以Hash 为地址将Socket 和对应的Connection_id 写入,完成业务流添加操作。

在连接上到达报文段时,为了简单标识连接进行数据传输,哈希查找电路根据Socket 得到Hash读取两个哈希桶中对应的表项,表项匹配成功,得到Connection_id 进行连接参数维护。

在发送电路完成释放连接的操作后,查找电路会进行业务流删除操作,它将根据Socket 得到Hash 读取两个哈希桶中对应的表项,将该表项(包括有效指示位)全部清零,完成业务流删除操作。

3.3 TCP 发送电路设计

TCP 发送电路的工作流程如图5 所示。发送状态机的初始状态为CLOSED 状态,在此状态下,所有寄存器的值都为初始设定值,发送状态机会不停地检测上层应用是否有执行建立连接的操作,若上层应用要建立连接,则发送状态机会发送一个同步序号编号(Synchronize Sequence Numbers,SYN)置1 的连接数据帧到对端,建立连接定时器就会被启动,发送状态机会随即跳转至SYN_SENT 状态。在SYN_SENT 状态下,发送状态机会等待对端ACK 的到来。若在建立连接定时器超时前收到对端的确认,则发送状态机跳转到ESTABLISH 状态,否则重发SYN。若在3 次发送SYN 都没有收到对端ACK,则建立连接失败[5]。

图5 TCP 发送电路工作流程

若上层应用有数据待发送,则发送状态机开始进行数据加载操作,数据加载完成后,发送状态机跳转至发送数据状态。在发送数据状态下,封装好的报文段被发送出去,同时启动超时定时器,之后进入超时检查状态。在检查超时时间时,发送方会等待对端ACK 的到来,若收到了对端的应答,且没有超时,则按照应答包接收窗口大小字段进入下一批数据发送操作;否则应进行数据重传,收到重传数据的确认后,继续进行下一批数据的传输操作。

完成数据的传输后,发送状态机可根据上级电路的要求发送一个结束帧(FIN 位置1)到对端,同时启动超时定时器,跳转至FIN_WAIT_1 状态。若在超时定时器超时前收到对端的确认,会进入FIN_WAIT_2 状态,同时启动fin_wait 定时器,否则会向对端重发FIN。若在fin_wait 定时器超时前,发送状态机收到对端FIN,得知对端请求关闭数据传输连接,便会发送一个应答包,随后跳转到TIME_WAIT状态。两倍的最大段生存时间(Maximum Segment Lifetime,MSL)后回到CLOSED 状态,否则直接关闭连接。

3.4 重传电路设计

如图6 所示为重传电路存储结构,重传电路的存储管理方式为自由指针队列(Free Pointer Queue,FQ)、待发送指针队列(Pending Pointer Queue,PQ)、数据存储区SRAM 和重传接口队列的组合。上层应用有数据块要发送时,发送控制电路在将数据写入发送队列的同时也将数据写入缓冲区队列。重传电路开始工作时,首先将FQ 初始化,若检测到缓冲区队列中有指针,写入状态机先从自由指针队列中读取一个自由指针;其次根据这个指针将数据块写入数据存储区中,其中自由指针作为数据存储区的基地址;最后以自由指针值为地址,将自由指针值、数据长度、起始字节编号(本地头)和时间戳等信息写入PQ 中。

图6 重传电路存储结构

接收状态机在检测ACK 接收队列指针是否非空的同时,在间隙中扫描PQ 中的时间戳。接收状态机如果收到对端ACK,则对ACK 包进行解析,依次读取PQ 队列并与PQ 中各表项的本地头比较,确定是哪一个数据包的ACK 并记录下接收窗口大小字段,然后从PQ 队列中读出自由指针。以该指针为基地址将数据块从存储区内释放,将自由指针归还给自由指针队列,同时在PQ 中将此表项的有效位置0,表示该表项对应的报文段被对端成功接收。如果发生超时,重传状态机边开始工作,将PQ 中自由指针值读出,以该指针为基地址将存储区内数据写入重传接口队列中,同时将时间戳值更新。这样便完成了ACK的接收与数据包的重传功能。由于一个TCP 的最大报文段是1.5 KB,所以对数据包进行存储时可以将一个32 KB RAM 的缓存区分块,每块2 KB,这样一块RAM 可以分为16 个数据块,每个数据块对应一个指针,这样对应一个深度为16 的自由指针队列0~15。在初始化时,将0~15 写入FQ 中。假设RAM 的位宽为32 位,这样512 个32 位的存储单元可以存储一个2 KB 完整的数据块。RAM 的地址除自由指针值外,还应该加上低9 位的计数值,加在一起才是真正使用的RAM地址。

4 仿真分析

本文以Xilinx ZYNQ-7020 开发板为硬件平台搭建TCP 处理电路,其关键电路的仿真波形如图7、图8 和图9 所示。图7 展示的是多连接查找电路的仿真结果,图中标“1”处是4 个连接的添加操作,由于电路采用双桶Hash 技术,所以对于前3 个相同Hash 的Socket 连接添加时,第3 个连接添加失败。标“2”处是连接查找操作,根据Socket 得到Hash 利用哈希查找电路进行查找,第3 个连接查找失败,其余3 个均查找成功。标“3”处是第4 个连接的删除操作,根据Socket 得到Hash 利用哈希电路进行表项删除,第4 个连接删除成功;标“4”处是连接查找操作,由于经过第3 步的连接删除操作,第3 和第4 个连接均查找失败。图8 和图9 展示了建立连接和释放连接仿真结果,图中标“1”处是第1 次建立连接操作,由于发送3 个SYN,均没有收到对端的同步应答帧,所以建立连接失败。标“2”处是第2 次建立连接操作,在发送第3 个SYN 的超时时间内收到对端的同步应答帧,建立连接成功。标“3”处是拆除连接过程中发送FIN 的操作,在第2 次FIN 的超时时间内收到对端ACK,且在一定时间内收到对端FIN,所以发送完ACK,再等待2MSL 时间后释放连接。标“4”处是拆除连接过程中接收对端FIN 超时的情况,在第2 次FIN的超时时间内收到对端ACK,但在一定时间内没有收到对端FIN,所以直接释放连接。

图7 连接查找电路仿真结果

图8 TCP 建立连接仿真结果

图9 TCP 释放连接仿真结果

5 结语

本文给出了多端口TCP 协议处理电路设计方案,由TCP 发送控制电路、哈希查找电路、重传电路、定时器管理电路组成。TCP 协议处理关键电路在Xilinx ZYNQ-7020 开发板上进行了设计与仿真分析,结果表明,TCP 处理电路可以以全硬件方式实现连接建立、数据传输、连接释放和连接存储管理,符合TCP 协议规范要求。

猜你喜欢

表项重传状态机
一种改进的TCAM路由表项管理算法及实现
基于ARMA模型预测的交换机流表更新算法
基于有限状态机的交会对接飞行任务规划方法
面向异构网络的多路径数据重传研究∗
SDN数据中心网络基于流表项转换的流表调度优化
数据链路层的选择重传协议的优化改进
MPTCP中一种减缓缓存阻塞的重传策略
FPGA设计中状态机安全性研究
基于反熔丝FPGA的有限状态机加固设计
选择性重传法在IPTV中的应用