一种基于多滑动窗口并发的轻量级异步消息实现方法与流程

文档序号:16380712发布日期:2018-12-22 09:27阅读:284来源:国知局
一种基于多滑动窗口并发的轻量级异步消息实现方法与流程

本发明涉及高速互连网络领域,尤其涉及一种基于多滑动窗口并发的轻量级异步消息实现方法。

背景技术

支持remotedirectmemoryaccess(rdma)技术的网络接口卡(rnic)使处理器具有直接访问远程计算机内存的能力,具有数据零拷贝、数据传输旁路操作系统核心等特性,从而可以显著降低处理器负载、提高数据传输效率。rnic一般包含如下三类通信资源:(1)发送队列(sendqueue,sq)是网卡中用于管理发送请求的部件,用于管理发送工作请求;(2)接收队列(receivequeue,rq),是网卡中用于管理接收请求的部件,用于管理接收工作请求;(3)完成队列(completequeue,cq),是网卡中用于管理完成信息的部件,用于管理完成信息。rnic支持异步消息、rdmaw、rdmar等消息类型,其中异步消息是一种重要的消息类型,提供了send/recv语义,可用于控制消息的传输等场景。每个发送队列可以向任意的接收队列发送数据,每个接收队列也可以从任意的发送队列接收数据。使用异步消息传输数据时,首先在接收方接收队列中投递接收请求,指定接收方缓冲区地址。然后由发送方向发送队列投递发送请求,指定发送方缓冲区地址。rnic发送部件根据发送请求将数据写入接收方接收请求指定的内存中,并分别在发送方、接收方的完成队列中产生完成信息。用户以异步方式查询完成队列获取发送及接收请求的执行情况。目前开放式高性能互连网络标准一般都是通过硬件维护的一对一连接以及递增的消息序列号来实现异步消息的有序可靠传输,这种方式不但增加了硬件设计的负担,而且消息传输效率较低。



技术实现要素:

本发明的目的在于通过一种基于多滑动窗口并发的轻量级异步消息实现方法,来解决以上背景技术部分提到的问题。

为达此目的,本发明采用以下技术方案:

一种基于多滑动窗口并发的轻量级异步消息实现方法,其包括如下步骤:

s101、接收端预先向接收队列投递接收请求;

s102、发送方消息库通过查询发送方连接信息表,获取空闲的发送窗口,并将窗口id、包序列号填入发送描述符,然后按门铃;

s103、发送部件处理该发送描述符:首先从发送队列取发送描述符,然后根据描述符从发送缓冲区取数据,并将数据发送给接收端;

s104、接收部件接收数据:从接收队列取接收描述符、将数据写入描述符指定的接收缓冲区、向接收方完成队列写完成;

s105、接收方向发送方发送ack;

s106、接收端进行消息排重:查询完成队列;查询接收方连接信息表,根据数据包携带的窗口id、序列号进行排重;

s107、发送方收到ack后,向完成队列写状态为成功的完成;或者定时器超时后,向完成队列写状态为超时的完成。

s108、发送方查询完成,根据完成状态确定是否重传:若状态为成功,则增加该消息使用的窗口的序列号,释放该窗口;若状态为超时,则进行重传。

特别地,如果在传输过程中异步消息请求丢失,则处理过程如下:

s201、接收端预先向接收队列投递接收请求;

s202、发送方消息库通过查询连接信息表,获取空闲的发送窗口,并将窗口id、包序列号填入发送描述符,然后按门铃;

s203、发送部件处理该发送描述符:从发送队列取发送描述符、根据描述符从发送缓冲区取数据、将数据发送给接收端,但数据在传输过程中丢失;

s204、发送方在规定的时间内未收到ack,向完成队列写状态为超时的完成;

s205、发送方查询到超时完成,使用同一个窗口进行重传。

特别地,如果在传输过程中异步消息ack丢失,则处理过程如下:

s301、接收端预先向接收队列投递接收请求;

s302、发送方消息库通过查询连接信息表,获取空闲的发送窗口,并将窗口id、包序列号填入发送描述符,然后按门铃;

s303、发送部件处理该发送描述符:首先从发送队列取发送描述符,然后根据描述符从发送缓冲区取数据,并将数据发送给接收端;

s304、接收部件接收数据:从接收队列取接收描述符、将数据写入描述符指定的接收缓冲区、向接收方完成队列写完成;

s305、接收方向发送方发送ack;

s306、接收端进行消息排重:查询完成队列;查询连接信息表,根据数据包携带的窗口id、序列号进行排重;

s307、发送方在规定的时间内未收到ack,向完成队列写状态为超时的完成;

s308、发送方查询到超时完成,使用同一个窗口进行重传;

s309、接收方收到重发的消息,查询连接信息包,如果发现是重复包,直接丢弃。

