数据传输错误校验的制作方法

文档序号:7508327阅读:694来源:国知局
专利名称:数据传输错误校验的制作方法
技术领域
本发明一般涉及数据传输,特别涉及一种具有用于对齐DDP片段的直通(cut-through)实现的、支持RDMA的网络接口控制器(RNIC)。
背景技术
1.概述参考图1A,示出了传统数据传输环境1的方框图。数据传输环境1包括数据源2(即,对等者),其通过一个或多个支持远程存储器数据访问(RDMA)的网络接口控制器(RNIC)4将数据传输3A传送到接收数据传输3B的数据宿5(即,对等者)。NIC 4包括重新装配缓冲器6等等(下面进一步说明)。连网通信速度最近已经从10兆位/秒(Mbps)经过100Mbps显著提高到1吉位/秒(Gbps),并且现在接近10Gbps范围内的速度。然而,通信带宽增加现在开始超过中央处理单元(CPU)能够高效处理数据的速率,从而在服务器处理器例如RNIC 4处产生瓶颈。例如,普通的1Gbps网络连接如果被完全利用则对于2GHz CPU是一个大负担。具体地说,诸如这样的CPU可以大约发挥其处理能力的一半来仅仅处理来自网络卡的数据的低级别传送控制协议(TCP)处理。
解决这一问题的一种方案是在硬件有限状态机(FSM)中而不是作为要由CPU处理的软件实现传送控制和网际协议(TCP/IP)栈。该方案允许非常快的分组处理,从而导致连续短分组的网速(wire speed)处理。另外,该方案提供了一种非常简洁且功能强大的、具有低成本的解决方案。遗憾的是,由于TCP/IP栈是针对软件实现而定义和开发的,因此采用硬件生成TCP/IP栈引起了范围较广的新问题。例如,所引起的问题包括如何在硬件FSM中实现基于软件的协议并且实现改善的性能,如何设计有利且高效的与高层协议(ULP)(例如,应用协议)的接口以提供ULP的较快速实现,以及如何在扩大的实现中避免新的瓶颈。
为了解决这些新问题,开发了新的通信层,其居于传统的ULP和TCP/IP栈之间。遗憾的是,置于TCP/IP栈之上的协议典型地需要很多拷贝操作,这是因为ULP必须提供用于间接数据放置的缓冲器,这将增加延迟并且使用重要的CPU和存储器资源。为了减少拷贝操作量,开发了被称作iWARP的新协议集。
2.协议参考图1B,现在将描述包括iWARP协议在内的各种协议、以及数据传输格式结构的简要概述。可以看出,每个数据传输可以包括与多个不同协议相关的信息,其中每个用于提供与数据传输相关的不同功能性。例如,如图1B所示,以太网协议100提供如由IEEE标准802.3定义的局域网(LAN)接入;网际协议(IP)102添加必要的网络路由信息;传输控制协议(TCP)104调度出站(outbound)TCP片断106,并且满足递送(delivery)保证;并且具有协议数据单元(PDU)对齐的标记(marker)(MPA)协议108提供MPA帧109,其跨越DDP片断112(仅仅示出了一个,但是可以是流)以固定的间隔(即,每512字节)包括向后MPA标记110,并且还向每个MPA帧109添加长度字段114和循环冗余校验(CRC)字段116。另外,直接数据放置(DDP)协议120将出站消息分成一个或多个DDP片断112,并且将一个或多个DDP片断重新装配成DDP消息113;并且远程数据存储器访问(RDMA)协议122将RDMA写、读、发送转换成DDP消息或者相反。虽然为了简洁起见仅示出了一个DDP片断112,但是应当认识到,在每个TCP片断106中可以提供许多DDP片断112。
尤其是关于RDMA协议122,由RDMA联盟开发的该协议通过允许一个计算机在对存储器总线带宽和中央处理单元(CPU)开销的最小要求的情况下将信息直接放置在另一个计算机的存储器中同时保持存储器保护语义而支持数据拷贝操作的去除和延迟的减少。TCP/IP上的RDMA通过减轻处理器和存储器上的开销负担从而使处理器资源可用于其它工作如用户应用,从而保证更高效和可伸缩的计算和数据传输,并且改善基础结构利用。在这种情况下,与将工作集中在较大、较昂贵的系统中相反,随着网络变得更高效,应用更好地能够通过跨越网络分担任务来伸缩。通过RDMA功能性,传送器可以使用帧化(framing)在以太网字节流上放置首标,以便在接收器处可以更容易地在无序模式中解码和执行这些字节流,这将大大提高性能-尤其是对于因特网小型计算机系统接口(iSCSI)和其它存储业务类型。由RDMA提供的另一个优点是能够在较少类型的互连上将功能聚集到数据中心中。通过在较少互连上聚集功能,所得到的基础结构较不复杂,更易于管理,并且提供架构冗余的机会,这将改善系统弹性。
尤其是关于DDP协议,该协议引入了可以将数据直接放置到高层协议(ULP)接收缓冲器中而无需中间缓冲器的机制。DDP减少并且在某些情况下消除了在处理入站TCP片断时由支持RDMA的网络接口控制器(RNIC)执行的附加拷贝(向和从重新装配缓冲器)。
3.挑战在硬件设置中高效实现具有RDMA和DDP的TCP/IP所面临的一个挑战是标准TCP/IP卸载(off-load)引擎(TOE)实现在接收逻辑中包括重新装配缓冲器,以安排无序接收的TCP流,这将增加拷贝操作。另外,为了完成向接收器的数据缓冲器的直接数据放置,RNIC必须能够定位每个到达TCP片断有效载荷127的目的缓冲器。结果,将所有TCP片断保存到重新装配缓冲器,以确保它们有序,并且可以定位目的缓冲器。为了解决该问题,iWARP规范强烈建议传送RNIC以将所创建的DDP片断与TCP片断“对齐”的方式执行RDMA消息的分段。但是,非对齐DDP片断时常是不可避免的,尤其是在数据传输经过很多交换的情况下,更是如此。
参考图1B,“对齐”意味着紧接在TCP首标126之后是DDP片断112(即,MPA首标跟随TCP首标,然后是DDP首标),并且DDP片断112完全包含在这个TCP片断106中。更具体地说,每个TCP片断106包括TCP首标126和TCP有效载荷/TCP数据127。“TCP洞”130是TCP数据流中的缺失TCP片断。MPA标记110为接收无序TCP片断106的时候提供数据,并且接收器想要知道TCP片断106内的MPA帧109是否与TCP片断106对齐。每个标记110以特定连接的初始序列号开始以相等的间隔(512字节)放置在TCP流中,并且指向它在其中行驶的MPA帧109的DDP/RDMA首标124。第一顺序标识号被分配给第一TCP片断106,并且后续TCP片断106中的每个初始序列号包括递增的序列号。
在图1B中,实线示出了对齐数据传输的示例,其中紧接在TCP首标126之后是MPA长度字段114和DDP/RDMA首标124,并且DDP片断112完全包含在TCP片断106中。DDP协议120层中的虚线表示非对齐DDP片断112NA,其中MPA长度字段114和DDP/RDMA首标124没有紧接在TCP首标126之后。非对齐DDP片断例如可以由于可居于发送和接收RNIC之间的中间盒的重新分段或者最大片断大小(MSS)的动态(on-the-fly)减小。由于传送RNIC不能改变DDP片断(改变TCP流中DDP首标的位置),因此尽管采用较大MSS的原始DDP片断创建,重新传送操作也可能需要新的减小MSS。在任何情况下,拷贝操作的增加降低速度和效率。从而,在本技术领域内需要一种方法来以不同于非对齐DDP片断放置和递送的方式处理对齐DDP片断放置和递送。
与非对齐DDP片断112NA处理相关的另一个挑战是由于这样的事实而产生的,即时常难以确定是什么导致了非对齐。例如,可以在两个或更多个TCP片断106之间分裂单个非对齐DDP片断112NA,并且它们中的一个可能到达而另一个可能未到达。在另一种情况下,一些DDP片断112NA可能落在MPA标记110之间,首标可能缺失,或者片断尾可能缺失(在后者情况下,您可以部分地放置片断,并且需要保存一些信息以理解当其余部分到达时在何处放置它)等等。与该后者情况相关,图1C示出了与一个或多个非对齐DDP片断112NA的MPA标记参考相关的可能情形的方框图。情况A示出了新接收的DDP片断162的DDP片断首标160由先前处理的DDP片断166的MPA长度字段164引用的情形。情况B示出了新接收的DDP片断162首标160由位于新接收的DDP片断162内部的标记168引用的情形。也就是,标记168引用新接收的DDP片断162的开头。情况C示出了标记168位于新接收的DDP片断162中但是指向该片断的外部的情形。情况D示出了标记168位于新接收的DDP片断162中并且指向该片断的内部的情形。情况E示出了没有标记位于新接收的DDP片断162中的情形。在任何情况下,在不能确定DDP片断非对齐的原因时,RNIC不能进行直接数据放置,这是因为存在太多情况而不能充分解决,并且存在太多信息/部分片断而不能保存在中间存储装置中。从而,提供对齐和非对齐DDP片断的不同处理的任何解决方案应当解决可能导致非对齐的各种情形。
4.DDP/RDMA操作流程参考图1D-1H,为了以后描述起见,现在将描述DDP/RDMA操作流程的简要概述。尤其是关于DDP协议120(图1B),DDP提供了被称作带标签(tagged)和不带标签(untagged)消息的两种消息。参考图1D,在“带标签消息”中,每个DDP片断112(图1B)在DDP/RDMA首标124中承载识别可以直接放置数据的接收器上的目的缓冲器中的存储器区域/窗口(例如,图1G中的存储器区域232)的引导标签(steeringtag)(“STag”)、该区域/窗口中的目标偏移量(TO)、以及片断有效载荷(未示出)。在这种情况下,通过STag“宣告”目的缓冲器的可用性。参考图1E,“不带标签消息”是这样的消息,其中远程传送器不知道接收器处的缓冲器,并且发送具有队列ID(QN)、消息序列号(MSN)和消息偏移量(MO)的消息,其可以由接收器用来确定适当的缓冲器。
参考图1F-1H,RDMA协议定义四种消息发送200、写202、读204、以及读响应206。回到图1A,动词接口7向使用者(consumer)呈现RNIC 4,并且包括分配和释放RNIC 4资源、以及将工作请求(WR)208投递(post)到RNIC 4的方法。动词接口7通常由动词库8实现,其中动词库8具有两个部分服务用户空间使用者的用户空间库9A和服务内核空间使用者的内核模块9B。动词接口7是与RNIC 4硬件和固件一起工作的RNIC特定软件。对于在动词接口7(动词库8)中应当实现什么,硬件和固件,没有严格的定义。动词接口7可以被视作向使用者提供RNIC 4服务的单个包,从而使用者可以主要执行两种操作RNIC 4资源的管理(分配和释放)、以及向RNIC 4投递工作请求(WR)。RNIC4资源管理的示例是队列对分配和释放、完成队列(以下为“CQ”)分配和释放或者存储器区域分配和释放。下面将更详细地描述这些管理任务。
如图1F-1H所示,使用者分配向其投递工作请求208的队列对。“队列对”(以下为“QP”)与TCP连接相关联,并且包括一对工作队列(例如,发送和接收)210、212、以及每个队列的投递机制(未示出)。每个工作队列210、212是工作队列元素(WQE)216的列表,其中每个WQE保存描述一个工作请求(WR)208的一些控制信息,并且引用(或指向)使用者缓冲器。使用者向工作队列210、212投递工作请求(WR)208,以便使动词接口7(图1A)和RNIC 4(图1A)执行所投递的工作请求(WR)208。另外,存在使用者不直接与其交互的、可以构成QP的资源,例如读队列214(图1H)和工作队列元素(WQE)216。可以由WQE 216保存的典型信息是使用者工作请求(WR)类型(即,对于发送WR 208S,它可以是RDMA发送、RDMA写、RDMA读等,对于接收WR 208R,它可以仅仅是RDMA接收)、以及承载要传送的数据或者表示用于所接收数据的位置的使用者缓冲器的描述。WQE 216总是描述/对应于单个RDMA消息。例如,当使用者投递RDMA写类型的发送工作请求(WR)208S时,动词库8(图1A)构建WQE 216S,其描述需要从其取得数据并且使用RDMA写消息发送到响应者的使用者缓冲器。在另一个示例中,存在接收工作请求(WR)208R(图1F)。在这种情况下,动词库8(图1A)将WQE 216R添加到接收队列(RQ)212,其保存要用于放置所接收的发送消息200的有效载荷的使用者缓冲器。
当动词库8(图1A)将新WQE 216添加到发送队列(SQ)210或接收队列(RQ)212时,它向RNIC 4(图1A)通知(这里被称作“使门铃响铃”)已经将新WQE 216分别添加到发送队列(SQ)/接收队列(RQ )。该“门铃响铃”操作通常是由RNIC硬件检测和解码的向RNIC存储器空间的写入。从而,门铃响铃向RNIC通知分别对于指定SQ/RQ存在需要完成的新工作。
RNIC 4(图1A)保存具有未决(已投递)WQE 216的发送队列(SQ)210的列表。另外,RNIC在这些发送队列(SQ)210之间仲裁,并且轮流服务它们。当RNIC 4选取要服务的发送队列(SQ)210时,它读取要服务的下一个WQE 216(WQE按照使用者投递它们的次序由RNIC处理),并且生成属于所请求的RDMA消息的一个或多个DDP片断220。
现在将参考图1F-1H描述特定类型的RDMA消息的处理。如图1F所示,RNIC(请求者)选择服务特定发送队列(SQ)210S。它从发送队列(SQ)210S读取WQE 216S。如果该WQE 216S对应于RDMA发送请求,则RNIC生成发送消息,并且将该消息发送到对等RNIC(响应者)。所生成的消息例如可以包括三个DDP片断220。当RNIC(响应者)接收发送消息时,它从接收队列(RQ)212读取WQE 216R,并且将所接收DDP片断220的有效载荷放置到由该WQE 216R引用的使用者缓冲器(即,响应者接收缓冲器)230。如果有序接收发送消息200,则RNIC从接收队列(RQ)212选取第一未用WQE 216R。WQE 216R按照使用者投递它们的次序链在请求队列(RQ)212中。就不带标签DDP消息而言,发送消息200承载消息序列号(MSN)(图1E),其被初始化为一,并且由传送器单调增加,其中每个发送DDP消息220属于相同DDP队列。(下面将与RDMA写消息202相关地描述带标签消息)。DDP队列由DDP首标中的队列号(QN)(图1E)识别。RDMA协议定义三个DDP队列用于入站RDMA发送的QN#0,用于入站RDMA读请求的QN#1,以及用于入站终止的QN#2。从而,当发送消息200无序到达时,RNIC 4可以使用该消息的MSN来查找对应于该发送消息200的WQE 216R。一个所接收的发送消息200从接收队列(RQ)212中使用一个WQE 216R。所投递WQE的缺少或者消息数据长度超过WQE缓冲器的长度被认为是关键性错误,并且导致连接终止。
参考图1G和1H,现在将描述使用带标签操作的RDMA写消息202、以及RDMA读消息204的一部分。为了使用带标签操作,使用者需要注册存储器区域232。存储器区域232是接收器即图1G中的响应者上的所依附(pinned)存储器的虚拟连续块。存储器区域232通过其起始虚拟地址(VA)、长度、访问权限、以及与该存储器区域232相关联的物理页列表来描述。作为存储器区域232注册的结果,使用者往回接收可以用来访问该注册存储器区域232的引导标签(STag)。由RNIC 4执行远程使用者(例如,图1G中的请求者)的存储器区域232访问,而无需任何与本地使用者(例如,图1G中的响应者)的交互。当使用者想要访问远程存储器232时,它分别投递RDMA写或RDMA读类型的发送工作请求(WR)208W或208R(图1H)。动词库8(图1A)分别将对应的WQE 216W(图1G)或216R(图1H)添加到发送队列(SQ)210W或210R,并且向RNIC 4通知。当连接赢得仲裁时,RNIC 16分别读取WQE216W或216R,并且生成RDMA写消息202或RDMA读消息204。
尤其是关于RDMA写消息202,如图1G所示,当RNIC 4接收到RDMA写消息202时,该RNIC使用DDP片断(属于该消息)的首标中的STag和TO(图1D)和长度,以查找注册存储器区域232,并且将RDMA写消息202的有效载荷放置到存储器232。接收器软件或CPU(即,所示的响应者)不涉及数据放置操作,并且不知道发生该操作。
尤其是关于RDMA读消息204,如图1H所示,当RNIC 4(图1A)接收到该消息时,该RNIC生成RDMA读响应消息206,并且将它发送回到远程主机,即所示的请求者。在这种情况下,接收队列被称作读队列214。还执行RDMA读响应206的生成而不涉及不知道发生该操作的本地使用者(即响应者)。当接收到RDMA读响应206时,RNIC4(图1A)与处理RDMA写消息204相类似地处理该消息。也就是,它写到请求者侧的存储器区域232。
除了处理使用者工作请求之外,RNIC 4(图1A)还向使用者通知这些请求的完成,如图1F-1H所示。通过使用完成队列240来进行完成通知,其中完成队列240是由使用者分配(通过由动词库8提供的专用函数)的另一个RNIC资源。完成队列240包括完成队列元素(CQE)242。CQE 242由RNIC 4在它报告使用者工作请求(WR)208S、208W、208RR时放置到完成队列(CQ)240。每个工作队列(即,发送队列(SQ)210、接收队列(RQ)212)具有相关联的完成队列(CQ)240。(注意读队列214是通过硬件维护的内部队列,并且不可见于软件。因此,没有CQ 240与该队列相关联,并且使用者既不分配该队列也不知道其存在)。然而,应当注意,同一完成队列(CQ)240可以与多于一个发送队列(SQ)210和接收队列(RQ)212相关联。在队列对(QP)分配时执行关联。在工作时,当使用者将工作请求WR 208投递到发送队列(SQ)210时,它可以指定是否它想要在完成该请求时得到通知。如果使用者请求了完成通知,则RNIC 4在完成工作请求(WR)时将完成队列元素(CQE)242放置到与发送队列(SQ)210相关联的关联完成队列(CQ)240。RDMA协议对于被投递到发送队列(SQ)210的工作请求(WR)208定义了非常简单的完成排序(ordering)。具体地说,RDMA发送工作请求(WR)208S和RDMA写工作请求(WR)208W在它们已被可靠传送时完成。RDMA读工作请求(WR)208R在对应的RDMA读响应消息206已被接收并且被放置到存储器区域232时完成。使用者工作请求(WR)按照将它们投递到发送队列(SQ)210的次序完成。参考图1F,被投递到接收队列(RQ)212的每个工作请求(WR)还要求完成通知。因此,当RNIC 4(图1A)完成所接收的发送消息200的放置时,它将完成队列元素(CQE)242放置到与该接收队列(RQ)212相关联的完成队列(CQ)240。
鉴于以上所述,在本技术领域内需要一种方法来与非对齐DDP片断放置和递送不同地处理对齐DDP片断放置和递送。

