一种TCP/IP卸载引擎架构的应用

发布时间:2010-8-2 11:55    发布者:lavida
关键词: 卸载 , 引擎架构
tcp/ip是一组全世界广泛应用的协议,不仅仅用于internet,许多私有网络也使用tcp/ip作为其协议组,许多硬件设计都是基于tcp/ip或者相关的协议来开发的。传统的tcp/ip处理网络数据传输过程中,要占用大量的主机cpu资源,为了减轻cpu的压力,一种叫toe(tcp/ip offload engine,tcp/ip卸载引擎)的技术应运而生。toe技术对tcp/ip协议栈进行扩展,使部分tcp/ip协议从cpu转移到toe硬件,减轻cpu的负担。

toe技术  

所谓卸载是指将cpu上的计算或处理转移到专门的硬件单元上进行。在目前的以太网环境中,tcp/ip的处理都是通过软件在中心处理器上实现的,导致系统在协议处理、中断处理、数据拷贝方面面临困难。利用toe技术对tcp/ip卸载则简化了数据包的处理,如图1所示,toe将tcp/ip协议从cpu中移到硬件中处理。在主机中安装和toe通信的驱动后,内核和用户的应用都可以直接和toe通信,这样就可以使主机cpu来处理别的工作。toe在接收到网络上的数据后,进行一系列的协议处理,将数据放在指定地址,交给上层应用。发送方向则相反,将需要处理的数据包装后通过硬件缓冲发送出去。toe的处理简化了流程,主机只需要直接处理数据而不用对数据拆包重组,因而对协议处理,中断和数据拷贝都大大减少,降低了主机cpu的负担。  

  
图1 toe技术的原理框图  

toe硬件结构  

● 硬件设计方案  

从器件的实现上,toe实现方案可以采用两种结构:一种是分离元件结构,另外一种是asic芯片。分离元件采用电路板构建,具有修改灵活性,方便升级改进。采用asic芯片实现的方案是将协议处理集成到定制的芯片中,在性能上比分离元件的方式有所提高,但它在可编程性、扩展性和灵活性方面比较差。为了提高灵活性又保证处理速度,可以采用fpga来实现toe。  

在设计中采用了altera公司的FPGA来实现toe,并配合nios ii实现嵌入式处理器的功能。图2为toe的框架结构,它由一个嵌入式cpu、接收部分、发送部分和物理硬件接口构成。在这个结构中,所有的发送模块在一边,接收模块在另一边,是为了能直接访问一个共享的存储器,从而减少数据拷贝。为了支持众多的协议模块访问,通过一条内部总线来连接协议模块和共享存储器。由嵌入式cpu协调模块间的通信,状态管理以及和上层cpu的通信。  

  
图2 toe硬件结构  

当网络上送来一个数据包时,物理接口开始启动,进行简单的包头处理后,发送中断给嵌入式cpu,cpu移动数据到接收缓冲器(buffer),将消息队列置为有效。协议接收模块检测到有数据需要处理,启动协议分析处理。当所有的处理完成后,嵌入式cpu发送一个中断给主cpu,并将数据放入指定的地址。发送过程和接收过程相反,cpu把需要处理的数据放入发送缓冲器,协议模块检测到有消息后开始启动处理。完成后将数据移到物理层的发送缓冲中发送出去。在这个设计中,共享存储器的访问控制和协议模块的设计是难点,下边将详细介绍。  

● 共享存储器的访问  

在fpga中,所有的协议模块将对输入与输出缓冲器有控制权。这里使用总线的方式来访问缓冲器,并加上一个总线仲裁器来处理模块对缓冲器的访问。协议模块在这个总线上作为访问发起者。当某一模块需要访问缓冲器的时候,它需要向总线仲裁发起一个中断,等待其响应。总线仲裁使用轮询的方式来处理每个模块的响应。协议模块获得访问权限后,就可以对缓冲器进行操作了,操作结束后,释放访问权限。使用总线仲裁器轮询的方式只是目前设计的一种方式,在不同的应用中,可能会有更好的方式来处理共享存储器的访问,需要后续的研究进一步验证。  

● 存储器管理  

这里有两种类型的存储器:本地的及共享的存储器。本地存储器驻留在每个模块的内部。这些本地存储器是驻留在这些模块内部的寄存器或者高速缓冲存储器。共享存储器可以被任何模块通过指针来访问。每个模块使用它自己的本地存储器来保存索引和偏移量。这个存储器将保存本模块运行所需要的临时变量。每个模块将控制用来指向被处理的数据包引用的编号。特定模块的编号数量将直接控制模块的行为。  

图3描述了在tcp接收模块中,一个存储器区域使用索引来查找的例子。输入索引和输出索引对于每个模块来说都是有访问控制的权限,索引使得模块之间保持协调。  

  
图3 共享存储器的查找索引  