本发明提出的基于多滑动窗口并发的轻量级异步消息实现方法通过发送方消息重传和接收方消息排重,由软硬件协作共同实现异步消息的可靠传输,极大地降低了硬件实现异步消息容错的复杂度。与传统滑动窗口相比,通信双方无需进行握手和信用反馈,无需对乱序数据包进行缓存,降低了维护并发窗口的内存开销和cpu开销;支持多个独立的滑动窗口并发工作,可以大幅提高异步消息的带宽。

附图说明

图1为本发明实施例提供的基于多滑动窗口并发的轻量级异步消息实现方法原理示意图;

图2a和图2b为本发明实施例提供的发送端获取发送窗口过程示意图;

图3为本发明实施例提供的数据包格式示意图;

图4为本发明实施例提供的传输过程中异步消息请求丢失处理过程示意图;

图5为本发明实施例提供的传输过程中异步消息ack丢失处理过程示意图。

具体实施方式

下面结合附图和实施例对本发明作进一步说明。可以理解的是,此处所描述的具体实施例仅仅用于解释本发明,而非对本发明的限定。另外还需要说明的是,为了便于描述,附图中仅示出了与本发明相关的部分而非全部内容,除非另有定义,本文所使用的所有技术和科学术语与属于本发明的技术领域的技术人员通常理解的含义相同。本文中所使用的术语只是为了描述具体的实施例,不是旨在于限制本发明。

本发明采用软硬件协同的方式实现异步消息的高效、可靠传输,由硬件提供一定的可靠传输能力,由消息库软件通过并发的轻量级滑动窗口实现异步消息的重传与排重。

硬件层为可靠数据传输提供下列支持:

(1)接收部件对每个收到的数据包进行应答,但不检测和处理丢包、重复包、乱序包等错误。

(2)发送部件在规定时间内收到应答后,产生状态为成功的完成。

(3)发送部件在规定时间内未收到应答,产生状态为超时的完成;此时存在两种可能,一是接收方没有收到数据,二是接收方收到了数据但应答丢失。

发送端通过查询完成队列获知发送请求的执行情况。状态为成功的完成表示数据被接收端正确地接收。状态为超时的完成无法判断接收端是否收到了数据。为了保证数据的可靠传输,发送端消息库查询到超时完成后,重新投递一个跟超时消息一样的发送请求。如果该超时是由于请求包丢失引起的,则该重传不会引起问题。如果该超时是由于应答包丢失引起的,则接收方会收到两个重复的数据包,为了保证可靠性语义,需要在接收端利用数据包的序列号进行排重以便丢掉重复的数据包。

请参照图1所示,图1为本发明实施例提供的基于多滑动窗口并发的轻量级异步消息实现方法原理示意图。

本实施例中基于多滑动窗口并发的轻量级异步消息实现方法,其包括:

步骤1.接收端预先向接收队列投递接收请求,指定接收缓冲区的地址、长度等信息。

步骤2.发送端获取发送窗口。发送方消息库通过查询发送方连接信息表,获取空闲的发送窗口,并将窗口id、包序列号填入发送描述符,然后按门铃。

如图2a和图2b所示,图中rqn指接收队列号;next_msn指下一个要发送的序列号,sqn指发送队列号,expected_msn指下一个要接收的序列号;eec指连接上下文信息。每个发送队列维护一张发送方连接信息表,维护了该发送队列到不同接收队列的所有连接的窗口信息。每个接收队列维护一张接收方连接信息表,维护了该接收队列到不同发送队列的所有连接的窗口信息。图2a和图2b中每个sq_eec和rq_eec都代表一条连接信息。每条连接包含多个滑动窗口,以实现消息并发。每个滑动窗口的大小为1,仅允许一个飞行消息,使用该滑动窗口的消息收到状态为成功的完成后才能释放该窗口。在发送端,每个滑动窗口维护了下一个要用的序列号next_msn,每成功发送一个异步消息,该序列号加1。在接收端,每个滑动窗口维护了期望的序列号expected_msn,每收到一个正常的数据包,该序列号加1。发送方消息库在投递发送描述符前,首先从该消息对应的连接中找到一个空闲窗口;然后将窗口id、窗口序列号next_msn填入发送描述符。

步骤3.发送部件处理该发送描述符:首先从发送队列取发送描述符,然后根据描述符从发送缓冲区取数据,并将数据发送给接收端。

将步骤2中填写的窗口id、窗口序列号next_msn分别填入图3所示包格式的win_id、win_msn字段。图3中queue_key指接收队列的key,接收队列收到异步消息后,首先对该字段进行校验,若该字段与接收队列的key不一致,则丢弃该异步消息;sourcesqn指发送队列号;win_id指窗口号;win_msn指序列号。

步骤4.接收部件接收数据:从接收队列取接收描述符;将数据写入描述符指定的接收缓冲区、向接收方完成队列写完成。

步骤5.接收方向发送方发送ack。