发明内容
本发明包括RNIC实现,其在特定连接的所有接收DDP片断是对齐的情况下执行向存储器的直接数据放置,或者在特定连接的一些DDP片断是非对齐的情况下使数据经过重新装配缓冲器。直通而不访问重新装配缓冲器的连接的类型被称作“快速”连接,而另一种类型被称作“慢速”连接。当使用者建立连接时,它指定连接类型。例如,将经过因特网到另一个洲的连接具有以对齐片断到达目的地的低可能性,因此应当由使用者指定为“慢速”连接类型。另一方面,在存储区域网(SAN)中连接两个服务器的连接具有使所有DDP片断对齐的很高可能性,因此将由使用者指定为“快速”连接类型。连接类型可以从快速变到慢速以及相反。本发明减少了存储器带宽、延迟、使用TCP重新传送的错误恢复,并且提供了从空接收队列的“适度恢复”,即接收队列没有入站不带标签DDP片断的已投递工作队列元素(WQE)的情况。传统的实现将以连接终止结束。相反,根据本发明的快速连接将丢弃这样的片断,并且使用TCP重新传送处理来从该情形恢复,并且避免连接终止。该实现还可以在发送确认片断接收的TCP确认(Ack)之前,在快速连接中对大部分入站DDP片断进行循环冗余校验(CRC)验证。这允许使用TCP可靠服务从通过CRC校验检测的数据损坏的高效恢复。
本发明的第一方面涉及一种校验数据传输的错误的方法,该方法包括以下步骤假定数据传输包括至少一个对齐直接数据放置(DDP)片断;基于传送控制协议(TCP)有效载荷的起始两个字节包括具有协议数据单元对齐的标记(MPA)协议帧的长度字段的假定,识别数据传输的边界;并且基于这些假定而计算循环冗余校验(CRC)值。
本发明的第二方面涉及一种用于校验数据传输的错误的系统,该系统包括用于基于传送控制协议(TCP)有效载荷的起始两个字节包括具有协议数据单元对齐的标记(MPA)协议长度字段的第一假定,识别数据传输的边界的装置;以及用于基于第一假定和数据传输包括至少一个对齐直接数据放置(DDP)片断的第二假定而计算循环冗余校验(CRC)值的装置。
本发明的第三方面涉及一种用于校验数据传输的错误的计算机程序产品,其包括其中实施有用于限制重新传送尝试的次数的计算机可读程序代码的计算机可用介质,该程序产品包括被配置成基于传送控制协议(TCP)有效载荷的起始两个字节包括具有协议数据单元对齐的标记(MPA)协议长度字段的第一假定,识别数据传输的边界的装置的程序代码;以及被配置成基于第一假定和数据传输包括至少一个对齐直接数据放置(DDP)片断的第二假定而计算循环冗余校验(CRC)值的程序代码。
根据下面对本发明实施例的更具体描述,本发明的前述和其它特征将会变得清楚。