每次一个数据报离开或者到达一个输入缓冲器,都要先查询存储器管理模块。这个模块使用一个称作空闲队列表的索引来管理输入输出缓冲器中的空闲地址。通过查询这个表,存储器管理模块可以为进入的有效载荷分配空间。当一个数据报离开其中一个缓冲器,那么一个新的值将登记到这个空闲队列表中。这个表是用来管理缓冲器中的空闲地址的。它的结构包含:一个输入或者输出缓冲器的引用;一个缓冲器的识别号;可用空间的大小。丢弃模块以及内存释放模块也间接地与空闲空间表打交道。  

● 协议模块的设计  

实现tcp/ip的卸载离不开和它紧密相关的协议。为了实现并行处理,整个tcp/ip协议栈分成了图4中的各个模块。不同的报文经过不同的数据路径处理报头信息。每个协议模块的缓冲在存储器中是排队的。这样的设计能够让tcp_rx模块处理报文的时候,ip_rx模块还能为接下来的报文处理ip层的数据。简而言之,每个协议模块都是独立的逻辑电路,协议的处理同软件类似。接收时按缓冲中的顺序处理报文头和数据。发送时根据用户的指令在缓冲中添加报文头和所需数据段。  

  
图4 协议模块处理  

● 协议模块运行状态  

协议模块设计成按照下面图5所描述的状态周期来工作。如果输入索引中没有数据包进入,处理过程将被锁定。在进入一个数据包之后,硬件开始了数据包的处理过程。处理完之后,生成的数据包放在输出索引中。其他的模块把这个输出索引当作自己的输入索引。缓冲器的索引直接依赖于每个模块。在tcp接收模块,输入索引是ip就绪索引,这个ip就绪索引是ip接收模块的输出索引。tcp的输出索引将是tcp就绪索引。应用层以及其他处于tcp上层的协议将使用这个索引来处理已经就绪的tcp/ip数据包。一旦一个模块将一个索引放入它的输出索引,那么这个模块将返回到状态1等待,直到下一个索引的到来。  

  
图5 状态机  

性能分析及模拟  

在这里,要估计在100mb/s以太网的性能。当使用tcp最大负荷时候,一个数据包是1460b,加上tcp和ip头,包长达到1500b,加上14b的mac头和4b的crc校验字节,一共有1518b。此外mac在传输有效报文时,还有8b的前文。这样在100mb以太网处理一个满负荷帧需要1526×8×10ns=122 080ns=0.122 08ms。也就是说系统需要在 0.122 08ms或12 208个100mb的时钟周期内完成整个帧处理。这是最好的情况。当tcp没有任何负荷时,帧的字节总数为20(tcp头)+20(ip头)+14(mac头)+4(crc)+8(mac前文)=66b。在100mb/s的以太网中需要66×8×10ns=5.28μs时间传输。就是说系统需要在5.28μs内处理完这个数据,这是最坏的情况。  

通过系统的分析,对满负荷的帧来说,从mac缓冲器拷贝数据到内部存储器开始,直到处理完毕后放在系统主存储区这个时间内,总共需要的时钟周期平均为1740个。发送的时候需要的1784个时钟周期。没有负荷的时候分别在发送和接收需要280和269个时钟周期。所以,我们可以计算出在100mb/s的以太网需要系统的系统时钟,如表1所示。根据综合的结果,系统能达到的最大时钟为49mhz,差不多能够满足最坏情况的需要。然而,最坏的情况是很少发生的,所以目前设计的toe系统能够很好地满足百兆位以太网的需求。  

  

使用ping、udp和tcp程序进行模拟。模拟环境需要2台通过网络连接的计算机,一台作服务器,一台作客户机。通过quartus ii编译dhl文件,下载到toe网卡的fpga中,将toe网卡连接到客户机。在客户机运行ping、udp和tcp程序,确认服务器是否能够响应客户机的数据包。通过客户机上的network analyzer软件,可以捕获发送接受数据包,能够进一步确认数据包的正确性。  

结束语  

高速以太网的发展,导致目前cpu在tcp/ip协议栈的处理开销越来越大,需要使用专门的硬件来执行tcp/ip的协议栈处理。本文给出了一种硬件实现的toe参考设计,在与普通网卡测试对比中表明,使用toe技术的网卡能够大大降低cpu的负担,而保持网络高吞吐率。
本文地址:https://www.eechina.com/thread-18485-1-1.html     【打印本页】

本站部分文章为转载或网友发布,目的在于传递和分享信息,并不代表本网赞同其观点和对其真实性负责;文章版权归原作者及原出处所有,如涉及作品内容、版权和其它问题,我们将根据著作权人的要求,第一时间更正或删除。
您需要登录后才可以发表评论 登录 | 立即注册

厂商推荐

关于我们  -  服务条款  -  使用指南  -  站点地图  -  友情链接  -  联系我们
电子工程网 © 版权所有   京ICP备16069177号 | 京公网安备11010502021702
快速回复 返回顶部 返回列表