步骤6.接收端进行消息排重:查询完成队列;查询接收方连接信息表,根据数据包携带的窗口id、序列号进行排重。

接收方收到数据后,硬件会将win_id、win_msn等信息拷贝到接收请求对应的完成中,接收方消息库根据这些信息判断消息是否是重复消息,具体判断过程为:

(a)根据收到数据包中的win_id找到接收窗口;

(b)比较数据包的win_msn与接收窗口的expected_msn是否相等;若相等,则该消息是新的数据包,将接收窗口的expected_msn加1,然后将消息提交给用户;

(c)如果数据包的win_msn与接收窗口的expected_msn不相等,则认为该消息是重复消息,直接丢弃。

步骤7.发送方收到ack后,向完成队列写状态为成功的完成;或者定时器超时后,向完成队列写状态为超时的完成。

步骤8.发送方查询完成,根据完成状态确定是否重传:若状态为成功,则增加该消息使用的窗口的序列号,释放该窗口;若状态为超时,则以同样的win_id、win_msn重发该消息。

如图4所示,如果在传输过程中异步消息请求丢失,则处理过程如下:

步骤1.接收端预先向接收队列投递接收请求。

步骤2.发送方消息库通过查询连接信息表,获取空闲的发送窗口,并将窗口id、包序列号填入发送描述符,然后按门铃。

步骤3.发送部件处理该发送描述符:从发送队列取发送描述符、根据描述符从发送缓冲区取数据、将数据发送给接收端,但数据在传输过程中丢失。

步骤4.如果发送方在规定的时间内未收到ack,向完成队列写状态为超时的完成。

步骤5.发送方查询到超时完成,使用同一个窗口进行重传。

如图5所示,如果在传输过程中异步消息ack丢失,则处理过程如下:

步骤1.接收端预先向接收队列投递接收请求。

步骤2.发送方消息库通过查询连接信息表,获取空闲的发送窗口,并将窗口id、包序列号填入发送描述符,然后按门铃。

步骤3.发送部件处理该发送描述符:首先从发送队列取发送描述符,然后根据描述符从发送缓冲区取数据,并将数据发送给接收端。

步骤4.接收部件接收数据:从接收队列取接收描述符、将数据写入描述符指定的接收缓冲区、向接收方完成队列写完成。

步骤5.接收方向发送方发送ack。

步骤6.接收端进行消息排重:查询完成队列;查询连接信息表,根据数据包携带的窗口id、序列号进行排重。

步骤7.如果发送方在规定的时间内未收到ack,向完成队列写状态为超时的完成。

步骤8.发送方查询到超时完成,使用同一个窗口进行重传。

步骤9.接收方收到重发的消息,查询连接信息包,如果发现是重复包,直接丢弃。

本发明的技术方案中接收部件对每个收到的异步消息进行应答,但不检测和处理丢包、重复包、乱序包等错误;发送部件在规定时间内收到应答后,产生状态为成功的完成;发送部件在规定时间内未收到应答,产生状态为超时的完成;发送队列和接收队列分别为每个连接维护多个并发的轻量级滑动窗口,窗口大小为1;发送方投递发送请求前,需要获取一个空闲的发送窗口,将窗口id、窗口包序列号填入发送请求描述符;异步消息由发送方传递到接收方过程中,需携带窗口id、窗口包序列号信息;发送方查询到超时的发送完成后,以原窗口id、原窗口包序列号重发异步消息;接收方收到数据后,根据窗口id、包序列号进行异步消息排重。

本发明是一种多滑动窗口并发的轻量级异步消息容错方法,通过发送方消息重传和接收方消息排重,由软硬件协作共同实现异步消息的可靠传输,极大地降低了硬件实现异步消息容错的复杂度,提高异步消息传输效率。与传统滑动窗口相比,通信双方无需进行握手和信用反馈,无需对乱序数据包进行缓存,降低了维护并发窗口的内存开销和cpu开销;支持多个独立的滑动窗口并发工作,可以大幅提高异步消息的带宽。

本领域普通技术人员可以理解实现上述实施例中的全部部分是可以通过计算机程序来指令相关的硬件来完成,所述的程序可存储于一计算机可读取存储介质中,该程序在执行时,可包括如上述各方法的实施例的流程。其中,所述的存储介质可为磁碟、光盘、只读存储记忆体(read-onlymemory,rom)或随机存储记忆体(randomaccessmemory,ram)等。

注意,上述仅为本发明的较佳实施例及所运用技术原理。本领域技术人员会理解,本发明不限于这里所述的特定实施例,对本领域技术人员来说能够进行各种明显的变化、重新调整和替代而不会脱离本发明的保护范围。因此,虽然通过以上实施例对本发明进行了较为详细的说明,但是本发明不仅仅限于以上实施例,在不脱离本发明构思的情况下,还可以包括更多其他等效实施例,而本发明的范围由所附的权利要求范围决定。

当前第1页1 2 
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1