将参考下列附图详细描述本发明的实施例,其中相同的附图标记表示相同的单元,并且其中图1A示出传统的数据传输环境和RNIC的方框图;图1B示出传统的TCP/IP上的MPA/RDMA/DDP数据传输结构的方框图;图1C示出一个或多个DDP片段的可能MPA标记参考的方框图;图1D示出传统的带标签DDP首标的方框图;图1E示出传统的不带标签DDP首标的方框图;图1F-1H示出各种传统的RDMA消息数据传输的方框图;图2A示出根据本发明的数据传输环境和RNIC的方框图;图2B示出图2A的RNIC的连接上下文的方框图;图2C示出图2A的RNIC的验证单元的方框图;图3示出RNIC输入逻辑(即,InLogic)功能的流程图;图4A-4B示出图3的InLogic的受限重新传送尝试模式实施例的流程图;图5示出说明根据可选实施例的、在连接降级之后处理TCP片断的方框图;图6示出图3的InLogic的连接升级实施例的流程图;图7示出MPA请求/答复帧,其供初始序列号协商实现使用,以便进行循环冗余校验(CRC)计算和验证;图8示出CRC计算和验证的可选改进MPA长度实现的流程图;图9示出使用CRC计算和验证的无标记直通实现的InLogic的第一可选实施例的流程图;
图10示出使用CRC计算和验证的无标记直通实现的InLogic的第二可选实施例的流程图;图11示出根据本发明的包括读队列的RDMA读和读响应消息数据传输的方框图;图12示出由RNIC输出逻辑(即,OutLogic)处理的消息的工作队列元素(WQE)和TCP洞的方框图;图13示出根据本发明的包括完成队列元素(CQE)的RDMA发送消息数据传输的方框图;图14示出了图13的CQE的方框图。
具体实施例方式
仅仅为了组织的目的,提供如下提纲I.概述;II.InLogic;III.OutLogic;以及IV.结束语。
I.概述A.环境参考附图,图2A是根据本发明的一个实施例的数据传输环境10的方框图。数据传输环境10包括数据源12(即,对等者),其通过一个或多个支持远程存储器数据访问(RDMA)的网络接口控制器(一个或多个)(RNIC)16,将数据传输14A传送到数据宿18(即,对等者),其接收数据传输14B。为描述起见,这里将发起数据传输的实体称为“请求者”,并且将对数据传输作出响应的实体称为“响应者”。类似地,传送数据的实体这里将被称为“传送器”,并且接收数据传输的实体这里将被称为“接收器”。应当认识到,数据源12和数据宿18中的每个在不同的时候可以是数据的传送器或接收器,或者是请求者或响应者,而且仅仅是为了最初表示保存要被传输的数据的那个实体的目的而提供了标注“源”和“宿”。在更具体的标注没有必要的情况下,下面的描述还可以将上面实体中的一个称为“使用者”(因为其使用RNIC 16资源)。“目的缓冲器”应当是指在接收器处最终接收数据的数据存储装置,即,数据源12或数据宿18的数据缓冲器50。数据源12和数据宿18每个包括用于存储数据的数据缓冲器50。
就硬件而言,RNIC 16是任何具有iWARP和动词功能性的网络接口控制器如网络I/O适配器或者嵌入式控制器。RNIC 16还包括动词接口20、访问控制30、RNIC输入逻辑(以下为“InLogic”)32、重新装配缓冲器34、内部数据缓冲器38、RNIC输出逻辑(以下为“OutLogic”)40、连接上下文42、验证单元44以及其它组件46。动词接口20是如通过RNIC 16硬件和RNIC驱动程序(未示出)的组合而实现以执行操作的、RNIC 16向使用者的呈现。动词接口20包括动词库22,其具有两个部分用户空间库24和内核模块26。访问控制30可以包括任何现在公知的或以后开发的、用于控制对InLogic 32的访问的逻辑。重新装配缓冲器34可以包括用于与数据传输14A、14B相关的数据临时存储的任何机制。具体地说,如下面将要更详细描述的那样,重新装配缓冲器34通常用于无序TCP流的临时存储。其它组件46可以包括RNIC 16的操作所需的任何其它逻辑、硬件、软件等,但是这里没有另外描述。
参考图2B,连接上下文42包括多个字段,其用于存储连接特定数据。其它上下文数据60提供这里未作另外说明但是对于本领域的普通技术人员可识别的连接特定数据。根据本发明,定义了两种连接类型快速(以下为“快速”)连接和慢速(以下为“慢速”)连接。术语“快速”和“慢速”是指递送对齐DDP片段的连接可能性。连接类型在被称作Connection Type(连接类型)62的连接上下文字段中识别。如下面将要更详细描述的那样,慢速连接可以用于作为慢速连接而被创建、或者在入站数据的处理期间由RNIC 16降级的RDMA连接。图2B所示的其它字段将在本公开内容中的其它地方与其关联处理相关地进行描述。参考图2C,验证单元44包括对于验证处理可能所需的循环冗余校验(CRC)逻辑64、TCP校验和逻辑66以及存储和转发缓冲器68。
B.RNIC一般操作回到图2A,在工作时,RNIC 16通过控制对InLogic 32的访问的访问控制30来接收数据传输14A。如同传统一样,用于维持连接的信息保持在连接上下文42的其它上下文数据60(图2B)中。InLogic 32处理数据传输14A中的入站TCP片断,通过TCP校验和逻辑66(图2C)执行接收TCP片断的验证,通过CRC逻辑64(图2C)计算MPACRC,并且将快速连接数据流与慢速连接数据流相分离。关于后者功能,如下面将要更全面描述的那样,InLogic 32将在慢速连接上由RNIC 16接收的所有数据定向到重新装配缓冲器34,并且以多种不同方式处理快速连接。关于快速连接,如果InLogic 32检测到对齐违例(即,紧接在TCP首标之后不是DDP首标,以及DDP片断没有完全包含在一个TCP片断中),则将连接降级到慢速连接,并且将数据定向到重新装配缓冲器34。相反,如果不存在对齐违例,则InLogic 32将对齐入站DDP流定向到内部数据缓冲器38,然后到OutLogic 40,以便直接放置到目的数据缓冲器50。可选地,可以丢弃TCP片断106,并且不发送确认(Ack),因此迫使进行该片断的重新传送。
OutLogic 40在快速和慢速连接之间仲裁,并且执行两种连接类型流向数据宿18数据缓冲器50的数据放置。快速连接上的对齐DDP片断被定向到内部数据缓冲器38以便直接放置到目的缓冲器的情形被称作“直通模式”,这是因为具有对齐DDP片断的快速连接由OutLogic 40直接放置,绕过重新装配缓冲器34。然而,对于两种连接类型,只有有序接收的数据流才通过OutLogic 40递送到数据宿18。
II.InLogic参考图3,将更详细地描述根据本发明的InLogic 32(图2A)及其数据传输14A的处理的流程图。如上所述,InLogic 32处理入站TCP片断,执行接收片断的TCP验证,计算MPA CRC,并且将快速连接数据流与慢速连接数据流相分离。除非另外指明,否则后面不跟有“S”的附图标记是指图2A-2C所示的结构。
在第一步骤S1,InLogic 32过滤属于RNIC 16连接的数据传输14A的TCP片断106,并且获得具有算出的接收片断的CRC验证(通过验证单元44)结果的分组。(注意,CRC验证应当在InLogic 32判定处理之前进行。CRC验证还可以在TCP片断106被识别为属于快速连接-步骤S2之前,与TCP校验和计算同时进行。)
在步骤S2,InLogic 32确定TCP片断106是否属于慢速连接。在这种情况下,InLogic 32确定传送器如何标注连接。如果是,则在步骤S3,将TCP片断106定向到重新装配缓冲器34,并且TCP逻辑将该片断认为是成功接收。
如果否,则在步骤S4,InLogic 32继续确定TCP片断106长度是否大于所规定的MPA片断长度。也就是,在TCP首标126中规定的TCP片断106长度是否长于在MPA长度字段114中规定的MPA长度。如果是,这表示TCP片断106包括多个DDP片断112,下面将描述其处理。如果否,这表示TCP片断106包括单个DDP片断112或112NA。
在该后者情况下,在步骤S5,InLogic 32确定MPA长度是否大于TCP片断106长度。如果是,这表示以下三种情形之一1)单个DDP片断112NA与TCP片断106未对齐,并且假定是MPA长度字段的字段不是长度字段;2)单个DDP片断112的开头与TCP片断106对齐,但是该单个DDP片断的长度超过TCP片断106有效载荷大小;或者3)所接收的单个DDP片断112与TCP片断106对齐,但是具有损坏的MPA长度字段114。前两种情况(1和2)表示在快速连接上接收到非对齐单个DDP片断112NA,因此在步骤S3应当将连接降级到慢速连接。第三种情况(3)不要求连接降级。然而,由于不能识别和确认MPA帧109长度超过TCP片断106长度的原因,因此丢弃(即,取消并不传输)这样的TCP片断106是不可取的,这是因为它可能引起死锁(上述情况2)。也就是,如果这样的TCP片断实际上承载非对齐DDP片断,则传送器将重新传送相同的非对齐DDP片断,遵循相同的流程,其将被接收器反复地丢弃,从而引起死锁。从而,在步骤S3,InLogic 32将TCP片断106的数据传输定向到重新装配缓冲器34,调度Ack以确认TCP片断106被成功接收,并且将连接降级到慢速连接(即,图2B中的ConnectionType字段62从快速转变到慢速)。如下所述,如果MPA长度字段114被损坏(上述情况3),这由OutLogic 40检测,并且连接由于如由验证单元44检测到的CRC错误而将被关闭。因此,在步骤S3,连接降级将不导致快速连接由于对齐DDP片断112中的数据损坏而永久性地变成慢速连接。
回到步骤S5,如果MPA长度不大于TCP长度,即否,则这表示MPA帧109长度匹配(等于)TCP片断106长度。在步骤S6,InLogic 32继续确定对于该TCP片断106,CRC验证结果是否有效。也就是,CRC逻辑64是否返回“有效”指示。如果是,则这表示单个DDP片断112完全适配TCP片断106边界(即,长度彼此相等),并且对于该片断,没有检测到数据损坏。结果,在步骤S7,通过将所接收的TCP片断106放置到RNIC 16的内部数据缓冲器38以便由OutLogic 40处理,在“快速路径模式”中处理单个DDP片断112,这将所接收的TCP片断106直接放置到接收器例如数据宿18的目的数据缓冲器50。另外,调度Ack以确认该TCP片断106的成功接收。
如果CRC逻辑64返回“无效”指示,即在步骤S6为否,则这表示存在可以根据本发明确定的五种可能情况之一。图1C示出了五种可能情况,并且步骤S8-S10示出了InLogic 32如何处理每种情况。在任何情况下,处理目标是1)避免非对齐连接的终止,即使这些连接由传送器声明为快速连接;2)降低由于属于快速连接的对齐DDP片断中的数据损坏而导致的连接终止的可能性;以及3)保持InLogic 32尽可能地简单,同时把要被单独处理的情况的数目减至最小。
在步骤S8,如图1C中的情况A所示,InLogic 32确定新接收的DDP片断162的DDP片断首标160是否由先前处理的DDP片断166的MPA长度字段164引用。在这种情况下,在新接收的DDP片断162的MPA CRC的验证期间检查先前处理的DDP片断166的MPA长度,因此它引用下一片断中的DDP首标160的正确位置。在步骤S6,情况A的CRC无效意味着单个DDP片断162数据或首标160已被损坏。新接收的片断162的TCP重新传送解决这一问题。从而,在步骤S9,丢弃TCP片断106,并且将片断接收认为是未被确认。
如果新接收的DDP片断162首标160没有由先前处理的DDP片断166的MPA长度字段164引用(即,在步骤S8为否),则在步骤S10,如图1C中的情况B所示,InLogic 32继续确定新接收的DDP片断162首标160首标160是否由位于新接收的DDP片断162内部的标记168引用。也就是,标记168正在引用新接收的DDP片断162的开头。在这种情况下,在步骤S6,CRC无效表示1)标记168承载正确值,并且新接收的DDP片断162具有损坏的DDP首标160或数据,或者2)新接收的DDP片断162内部的标记168已被损坏。在这两种情况下,新接收的DDP片断162的重新传送解决这一问题。从而,在步骤S9,丢弃TCP片断,并且不确认片断接收。
如果新接收的DDP片断162首标160没有由位于新接收的DDP片断162内部的标记168引用,即在步骤S10为否,则存在如下三种情况之一。第一,如图1C中的情况C所示,标记168位于新接收的DDP片断162中,但是指向该片断的外部。第二,如图1C中的情况D所示,标记168位于新接收的DDP片断162中,但是指向该片断的内部。第三,如图1C中的情况E所示,没有标记位于新接收的DDP片断162中。
在情况C、D和E中,CRC逻辑64返回无效指示的原因是不确定的,并且可以是数据损坏和/或非对齐DDP片断112NA(图1B)的接收的结果。在非对齐DDP片断112NA的情况下,这样的片断的无限制重新传送可能引起死锁。为了避免潜在的死锁,InLogic 32通过如在步骤S3所示将新接收的DDP片断162定向到重新装配缓冲器34,调度Ack以确认该片断的成功接收,以及将连接降级到慢速连接,处理情况C、D和E。如果CRC逻辑64返回无效指示是由于对齐DDP片断112中的数据损坏,则如下所述,该错误将由OutLogic 40在处理慢速连接的数据时检测到,并且将终止连接。另外,连接将永远保持慢速连接。然而,如下所述,受限重新传送尝试模式可以避免这一问题。
返回到图3的步骤S4,如果InLogic 32确定TCP片断106长度大于MPA帧109长度,则这表示TCP片断106包括多个DDP片断112。在这种情况下,在步骤S11,从第一到最后DDP片断112进行CRC逻辑64验证结果的顺序检查。如果所有DDP片断112具有有效CRC,即是,则所有DDP片断112都完全包含在TCP片断106中,并且全都是有效、正确对齐的DDP片断112。在这种情况下,在步骤S7,InLogic 32通过将所接收的TCP片断106放置到RNIC 16的内部数据缓冲器38以由OutLogic 40处理,在快速路径模式上处理DDP片断112,这将所接收的TCP片断106放置到目的数据缓冲器,例如数据宿18的数据缓冲器50。另外,调度Ack以确认该TCP片断106的成功接收。InLogic 32在检测到第一故障时停止检查CRC验证结果,其管理将与步骤S12-S13相关地加以说明。
在步骤S12,InLogic 32确定第一DDP片断112是否如由CRC逻辑64所确定的那样具有无效CRC。如果是,则InLogic 32与单个DDP片断的无效CRC情况相类似地处理第一DDP片断112(步骤S8)。也就是,InLogic 32将具有无效CRC的第一DDP片断112当作单个DDP片断112,并且继续确定是什么导致了CRC无效,即图1C的情况A-E中的哪个适用,并且如何适当地处理该情况。
如果步骤S12的结果为否,即第一DDP片断112具有有效CRC,则InLogic 32在步骤S13继续确定在校验中间或最后DDP片断112时是否检测到CRC无效。如果是,则InLogic 32(图1)继续到步骤S9,这是因为该错误表示导致CRC无效的DDP片断112的数据或首标已被损坏(即,先前的具有有效CRC的DDP片断的长度)。也就是,在相同TCP片断106中的中间或最后DDP片断112上检测到CRC错误,这意味着先前DDP片断具有有效CRC,因此先前DDP片断的长度指向具有无效CRC的片断的首标。这匹配情况A(图1C)的描述。因此,如情况A所述,首标的位置是已知的,因此,可以知道,CRC错误是由于数据或首标损坏而导致的。从而,整个TCP片断的重新传送应当解决这一问题,而没有任何死锁场景的风险。在步骤S9,丢弃TCP片断,并且不确认片断接收。
如果步骤S13的结果为否,即中间或最后DDP片断112没有导致CRC无效,则这表示最后DDP片断112的MPA长度字段114超过TCP片断106边界,即最后DDP片断在TCP片断106边界之外或太长。在这种情况下,InLogic 32将该情形视作相同于太长的单个DDP片断112。具体地说,在步骤S3,InLogic 32继续将TCP片断106的数据传输14A定向到重新装配缓冲器34,调度Ack以确认TCP片断106被成功接收,并且将连接降级到慢速连接。这样,避免了死锁。如果RNIC 16决定丢弃包含在TCP片断106中的多个DDP片断112之一,则丢弃整个TCP片断106,这简化了实现,并且减少了需要处理的情况的数目。
虽然上面没有显式讨论,但是应当认识到,还可以结合InLogic 32的上述操作执行其它数据传输处理。例如,还可以执行属于RNIC 16连接的TCP片断的过滤和接收分段的TCP/IP验证,包括通过TCP校验和逻辑66(图2C)的检验和验证。入站TCP片断106的处理还可以包括计算MPA CRC、以及通过CRC逻辑64(图2C)验证该CRC。下面将进一步描述用于CRC计算和验证的一个特定实施例。
A.受限重新传送尝试模式作为与所检测错误(例如,在图3的步骤S10为否是可以导致这样的情形的一个说明性确定)的原因的不确定性相关的可选实施例,可以实现“受限重新传送尝试模式”,以限制重新传送尝试的次数,从而避免死锁并且减少无需降至慢速连接的快速连接的数目。具体地说,如上所述,情况C、D和E表示若干情况,其中,由于所检测错误的原因的不确定性,连接可以被降级到慢速连接(步骤S3),其中在错误是由于数据损坏而非DDP片断112对齐的丢失时,(由OutLogic 40)进行潜在的连接终止。
为了限制重新传送尝试次数,本发明对连接上下文42(图2B)提供了附加字段,以允许在降级连接之前特定次数的重新传送。具体地说,如图2B所示,连接上下文42包括一组字段290,其包括恢复尝试次数字段(RecoveryAttemptsNum)292、最后恢复序列号字段(LastRecoverySN)294、以及最大恢复尝试次数字段(MaxRecoveryAttemptsNum)296。RecoveryAttemptsNum字段292维护自从最后更新以来对于连接进行的恢复尝试次数;LastRecoverySN字段294维护最后发起的恢复操作的序列号(SN);以及MaxRecoveryAttemptsNum字段296定义在降级连接之前应当由InLogic 32执行的最大恢复尝试次数。
参考图4A,在工作时,当InLogic 32检测到新有序接收的数据传输包含错误(被一般性地示出为图4A中的步骤S101),不是将连接立即降级到慢速连接(在图3中的步骤S3),InLogic 32提供了对该包含错误的数据传输进行特定次数的重新传送。应当认识到,步骤S101对于由于非对齐DDP片断112NA或数据损坏而导致的多个错误确定是一般性的(例如对于图3的步骤S5的是或者图3的步骤S10的否,步骤S101可以适用)。在步骤S102,InLogic继续通过将RecoveryAttemptsNum增加一(1)来针对该包含错误的数据传输记录该传送尝试。另外,InLogic更新LastRecoverySN,以存储先前存储在其中的序列号和新接收(但是被丢弃)的数据传输的序列号当中的最大序列号。也就是,InLogic更新LastRecoverySN以存储指示至少一个先前接收的包含错误的数据传输和新接收的包含错误(但是被丢弃)的数据传输当中的最大序列号。通过将新接收的包含错误的数据传输的序列号与所存储的最大序列号进行比较,确定新接收的包含错误的数据传输具有大于最大序列号的序列号。LastRecoverySN记录的意义在下面将会变得清楚。
接下来,在步骤S103,InLogic 32确定RecoveryAttemptsNum(字段292)是否超过MaxRecoveryAttemptsNum(字段296)。如果否,则在步骤S104,InLogic 32丢弃TCP片断106,并且不确认成功接收,这将导致TCP片断的重新传送。然后,处理返回到步骤S1(图3)。如果TCP片断106被损坏,则重新传送应当补救该损坏,使得数据传输14A作为快速连接被直接放置到存储器(在图3的步骤S7)。可选地,如果处理继续返回其它错误检测(例如,图3的步骤S10),则RecoveryAttemptsNum(字段292)将最终超过MaxRecoveryAttemptsNum(字段296),并且在步骤S106导致是。在这种情况下,InLogic 32继续到步骤S105,其中InLogic 32将连接降级到慢速连接,将包含错误的数据传输14A放置到重新装配缓冲器34,并且调度确认该TCP片断的成功接收的Ack。对于每个包含错误的数据传输,进行上述处理。
图4B表示受限重新传送尝试模式的另一个组成部分,其针对数据损坏通常不在多个连续TCP片断中发生但是非对齐片断可能影响若干后续TCP片断这一事实。例如,快速连接可以维持长时间段,例如五小时,并且不时地,例如一小时一次,可能具有数据损坏,使得CRC验证将失败。当这发生时,每次丢弃包含错误的数据传输(即损坏的片断)时,可以增加RecoveryAttemptsNum(字段292)。该处理解决了这样的情形,其中不同片断在不同的时间段由于数据损坏而被丢弃,并且在若干(可能为一)重新传送操作之后,成功地接收这些片断,并且将其放置到存储器。从而,成功地完成对这些片断的恢复操作,并且从其恢复的数据损坏情况不被计数,即当由于接收新的错误片段而进入新的恢复模式时。
为了从受限重新传送尝试模式退出,在步骤S105进行关于新接收的有序数据传输的TCP片断序列号(SN)(即,InOrderTCPSegmentSN)是否大于LastRecoverySN(SN)(图2B中的字段294)的确定。也就是,将属于快速连接的每个新接收有序TCP片断的序列号与从一个或多个先前接收的包含错误的数据传输中选择的所存储最大序列号进行比较。(注意,具有较大SN的无序片断的接收不意味着错误恢复完成。)然而,恢复完成的一个指示是接收到在导致进入恢复模式的片断之后传送的TCP片断。该情形可以通过比较InOrderTCPSegmentSN与LastRecoverySN来确定。该确定可以在对于该连接接收的TCP片断的实际上任何处理阶段进行。例如,在图3中的步骤S9之后,或者在图4A中的步骤S102之前。当有序片断SN大于LastRecoverySN,即接收到新TCP片断并且在步骤S105确定是时,在步骤S106,重置RecoveryAttemptsNum(图2B中的字段292),即将其设为零。关于上述示例,在被丢弃片断由于数据损坏而被丢弃,然后在传送器重新传送该片断之后被成功接收并且作为对齐片断被处理的情况下,步骤S105防止在长时间段例如五小时之后不必要的快速连接到慢速连接的降级(即,由于RecoveryAttemptsNum超过MaxRecoveryAttemptsNum)。如果在步骤S105为否或者在步骤S106之后,片断处理照常继续,例如,图3的步骤S1。
使用上述处理,通过设置MaxRecoveryAttemptsNum字段296,容许重新传送次数可以是用户定义的。应当认识到,虽然上面关于图4A-4B以及与图3的步骤S10相关的错误检测描述了受限重新传送尝试模式,但是如下面将要进一步描述的那样,受限重新传送尝试模式不仅仅适用于步骤S10的错误检测。注意,受限重新传送模式还找到有利的与下述部分D加速TCP重新传送处理一起的使用,其中当片断由于ULP考虑而被丢弃时,发送中间重复Ack。
B.连接降级参考图5,现在将描述处理这样的独特情形的讨论,其中在快速路径模式中将一个或多个无序接收的DDP片断112放置到目的数据缓冲器50之后降级连接(图3中的步骤S3)。如图5所示,无序地即按照次序3、4、1和2接收被标注为分组(Pkt)的四个TCP片断。当连接被降级到慢速连接时,从降级时刻开始接收的所有数据都被放置到重新装配缓冲器34,并且被重新装配成有序,即作为Pkt 1、2、3和4。在这种情况下,根据TCP协议,InLogic 32维护这些片断被接收的记录。
虽然罕见,可能出现这样的情形,其中(一个或多个)片断例如Pkt#3(加阴影)被直接放置到目的数据缓冲器50。即使InLogic 32假定接收到所有数据,该情形也引起以‘垃圾’数据即间隙或洞填充正常将保存分组3(Pkt#3)的重新装配缓冲器34中的位置。如果允许不加纠正地继续处理,则当OutLogic 40将重新装配缓冲器34传输到目的数据缓冲器50时,将以‘垃圾’数据覆写在快速路径模式上较早传输的分组3(Pkt#3),这将损坏数据。
为了解决这一问题而不增加硬件复杂度,在可选实施例中,InLogic32指示TCP逻辑忘记在连接是快速连接时无序接收的片断(即,图5中的Pkt#3)。具体地说,InLogic 32被配置成在步骤S3(图3)将连接降级到慢速连接时清除无序放置的数据传输的TCP洞,并且停止已经接收到这些分组的向传送器的接收报告(SACK选项)。结果,传送器重新传送所有未被确认的数据,包括无序直接放置到目的数据缓冲器50的那些片断,即Pkt#3。当接收到重新传送的数据时,将它写入到重新装配缓冲器34,并且当OutLogic 40从重新装配缓冲器34传输数据时,在目的数据缓冲器50处覆写任何无序直接放置的片断。该功能性有效地意味着RNIC 16‘丢弃’在该连接中无序放置到目的数据缓冲器50的片断。这样的方案消除了重新装配缓冲器34中的‘带间隙’有序流的情况,并且由于将引起该行为的罕见条件而不会导致明显的性能恶化。
C.连接升级作为另一个可选实施例,本发明可以包括如图6所示的连接升级过程。上述快速路径模式方案的目的是对于承载对齐DDP片断112的连接,允许绕过重新装配缓冲器34。然而,甚至在快速连接中,数据源12或中间网络设备也可以生成间歇性非对齐DDP片断112NA,根据上述技术,这将导致快速连接被降级到慢速连接。该间歇性行为例如可以是由于TCP重新传送期间的最大片断大小(MSS)改变或者其它偶发性场景而导致的。
如图6所示,为了从该情形恢复,本发明还可以提供在例如步骤S3(图3)的较早降级之后从慢速连接到快速连接的连接升级。为了允许升级,必须存在多种情形。在可选实施例的第一步骤S31中,InLogic32确定重新装配缓冲器34是否为空。如果否,则不进行升级-步骤S32。如果在步骤S31确定是,则在步骤S33,InLogic 32确定是否正在接收对齐DDP片断112。如果否,则不进行升级-步骤S32。如果在步骤S33确定是,则在步骤S34,InLogic 32确定连接是否由传送器例如数据源12作为快速连接而发起。如果在步骤S24确定否,则不进行升级-步骤S32。如果在步骤S34确定是,则在步骤S35将连接升级到快速连接。
D.加速TCP重新传送处理另一个可选实施例解决这样的情形,其中TCP片断106被接收,但是由于RDMA或ULP考虑例如DDP片断的损坏、无效CRC等而被丢弃。根据上述过程,存在TCP片断106被接收并且通过了TCP校验和但是被InLogic 32丢弃而不发送覆盖该片断的TCP Ack(即,图3的步骤S9)的多个时候。然后,传统的过程将导致这些分组的重新传送尝试。具体地说,在基本方案(所谓的“Reno协议”)中,TCP传送器在它获得三个重复的Ack(即,没有推进有序接收数据的序列号的Ack)时开始‘快速重新传送’模式。例如,假定两个TCP片断A和B,并且片断B按照TCP次序在片断A之后。如果片断A被丢弃,则接收器只有在它接收到片断B时才将发送重复Ack。该重复Ack将表示“我正在等待片断A,但是接收到另一个片断”,即片断B。在Reno协议之下的‘快速重新传送’模式中,传送器发送一个片断,然后它等待另外三个重复Ack以重新传送另一个分组。更高级的方案(如所谓的“新Reno协议”)允许在其‘快速恢复’模式中为每个接收的重复重新传送片断。该处理背后的逻辑是如果一个片断离开网络,则传送器可以将另一个分组放置到网络。
为了帮助重新传送,根据本发明的可选实施例,InLogic 32生成第一重复TCP确认(Ack),其覆盖通过TCP确定为有效但是基于高层协议(ULP)判定而通过TCP丢弃(例如,在图3的步骤S9)的接收TCP片断;并且传送该重复TCP Ack。如上所述,ULP可以包括以下项中的一个或多个MPA协议、DDP协议、以及RDMA协议。不管TCP片断是有序还是无序,并且甚至在没有接收到下一个有序TCP片断的情况下,对于TCP片断都生成第一重复TCP Ack。InLogic 32还可以生成覆盖下一个无序接收TCP片断的第二重复TCP确认(Ack),并且传送第二重复TCPAck。
上述处理有效地意味着即使可能尚未接收下一个有序片断(例如,上面示例中的片断B)也生成重复Ack(例如,对于上面示例中的片断A),因此应当加速在上述重新传送规则之下使传送器重新进入快速路径模式的处理。更具体地说,即使尚未接收片断B,传送器也将知道片断A,有效的TCP片断被接收并且由于ULP考虑而被丢弃。结果,附加的重复Ack迫使传送器在重新传送开始之前必须接收多个重复Ack的情况下较早地开始重新传送过程。该方案不违反TCP原则,这是因为TCP片断106已经被成功地递送到ULP,但是由于ULP考虑(无效CRC)而被丢弃。因此,该分组不被IP协议丢弃或重新排序。当RNIC 16实现如关于图4A所概述的受限重新传送尝试模式即在步骤S103发送Ack时,该方案是特别有价值的。
E.CRC计算和验证传统的进入以太网帧的处理以过滤处理开始。过滤的目的是将有效的以太网帧与无效的以太网帧相分离。“无效帧”不是损坏的帧,而是不应当由RNIC 16接收的帧,例如,MAC过滤-基于MAC地址的帧选择、虚拟局域网(VLAN)过滤-基于VLAD标签的帧选择等。允许进入RNIC 16的有效帧也被分成不同的类型。这些类型之一是TCP片断。动态地进行过滤处理,而无需执行整个以太网帧的存储和转发处理。
TCP片断处理的下一步骤是TCP校验和计算和验证。通过通常使用数据块中的二进制值,使用某算法,在传送时计算值,并且与数据一起存储该结果,以便在接收时与以相同方式算出的值进行比较,校验和计算确定数据是否被无错误地传送。校验和计算和验证要求整个TCP片断的存储和转发处理,因为它覆盖整个TCP片断有效载荷。传统地,循环冗余校验(CRC)的计算和验证通常在TCP校验和验证之后,即在将连接识别为RDMA连接之后,以及在使用先前DDP片断的长度或MPA标记之后检测到DDP片断的边界之后。CRC计算和验证通过将消息划分成用作被除数除以固定除数的预定长度,确定数据是否已被准确传送。将计算余数附加到该消息,以便与由接收器进行的相同计算进行比较。CRC计算和验证也要求整个DDP片断的存储和转发,这增加了延迟并且要求用于存储的大数据缓冲器。CRC计算的一个要求是知道DDP片断边界,其使用先前DDP片断的长度或者使用MPA标记110(图1B)确定。基于标记的确定由于很多例外和角落情况而非常复杂。部分接收的DDP片断的CRC计算也是复杂的处理。
为了解决上述问题,如图2C所示,本发明使用相同的存储和转发缓冲器68与通过TCP校验和逻辑66的TCP校验和计算和验证相并行地执行通过CRC逻辑64的CRC计算和验证。另外,本发明不直接定位DDP片断边界,然后计算和验证DDP片断CRC。相反,本发明通过计算CRC并且以后确定DDP边界而转变操作次序。为了进行该转变,CRC逻辑64假定每个TCP片断(在已知该片断属于RDMA连接之前)以对齐DDP片断开始。另外,本发明假定TCP有效载荷127(图1B)的起始两个字节是MPA帧的MPA长度字段114(图1B)。然后,使用该长度识别DDP片断边界,并且计算该片断的CRC。在验证单元44识别TCP片断106中的第一可能DDP片断112的边界之后,它与TCP片断有效载荷127的该部分的校验和计算同时地计算和验证该DDP片断的CRC,然后继续到包含在相同TCP片断106中的下一个潜在DDP片断112(若有的话)。对于在TCP片断106中发现的每个“潜在”DDP片断,CRC验证结果可以是有效、无效或太长。存储CRC验证结果以便如上面关于图3所述使用。
为了如上所述实际上计算CRC,当处理TCP片断106的有效载荷时,InLogic 32需要知道MPA标记110在TCP片断106中的何处。如上面关于图1B所讨论的那样,每隔512字节在TCP片断106中放置MPA标记110,并且第一MPA标记与作为连接上下文42的StartNum字段248(图2B)存储的、TCP首标126(图1B)中的初始序列号相距512字节。遗憾的是,每个MPA标记110的估计不揭示其相对于StartNum248(图2B)的位置。另外,MPA标记110被CRC数据116覆盖,但是不包括在MPA长度字段114中,其中MPA长度字段114仅包括MPA帧的有效载荷。从而,为了识别MPA标记110,RNIC 16需要知道必须从连接上下文42取出的StartNum 248(图2B)。遗憾的是,在TCP处理期间,读取连接上下文42是非常不便于进行的,这是因为它在处理中非常早地发生,并且打断或停顿分组处理。
为了减少或消除连接上下文42取出,本发明提供了四种可选方案,其允许正确计算对于计算和验证DDP片断112的MPA CRC所需的DDP片断112长度。这些选项在下面加以讨论。
1.连接上下文预取方法用于正确计算DDP片断112长度的第一可选实施例包括实现作为StartNum字段248(图2B)存储的初始序列号的连接上下文42预取。这里不提出对MPA规范的改变。当前MPA规范需要知道初始序列号(StartNum)来识别TCP片断106中的MPA标记110的位置。初始序列号是TCP连接属性,其随着连接而不同,并且在连接建立时协商。因此,基于每个连接而维护StartNum 248(图2B)。为了识别MPA标记110的位置,CRC逻辑64(图2C)检查特定片断的序列号(SeqNum)和StartNum的余数(SeqNum-StartNum)mod 512为零。也就是,由于每个TCP片断106首标承载其有效载荷的第一字节的序列号,因此CRC逻辑64可以通过获得特定片断的序列号和StartNum 238之差然后从该位置开始每512字节地定位标记,从而确定在何处查找标记。MPA规范定义上述标记检测方法。这样,可以在执行TCP校验和验证之前执行散列查询(基于TCP三元组)和连接上下文42预取。这是正常连接上下文42取出流程。如果RNIC 16想要获得连接上下文42,则它首先需要理解该上下文位于何处,或者获得连接ID。TCP片断106首标承载TCP三元组(IP地址(源和目的地)和TCP端口(源和目的地))。三元组是散列函数的输入。散列函数的输出是连接ID。当然,可能产生不同三元组的相同连接ID,这被称作“冲突”。为了处理冲突,RNIC 16读取连接上下文42,采用分组中的三元组检查连接上下文42中的三元组,并且如果它不匹配,则RNIC 16获得指向下一个连接上下文42的指针。RNIC 16保持检查三元组,直至它发现匹配或者将片断识别为不属于任何已知连接的片断。该处理允许定位TCP流中的MPA标记110。结果,可以与TCP校验和验证同时地执行CRC计算和验证。
2.初始序列号协商方法在第二可选实施例中,通过对MPA规范进行多种改变,在不进行连接上下文取出的情况下,正确地计算DDP片断长度是可能的。首先,改变MPA规范中的MPA标记110放置的定义。上述连接上下文预取方法的一个缺点是需要执行散列查询和连接上下文42预取以识别TCP片断106中的MPA帧109的边界。为了防止这一点,本发明以每512字节的方式而非以从初始序列号(SN)(被保存为StartNum 248)开始每512字节的方式(这需要上述SN-StartNum mod 512处理)放置MPA标记110。以这种方式,MPA标记110位置可以通过序列号mod 512处理来确定以定位MPA标记110,并且无需连接上下文42取出。
根据该实施例对MPA规范的第二改变用来避免在两个DDP片断112之间分裂一个标记的情形,即初始序列号不是字对齐的情况。结果,序列号mod 512处理可能不在所有环境中工作,这是因为标准TCP实现允许初始SN具有随机生成的字节对齐值。也就是,初始序列号是否字对齐不可由RNIC 16控制。结果,给定连接的TCP流可能不一定以MPA标记110开始。从而,如果CRC逻辑64仅仅通过使用序列号mod 512处理来选取标记110的位置,则它可以使标记放置到不可接受的字节对齐位置。为了避免这一情形,本发明向在MPA协商阶段交换的MPA帧即所谓的“MPA请求/答复帧”添加填充符(padding),以使RDMA连接的初始SN字在它移到RDMA模式时字对齐。也就是,如图7所示,将校正因素150插入到TCP片断106的MPA请求/答复帧152中,其包括使初始SN字对齐所需的一定数目的字节。应当认识到,校正因素150的准确位置不必如同所示一样。这样,CRC逻辑64可以实现序列号mod 512处理,以获得TCP流中的MPA标记110的准确位置而无需连接上下文取出。使用MPA规范的上述修改,本发明可以定位MPA标记110,并且正确地计算MPA片断的长度,而无需预取连接上下文42。
3.MPA长度字段修改方法在用于正确计算DDP片断112长度而无需连接上下文取出的第三可选实施例中,在MPA规范中改变MPA长度字段114的定义。传统地,MPA长度字段114被定义成承载排除了标记110、填充符121(图1B)和由MPA层添加的CRC数据116的各个MPA帧109的ULP有效载荷的长度。遗憾的是,该信息不允许使用由TCP片断106提供的信息定位MPA帧边界。为了解决这一点,根据该可选实施例,改变MPA规范中的MPA长度的定义,以指定整个MPA帧109的长度,其包括MPA长度字段114的14个最高有效位(MSB)、ULP有效载荷118长度、MPA标记110、CRC数据116、MPA长度字段114的2个最低有效位(LSB)、以及填充符121中的有效位。
该修订定义允许使用MPA长度字段114检测MPA帧109边界而无需定位嵌入在该MPA帧中的所有MPA标记110。MPA层协议负责剥去标记110、CRC数据116以及填充符121,并且向ULP(DDP层)提供ULP有效载荷长度。
参考图8,使用MPA长度的这一定义,CRC逻辑64通过下面处理来定位MPA帧109的边界在步骤S100,CRC逻辑64确定MPA帧109的第一字是否等于零。如果是,则InLogic 32(图2A)在步骤S102从下一个字读取MPA长度字段114。这是MPA标记110落在两个MPA帧109之间的情况。在这种情形下,MPA长度字段114如在步骤S104所示位于下一个字中。如果在步骤S100确定否,则该字保存MPA长度字段114。在步骤S106,使用MPA长度来查找覆盖该MPA帧109的CRC数据116的位置。然后,上述处理重复以定位嵌入在TCP片断106中的其它MPA帧109。该实施例允许定位MPA帧109边界而无需来自连接上下文42的任何附加信息。
4.无标记直通实现在第四可选实施例中,如下所述,关于CRC计算和验证而使用无标记直通实现。用于正确计算DDP片断长度的上述三个可选实施例的缺点是每一个需要MPA规范修改或连接上下文42预取。该实施例实现入站片断的直通处理而无需预取连接上下文42以计算到达MPA帧的CRC以及无需对MPA规范的任何附加改变。另外,该实施例允许无序直接数据放置而不使用MPA标记。该实施例部分地基于接收器根据MPA规范的最新更新版本针对给定连接协商‘无标记’选项的能力。具体地说,更新的MPA规范允许MPA接收器决定针对给定连接是否使用标记,并且发送者必须尊重接收者的决定。该实施例改变验证单元44逻辑,以允许与TCP校验和计算同时地进行动态的CRC计算,并且无需预取连接上下文42。
完全如同对于具有标记的情况所描述的一样进行CRC计算。也就是,本发明假定TCP片断以对齐DDP片断开始,并且使用MPA长度字段来查找CRC的位置,然后计算和验证CRC。然而,与该实施例的区别是给定MPA首标的MPA长度字段,在计算DDP片断长度时无需考虑标记。
参考图9,示出了说明与该实施例的第一可选方案相关的InLogic32功能性的流程图。应当认识到,InLogic 32功能性的大部分基本上类似于上面关于图3所述。为清楚起见,在InLogic 32功能性基本上类似于上面关于图3所述的情况下,重复并且以虚线框标出这些步骤。
在更新的MPA规范下,接收器在连接初始化时协商特定连接的‘无标记’选项。如图9所示,在该实施例中,在步骤S201,InLogic 32确定入站TCP片断106是否包括标记110。如果是,则InLogic 32如同在图3中一样继续处理,并且如上所述将使用一些其它的CRC计算和验证方法。如果否,则在步骤S202,入站MPA帧109使用与TCP校验和逻辑66相同的存储和转发缓冲器68使其CRC动态地被计算和验证,但是无需取出连接上下文42。还可以完成连接是否是慢速连接的确定,如图3中的步骤S2和S3。CRC验证的结果可以是下列项之一1)MPA帧109的长度匹配TCP片断106的长度,并且MPA帧109具有有效MPA CRC;2)MPA帧109的长度匹配TCP片断106的长度,但是MPA帧109匹配TCP片断106的长度,但是MPA帧109具有无效CRC;3)MPA帧109的长度超过TCP片断的长度;以及4)MPA帧109的长度小于TCP片断106的长度。
在情况1)中,InLogic 32基本上类似于图3的步骤S4-S7而工作。也就是,在MPA帧109具有与TCP片断106相同的长度(图3的步骤S4和S5)并且承载有效的MPA CRC(步骤S6)的情况下,帧被认为是有效MPA帧,并且在快速路径模式上通过内部数据缓冲器38传到OutLogic 40以作进一步的处理,并且传到目的数据缓冲器50。
在情况2)中,在MPA帧109具有与TCP片断106相同的长度(图3的步骤S4和S5)但是具有无效CRC(图3的步骤S6)的情况下,InLogic32与关于图3所述不同地工作。具体地说,由于接收MPA帧109不包含MPA标记110,因此标记相关信息不能用于恢复(如在图3的步骤S10中)。这仅仅遗留了需要解决的两种情况情况A当MPA帧109由先前接收的片断(并且经过验证的)MPA帧109的长度引用(如在图3的步骤S8所确定的那样);以及情况B所有其它情况。在情况A中,MPA帧109被损坏,并且在情况B中,MPA帧109可能被损坏或者未对齐。在两种情况下,都丢弃接收TCP片断106(图3的步骤S9),并且不确认接收。在这种情况下,关于图4所述的受限重新传送尝试模式可以被实现成从该TCP片断106的丢弃恢复,这允许发送者重新传送被丢弃的TCP片断106,并且解决任何潜在的数据破坏。如果MPA帧109与TCP片断106未对齐,则受限重新传送尝试模式将如上所述以将连接降级到慢速连接结束。
在情况3)中,在MPA帧109的长度超过TCP片断106的长度(图3的步骤S5)的情况下,MPA帧109与TCP片断106未对齐,或者长度被损坏。在这种情况下,丢弃接收TCP片断106(图3的步骤S9),并且TCP不确认接收。在这种情况下,同样,关于图4所述的受限重新传送尝试模式可以被实现成从该TCP片断106的丢弃恢复,这允许发送者重新传送被丢弃的TCP片断并且解决任何潜在的数据损坏。同样,如果MPA帧109与TCP片断106未对齐,则受限重新传送尝试模式将如上所述以将连接降级到慢速连接结束。
在情况4)中,在MPA帧109的长度小于TCP片断106的长度(图3的步骤S4)或者TCP片断106潜在地承载多个MPA帧109(发送者实行压缩组装(packing)选项)的情况下,InLogic 32顺序地检查嵌入在接收TCP片断106中的所有DDP片断112的CRC(图3的步骤S11-S13)。如果所有DDP片断112都具有有效CRC,则InLogic 32认可该TCP片断106的接收,并且在快速路径模式上转发所有MPA帧以作进一步处理(图3的步骤S7)。如果DDP片断112之一具有无效CRC,或者最后片断没有完全包含在TCP片断中(图3的步骤S12-S13),则丢弃整个TCP片断(图3的步骤S9),并且InLogic 32不确认该TCP片断的接收。如上所述,关于RNIC 4所述的受限重新传送尝试模式可以被实现成从该TCP片断106的丢弃恢复,这允许发送者重新传送被丢弃的TCP片断,并且解决任何潜在数据损坏。如果MPA帧109与TCP片断106未对齐,则受限重新传送尝试模式将如上所述以将连接降级到慢速连接结束。
转到图10,示出了另一个可选流程图,其说明了与该实施例相关的InLogic 32功能性,并且包括受限重新传送尝试模式和TCP重新传送加速的方面。与图9相反,相比于图3,大大简化了InLogic 32功能性。为了清楚起见,在InLogic 32功能性基本上类似于上面关于图3所述的情况下,重复并以虚线框标出这些步骤。
在图10中,步骤S151-S153基本上相同于图3的步骤S1-S3。在步骤S154,InLogic 32确定是否通过CRC验证。该评测不同于图3中的步骤S4之处在于代替每DDP片断提供指示,CRC逻辑54提供CRCValidationPassed(CRC验证通过)位,其表示接收TCP片断中的所有DDP片断的CRC验证的成功或失败。如果对于包含在接收TCP片断中的所有DDP片断,都通过CRC验证,则设置该位,并且如果对于这些片断之一CRC验证失败,或者最后(唯一)片断太长,则清除它。如果否,则InLogic 32继续到步骤S155,其中确定RecoveryAttemptsNum(图2B的字段292)是否大于MaxRecoveryAttemptsNum(图2B的字段296)。如果是,则InLogic继续到步骤S153,其中将DDP片断放置到重新装配缓冲器34,发送Ack,并且将连接降级到慢速连接(如果它是快速连接)。如果在步骤S155为否,则在步骤S156,丢弃TCP片断106,并且不调度确认。另外,将RecoveryAttemptsNum(图2B的字段292)增加一,并且更新LastRecoverySN(图2B的字段294)。
回到步骤S154,如果该确定的结果为是,则在步骤S157,InLogic32继续确定新接收的有序数据传输的序列号(有序SN)是否大于LastRecoverySN(图1B的字段294)。如果是,则在步骤S158,InLogic32清除RecoveryAttemptsNum(图1B中的字段292),即将它设为零。如果在步骤S157为否或者在步骤S158之后,则在步骤S159,通过将片断放置到目的数据缓冲器50来在“快速路径模式”上处理片断。如上面关于TCP重新传送加速选项所讨论的那样,步骤S159还可以包括重复Ack的实现。
上述图10实施例实现本发明的直通模式、加上受限重新传送尝试模式和TCP重新传送加速选项,而不使用MPA标记。
III.OutLogicOutLogic 40(图2A)执行RDMA消息的有序递送而无需每RDMA消息保存信息。存在所解决的两种情形1)对于除了发送消息之外的所有RDMA消息,以及2) RDMA发送消息。
回到图1F-1H,现在将描述OutLogic 40(图2A)的操作。OutLogic处理来自内部数据缓冲器38的对齐DDP片断220,其中该片断如上所述在快速路径模式上被放置在内部数据缓冲器38中,并且向接收器的数据缓冲器进行对齐DDP片断的数据放置和递送。如这里所使用的那样,“放置”是指将数据实际放置在缓冲器中的处理,并且“递送”是指确认数据传输完成的处理。“放置”可以应用于片断和消息,而“递送”仅仅应用于消息。在RDMA协议之下,可以以无序方式放置对齐DDP片断,但是不进行递送直至无序放置所有对齐DDP片断。例如,对于三个对齐DDP片断1、2和3,在没有片断1而首先放置片断2和3的情况下,不发生递送直至放置了片断1。
A.放置关于放置,如下所述,除了与RDMA读消息相关的之外,OutLogic 40提供传统的RDMA消息放置。
关于带标签DDP片断,例如,回到图1D,根据RDMA协议,带标签DDP片断的首标124承载接收器的先前注册存储器区域(例如,图1G中的存储器区域232)的地址。如上所示,该地址包括表示位于存储器区域/窗口(例如,对于RDMA写消息,图1G中的存储器区域232)中的目的缓冲器的开始标签(STag)、该区域/窗口中的目标偏移量(TO)、以及事务长度(片断有效载荷)。在这种情况下,数据放置由OutLogic 40以传统的方式进行,而不从连接上下文42(图2A)检索任何附加信息。将STag和TO翻译成描述目的数据缓冲器的存储器区域的物理缓冲器列表的传统地址翻译和保护(ATP)处理居于OutLogic 40的数据放置之前。
关于诸如RDMA读消息的不带标签DDP片断,参考图1H,RDMA协议定义在协商时交换的未决入站读请求222的最大数目。每个RDMA读消息204使用单个DDP片断222。当RNIC 16接收RDMA读消息204时,它将RDMA读响应WQE 216RR投递到读队列214。在另一个示例中,参考图1F,将每个发送消息200放置到响应者例如数据宿18(图2A)的接收队列(RQ)212。如上所述,每个接收队列(RQ)212是向其放置控制指令的缓冲器,并且包括向其放置有效载荷的WQE 216R。接收队列(RQ)212包括WQE 216R。每个WQE 216R保存描述由使用者投递的接收WR 208R的控制信息。每个WQE 216R还指向在该WR 208R中投递的使用者缓冲器。这些缓冲器用来放置有效载荷。从而,每个消息200使用WQE 216R。
参考图11,示出了类似于图1H的RDMA读消息204和RDMA读响应206的表示。然而,根据本发明,提供读队列414作为被实现为循环缓冲器的特殊工作队列(WQ),并且该循环缓冲器的每个条目是描述需要由传送逻辑生成的RDMA读响应的WQE 216RR。这允许容易且高效的无序RDMA读请求222的放置,这是因为对于每个入站RDMA读请求,在读队列414中存在众所周知的位置,即WQE 216RR。例如,当接收到RDMA读消息#3并且RDMA读消息#2丢失时,放置RDMA读消息#3。在接收到RDMA读请求消息222,即由于请求者上的读WR 208R的投递而发送的消息时,进行该放置。读队列414中的WQE216RR的位置由RDMA读消息首标124(图1D)中的MSN识别。
B.递送RDMA协议允许无序的数据放置,但是要求有序递送。从而,传统的实现要求维护关于放置(完全或部分地)到存储器但是尚未递送的每个消息的信息。然而,单个TCP片断的丢失可能引起很多无序RDMA消息的接收,这些无序RDMA消息将被放置到目的缓冲器,并且不完成直至缺失的片断将被重新传送并且成功地放置到存储器。在传统的环境下,有限的资源可用于存储无序流,使得在接收到无序流之后只能存储特定数目的后续消息。
然而,根据本发明,不是为每个未被递送的RDMA消息保存某信息因此限制所支持的无序接收消息的数目,而是通过基于每个TCP洞而存储信息,支持无限数目的未被递送的RDMA消息。“TCP 洞”是描述由于无序TCP片断的接收而在TCP流中形成的空缺的术语。
参考图12,白块表示形成TCP洞130A-130C的缺失TCP片断400,并且加阴影/灰色块402表示连续接收的TCP流。每个TCP洞130A-130C信息存储在连接上下文42(图2B)中。有限数目的所支持TCP洞130A-130C是从TCP协议实现继承的特性。具体地说,TCP协议通常将所支持TCP洞130A-130C的数目限制为例如一个、两个或三个洞。典型地,有限数目的TCP洞130A-130C的支持有效地意味着当无序TCP片断到达从而打开新的TCP洞时,该片断被TCP逻辑丢弃。图12示出了三TCP洞实现。在这种情况下,如果新片断在底部TCP首标130C之后即在两个底部缺失片断400之后到达,则该片断将“打开”不被支持的第四个洞。结果,该片断将被丢弃。
为了解决这一情形,本发明实现通过连接上下文42(图2A和2B)的TCP洞130(图12)的跟踪而非无序消息/片断的跟踪。具体地说,如图2B所示,本发明存储用来对已完成RDMA读请求进行计数的PendingReadResponseNum字段300、用来对已完成发送消息进行计数的CompletedSendsNum字段302、以及用来对已完成RDMA读响应进行计数的CompletedReadResponseNum字段306。本领域的技术人员应当认识到,对于每个洞,可能需要其它字段,为了简洁起见将不对其进行描述。该方案允许无限数目的等待完成和无序递送的无序接收RDMA消息。该方案不限制没有任何限制地由接收212和发送210队列共享完成队列240(图1F-1H)的能力。现在将描述特定类型的消息的处理的详细信息。
第一,应当认识到,RDMA写消息202(图1G)的递送由于该操作的性质而不引起向响应者的任何报告、或者向其它硬件逻辑的任何通知。从而,不关心与这种RDMA消息相关的递送。
第二,回到图11,关于RDMA读响应消息206,该操作表示未决RDMA读消息204的完成。在这种情况下,针对每个TCP洞130在连接上下文42中存储包含已完成RDMA读响应消息206的数目的CompletedReadResponseNum字段306(图2B)足以向请求者的完成处理逻辑提供足够的信息来完成未决RDMA读工作请求208R。当TCP洞关闭时,向请求者的完成处理逻辑报告与该洞相关联的已完成RDMA读响应的数目,以表示未决RDMA读工作请求208R的完成。
关于RDMA读请求,WQE 216RR投递的操作包括两个步骤将WQE 216RR放置到读队列414、以及向RNIC 16通知可以处理该WQE的通知即门铃响铃。可以无序地进行WQE 216RR的放置。然而,如上所述,WQE处理(并且由此门铃响铃)的开始必须遵循RDMA排序规则。也就是,RDMA协议要求入站RDMA读消息204的处理的延迟,直至完成所有先前传送的任何类型的RDMA消息。这样,应当延迟门铃响铃即通知,直至完成所有有序先前RDMA读消息204。单个门铃响铃即通知可以表示若干WQE 216RR的投递。
为了解决上述问题,根据本发明的RNIC 16针对每个TCP洞130在连接上下文42(PendingReadResponseNum字段300(图2B))中存储等待门铃响铃(通知)的已投递RDMA读响应WQE 216RR的数目。当关闭TCP洞130时,RNIC 16使门铃响铃(通知)以确认PendingReadResponseNum个WQE 216RR向读队列214的投递。这表示所有先前读消息204已经完成,并且RNIC 16可以开始已投递读响应WQE 216RR的处理。
参考图13,RDMA发送消息500表示独特情形。具体地说,已完成发送消息的递送包括将CQE 452放置到CQ 540。CQE 542承载描述已完成消息的信息(例如,长度、无效STag等)。该信息是消息特定信息,因此应当针对每个未决发送消息500而保存。RNIC 16不能在发送消息500完成之前放置CQE 542(类似于所接收的读工作请求508R中的RDMA读响应WQE 508RR的放置),这是因为如上所述,CQ 540可以由若干发送510和接收512队列共享。
为了解决这一问题而不使用附加RNIC资源,并且提供可伸缩实现,根据本发明的OutLogic 40将需要包括在CQE 542中的所有信息放置到由该发送消息500使用的WQE 516R。然后,在完成轮询请求时由动词接口20(图2A)从WQE 516R检索该信息。RNIC 16需要针对每个TCP洞130在连接上下文42中保存已完成发送消息500的数目(CompletedSendsNum字段302中),其用来在对应TCP洞关闭时将CQE 542投递到CQ 540。当TCP洞130关闭时,RNIC 16将CQE542放置到CQ 540。要被放置的CQE 542的数目等于针对该洞计数的已完成发送消息500的数目。当N是已完成发送消息500的数目时,该方案涉及2N个写操作。
上面关于RDMA发送消息500的递送而提出的方案的一个缺点是它使由RNIC 16执行的写操作的数目加倍。也就是,对于每个已完成发送消息500,存在一个向WQE 516的写入和一个CQE542的写入。为了解决这一问题,如图14所示,根据本发明的可选实施例,将CQE542的内容改变成承载特定CQE 542完成的WQE 516R的参考计数器544。参考计数器544由RNIC 16初始化为针对给定TCP洞130完成的发送消息500的数目。对于每个完成轮询操作,动词接口20减小参考计数器544,并且只有当该计数器变成零时才从CQ 540移除CQE542。另外,只有当等待完成的未完成发送消息500保持大于阈值(M)时,RNIC 16才更新WQE 516S。M是可配置参数,其表示为了保存用于未决入站发送消息500的信息而分配的内部资源量。如果M等于零,则任何无序接收的发送消息500涉及WQE 516R的更新(对于有序接收的发送消息500,无需更新)。
该实施例还包括定义两种CQE 542,并且向CQE 542提供指示符546,以表示该CQE是在CQE主体内承载所有完成数据的CQE,还是承载部分完成数据的CQE,其中完成信息的其余部分存储在与一个或多个RDMA发送消息相关联的WQE 516R中。该可选实施例将写操作数目减至N+1,其中N是在关闭TCP洞130之前未决的已完成发送消息500的数目。
IV.结束语在前面讨论中,应当理解,方法步骤优选地由包含用于实现本发明的一个或多个功能任务的专用硬件的特定用户计算机即有限状态机执行。然而,这些方法步骤也可以由执行存储在存储器中的程序产品的指令的处理器如CPU执行。应当理解,这里描述的各种设备、模块、机制和系统可以采用硬件、软件或者硬件和软件的组合实现,并且可以以不同于所示的方式进行划分。它们可以由被适配成执行这里描述的方法的任何类型的计算机系统或其它设备实现。硬件和软件的典型组合可以是具有计算机程序的通用计算机系统,在被装载和执行时,其控制计算机系统,使得它实现这里描述的方法。本发明也可以嵌入在计算机程序产品中,其中该计算机程序产品包括允许实现这里描述的方法和功能的所有特征,并且-当被装载在计算机系统中时-其能够执行这些方法和功能。在本上下文中,计算机程序、软件程序、程序、程序产品或者软件意味着旨在使具有信息处理能力的系统直接地或者在下列操作之后执行特定功能的一组指令的、采用任何语言、代码或表示法的任何表达(a)转换到另一个语言、代码或表示法;以及/或者(b)以不同的素材形式再现。
虽然结合上面概述的特定实施例描述了本发明,但是显而易见的是,很多可选方案、变型和变体对于本领域的技术人员将是清楚的。从而,如上所述的本发明的实施例旨在是说明性而非限制性的。在不背离如在所附权利要求中所限定的本发明的精神和范围的情况下,可以进行各种修改。具体地说,在特定环境中可以改变所述步骤次序、或者由不同步骤集提供的功能,而不背离本发明的范围。
工业应用性本发明的校验数据传输的方法和系统有用于采用硬件实现通信协议,并且特别有用于支持RDMA的网络接口控制器。
权利要求
1.一种检验数据传输的错误的方法,该方法包括以下步骤假定数据传输包括至少一个对齐直接数据放置(DDP)片断;基于传送控制协议(TCP)有效载荷的起始两个字节包括具有协议数据单元对齐的标记(MPA)协议帧的长度字段的假定,识别数据传输的边界;以及基于这些假定而计算循环冗余校验(CRC)值。
2.如权利要求1所述的方法,其中计算步骤还包括与计算CRC值并行地计算TCP检验和值。
3.如权利要求1所述的方法,其中识别步骤包括从连接上下文取出初始序列号,并且确定初始序列号和数据传输序列号之间的余数。
4.如权利要求1所述的方法,其中MPA请求/答复帧包括校正因素,其包含使数据传输的初始序列号字对齐所需的一定数目的字节。
5.如权利要求4所述的方法,其中识别步骤包括实现序列号mod512处理。
6.如权利要求1所述的方法,其中数据传输包括MPA长度字段,其包含包括以下项的整个MPA帧MPA长度字段的十四个最高有效位(MSB)、高层协议(ULP)有效载荷长度、所有MPA标记、CRC数据、MPA长度字段的两个最低有效位(LSB)和MPA填充符中的任何有效位。
7.如权利要求6所述的方法,还包括以下步骤确定MPA帧的第一字是否等于零;在第一字等于零的情况下,从下一个字读取MPA长度字段;以及在第一字不等于零的情况下,从第一字读取MPA长度字段。
8.如权利要求1所述的方法,其中数据传输不包括MPA标记。
9.一种用于校验数据传输的错误的系统,该系统包括用于基于传送控制协议(TCP)有效载荷的起始两个字节包括具有协议数据单元对齐的标记(MPA)协议长度字段的第一假定,识别数据传输的边界的装置;以及用于基于第一假定和数据传输包括至少一个对齐直接数据放置(DDP)片断的第二假定而计算循环冗余校验(CRC)值的装置。
10.如权利要求9所述的系统,其中计算装置还包括用于与计算CRC值并行地计算TCP检验和值的装置。
11.如权利要求9所述的系统,其中识别装置包括用于从连接上下文取出初始序列号,并且确定初始序列号和数据传输序列号之间的余数的装置。
12.如权利要求9所述的系统,其中MPA请求/答复帧包括校正因素,其包含使数据传输的初始序列号字对齐所需的一定数目的字节。
13.如权利要求12所述的系统,其中识别装置包括用于实现序列号mod 512处理的装置。
14.如权利要求9所述的系统,其中数据传输包括MPA长度字段,其包含包括以下项的整个MPA帧MPA长度字段的十四个最高有效位(MSB)、高层协议(ULP)有效载荷长度、所有MPA标记、CRC数据、MPA长度字段的两个最低有效位(LSB)和MPA填充符中的任何有效位。
15.如权利要求14所述的系统,还包括用于确定MPA帧的第一字是否等于零的装置;用于在第一字等于零的情况下从下一个字读取MPA长度字段的装置;以及用于在第一字不等于零的情况下从第一字读取MPA长度字段的装置。
16.如权利要求9所述的系统,其中数据传输不包括MPA标记。
17.一种用于处理数据传输的网络接口控制器(NIC),该NIC包括第一存储装置,用于存储数据传输以便重新装配;第二存储装置,用于存储数据传输以便向目的缓冲器进行直接数据放置;用于接收数据传输的装置,其中数据传输被表示为第一类型和第二类型之一;用于对数据传输计算如权利要求1-8中的任一项所述的循环冗余校验(CRC)的装置,其中CRC为有效和无效之一;以及用于执行以下操作之一的装置c1)丢弃数据传输并且不确认接收;c2)将数据传输放置到NIC的重新装配缓冲器;以及c3)将数据传输放置到NIC的内部缓冲器,以便向目的缓冲器进行直接数据放置。
18.如权利要求17所述的NIC,其中在数据传输为第一类型的情况下,执行装置执行c2)。
19.如权利要求17所述的NIC,还包括用于确定数据传输是否包括单个或多个直接数据放置(DDP)片断的装置。
20.如权利要求19所述的NIC,其中在数据传输包括完全包含在TCP片断中的多个DDP片断并且所有DDP片断具有有效CRC的情况下,执行装置执行c3)。
21.如权利要求19所述的NIC,其中在数据传输包括多个DDP片断,第一DDP片断具有无效CRC,并且第一DDP片断的DDP首标由与先前DDP片断相关联的MPA长度引用的情况下,执行装置执行c1)。
22.如权利要求19所述的NIC,其中在数据传输包括多个DDP片断,第一DDP片断具有无效CRC,并且第一DDP片断的DDP首标没有由与先前DDP片断相关联的MPA长度引用的情况下在DDP首标由MPA标记引用的情况下执行c1);以及在DDP首标没有由MPA标记引用的情况下执行c2)。
23.如权利要求19所述的NIC,其中在数据传输包括多个DDP片断,并且最后DDP片断延伸到TCP片断边界之外的情况下,执行装置执行c1);并且在数据传输包括多个DDP片断,并且最后DDP片断没有延伸到TCP片断边界之外的情况下,执行装置执行c2)。
24.如权利要求19所述的NIC,其中在数据传输包括单个DDP片断,并且与该单个DDP片断相关联的MPA长度大于数据传输的传送控制协议(TCP)片断长度的情况下,执行装置执行c2)。
25.如权利要求19所述的NIC,其中在数据传输包括具有以下项的单个DDP片断等于TCP片断长度的与该单个DDP片断相关联的MPA长度、以及有效CRC的情况下,执行装置执行c3)。
26.如权利要求19所述的NIC,其中在数据传输包括具有以下项的单个DDP片断等于TCP片断长度的与其相关联的MPA长度、无效CRC、以及由与先前DDP片断相关联的MPA长度引用的DDP首标的情况下,执行装置执行c1)。
27.如权利要求26所述的NIC,其中在该单个DDP片断具有以下项的情况下等于TCP片断长度的与其相关联的MPA长度、无效CRC、以及没有由MPA标记引用的DDP首标,执行装置在DDP首标由MPA标记引用的情况下,执行c1);以及在DDP首标没有由MPA标记引用的情况下,执行c2)。
28.如权利要求17所述的NIC,还包括用于当执行装置执行c2)时将数据传输类型设成第一类型的装置。
29.如权利要求17所述的NIC,还包括用于针对执行装置对其执行c3)的无序数据传输,清除连接上下文中的TCP洞信息并且停止接收报告的装置。
30.如权利要求17所述的NIC,其中数据传输包括DDP片断,并且计算装置一起计算数据传输的所有DDP片断的CRC。
31.如权利要求17所述的NIC,其中数据传输不包含MPA标记。
32.如权利要求17所述的NIC,还包括第三装置,用于存储每个包含错误的数据传输的重新传送尝试次数;以及第四装置,用于存储最大序列号。
33.如权利要求32所述的NIC,其中在数据传输的CRC无效,这表示数据传输是新接收的包含错误的数据传输的情况下在重新传送尝试次数超过该数据传输的最大重新传送尝试次数的情况下,执行装置对新接收的包含错误的数据传输执行c2),并且在重新传送尝试次数未超过该数据传输的最大重新传送尝试次数的情况下,执行装置对新接收的包含错误的数据传输执行c1);并且NIC还包括用于在执行装置执行c1)的情况下将新接收的包含错误的数据传输的重新传送尝试次数增加一的装置;以及用于在执行装置执行c1)的情况下将第四存储装置更新成承载至少一个先前接收的包含错误的数据传输和新接收的包含错误的数据传输当中的最大序列号的装置。
34.如权利要求32所述的NIC,还包括用于在有序数据传输的CRC有效并且有序数据传输的序列号大于所存储的最大序列号的情况下重置重新传送尝试次数的装置;以及其中执行装置在以下情况下执行c3)a)有序数据传输的CRC有效,并且有序数据传输的序列号不大于所存储的最大序列号,以及b)重置装置重置重新传送尝试次数。
全文摘要
本发明公开一种网络接口控制器实现,其在特定连接的所有片断对齐的情况下执行向存储器的直接数据放置,即直通而不访问重新装配缓冲器(即,“快速”连接类型),或者如果所有片断不对齐,则使数据经过重新装配缓冲器(即,“慢速”连接类型)。连接类型可以从快速变到慢速以及相反。优选地,该实现在发送确认片断接收的TCP确认之前,在快速连接中对大部分入站DDP片断进行CRC验证。根据本发明的计算CRC值的方法假定每个TCP片断以对齐DDP片断开始,并且TCP有效载荷的起始两个字节是MPA帧的MPA长度字段。
文档编号H03M13/00GK101091318SQ200480036615
公开日2007年12月19日 申请日期2004年12月8日 优先权日2003年12月11日
发明者吉奥恩·比兰, 佐里克·马丘尔斯基, 瓦蒂姆·马克尔瓦克斯, 利赫·沙莱夫 申请人:国际商业机器公司
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1