一种数据传输方法及装置制造方法
【专利摘要】本发明涉及通信【技术领域】,尤其涉及一种数据传输方法及装置,用以解决在RDMA数据传输过程中,一旦出现丢包,后续数据包都需要重传,导致出现雪崩效应,严重影响传输效率的问题;本发明实施例中,第一网卡NIC接收第二NIC发送的请求数据包;所述第一NIC在确定当前接收的所述请求数据包为之前未接收的、后续待处理的请求数据包后,将当前接收的所述请求数据包缓存在所述第一NIC中,并回复ACK数据包;采用这种方法,在RDMA数据传输过程中,若其中一个数据包被丢弃,接收方仍然可以处理接收到的后续数据包,使后续数据包可以正常传输,从而提高传输效率。
【专利说明】一种数据传输方法及装置
【技术领域】
[0001]本发明涉及通信【技术领域】,尤其涉及一种数据传输方法及装置。
【背景技术】
[0002]远程直接数据存取(Remote Direct Memory Access, RDMA)技术是为了解决网络传输中服务器端数据处理的延迟而产生的数据传输技术;它不需要对操作系统造成任何影响,就可以通过网络把资料直接传入计算机的存储区,将数据从一个应用系统快速移动到远程应用系统存储器中,采用这项技术,可以减少传统以太网数据传输过程中对数据的内存拷贝、内核处理以及系统调用切换等过程,从而降低数据传输的时延,提高业务处理能力。如图1所示,为传统以太网数据传输中资源消耗分布图,从图中可以看出,传统的数据传输方式中,内存拷贝、内核处理以及系统调用切换过程占用了整个数据传输中资源消耗的绝大部分。因此,相比传统方式,采用RDMA技术进行数据传输可以极大地降低对存储器带宽和处理器开销的需求。
[0003]RDMA的工作过程为:在不执行任何数据复制,不需要任何内核内存参与的条件下,通过RDMA请求,将数据从运行在用户空间中的应用中发送到本地网卡(NetworkInterface Card, NIC);本地NIC将数据通过网络传送到远程目标NIC ;目标NIC在接收到该数据后,确认内存钥匙,直接将数据写入应用缓存中。
[0004]在RDMA技术的应用中,RDMA数据的传输依赖于具有数据中心桥接(Data CenterBridging,DCB)特性的交换机,采用具有DCB特性的交换机传输数据可以保证RDMA数据传输过程中不丢包,但是,在当前的存储领域中,很多数据交换场景中并没有采用具备DCB特性的交换机进行数据传输,在这种情况下,上述RDMA技术的应用就会存在很大限制,因为在RDMA数据传输过程中,若其中一个数据包被丢弃,因接收方无法处理后续数据包,导致后续数据包都会传输失败,如图2所示,在RDMA数据传输过程中,一旦出现丢包,后续数据包都会传输失败,导致出现雪崩效应,严重影响传输效率。
【发明内容】
[0005]本发明实施例提供一种数据传输方法,用以解决在RDMA数据传输过程中,一旦出现丢包,后续数据包都会传输失败,导致出现雪崩效应,严重影响传输效率的问题。
[0006]第一方面,提供一种数据传输方法,包括:
[0007]第一网卡NIC接收第二 NIC发送的请求数据包;
[0008]所述第一 NIC根据当前接收的所述请求数据包的序列号、之前已接收的所有请求数据包的序列号集合及当前正在处理的请求数据包的序列号,确定当前接收的所述请求数据包是否为之前未接收的、后续待处理的请求数据包;其中,所述之前未接收的、后续待处理的请求数据包的序列号不属于所述之前已接收的所有请求数据包的序列号集合、且与所述当前正在处理的请求数据包的序列号不相邻;
[0009]若所述第一 NIC确定当前接收的所述请求数据包为之前未接收的、后续待处理的请求数据包,则将当前接收的所述请求数据包缓存在所述第一 NIC中,并向所述第二 NIC回复确认ACK数据包,以确认接收到所述请求数据包。
[0010]结合第一方面,在第一种可能的实现方式中,所述第一 NIC接收第二 NIC发送的请求数据包之后,还包括:
[0011]所述第一 NIC根据当前接收的所述请求数据包的序列号、之前已接收的所有请求数据包的序列号集合及当前正在处理的请求数据包的序列号,确定当前接收的所述请求数据包是否为之前未接收的、当前待处理的请求数据包;其中,所述之前未接收的、当前待处理的请求数据包的序列号不属于所述之前已接收的请求数据包的序列号集合、且与所述当前正在处理的请求数据包的序列号相邻;
[0012]若所述第一 NIC确定当前接收的所述请求数据包为之前未接收的、当前待处理的请求数据包,则将当前接收的所述请求数据包写入目标存储地址中,并向所述第二 NIC回复ACK数据包,以确认接收到所述请求数据包。
[0013]结合第一方面,在第二种可能的实现方式中,所述第一 NIC接收第二 NIC发送的请求数据包之后,还包括:
[0014]所述第一 NIC根据当前接收的所述请求数据包的序列号、之前已接收的所有请求数据包的序列号集合及当前正在处理的请求数据包的序列号,确定当前接收的请求数据包是否为之前已接收的请求数据包;其中,所述之前已接收的请求数据包的序列号属于所述之前已接收的所有请求数据包的序列号集合;
[0015]若所述第一 NIC确定当前接收的所述请求数据包为之前已接收的请求数据包,则丢弃当前接收的所述请求数据包,并向所述第二 NIC回复ACK数据包,以确认接收到所述请求数据包。
[0016]结合第一方面,在第三种可能的实现方式中,所述第一 NIC将当前接收的所述请求数据包缓存在所述第一 NIC中之后,还包括:
[0017]所述第一 NIC从自身缓存中查找当前待处理的请求数据包;
[0018]若所述第一 NIC查找到当前待处理的请求数据包,则将所述查找到的请求数据包写入目标存储地址中。
[0019]结合第一方面的第三种可能的实现方式,在第四种可能的实现方式中,所述第一NIC从自身缓存中查找当前待处理的请求数据包,包括:
[0020]所述第一 NIC在将当前正在处理的请求数据包写入目标存储地址后,从自身缓存中查找当前待处理的请求数据包。
[0021]第二方面,提供一种数据传输方法,包括:
[0022]第二网卡NIC接收第一 NIC发送的确认ACK数据包;
[0023]第二网卡NIC从已发送的请求数据包中,确定该ACK数据包所确认接收的请求数据包;其中,所述ACK数据包的序列号与该ACK数据包所确认接收的请求数据包的序列号相同;
[0024]所述第二 NIC将所述ACK数据包所确认接收的请求数据包确定为不需要重传的请求数据包;所述不需要重传的请求数据包的序列号大于至少一个所述第二 NIC发送的请求数据包中未被确认接收的请求数据包的序列号。
[0025]结合第二方面,在第一种可能的实现方式中,所述方法还包括:[0026]所述第二 NIC在向所述第一 NIC发送请求数据包之后,若在设定时间内没有接收到所述第一 NIC确认该请求数据包已接收的ACK数据包,则向所述第一 NIC重传所述请求数据包。
[0027]结合第二方面的第一种可能的实现方式,在第二种可能的实现方式中,所述第二NIC向所述第一 NIC重传所述请求数据包之后,还包括:
[0028]若所述第二 NIC接收到所述第一 NIC确认首次发送的请求数据包已接收的ACK数据包,则所述第二 NIC根据首次发送所述请求数据包的时间与接收到该ACK数据包的时间之差,减小所述设定时间;其中,所述首次发送的请求数据包为重传所述请求数据包之前首次发送的、与重传的所述请求数据包中的数据一致的请求数据包。
[0029]第三方面,提供一种数据传输装置,该装置设置于第一网卡NIC中,包括:
[0030]接收模块,用于接收第二 NIC发送的请求数据包,并将接收的所述请求数据包传输至确定模块;
[0031]确定模块,用于根据当前接收的所述请求数据包的序列号、之前已接收的所有请求数据包的序列号集合及当前正在处理的请求数据包的序列号,确定当前接收的所述请求数据包是否为之前未接收的、后续待处理的请求数据包;其中,所述之前未接收的、后续待处理的请求数据包的序列号不属于所述之前已接收的所有请求数据包的序列号集合、且与所述当前正在处理的请求数据包的序列号不相邻;
[0032]处理模块,用于在所述确定模块确定当前接收的所述请求数据包为之前未接收的、后续待处理的请求数据包时,则将当前接收的所述请求数据包缓存在所述第一 NIC中,并向所述第二 NIC回复确认ACK数据包,以确认接收到所述请求数据包。
[0033]结合第三方面,在第一种可能的实现方式中,所述确定模块还用于,根据当前接收的所述请求数据包的序列号、之前已接收的所有请求数据包的序列号集合及当前正在处理的请求数据包的序列号,确定当前接收的所述请求数据包是否为之前未接收的、当前待处理的请求数据包;其中,所述之前未接收的、当前待处理的请求数据包的序列号不属于所述之前已接收的请求数据包的序列号集合、且与所述当前正在处理的请求数据包的序列号相邻;
[0034]所述处理模块还用于,若所述确定模块确定当前接收的所述请求数据包为之前未接收的、当前待处理的请求数据包,则将当前接收的所述请求数据包写入目标存储地址中,并向所述第二 NIC回复ACK数据包,以确认接收到所述请求数据包。
[0035]结合第三方面,在第二种可能的实现方式中,所述确定模块还用于,根据当前接收的所述请求数据包的序列号、之前已接收的所有请求数据包的序列号集合及当前正在处理的请求数据包的序列号,确定当前接收的请求数据包是否为之前已接收的请求数据包;其中,所述之前已接收的请求数据包的序列号属于所述之前已接收的所有请求数据包的序列号集合;
[0036]所述处理模块还用于,若所述确定模块确定当前接收的所述请求数据包为之前已接收的请求数据包,则丢弃当前接收的所述请求数据包,并向所述第二 NIC回复ACK数据包,以确认接收到所述请求数据包。
[0037]结合第三方面,在第三种可能的实现方式中,所述处理模块还用于,从所述第一NIC的缓存中查找当前待处理的请求数据包,若查找到当前待处理的请求数据包,则将所述查找到的请求数据包写入目标存储地址中。
[0038]结合第三方面的第三种可能的实现方式,在第四种可能的实现方式中,所述处理模块具体用于,在将当前正在处理的请求数据包写入目标存储地址后,从所述第一 NIC的缓存中查找当前待处理的请求数据包。
[0039]第四方面,提供一种数据传输装置,该装置设置于第二 NIC中,包括:
[0040]接收模块,用于接收第一 NIC发送的确认ACK数据包,并将接收的所述ACK数据包传输至第一确定模块;
[0041]第一确定模块,用于从已发送的请求数据包中,确定所述ACK数据包所确认接收的请求数据包,并将确定的请求数据包传输至第二确定模块;其中,所述ACK数据包的序列号与该ACK数据包所确认接收的请求数据包的序列号相同;
[0042]第二确定模块,用于将所述ACK数据包所确认接收的请求数据包确定为不需要重传的请求数据包;所述不需要重传的请求数据包的序列号大于至少一个所述第二 NIC发送的请求数据包中未被确认接收的请求数据包的序列号。
[0043]结合第四方面,在第一种可能的实现方式中,所述装置还包括:
[0044]发送模块,用于在向所述第一 NIC发送请求数据包之后,若在设定时间内没有接收到所述第一 NIC确认该请求数据包已接收的ACK数据包,则向所述第一 NIC重传所述请求数据包。
[0045]结合第四方面,在第一种可能的实现方式中,所述发送模块还用于,在向所述第一NIC重传所述请求数据包之后,若确定接收到所述第一 NIC确认首次发送的请求数据包已接收的ACK数据包,则根据首次发送所述请求数据包的时间与接收到该ACK数据包的时间之差,减小所述设定时间;其中,所述首次发送的请求数据包为重传所述请求数据包之前首次发送的、与重传的所述请求数据包中的数据一致的请求数据包。
[0046]根据上述第一方面提供的数据传输方法,第一 NIC在确定接收的请求数据包为之前未接收的、且为后续待处理的请求数据包时,将接收的请求数据包先缓存在所述第一 NIC中,并发送与所述接收的请求数据包对应的ACK数据包,采用这种方法,第一 NIC可以在接收到后续待处理的请求数据包时,先将该请求数据包缓存,并回复ACK数据包,以告知发送方该请求数据包已收到,因此,采用这种方法,在其中一个请求数据包被丢弃后,后续请求数据包可以正常传输,不需要重传,从而提高传输效率;
[0047]根据上述第二方面提供的数据传输方法,第二 NIC在接收到确认所述第二 NIC发送的请求数据包已接收的ACK数据包后,便不再重传该请求数据包,只重传未被确认接收的请求数据包,这样,既保证了丢失数据的重传,又提高了数据传输效率。
【专利附图】
【附图说明】
[0048]图1为传统以太网数据传输中资源消耗分布图;
[0049]图2为【背景技术】中RDMA数据传输过程示意图;
[0050]图3为本发明实施例一提供的数据传输方法流程图;
[0051]图4为本发明实施例中NIC接收请求数据包的示意图;
[0052]图5为本发明实施例二提供的数据传输方法流程图;
[0053]图6为本发明实施例进行请求数据包重传的示意图;[0054]图7为本发明实施例中请求数据包和ACK数据包传输示意图;
[0055]图8为本发明实施例提供的请求数据包的接收方法流程图;
[0056]图9为本发明实施例提供的ACK数据包的接收方法流程图;
[0057]图10为本发明实施例提供的发送请求数据包的方法流程图;
[0058]图11为本发明实施例一提供的数据传输装置示意图;
[0059]图12为本发明实施例二提供的数据传输装置示意图;
[0060]图13为本发明实施例一提供的NIC结构示意图;
[0061]图14为本发明实施例二提供的NIC结构示意图。
【具体实施方式】
[0062]下面结合说明书附图对本发明实施例作进一步详细描述。
[0063]如图3所示,为本发明实施例一提供的一种数据传输方法流程图,包括以下步骤:
[0064]S301:第一网卡NIC接收第二 NIC发送的请求数据包;
[0065]S302:所述第一 NIC根据当前接收的所述请求数据包的序列号、之前已接收的所有请求数据包的序列号集合及当前正在处理的请求数据包的序列号,确定当前接收的所述请求数据包是否为之前未接收的、后续待处理的请求数据包;其中,所述之前未接收的、后续待处理的请求数据包的序列号不属于所述之前已接收的所有请求数据包的序列号集合、且与所述当前正在处理的请求数据包的序列号不相邻;
[0066]S303:若所述第一 NIC确定当前接收的所述请求数据包为之前未接收的、后续待处理的请求数据包,则将当前接收的所述请求数据包缓存在所述第一 NIC中,并向所述第二 NIC回复确认ACK数据包,以确认接收到所述请求数据包。
[0067]采用本发明实施例的方法,第一 NIC可以在确定接收的请求数据包为之前未接收的、且为后续待处理的请求数据包时,先将该数据包存入NIC的缓存,并向发送方发送ACK数据包,以告知发送方该请求数据包已收到,这样,可以避免发送方因为没有收到ACK数据包而重传该请求数据包,因此,采用这种方法,在其中一个请求数据包被丢弃后,后续请求数据包仍可以正常传输,不需要重传,从而提高传输效率。
[0068]采用本发明实施例,无需将现有以太网数据交换环境升级为DCB交换环境,也即,本发明实施例支持RDMA远程内存访问技术在传统以太网交换环境上的应用,从而可以节约应用RDMA技术的成本。
[0069]可选地,步骤S301之后,还包括:
[0070]所述第一 NIC根据当前接收的所述请求数据包的序列号、之前已接收的所有请求数据包的序列号集合及当前正在处理的请求数据包的序列号,确定当前接收的所述请求数据包是否为之前未接收的、当前待处理的请求数据包;其中,所述之前未接收的、当前待处理的请求数据包的序列号不属于所述之前已接收的请求数据包的序列号集合、且与所述当前正在处理的请求数据包的序列号相邻;
[0071]若所述第一 NIC确定当前接收的所述请求数据包为之前未接收的、当前待处理的请求数据包,则将当前接收的所述请求数据包写入目标存储地址中,并向所述第二 NIC回复ACK数据包,以确认接收到所述请求数据包。
[0072]可选地,步骤S301之后,还包括:[0073]所述第一 NIC根据当前接收的所述请求数据包的序列号、之前已接收的所有请求数据包的序列号集合及当前正在处理的请求数据包的序列号,确定当前接收的请求数据包是否为之前已接收的请求数据包;其中,所述之前已接收的请求数据包的序列号属于所述之前已接收的所有请求数据包的序列号集合;
[0074]若所述第一 NIC确定当前接收的所述请求数据包为之前已接收的请求数据包,则丢弃当前接收的所述请求数据包,并向所述第二 NIC回复ACK数据包,以确认接收到所述请求数据包。
[0075]在本发明实施例中,第一 NIC接收的请求数据包的类型有多种,有可能是之前已接收的请求数据包,也有可能是之前未接收的、当前待处理的请求数据包,也有可能是之前未接收的、后续待处理的请求数据包,第一 NIC具体可以根据接收的请求数据包的序列号来判断接收的该数据包的类型,如图4所示,为本发明实施例中第一 NIC接收请求数据包的示意图;假设第一 NIC当前已接收的请求数据包的序列号包括已处理过的序列号小于等于i+2的请求数据包,及后续待处理的序列号为i+4的请求数据包,当前待处理的请求数据包的序列号为i+3;此时,第一 NIC接收到序列号为k的请求数据包,则第一 NIC在k≤i+2,或k=i+4时,确定该请求数据包为已接收的请求数据包,在k=i+3时,确定该请求数据包为之前未接收的、当前待处理的请求数据包,若k > i+5,则确定该请求数据包为之前未接收的、后续待处理的请求数据包。
[0076]在具体实施过程中,第一 NIC在接收到请求数据包之后,根据该请求数据包的序列号,判断接收的请求数据包是否为之前已经接收过的请求数据包,若是之前已经接收过的请求数据包,则可以将该请求数据包丢弃,同时,可以回复确认(ACK)数据包,若不是之前已经接收过的请求数据包,则可以判断接收的请求数据包是否为当前待处理的请求数据包,如果是,则直接将该请求数据包写入目标存储地址,并回复ACK数据包,否则,确定接收的数据包为后续待处理的请求数据包,可以将该后续待处理的请求数据包存入第一 NIC中的缓存队列,并回复ACK数据包。
[0077]可选地,步骤S303之后,还包括:
[0078]所述第一 NIC从自身缓存中查找当前待处理的请求数据包;
[0079]若所述第一 NIC查找到当前待处理的请求数据包,则将所述查找到的请求数据包写入目标存储地址中。
[0080]可选地,所述第一 NIC从自身缓存中查找当前待处理的请求数据包,包括:
[0081]所述第一 NIC在将当前正在处理的请求数据包写入目标存储地址后,从自身缓存中查找当前待处理的请求数据包。
[0082]在具体实施过程中,第一 NIC将接收的请求数据包缓存在所述第一 NIC中之后,可以在处理数据的过程中,从该缓存队列中查找序列号与当前正在处理的请求数据包的序列号相邻的请求数据包,也即序列号比当前正在处理的请求数据包的序列号大I的请求数据包,将查找到的请求数据包作为当前待处理的请求数据包写入目标存储地址中。
[0083]与上述数据传输中接收方处理接收到的请求数据包的方法相对应,本发明实施例还提供了下列数据传输中发送方处理需要发送的请求数据包的方法;
[0084]如图5所示,为本发明实施例二提供的一种数据传输方法流程图,包括:
[0085]S501:第二网卡NIC接收第一 NIC发送的确认ACK数据包;[0086]S502:第二网卡NIC从已发送的请求数据包中,确定该ACK数据包所确认接收的请求数据包;其中,所述ACK数据包的序列号与该ACK数据包所确认接收的请求数据包的序列号相同;
[0087]S503:所述第二 NIC将所述ACK数据包所确认接收的请求数据包确定为不需要重传的请求数据包;所述不需要重传的请求数据包的序列号大于至少一个所述第二 NIC发送的请求数据包中未被确认接收的请求数据包的序列号。
[0088]采用本发明实施例,第二 NIC在确定接收到第一 NIC确认发送的请求数据包已接收的确认数据包后,便不再重传该请求数据包,只重传未收到对应的确认数据包的请求数据包,这样,既保证了丢失数据的重传,又提高了数据传输效率。
[0089]采用本发明实施例,在交换机没有DCB特性的条件下,可以通过上述选择性重传提高传输效率,在具体实施中,可通过设置使能开关,选择是否采用上述选择性重传机制,使交换机兼容多种组网环境。
[0090]如图6所示,为本发明实施例进行请求数据包重传的示意图,本发明实施例中,若其中一个数据包丢失,后续数据包仍可以正常传输,第二 NIC只需发送需要重传的请求数据包即可。
[0091]如图7所示,为本发明实施例中请求数据包和ACK数据包传输示意图,在实施中,第二 NIC根据已发送的请求数据包及接收的ACK数据包,确认传输成功的请求数据包和传输失败的请求数据包,针对已发送的请求数据包中的任意一个请求数据包,若没有接收到第一 NIC确认该请求数据包已接收的ACK数据包,则确定该请求数据包传输失败;可见,第二 NIC确定传输失败的请求数据包中可能包括本身没有到达到第一 NIC的请求数据包,也有可能包括已经到达第一 NIC,但第一 NIC回复的ACK数据包没有到达该第二 NIC的请求数据包,如图7所示,请求数据包P2在传输过程中没有到达第一 NIC,第二 NIC确定需要重传P2 ;请求数据包P4成功到达第一 NIC,但是第一 NIC回复的ACK数据包A4没有到达该第二NIC,该第二 NIC确定需要重传P4 ;其它请求数据包P1、P3、P5、P6及对应的ACK数据包传输成功,该第二 NIC确定这些请求数据包传输成功。
[0092]可选地,所述方法还包括:
[0093]所述第二 NIC在向所述第一 NIC发送请求数据包之后,若在设定时间内没有接收到所述第一 NIC确认该请求数据包已接收的ACK数据包,则向所述第一 NIC重传所述请求数据包。
[0094]在具体实施过程中,可以通过设置定时器,在发送请求数据包的同时启动定时器,若在定时器超时时间内,没有接收到确认某请求数据包已接收的ACK数据包,则确定需要重传该请求数据包,在重传该请求数据包的同时,可以增大定时器的超时时间,并再次启动定时器;还可以设置重传阈值,在重传次数大于设定阈值时,确定数据连接断开,这时,可以启动报警器,通知相关人员进行故障分析等。
[0095]可选地,所述第二 NIC向所述第一 NIC重传所述请求数据包之后,还包括:
[0096]若所述第二 NIC接收到所述第一 NIC确认首次发送的请求数据包已接收的ACK数据包,则所述第二 NIC根据首次发送所述请求数据包的时间与接收到该ACK数据包的时间之差,减小所述设定时间;其中,所述首次发送的请求数据包为重传所述请求数据包之前首次发送的、与重传的所述请求数据包中的数据一致的请求数据包。[0097]在具体实施过程中,在第二 NIC发送需要重传的请求数据包之后,有可能接收到第一 NIC确认之前的请求数据包已接收的ACK数据包,这说明之前设置的定时器的超时时间短了,可以增大定时器的超时时间,以减少不必要的重传,节省开销。
[0098]可选地,所述方法还包括:
[0099]所述第二 NIC在当前正在发送的请求数据包的序列号与序列号最小的待确认的请求数据包的序列号之差大于设定阈值时,停止发送除需要重传的请求数据包之外的其它请求数据包;
[0100]在具体实施过程中,当传输过程中出现断点的时候,第二 NIC发送的后续请求数据包在第一 NIC是先被缓存的,会消耗第一 NIC的存储空间。因此,在需要重传的请求数据包较多时,需要中断(Backlog)机制,降低该第二 NIC发送请求数据包的速度,以免过多地消耗第一 NIC的缓存资源最终引起传输效率降低。
[0101]为了进一步说明本发明实施例进行数据传输的方法,下面分别介绍本发明实施例中接收请求数据包、接收确认数据包、及发送请求数据包的过程;
[0102]如图8所示,为本发明实施例提供的请求数据包的接收方法流程图,本发明实施例的执行主体为NIC,包括:
[0103]S801:接收请求数据包;
[0104]S802:根据接收的请求数据包的序列号,判断该请求数据包的类型是已接收过的请求数据包,还是没有接收过的、当前待处理的请求数据包,还是没有接收过的、后续待处理的请求数据包,若为已接收过的请求数据包,则进入步骤S803,若为没有接收过的、当前待处理的请求数据包,则进入步骤S804,若为没有接收过的、后续待处理的请求数据包,则进入步骤S805 ;
[0105]具体地,NIC可以根据接收的请求数据包的序列号判断该请求数据包的类型,具体判断方式可参见上述与图4相关的描述,这里不再赘述。
[0106]S803:丢弃该请求数据包,并回复ACK数据包;
[0107]这里,NIC接收的重复的请求数据包应该是接收到重传的请求数据包之前对端发送的请求数据包,这时,NIC仍然需要回复ACK数据包,以使对端根据该回复,调整重传超时时间,以避免不必要的重传,节省系统开销。
[0108]S804:压入接收协议栈进行处理,并回复ACK数据包,进入步骤S806 ;
[0109]在具体实施中,NIC在接收到当前待处理的请求数据包后,将接收的请求数据包压入接收协议栈进行处理,也即将接收的请求数据包写入目标存储地址中,并回复ACK数据包;
[0110]S805:对接收的后续待处理的请求数据包进行校验后缓存在NIC中,并回复ACK数据包;
[0111]S806:从NIC的缓存中查找当前待处理的请求数据包,并在查找到当前待处理的请求数据包后,进入步骤S804。
[0112]如图9所示,为本发明实施例提供的ACK数据包的接收方法流程图,本发明实施例的执行主体为NIC,包括:
[0113]S901:接收ACK数据包;
[0114]S902:从待确认的请求数据包中,查找是否存在该ACK数据包确认接收的请求数据包,若存在,则进入步骤S903,否则,进入步骤S904 ;
[0115]在具体实施过程中,可以设置待确认的请求数据包重传链,用于存储待确认的请求数据包,在接收到确认其中一个待确认的请求数据包已接收的ACK数据包后,将该请求数据包从上述重传链中删除。
[0116]S903:从待确认的请求数据包中删除将该ACK数据包确认接收的请求数据包,并记录从发送请求数据包到接收到确认该请求数据包已接收的ACK数据包的时间长度;所述记录的时间长度用于调整超时重传时间;
[0117]S904:丢弃该ACK数据包。
[0118]如图10所示,为本发明实施例提供的发送请求数据包的方法流程图,本发明实施例的执行主体为NIC,包括:
[0119]S1001:发送请求数据包,并同时启动超时定时器;
[0120]S1002:将发送的请求数据包加入待确认的请求数据包重传链;
[0121]S1003:判断当前正在发送的请求数据包的序列号与序列号最小的待确认的请求数据包的序列号之差是否大于设定阈值,若是,则进入步骤S1004,否则返回步骤S1001 ;
[0122]S1004:停止发送除需要重传的请求数据包之外的其它请求数据包,只发送需重传的请求数据包。
[0123]基于同一发明构思,本发明实施例中还提供了一种与数据传输方法对应的数据传输装置,由于该装置解决问题的原理与本发明实施例数据传输方法相似,因此该装置的实施可以参见方法的实施,重复之处不再赘述。
[0124]如图11所示,为本发明实施例一提供的数据传输装置示意图,该装置设置于第一NIC中,包括:
[0125]接收模块111,用于接收第二 NIC发送的请求数据包,并将接收的所述请求数据包传输至确定模块112 ;
[0126]确定模块112,用于根据当前接收的所述请求数据包的序列号、之前已接收的所有请求数据包的序列号集合及当前正在处理的请求数据包的序列号,确定当前接收的所述请求数据包是否为之前未接收的、后续待处理的请求数据包;其中,所述之前未接收的、后续待处理的请求数据包的序列号不属于所述之前已接收的所有请求数据包的序列号集合、且与所述当前正在处理的请求数据包的序列号不相邻;
[0127]处理模块113,用于在所述确定模块112确定当前接收的所述请求数据包为之前未接收的、后续待处理的请求数据包时,则将当前接收的所述请求数据包缓存在所述第一NIC中,并向所述第二 NIC回复确认ACK数据包,以确认接收到所述请求数据包。
[0128]可选地,所述确定模块112还用于,根据当前接收的所述请求数据包的序列号、之前已接收的所有请求数据包的序列号集合及当前正在处理的请求数据包的序列号,确定当前接收的所述请求数据包是否为之前未接收的、当前待处理的请求数据包;其中,所述之前未接收的、当前待处理的请求数据包的序列号不属于所述之前已接收的请求数据包的序列号集合、且与所述当前正在处理的请求数据包的序列号相邻;
[0129]所述处理模块113还用于,若所述确定模块112确定当前接收的所述请求数据包为之前未接收的、当前待处理的请求数据包,则将当前接收的所述请求数据包写入目标存储地址中,并向所述第二 NIC回复ACK数据包,以确认接收到所述请求数据包。[0130]可选地,所述确定模块112还用于,根据当前接收的所述请求数据包的序列号、之前已接收的所有请求数据包的序列号集合及当前正在处理的请求数据包的序列号,确定当前接收的请求数据包是否为之前已接收的请求数据包;其中,所述之前已接收的请求数据包的序列号属于所述之前已接收的所有请求数据包的序列号集合;
[0131]所述处理模块113还用于,若所述确定模块确定当前接收的所述请求数据包为之前已接收的请求数据包,则丢弃当前接收的所述请求数据包,并向所述第二 NIC回复ACK数据包,以确认接收到所述请求数据包。
[0132]可选地,所述处理模块113还用于,从所述第一 NIC的缓存中查找当前待处理的请求数据包,若查找到当前待处理的请求数据包,则将所述查找到的请求数据包写入目标存储地址中。
[0133]可选地,所述处理模块113具体用于,在将当前正在处理的请求数据包写入目标存储地址后,从所述第一 NIC的缓存中查找当前待处理的请求数据包。
[0134]如图12所示,为本发明实施例二提供的数据传输装置示意图,该装置设置于第二NIC中,包括:
[0135]接收模块121,用于接收第一 NIC发送的确认ACK数据包,并将接收的所述ACK数据包传输至第一确定模块122 ;
[0136]第一确定模块122,用于从已发送的请求数据包中,确定所述ACK数据包所确认接收的请求数据包,并将确定的请求数据包传输至第二确定模块123 ;其中,所述ACK数据包的序列号与该ACK数据包所确认接收的请求数据包的序列号相同;
[0137]第二确定模块123,用于将所述ACK数据包所确认接收的请求数据包确定为不需要重传的请求数据包;所述不需要重传的请求数据包的序列号大于至少一个所述第二 NIC发送的请求数据包中未被确认接收的请求数据包的序列号。
[0138]可选地,所述装置还包括:
[0139]发送模块124,用于在向所述第一 NIC发送请求数据包之后,若在设定时间内没有接收到所述第一 NIC确认该请求数据包已接收的ACK数据包,则向所述第一 NIC重传所述请求数据包。
[0140]可选地,所述发送模块124还用于,在向所述第一 NIC重传所述请求数据包之后,若确定接收到所述第一 NIC确认首次发送的请求数据包已接收的ACK数据包,则根据首次发送所述请求数据包的时间与接收到该ACK数据包的时间之差,减小所述设定时间;其中,所述首次发送的请求数据包为重传所述请求数据包之前首次发送的、与重传的所述请求数据包中的数据一致的请求数据包。
[0141]如图13所示,为本发明实施例一提供的NIC结构示意图,包括:
[0142]输入输出(Input/Output,I/O)装置131,用于接收发送方发送的请求数据包,并将接收的所述请求数据包传输至处理器132 ;
[0143]处理器132,用于根据当前接收的所述请求数据包的序列号、之前已接收的所有请求数据包的序列号集合及当前正在处理的请求数据包的序列号,确定当前接收的所述请求数据包是否为之前未接收的、后续待处理的请求数据包;其中,所述之前未接收的、后续待处理的请求数据包的序列号不属于所述之前已接收的所有请求数据包的序列号集合、且与所述当前正在处理的请求数据包的序列号不相邻;若确定当前接收的所述请求数据包为之前未接收的、后续待处理的请求数据包,则将当前接收的所述请求数据包缓存在所述NIC中,并向所述发送方回复确认ACK数据包,以确认接收到所述请求数据包。
[0144]可选地,所述处理器132还用于,根据当前接收的所述请求数据包的序列号、之前已接收的所有请求数据包的序列号集合及当前正在处理的请求数据包的序列号,确定当前接收的所述请求数据包是否为之前未接收的、当前待处理的请求数据包;其中,所述之前未接收的、当前待处理的请求数据包的序列号不属于所述之前已接收的请求数据包的序列号集合、且与所述当前正在处理的请求数据包的序列号相邻;若确定当前接收的所述请求数据包为之前未接收的、当前待处理的请求数据包,则将当前接收的所述请求数据包写入目标存储地址中,并向所述发送方回复ACK数据包,以确认接收到所述请求数据包。
[0145]可选地,所述处理器132还用于,根据当前接收的所述请求数据包的序列号、之前已接收的所有请求数据包的序列号集合及当前正在处理的请求数据包的序列号,确定当前接收的请求数据包是否为之前已接收的请求数据包;其中,所述之前已接收的请求数据包的序列号属于所述之前已接收的所有请求数据包的序列号集合;若所述确定模块确定当前接收的所述请求数据包为之前已接收的请求数据包,则丢弃当前接收的所述请求数据包,并向所述发送方回复ACK数据包,以确认接收到所述请求数据包。
[0146]可选地,所述处理器132还用于,从所述NIC的缓存中查找当前待处理的请求数据包,若查找到当前待处理的请求数据包,则将所述查找到的请求数据包写入目标存储地址中。
[0147]可选地,所述处理器132还用于,在将当前正在处理的请求数据包写入目标存储地址后,从所述NIC的缓存中查找当前待处理的请求数据包。
[0148]如图14所示,为本发明实施例二提供的NIC示意图,包括:
[0149]输入输出(Input/Output, I/O)装置141,用于接收请求数据包接收方发送的确认ACK数据包,并将接收的所述ACK数据包传输至处理器142 ;
[0150]处理器142,用于从已发送的请求数据包中,确定所述ACK数据包所确认接收的请求数据包,并将所述ACK数据包所确认接收的请求数据包确定为不需要重传的请求数据包;其中,所述ACK数据包的序列号与该ACK数据包所确认接收的请求数据包的序列号相同;所述不需要重传的请求数据包的序列号大于至少一个所述NIC发送的请求数据包中未被确认接收的请求数据包的序列号。
[0151]可选地,所述I/O装置141还用于:
[0152]在向所述接收方发送请求数据包之后,若在设定时间内没有接收到所述接收方确认该请求数据包已接收的ACK数据包,则向所述接收方重传所述请求数据包。
[0153]可选地,所述处理器142还用于,在所述I/O装置141向所述接收方重传所述请求数据包之后,若确定接收到所述接收方确认首次发送的请求数据包已接收的ACK数据包,则根据首次发送所述请求数据包的时间与接收到该ACK数据包的时间之差,减小所述设定时间;其中,所述首次发送的请求数据包为重传所述请求数据包之前首次发送的、与重传的所述请求数据包中的数据一致的请求数据包。
[0154]本领域内的技术人员应明白,本发明的实施例可提供为方法、系统、或计算机程序产品。因此,本发明可采用完全硬件实施例、完全软件实施例、或结合软件和硬件方面的实施例的形式。而且,本发明可采用在一个或多个其中包含有计算机可用程序代码的计算机可用存储介质(包括但不限于磁盘存储器、CD-ROM、光学存储器等)上实施的计算机程序产品的形式。
[0155]本发明是参照根据本发明实施例的方法、装置(系统)、和计算机程序产品的流程图和/或方框图来描述的。应理解可由计算机程序指令实现流程图和/或方框图中的每一流程和/或方框、以及流程图和/或方框图中的流程和/或方框的结合。可提供这些计算机程序指令到通用计算机、专用计算机、嵌入式处理机或其他可编程数据处理设备的处理器以产生一个机器,使得通过计算机或其他可编程数据处理设备的处理器执行的指令产生用于实现在流程图一个流程或多个流程和/或方框图一个方框或多个方框中指定的功能的装置。
[0156]这些计算机程序指令也可存储在能引导计算机或其他可编程数据处理设备以特定方式工作的计算机可读存储器中,使得存储在该计算机可读存储器中的指令产生包括指令装置的制造品,该指令装置实现在流程图一个流程或多个流程和/或方框图一个方框或多个方框中指定的功能。
[0157]这些计算机程序指令也可装载到计算机或其他可编程数据处理设备上,使得在计算机或其他可编程设备上执行一系列操作步骤以产生计算机实现的处理,从而在计算机或其他可编程设备上执行的指令提供用于实现在流程图一个流程或多个流程和/或方框图一个方框或多个方框中指定的功能的步骤。
[0158]尽管已描述了本发明的优选实施例,但本领域内的技术人员一旦得知了基本创造性概念,则可对这些实施例作出另外的变更和修改。所以,所附权利要求意欲解释为包括优选实施例以及落入本发明范围的所有变更和修改。
[0159]显然,本领域的技术人员可以对本发明进行各种改动和变型而不脱离本发明的精神和范围。这样,倘若本发明的这些修改和变型属于本发明权利要求及其等同技术的范围之内,则本发明也意图包含这些改动和变型在内。
【权利要求】
1.一种数据传输方法,其特征在于,该方法包括: 第一网卡NIC接收第二 NIC发送的请求数据包; 所述第一 NIC根据当前接收的所述请求数据包的序列号、之前已接收的所有请求数据包的序列号集合及当前正在处理的请求数据包的序列号,确定当前接收的所述请求数据包是否为之前未接收的、后续待处理的请求数据包;其中,所述之前未接收的、后续待处理的请求数据包的序列号不属于所述之前已接收的所有请求数据包的序列号集合、且与所述当前正在处理的请求数据包的序列号不相邻; 若所述第一 NIC确定当前接收的所述请求数据包为之前未接收的、后续待处理的请求数据包,则将当前接收的所述请求数据包缓存在所述第一 NIC中,并向所述第二 NIC回复确认ACK数据包,以确认接收到所述请求数据包。
2.如权利要求1所述的方法,其特征在于,所述第一NIC接收第二 NIC发送的请求数据包之后,还包括: 所述第一 NIC根据当前接收的所述请求数据包的序列号、之前已接收的所有请求数据包的序列号集合及当前正在处理的请求数据包的序列号,确定当前接收的所述请求数据包是否为之前未接收的、当前待处理的请求数据包;其中,所述之前未接收的、当前待处理的请求数据包的序列号不属于所述之前已接收的请求数据包的序列号集合、且与所述当前正在处理的请求数据包的序列号相邻; 若所述第一 NIC确定当前接收的所述请求数据包为之前未接收的、当前待处理的请求数据包,则将当前接收的所述请求数据包写入目标存储地址中,并向所述第二 NIC回复ACK数据包,以确认接收到所述请求数据包。
3. 如权利要求1所述的方法,其特征在于,所述第一NIC接收第二 NIC发送的请求数据包之后,还包括: 所述第一 NIC根据当前接收的所述请求数据包的序列号、之前已接收的所有请求数据包的序列号集合及当前正在处理的请求数据包的序列号,确定当前接收的请求数据包是否为之前已接收的请求数据包;其中,所述之前已接收的请求数据包的序列号属于所述之前已接收的所有请求数据包的序列号集合; 若所述第一 NIC确定当前接收的所述请求数据包为之前已接收的请求数据包,则丢弃当前接收的所述请求数据包,并向所述第二 NIC回复ACK数据包,以确认接收到所述请求数据包。
4.如权利要求1所述的方法,其特征在于,所述第一NIC将当前接收的所述请求数据包缓存在所述第一 NIC中之后,还包括: 所述第一 NIC从自身缓存中查找当前待处理的请求数据包; 若所述第一 NIC查找到当前待处理的请求数据包,则将所述查找到的请求数据包写入目标存储地址中。
5.如权利要求4所述的方法,其特征在于,所述第一NIC从自身缓存中查找当前待处理的请求数据包,包括: 所述第一 NIC在将当前正在处理的请求数据包写入目标存储地址后,从自身缓存中查找当前待处理的请求数据包。
6.一种数据传输方法,其特征在于,该方法包括:第二网卡NIC接收第一 NIC发送的确认ACK数据包; 第二网卡NIC从已发送的请求数据包中,确定该ACK数据包所确认接收的请求数据包;其中,所述ACK数据包的序列号与该ACK数据包所确认接收的请求数据包的序列号相同; 所述第二 NIC将所述ACK数据包所确认接收的请求数据包确定为不需要重传的请求数据包;所述不需要重传的请求数据包的序列号大于至少一个所述第二 NIC发送的请求数据包中未被确认接收的请求数据包的序列号。
7.如权利要求6所述的方法,其特征在于,所述方法还包括: 所述第二 NIC在向所述第一 NIC发送请求数据包之后,若在设定时间内没有接收到所述第一 NIC确认该请求数据包已接收的ACK数据包,则向所述第一 NIC重传所述请求数据包。
8.如权利要求7所述的方法,其特征在于,所述第二NIC向所述第一 NIC重传所述请求数据包之后,还包括: 若所述第二 NIC接收到所述第一 NIC确认首次发送的请求数据包已接收的ACK数据包,则所述第二 NIC根据首次发送所述请求数据包的时间与接收到该ACK数据包的时间之差,减小所述设定时间;其中,所述首次发送的请求数据包为重传所述请求数据包之前首次发送的、与重传的所述请求数据包中的数据一致的请求数据包。
9.一种数据传输装 置,其特征在于,该装置设置于第一网卡NIC中,包括: 接收模块,用于接收第二 NIC发送的请求数据包,并将接收的所述请求数据包传输至确定模块; 确定模块,用于根据当前接收的所述请求数据包的序列号、之前已接收的所有请求数据包的序列号集合及当前正在处理的请求数据包的序列号,确定当前接收的所述请求数据包是否为之前未接收的、后续待处理的请求数据包;其中,所述之前未接收的、后续待处理的请求数据包的序列号不属于所述之前已接收的所有请求数据包的序列号集合、且与所述当前正在处理的请求数据包的序列号不相邻; 处理模块,用于在所述确定模块确定当前接收的所述请求数据包为之前未接收的、后续待处理的请求数据包时,则将当前接收的所述请求数据包缓存在所述第一 NIC中,并向所述第二 NIC回复确认ACK数据包,以确认接收到所述请求数据包。
10.如权利要求9所述的装置,其特征在于,所述确定模块还用于,根据当前接收的所述请求数据包的序列号、之前已接收的所有请求数据包的序列号集合及当前正在处理的请求数据包的序列号,确定当前接收的所述请求数据包是否为之前未接收的、当前待处理的请求数据包;其中,所述之前未接收的、当前待处理的请求数据包的序列号不属于所述之前已接收的请求数据包的序列号集合、且与所述当前正在处理的请求数据包的序列号相邻; 所述处理模块还用于,若所述确定模块确定当前接收的所述请求数据包为之前未接收的、当前待处理的请求数据包,则将当前接收的所述请求数据包写入目标存储地址中,并向所述第二 NIC回复ACK数据包,以确认接收到所述请求数据包。
11.如权利要求9所述的装置,其特征在于,所述确定模块还用于,根据当前接收的所述请求数据包的序列号、之前已接收的所有请求数据包的序列号集合及当前正在处理的请求数据包的序列号,确定当前接收的请求数据包是否为之前已接收的请求数据包;其中,所述之前已接收的请求数据包的序列号属于所述之前已接收的所有请求数据包的序列号集合; 所述处理模块还用于,若所述确定模块确定当前接收的所述请求数据包为之前已接收的请求数据包,则丢弃当前接收的所述请求数据包,并向所述第二 NIC回复ACK数据包,以确认接收到所述请求数据包。
12.如权利要求9所述的装置,其特征在于,所述处理模块还用于,从所述第一NIC的缓存中查找当前待处理的请求数据包,若查找到当前待处理的请求数据包,则将所述查找到的请求数据包写入目标存储地址中。
13.如权利要求12所述的装置,其特征在于,所述处理模块具体用于,在将当前正在处理的请求数据包写入目标存储地址后,从所述第一 NIC的缓存中查找当前待处理的请求数据包。
14.一种数据传输装置,其特征在于,该装置设置于第二 NIC中,包括: 接收模块,用于接收第一 NIC发送的确认ACK数据包,并将接收的所述ACK数据包传输至第一确定模块; 第一确定模块,用于从已发送的请求数据包中,确定所述ACK数据包所确认接收的请求数据包,并将确定的请求数据包传输至第二确定模块;其中,所述ACK数据包的序列号与该ACK数据包所确认接收的请求数据包的序列号相同; 第二确定模块,用于将所述ACK数据包所确认接收的请求数据包确定为不需要重传的请求数据包;所述不需要重传的请求数据包的序列号大于至少一个所述第二 NIC发送的请求数据包中未被确认接收的请求数据包的序列号。
15.如权利要求14所述的装置,其特征在于,所述装置还包括: 发送模块,用于在向所述第一 NIC发送请求数据包之后,若在设定时间内没有接收到所述第一 NIC确认该请求数据包已接收的ACK数据包,则向所述第一 NIC重传所述请求数据包。
16.如权利要求15所述的装置,其特征在于,所述发送模块还用于,在向所述第一NIC重传所述请求数据包之后,若确定接收到所述第一 NIC确认首次发送的请求数据包已接收的ACK数据包,则根据首次发送所述请求数据包的时间与接收到该ACK数据包的时间之差,减小所述设定时间;其中,所述首次发送的请求数据包为重传所述请求数据包之前首次发送的、与重传的所述请求数据包中的数据一致的请求数据包。
【文档编号】H04L1/18GK103546258SQ201310522673
【公开日】2014年1月29日 申请日期:2013年10月29日 优先权日:2013年10月29日
【发明者】程韬, 曲会春 申请人:华为技术有限公司