一种发送数据的方法、接收数据的方法、设备及系统
技术领域
本申请涉及信息技术领域,特别涉及发送数据的方法、接收数据的方法、设备及系统。
背景技术
随着存储技术的发展,设备产生的数据可以不用存放在本地,而是将该数据存放在存储设备中。该设备可以使用远程直接数据存取(remote direct memory access,RDMA)技术向存储设备中存储数据,在存储时,该设备可以将该数据封装成多个RDMA报文,向存储设备发送该多个RDMA报文,存储设备存储该RDMA报文中的数据。
该数据包括多个等长度的数据块和每个数据块对应的保护信息(protectioninformation,PI),数据块对应的PI用于保护该数据块,每个数据块的PI的长度为8个字节,RDMA报文的净荷部分包括数据块和该数据块对应的PI。其中该净荷部分的长度为固定长度,该净荷部分的长度可以是数据块的长度的整数倍。例如,假设数据块的长度为512,RDMA报文的净荷部分的长度为1k,这样第一个RDMA报文中的净荷部分中包括该数据中的第一个数据块、第一个数据块对应的PI和第二数据块中的前504个字节的数据;第二个RDMA报文中的净荷部分中包括第二个数据块中的后8个字节的数据、第二个数据块对应的PI、第三个数据块、第三个数据块对应的PI和第四个数据块中的前488个字节的数据;第三个RDMA报文中的净荷部分中包括第四个数据块中的后24个字节的数据、第四个数据块对应的PI、第五个数据块、第五个数据块对应的PI和第六个数据块的前472个字节的数据。对于第四个RDMA报文、第五个RDMA报文……不再一一列举。
设备在接收到RDMA报文时,需要对报文中的净荷部分进行处理,以恢复出数据块和数据块对应的PI。然而对于目前的报文结构,需要通过较复杂的处理逻辑来处理报文,这样在处理时不仅耗时,还需要大量的硬件资源来支持。
发明内容
为了降低接收端处理RDMA报文的难度,本申请实施例提供了一种发送数据的方法、接收数据的方法、设备及系统。所述技术方案如下:
第一方面,本申请提供一种发送数据的方法,所述方法可以生成远程直接数据存取RDMA报文,发送RDMA报文。由于生成的每个RDMA报文的净荷部分包括待发送数据中的多个数据块和每个数据块对应的保护信息PI,或者,生成的每个RDMA报文的净荷部分包括一个数据单元,该数据单元包括一个数据块和一个数据块对应的PI,这样每个RDMA报文的净荷部分的结构相同,可以减小接收端处理RDMA报文的难度,耗时以及对硬件资源的需求。或者,由于RDMA报文的净荷部分包括数据单元中的部分数据,数据单元包括一个数据块和一个数据块对应的PI,数据单元的长度等于该部分数据的长度的整数倍,这样可以将一个数据单元封装成多个RDMA报文,对于该多个RDMA报文除最后一个RDMA报文以外的其他每个RDMA报文,该其他每个RDMA报文中的净荷部分包括的部分数据均为该数据块中的部分数据,该最后一个RDMA报文的净荷部分包括的部分数据为该数据块中剩余的数据和该数据块对应的PI,如此接收端只需要两种处理逻辑,其中一种处理逻辑用于处理该数据单元对应的最后一个RDMA报文,另一种处理逻辑用于处理该数据单元对应的其他每个RDMA报文,相比目前每个RDMA报文需要对应的一种处理逻辑,可以减小接收端处理RDMA报文的难度,耗时以及对硬件资源的需求。
可选的,获取标准净荷长度L1和待发送数据中的数据块长度L2,根据该标准净荷长度L1和该数据块长度L2生成RDMA报文,从而能保证生成的每个RDMA报文的净荷部分的结构相同,或者,保证生成的每个RDMA报文的净荷部分包括待发送数据的一个数据单元或数据单元中的部分数据且数据单元的长度等于该部分数据的长度的整数倍。
可选的,在L1大于L2时,从待发送数据中获取x个数据块和每个数据块对应的PI,x=L1/L2,将该x个数据块和每个数据块对应的PI组成净荷部分,基于该净荷部分生成RDMA报文,这样使得生成的每个RDMA报文的净荷部分包括x个数据块和每个数据块对应的PI,保证生成的每个RDMA报文的净荷部分的结构相同。
可选的,L1=1024,L2=512,x=2,RDMA报文的净荷部分包括2个数据块和该2个数据块中的每个数据块对应的PI;或者,
L1=2048,L2=512,x=4,RDMA报文的净荷部分包括4个数据块和该4个数据块中的每个数据块对应的PI;或者,
L1=4096,L2=512,x=8,RDMA报文的净荷部分包括8个数据块和该8个数据块中的每个数据块对应的PI。
可选的,在L1小于或等于L2时,从待发送数据中的一个数据单元的起始位置获取数据,当获取到该数据单元的y分之一的数据时,y=L2/L1,将该数据单元的y分之一的数据组成净荷部分,基于该净荷部分生成RDMA报文。这样保证生成的每个数据单元对应的前y-1个RDMA报文的净荷部分的结构相同,每个数据单元对应的第y个RDMA报文的净荷部分的结构相同。
对于一个数据单元对应的y个RDMA报文,该数据单元包括一个数据块和该数据块对应的PI,对于第1至第y-1个RDMA报文中的每个RDMA报文,该RDMA报文的净荷部分包括的部分数据是该数据块中的长度为L1+L3/y的数据,第y个RDMA报文的净荷部分包括的部分数据是该数据块剩余的长度为L1+L3/y-L3的数据和该PI。
可选的,L1=1024,L2=4096,y=4,RDMA报文的净荷部分包括数据单元中的长度为1024+L3/4的数据,L3为该数据单元中的PI长度;或者,
L1=2048,L2=4096,y=2,RDMA报文的净荷部分包括数据单元中的长度为2048+L3/2的数据;或者,
L1=4096,L2=4096,y=1,RDMA报文的净荷部分包括数据单元。
可选的,数据单元还包括数据块对应的元数据,在该数据单元中该数据块对应的PI位于该元数据的右侧;
L1=1024,L2=4096,y=4,RDMA报文的净荷部分包括该数据单元中的长度为1024+(L4+L3)/4的数据,L3为该数据单元中的PI长度,L4为元数据长度;或者,
L1=2048,L2=4096,y=2,RDMA报文的净荷部分包括该数据单元中的长度为2048+(L4+L3)/2的数据;或者,
L1=4096,L2=4096,y=1,RDMA报文的净荷部分包括该数据单元。
可选的,上述生成RDMA报文的操作可以由设备的网卡实现。这样将生成RDMA报文的操作由设备的处理器转移到设备的网卡,通过网卡分担了处理器的压力,可以使处理器更好地处理业务。
可选的,网卡在生成RDMA报文时需要获取作为净荷部分的数据,网卡可以接收设备的处理器发送的数据,且可以直接从设备的存储器中直接取数据。在直接从设备的存储器取数据时,可以分担处理器的压力,可以使处理器更好地处理业务。
可选的,网卡可以根据发送端和接收端所在的网络类型获取标准净荷长度L1。例如,该网络类型为公网时,可以获取L1等于512或1k等,该网络类型为局域网或私有网络时,可以获取L1等于1k、2k或4k等,这样可以使RDMA报文的净荷部分的大小适合当前的网络类型,保证RDMA报文在网络中可以被成功地传输至接收端。另外在不同网络类型下可以设置的L1可以得到适何该类型的最大净荷长度,例如在局域网或私有网络,L1可以等于2k或4k等,这样可以使最大净荷长度超过2k或4k等,可以使一个RDMA报文携带更多的数据,提高数据发送的效率。
第二方面,本申请提供一种接收数据的方法,所述方法接收至少一个远程直接数据存取RDMA报文,从至少一个RDMA报文中获取数据块和该数据块对应的PI。由于RDMA报文的净荷部分包括待发送数据中的多个数据块和每个数据块对应的保护信息PI,这样每个RDMA报文的净荷部分的结构相同,可以减小接收端处理RDMA报文的难度,耗时以及对硬件资源的需求。或者,由于RDMA报文的净荷部分包括待发送数据的一个数据单元和该数据单元中的部分数据,该数据单元包括一个数据块和该一个数据块对应的PI,该数据单元的长度等于该部分数据的长度的整数倍,这样每个数据单元对应的RDMA报文中的净荷部分的结构相同,相比目前每个RDMA报文的净荷部分的结构不同,可以减小接收端处理RDMA报文的难度,耗时以及对硬件资源的需求。
可选的,在L1大于L2时,L1为标准净荷长度,L2为所述待发送数据中的数据块长度,该RDMA报文的净荷部分包括待发送数据中的x个数据块和每个数据块对应的PI,x=L1/L2。从而能保证每个RDMA报文的净荷部分的结构相同。
可选的,在接收到一个RDMA报文时,从该一个RDMA报文中获取x个数据块和该x个数据块中的每个数据块对应的PI。由于每个RDMA报文的净荷部分的结构相同,所以对每个RDMA报文进行相同的处理操作,可以减小接收端处理RDMA报文的难度,耗时以及对硬件资源的需求。
可选的,L1=1024,L2=512,x=2,所述RDMA报文的净荷部分包括2个数据块和所述2个数据块中的每个数据块对应的PI;或者,
L1=2048,L2=512,x=4,所述RDMA报文的净荷部分包括4个数据块和所述4个数据块中的每个数据块对应的PI;或者,
L1=4096,L2=512,x=8,所述RDMA报文的净荷部分包括8个数据块和所述8个数据块中的每个数据块对应的PI。
可选的,在L1小于或等于L2时,L1为标准净荷长度,L2为所述待发送数据中的数据块长度,所述RDMA报文的净荷部分包括所述待发送数据的一个数据单元中的y分之一的数据,y=L2/L1。这样保证每个数据单元对应的前y-1个RDMA报文的净荷部分的结构相同,每个数据单元对应的第y个RDMA报文的净荷部分的结构相同。
可选的,在根据起始报文的序号确定接收到数据单元对应的y个RDMA报文时,从该y个RDMA报文中获取数据单元。由于每个数据单元对应的y个RDMA报文的净荷部分的结构相同,所以对每个数据单元对应的y个RDMA报文进行相同的处理操作,可以减小接收端处理RDMA报文的难度,耗时以及对硬件资源的需求。
可选的,L1=1024,L2=4096,y=4,所述RDMA报文的净荷部分包括所述数据单元中的长度为1024+L3/4的数据,L3为所述数据单元中的PI长度;或者,
L1=2048,L2=4096,y=2,所述RDMA报文的净荷部分包括所述数据单元中的长度为2048+L3/2的数据;或者,
L1=4096,L2=4096,y=1,所述RDMA报文的净荷部分包括所述数据单元。
可选的,所述数据单元还包括所述数据块对应的元数据,在所述数据单元中所述数据块对应的PI位于所述元数据的右侧;
L1=1024,L2=4096,y=4,所述RDMA报文的净荷部分包括所述数据单元中的长度为1024+(L4+L3)/4的数据,L3为所述数据单元中的PI长度,L4为元数据长度;或者,
L1=2048,L2=4096,y=2,所述RDMA报文的净荷部分包括所述数据单元中的长度为2048+(L4+L3)/2的数据;或者,
L1=4096,L2=4096,y=1,所述RDMA报文的净荷部分包括所述数据单元。
可选的,上述用于接收数据的执行主体可以为设备的网卡。这样网卡在接收数据时,可以从接收的至少一个RDMA报文中获取数据块和数据块对应的PI,从而不需要由设备的处理器从该至少一个RDMA报文中获取数据块和数据块对应的P,通过网卡分担了处理器的压力,可以使处理器更好地处理业务。
可选的,当该设备为存储设备时,网卡可以将获取的数据块和数据块对应的PI发送至设备的处理器,由于处理器将该数据块和该数据块对应的PI保存在设备的存储器中。或者网卡可以直接向设备的存储器存储该数据块和该数据块对应的PI。在网卡直接存储时,可以分担处理器的压力,可以使处理器更好地处理业务。
第三方面,本申请实施例提供了一种发送数据的设备,所述设备包括:
一个或多个处理器;和
存储器;
所述存储器存储有一个或多个程序,所述一个或多个程序被配置成由所述一个或多个处理器执行,所述一个或多个程序包含用于进行第一方面或第一方面的任意一种可选的实现方式的方法的指令。
第四方面,本申请实施例提供了一种接收数据的设备,其特征在于,所述设备包括:
一个或多个处理器;和
存储器;
所述存储器存储有一个或多个程序,所述一个或多个程序被配置成由所述一个或多个处理器执行,所述一个或多个程序包含用于进行第二方面或第二方面的任意一种可选的实现方式的方法的指令:
第五方面,本申请实施例提供了一种发送数据的装置,所述装置包括:处理单元和发送单元;所述处理单元,用于生成远程直接数据存取RDMA报文;发送单元,用于发送所述RDMA报文。
其中,所述处理单元生成的每个RDMA报文的净荷部分包括待发送数据中的多个数据块和每个数据块对应的保护信息PI,或者,生成的每个RDMA报文的净荷部分包括一个数据单元,该数据单元包括一个数据块和一个数据块对应的PI,这样每个RDMA报文的净荷部分的结构相同,可以减小接收端处理RDMA报文的难度,耗时以及对硬件资源的需求。或者,所述处理单元生成的RDMA报文的净荷部分包括数据单元中的部分数据,数据单元包括一个数据块和一个数据块对应的PI,数据单元的长度等于该部分数据的长度的整数倍,这样可以将一个数据单元封装成多个RDMA报文,对于该多个RDMA报文除最后一个RDMA报文以外的其他每个RDMA报文,该其他每个RDMA报文中的净荷部分包括的部分数据均为该数据块中的部分数据,该最后一个RDMA报文的净荷部分包括的部分数据为该数据块中剩余的数据和该数据块对应的PI,如此接收端只需要两种处理逻辑,其中一种处理逻辑用于处理该数据单元对应的最后一个RDMA报文,另一种处理逻辑用于处理该数据单元对应的其他每个RDMA报文,相比目前每个RDMA报文需要对应的一种处理逻辑,可以减小接收端处理RDMA报文的难度,耗时以及对硬件资源的需求。
可选的,所述处理单元,用于获取标准净荷长度L1和待发送数据中的数据块长度L2,根据所述标准净荷长度L1和所述数据块长度L2生成RDMA报文。从而能保证生成的每个RDMA报文的净荷部分的结构相同,或者,保证生成的每个RDMA报文的净荷部分包括待发送数据的一个数据单元或数据单元中的部分数据且数据单元的长度等于该部分数据的长度的整数倍。
可选的,所述处理单元,用于在L1大于L2时,从所述待发送数据中获取x个数据块和所述x个数据块中的每个数据块对应的PI,x=L1/L2;将所述x个数据块和所述每个数据块对应的PI组成净荷部分;基于所述净荷部分生成RDMA报文。这样使得生成的每个RDMA报文的净荷部分包括x个数据块和每个数据块对应的PI,保证生成的每个RDMA报文的净荷部分的结构相同。
可选的,L1=1024,L2=512,x=2,所述RDMA报文的净荷部分包括2个数据块和所述2个数据块中的每个数据块对应的PI;或者,
L1=2048,L2=512,x=4,所述RDMA报文的净荷部分包括4个数据块和所述4个数据块中的每个数据块对应的PI;或者,
L1=4096,L2=512,x=8,所述RDMA报文的净荷部分包括8个数据块和所述8个数据块中的每个数据块对应的PI。
可选的,所述处理单元,用于在L1小于或等于L2时,从所述待发送数据中的一个数据单元的起始位置获取数据;当获取到所述数据单元的y分之一的数据时,y=L2/L1,将所述数据单元的y分之一的数据组成净荷部分;基于所述净荷部分生成RDMA报文。这样保证生成的每个数据单元对应的前y-1个RDMA报文的净荷部分的结构相同,每个数据单元对应的第y个RDMA报文的净荷部分的结构相同。
对于一个数据单元对应的y个RDMA报文,该数据单元包括一个数据块和该数据块对应的PI,对于第1至第y-1个RDMA报文中的每个RDMA报文,该RDMA报文的净荷部分包括的部分数据是该数据块中的长度为L1+L3/y的数据,第y个RDMA报文的净荷部分包括的部分数据是该数据块剩余的长度为L1+L3/y-L3的数据和该PI。
可选的,L1=1024,L2=4096,y=4,所述RDMA报文的净荷部分包括所述数据单元中的长度为1024+L3/4的数据,L3为所述数据单元中的PI长度;或者,
L1=2048,L2=4096,y=2,所述RDMA报文的净荷部分包括所述数据单元中的长度为2048+L3/2的数据;或者,
L1=4096,L2=4096,y=1,所述RDMA报文的净荷部分包括所述数据单元。
可选的,所述数据单元还包括所述数据块对应的元数据,在所述数据单元中所述数据块对应的PI位于所述元数据的右侧;
L1=1024,L2=4096,y=4,所述RDMA报文的净荷部分包括所述数据单元中的长度为1024+(L4+L3)/4的数据,L3为所述数据单元中的PI长度,L4为元数据长度;或者,
L1=2048,L2=4096,y=2,所述RDMA报文的净荷部分包括所述数据单元中的长度为2048+(L4+L3)/2的数据;或者,
L1=4096,L2=4096,y=1,所述RDMA报文的净荷部分包括所述数据单元。
第六方面,本申请实施例提供了一种接收数据的装置,所述装置包括:接收单元和处理单元;所述接收单元,用于接收至少一个远程直接数据存取RDMA报文;所述处理单元,用于从所述至少一个RDMA报文中获取数据块和所述数据块对应的PI。
其中,所述接收单元接收的RDMA报文的净荷部分包括待发送数据中的多个数据块和每个数据块对应的保护信息PI,这样每个RDMA报文的净荷部分的结构相同,可以减小所述处理单元处理RDMA报文的难度,耗时以及对硬件资源的需求。或者,所述接收单元接收的RDMA报文的净荷部分包括待发送数据的一个数据单元和该数据单元中的部分数据,该数据单元包括一个数据块和该一个数据块对应的PI,该数据单元的长度等于该部分数据的长度的整数倍,这样每个数据单元对应的RDMA报文中的净荷部分的结构相同,相比目前每个RDMA报文的净荷部分的结构不同,可以减小所述处理单元处理RDMA报文的难度,耗时以及对硬件资源的需求。
可选的,在L1大于L2时,L1为标准净荷长度,L2为所述待发送数据中的数据块长度,所述RDMA报文的净荷部分包括所述待发送数据中的x个数据块和所述x个数据块中的每个数据块对应的PI,x=L1/L2。从而能保证每个RDMA报文的净荷部分的结构相同。
可选的,所述处理单元,用于在接收到一个RDMA报文时,从所述一个RDMA报文中获取x个数据块和所述x个数据块中的每个数据块对应的PI。由于每个RDMA报文的净荷部分的结构相同,所以对每个RDMA报文进行相同的处理操作,可以减小所述处理单元处理RDMA报文的难度,耗时以及对硬件资源的需求。
可选的,L1=1024,L2=512,x=2,所述RDMA报文的净荷部分包括2个数据块和所述2个数据块中的每个数据块对应的PI;或者,
L1=2048,L2=512,x=4,所述RDMA报文的净荷部分包括4个数据块和所述4个数据块中的每个数据块对应的PI;或者,
L1=4096,L2=512,x=8,所述RDMA报文的净荷部分包括8个数据块和所述8个数据块中的每个数据块对应的PI。
可选的,在L1小于或等于L2时,L1为标准净荷长度,L2为所述待发送数据中的数据块长度,所述RDMA报文的净荷部分包括所述待发送数据的一个数据单元中的y分之一的数据,y=L2/L1。这样保证每个数据单元对应的前y-1个RDMA报文的净荷部分的结构相同,每个数据单元对应的第y个RDMA报文的净荷部分的结构相同。
可选的,所述处理单元,用于在根据起始报文的序号确定接收到所述数据单元对应的y个RDMA报文时,从所述y个RDMA报文中获取所述数据单元。由于每个数据单元对应的y个RDMA报文的净荷部分的结构相同,所以对每个数据单元对应的y个RDMA报文进行相同的处理操作,可以减小所述处理单元处理RDMA报文的难度,耗时以及对硬件资源的需求。
可选的,L1=1024,L2=4096,y=4,所述RDMA报文的净荷部分包括所述数据单元中的长度为1024+L3/4的数据,L3为所述数据单元中的PI长度;或者,
L1=2048,L2=4096,y=2,所述RDMA报文的净荷部分包括所述数据单元中的长度为2048+L3/2的数据;或者,
L1=4096,L2=4096,y=1,所述RDMA报文的净荷部分包括所述数据单元。
可选的,所述数据单元还包括所述数据块对应的元数据,在所述数据单元中所述数据块对应的PI位于所述元数据的右侧;
L1=1024,L2=4096,y=4,所述RDMA报文的净荷部分包括所述数据单元中的长度为1024+(L4+L3)/4的数据,L3为所述数据单元中的PI长度,L4为元数据长度;或者,
L1=2048,L2=4096,y=2,所述RDMA报文的净荷部分包括所述数据单元中的长度为2048+(L4+L3)/2的数据;或者,
L1=4096,L2=4096,y=1,所述RDMA报文的净荷部分包括所述数据单元。
第七方面,本申请实施例提供了一种发送数据的装置,所述装置可以为发送端的网卡或可以为所述网卡的部分结构,可以包括:至少一个处理器,至少一个存储器、至少一个通信接口和至少一个网口,所述至少一个处理器通过总线与所述至少一个存储器和至少一个网口连接;所述至少一个存储器存储有一个或多个程序,所述一个或多个程序被配置成由所述至少一个处理器执行,所述一个或多个程序包含用于进行第一方面或第一方面的任意一种可能的实现方式的方法的指令。
第八方面,本申请实施例提供了一种接收数据的装置,所述装置可以为接收端的网卡或可以为所述网卡的部分结构,可以包括:至少一个处理器,至少一个存储器、至少一个通信接口和至少一个网口,所述至少一个处理器通过总线与所述至少一个存储器和至少一个网口连接;所述至少一个存储器存储有一个或多个程序,所述一个或多个程序被配置成由所述至少一个处理器执行,所述一个或多个程序包含用于进行第二方面或第二方面的任意一种可选的实现方式的方法的指令。
第九方面,本申请实施例提供了一种计算机程序产品,所述计算机程序产品包括在计算机可读存储介质中存储的计算机程序,并且所述计算程序通过控制器进行加载来实现上述第一方面、第二方面、第一方面的任意可选的实现方式或第二方面的任意可选的实现方式的方法。
第十方面,本申请实施例提供了一种非易失性计算机可读存储介质,用于存储计算机程序,所述计算机程序通过处理器进行加载来执行上述第一方面、第二方面、第一方面的任意可能的实现方式或第二方面的任意可能的实现方式的方法的指令。
第十一方面,本申请实施例提供了一种芯片,所述芯片包括可编程逻辑电路和/或程序指令,当所述芯片运行时用于实现上述第一方面、第二方面、第一方面的任意可能的实现方式或第二方面的任意可能的实现方式的方法。
第十二方面,本申请实施例提供了一种通信系统,所述系统包括第三方面所述的设备和第四方面所述的设备。
附图说明
图1-1是本申请实施例提供的一种通信网络的结构示意图;
图1-2是本申请实施例提供的一种待发送数据的结构示意图;
图1-3是本申请实施例提供的另一种待发送数据的结构示意图;
图1-4是本申请实施例提供的另一种待发送数据的结构示意图;
图1-5是本申请实施例提供的另一种待发送数据的结构示意图;
图1-6是本申请实施例提供的一种RDMA报文的结构示意图;
图2-1是本申请实施例提供的一种设备结构示意图;
图2-2是本申请实施例提供的一种设备的另一结构示意图;
图3-1是本申请实施例提供的一种发送数据的方法流程图;
图3-2是本申请实施例提供的另一种RDMA报文的结构示意图;
图3-3是本申请实施例提供的另一种RDMA报文的结构示意图;
图3-4是本申请实施例提供的另一种RDMA报文的结构示意图;
图3-5是本申请实施例提供的另一种RDMA报文的结构示意图;
图3-6是本申请实施例提供的另一种RDMA报文的结构示意图;
图3-7是本申请实施例提供的另一种RDMA报文的结构示意图;
图3-8是本申请实施例提供的另一种RDMA报文的结构示意图;
图3-9是本申请实施例提供的另一种RDMA报文的结构示意图;
图4-1是本申请实施例提供的一种接收数据的方法流程图;
图4-2是本申请实施例提供的另一种待发送数据的结构示意图;
图5是本申请实施例提供的一种发送数据的装置结构示意图;
图6是本申请实施例提供的一种接收数据的装置结构示意图;
图7是本申请实施例提供的另一种发送数据的装置结构示意图;
图8是本申请实施例提供的另一种接收数据的装置结构示意图。
具体实施方式
下面将结合附图对本申请实施方式作进一步地详细描述。
当前发送端在将待发送数据封装成多个RDMA报文时,该多个RDMA报文中的净荷部分中包括的数据块和数据块对应的PI是无序变化的。例如,假设数据块的长度为512,RDMA报文的净荷部分的长度为1k,这样封装的第一个RDMA报文中的净荷部分中包括该数据中的第一个数据块、第一个数据块对应的PI和第二数据块中的前504个字节的数据;第二个RDMA报文中的净荷部分中包括第二个数据块中的后8个字节的数据、第二个数据块对应的PI、第三个数据块、第三个数据块对应的PI和第四个数据块中的前488个字节的数据;第三个RDMA报文中的净荷部分中包括第四个数据块中的后24个字节的数据、第四个数据块对应的PI、第五个数据块、第五个数据块对应的PI和第六个数据块的前472个字节的数据。
上述封装的多个RDMA报文,RDMA报文中的数据块和数据块对应的PI是无序变化的。使得每个RDMA报文的净荷部分的结构均不同,接收端在处理RDMA报文,需要为每个RDMA报文设置对应的处理逻辑,在接收到一个RDMA报文时通过该RDMA报文对应的处理逻辑对该RDMA报文进行处理,得到该RDMA报文中的数据块和该数据块对应的PI,增加了接收端处理的难度。为了解决该技术问题,在本申请中,可以通过如下任意种实施方式,将待发送数据封装成多个RDMA报文,且封装后的RDMA报文中的数据块和数据块对应的PI是有序变化或循环变化的,从而降低接收端处理的难度。
参见图1-1,本申请实施例提供了一种通信网络,该通信网络包括发送端和接收端,发送端和接收端之间有网络连接,该网络连接可以为有线连接或无线连接。
发送端可以向接收端发送待发送数据,发送端在发送待发送数据时,可以将待发送数据封装成一个或多个RDMA报文,向接收端发送该RDMA报文,接收端接收该RDMA报文并从该RDMA报文中获取数据。
可选的,接收端和发送端可以均为服务器,其中一个服务器为存储服务器。或者,发送端和接收端中的其中一个可以为服务器或终端等,该终端可以为手机、个人计算机或平板电脑等,另一个可以为存储节点。
可选的,待发送数据可以是发送端需要存储的数据,接收端可以是存储设备,上述发送端向接收端发送待发送数据的过程是发送端向接收端写待发送数据的过程,接收端获取到发送端发送的数据后,可以将获取的数据存储在本地。或者,待发送数据可以是发送端本地存储的数据,发送端可以是存储设备,上述发送端向接收端发送待发送数据的过程是发送端接收到接收端发送的读请求后执行的过程,该发送数据的过程是接收端从发送端中读待发送数据的过程。
可选的,参见图1-2,待发送数据可以包括多个数据块,每个数据块的长度相等,且数据块的长度可以等于2n,n可以等于8、9、10、11或12等整数值,也就是说数据块的长度可以等于256、512、1024、2048或4096等。其中,数据块的长度的单位可以为字节或比特等。在本申请实施例中,后续描述涉及到长度的单位均以字节为例进行说明,对于其他单位,只需要将后续描述中出现的字节替换为该其他单位,就可得到其他单位对应的实施方式,因此对于其他单位的实施方式在本申请中不一一列举。
可选的,参见图1-3,待发送数据还可以包括每个数据块对应的PI,在该数据中数据块对应的PI位于该数据块之后且紧随该数据块。
可选的,每个数据块的PI的长度可以相等,且每个数据块的PI的长度可以为8字节、10字节或12字节等。该数据块的PI可以是根据该数据块计算出的循环冗余校验(cyclicredundancy check,CRC)。
可选的,参见图1-4,待发送数据中的数据块的长度可以为4k,即待发送数据中的数据块的长度为4096个字节,在待发送数据中的数据块的长度为4k时,待发送数据还包括每个数据块对应的元数据(Metadata),在待发送数据中数据块对应的元数据位于该数据块之后。
可选的,参见图1-4,在待发送数据中数据块对应的PI可以位于该数据块对应的元数据的左侧,该数据块对应的PI是根据该数据块计算出的CRC;或者,参见图1-5,在待发送数据中数据块对应的PI可以位于该数据块对应的元数据的右侧,该数据块对应的PI是根据该数据块和该数据块对应的元数据计算出的CRC。
可选的,每个数据块对应的元数据的长度也相等且为2m,m的取值可以为5或6等整数值,也是就说元数据的长度可以为32或64个字节等。
可选的,发送端发送的RDMA报文中可以包括数据块对应的PI,也可以不包括数据块对应的PI。
对于RDMA报文中不包括数据块对应的PI的情况,确定RDMA报文的标准净荷长度L1,在RDMA报文的标准净荷长度L1大于数据块的长度L2时,将待发送数据中的连续的x个数据块封装成一个RDMA报文,其中该RDMA报文的净荷部分中包括该x个数据块,该净荷部分的长度等于L1,x=L1/L2,接收端在接收到该RDMA报文时从该RDMA报文中获取该x个数据块;在RDMA报文的标准净荷长度L1小于或等于数据块的长度L2时,将该数据中的一个数据块封装成y个RDMA报文,其中对于该y个RDMA报文中的任一个RDMA报文,该RDMA报文的净荷部分的长度为L1,该RDMA报文的净荷部分中包括该数据块中的部分数据,该部分数据的长度为L1,y=L2/L1,接收端在接收到该y个RDMA报文时从该y个RDMA报文中获取该一个数据块。其中,发送端封装RDMA报文的详细过程,以及接收端从RDMA报文中获取数据块的详细过程可以参见后续相关实施例中的内容,在此先不做详细说明。
对于RDMA报文中包括数据块对应的PI的情况,确定RDMA报文的标准净荷长度L1,在RDMA报文的标准净荷长度L1大于数据块的长度L2时,将待发送数据中的连续的x个数据块和该x个数据块中的每个数据块对应的PI封装成一个RDMA报文,x=L1/L2,其中在封装时对该RDMA报文的净荷部分进行扩展,使该RDMA报文的净荷部分的长度由L1扩展为L1+L3*x,L3为PI长度,即该RDMA报文的净荷部分的长度为L1+L3*x,该RDMA报文的净荷部分中包括该x个数据块和每个数据块对应的PI,接收端在接收到该RDMA报文时从该RDMA报文中获取该x个数据块和该x个数据块中的每个数据块对应的PI;在RDMA报文的标准净荷长度L1小于或等于数据块的长度L2时,将该数据中的一个数据块和该一个数据块对应的PI封装成y个RDMA报文,y=L2/L1,其中对于该y个RDMA报文中的任一个RDMA报文,在封装时对该RDMA报文的净荷部分进行了扩展,使该RDMA报文的净荷部分的长度由L1扩展为L1+L3/y,即该RDMA报文的净荷部分的长度为L1+L3/y,第1个RDMA报文至第y-1个RDMA报文的净荷部分中包括该数据块中的部分数据,该部分数据的长度为L1+L3/y,第y个RDMA报文的净荷部分中包括该数据块中剩余的数据和该数据块对应的PI,接收端在接收到该y个RDMA报文时从该y个RDMA报文中获取该一个数据块和该一个数据块对应的PI。其中,发送端封装RDMA报文的详细过程,以及接收端从RDMA报文中获取数据块和PI的详细过程可以参见后续相关实施例中的内容,在此先不做详细说明。
可选的,对于待发送数据中的数据块的长度为4k的情况,通常RDMA报文的标准净荷长度L1小于或等于数据块的长度L2,参见图1-4,在待发送数据中的数据块对应的PI位于该数据块对应的元数据的左侧时,对于待发送数据中的任一个数据块,可以将该数据块和该数据块对应的PI封装成y个RDMA报文,其中对于该y个RDMA报文中的任一个RDMA报文,在封装时对该RDMA报文的净荷部分进行了扩展,使该RDMA报文的净荷部分的长度由L1扩展为L1+L3/y,即该RDMA报文的净荷部分的长度为L1+L3/y,第1个RDMA报文至第y-1个RDMA报文的净荷部分中包括该数据块中的部分数据,该部分数据的长度为L1+L3/y,第y个RDMA报文的净荷部分中包括该数据块中剩余的数据和该数据块对应的PI,而该数据块对应的元数据不封装在RDMA报文中,也就是说发送端不向接收端发送该数据块对应的元数据。
参见图1-5,在待发送数据中的数据块对应的PI位于该数据块对应的元数据的右侧时,对于待发送数据中的任一个数据块,可以将该数据块、该数据块对应的元数据和该数据块对应的保护信息封装成y个RDMA报文,其中对于该y个RDMA报文中的任一个RDMA报文,在封装时对该RDMA报文的净荷部分进行扩展,使该RDMA报文的净荷部分的长度由L1扩展为L1+(L4+L3)/y,即该RDMA报文的净荷部分的长度为L1+(L4+L3)/y,L4为元数据长度,第1个RDMA报文至第y-1个RDMA报文的净荷部分中包括该数据块中的部分数据,该部分数据的长度为L1+(L4+L3)/y,第y个RDMA报文的净荷部分中包括该数据块中剩余的数据、该数据块对应的元数据和该数据块对应的PI。
可选的,发送端和接收端基于RDMA协议进行通信,目前的RDMA协议规定确定的标准净荷长度L1=2z,z可以等于8、9、10、11或12等整数值,也就是说标准净荷长度L1可以等于256、512、1k、2k或4k等。以及目前的RDMA协议还规定数据块的长度L2=2n,n可以等于8、9、10、11或12等整数值,所以基于目前的RDMA协议可以得出确定的标准净荷长度L1是数据块长度L2的整数倍,或者,数据块的长度L2是确定的标准净荷长度L1的整数倍。
发送端与接收端之间可能位于同一个局域网或私有网络,确定的标准净荷长度L1可以为预设长度,该预设长度可以为4k或2k等,此时封装的RDMA报文可以为Jumbo帧报文。发送端与接收端之间可能不在同一个局域网或私有网络,即发送端和接收端之间需要通过公网通信,确定的标准净荷长度L1小于公网允许的最大传输单元的长度,当前公网允许的最大传输单元的长度为1500,所以确定的标准净荷长度L1可以为512或1k等,随着技术的发送公网允许的最大传输单元的长度可以会发生变化,所以确定的标准净荷长度L1可能会随着公网允许的最大传输单元的长度变化而变化,例如,假设将来公网允许的最大传输单元的长度可能是2500,则确定的标准净荷长度L1可以为1k或2k等。
可选的,参见图1-6,该RDMA报文包括报文头、净荷部分和校验部分,净荷部分位于报文头和校验部分之间,该报文头中包括该RDMA报文的序号、该净荷部分可以包括发送端发送给接收端的数据块和/或PI等内容,检验部分包括用于校验该RDMA报文的校验信息。
可选的,发送端基于RDMA协议发送数据,接收端基于RDMA协议接收数据,RDMA协议定了报文头的长度和校验部分的长度。例如,RDMA协议定义的报文头的长度可以为48个字节,定义的验部分的长度可以为16个字节,但随着技术的发展RDMA协议定义的报文头的长度和校验部分的长度可能会发生变化。
可选的,报文头可以包括以太网(abbreviation of ethernet,ETH)头、网络之间互连的协议(internet protocol,IP)头、用户数据报协议(user datagram protocol,UDP)头和基本传输报头(base transport header,BTH)头,校验部分可以包括不变CRC(invariant CRC,ICRC)和帧校验序列(frame check sequence,FCS)FCS。
参见图2-1,本申请实施例提供了一种设备,该设备可以是上述的发送端或接收端,该设备包括:
处理器1,总线系统2,第一存储器3、网卡4。该处理器1、第一存储器3和网卡4之间通过总线系统2连接。
第一存储器3用于存储包括程序、指令或代码。处理器1用于执行第一存储器3中的程序、指令或代码,控制网卡4发送数据或接收数据。
可选的,当上述设备是一个存储设备时,第一存储器3还可以用于存储其他设备写入的数据。
第一存储器3可以包括至少一个磁盘,还可以包括内存等。
可选的,上述处理器1可以是一个通用中央处理器(central processing unit,CPU),微处理器,特定应用集成电路(application-specific integrated circuit,ASIC),或一个或多个集成电路。
上述总线系统2可以包括一通路,在上述组件之间传送信息。
上述网卡4可以用于与其他设备或通信网络通信,如以太网,无线接入网(radioaccess network,RAN),无线局域网(wireless local area networks,WLAN)等。
参见图2-2,对于上述网卡4,网卡4可以包括通信接口41、网口42、第二存储器43和处理模块44,处理模块44可以分别与通信接口41、网口42和第二存储器43连接,通信接口41还连接至总线系统2。
可选的,处理模块44可以包括一个处理器或多个处理器。网口42的数目可以为一个也可以为多个,第二存储器43的数目可以为一个也可以为多个,同样通信接口41的数目可以为一个也可以为多个。
网卡4中也可以包括总线,处理模块44可以通过该总线与通信接口41、网口42、第二存储器43连接。
第二存储器43可以存储有程序、指令或代码。处理模块44用于执行第二存储器43中的程序、指令或代码,以实现发送数据或接收数据。
可选的,当上述设备为发送端时,处理器1可以通过总线系统2向网卡4发送输入输出(input/output,IO)配置信息,该IO配置信息中包括起始报文的序号、数据块长度L2、用于指示RDMA报文是否包括PI的第一指示信息和用于指示待发送数据是否包括PI的第二指示信息等内容;网卡4中的处理模块44可以通过通信接口41接收该IO配置信息,将该IO配置信息保存在第二存储器43中,以及向接收端发送该IO配置信息。
然后,处理器1可以通过总线系统2向网卡4发送待发送数据。网卡4中的处理模块44可以通过通信接口41从该总线系统2上接收待发送数据,根据发送端和接收端当前所在的网络类型确定RDMA报文的标准净荷长度L1;从第二存储器43中读取该IO配置信息。
对于根据第一指示信息确定RDMA报文中不包括数据块对应的PI的情况,在RDMA报文的标准净荷长度L1大于数据块的长度L2时,处理模块44将待发送数据中的连续的x个数据块封装成一个RDMA报文,x=L1/L2,通过网口42向接收端发送该RDMA报文;在RDMA报文的标准净荷长度L1小于或等于数据块的长度L2时,将待发送数据中的一个数据块封装成y个RDMA报文,y=L2/L1,通过网口42向接收端发送该y个RDMA报文。其中,发送端封装RDMA报文的详细过程,在此先不做详细说明。
对于根据第一指示信息确定RDMA报文中包括数据块对应的PI的情况,在RDMA报文的标准净荷长度L1大于数据块的长度L2时,处理模块44将待发送数据中的连续的x个数据块和该x个数据块中的每个数据块对应的PI封装成一个RDMA报文,x=L1/L2,通过网口42向接收端发送该RDMA报文;在RDMA报文的标准净荷长度L1小于或等于数据块的长度L2时,将待发送数据中的一个数据块和该一个数据块对应的PI封装成y个RDMA报文,y=L2/L1,通过网口42向接收端发送该y个RDMA报文。其中,发送端封装RDMA报文的详细过程,在此先不做详细说明。
可选的,当上述设备为接收端时,网卡4中的处理模块44可以通过网口42接收发送端发送的IO配置信息,将该IO配置信息保存在第二存储器43中,根据发送端和接收端当前所在的网络类型确定RDMA报文的标准净荷长度L1。
对于根据第一指示信息确定RDMA报文中不包括数据块对应的PI的情况,在RDMA报文的标准净荷长度L1大于数据块的长度L2时,处理模块44通过网口42接收RDMA报文,从该RDMA报文中获取x个数据块,x=L1/L2;在RDMA报文的标准净荷长度L1小于或等于数据块的长度L2时,处理模块44可以通过网口42接收发送端发送同一个数据块对应的y个RDMA报文,y=L2/L1,从该y个RDMA报文中获取该数据块。其中,接收端从RDMA报文中获取数据块的详细过程可以参见后续相关实施例中的内容,在此先不做详细说明。
对于根据第一指示信息确定RDMA报文中包括数据块对应的PI的情况,在RDMA报文的标准净荷长度L1大于数据块的长度L2时,处理模块44通过网口42接收RDMA报文,从该RDMA报文中获取x个数据块和每个数据块对应的PI,x=L1/L2;在RDMA报文的标准净荷长度L1小于或等于数据块的长度L2时,处理模块44可以通过网口42接收发送端发送同一个数据块对应的y个RDMA报文,y=L2/L1,从该y个RDMA报文中获取该数据块和该数据块对应的PI。其中,接收端从RDMA报文中获取数据块的详细过程可以参见后续相关实施例中的内容,在此先不做详细说明。
参见图3-1,本申请实施例提供了一种发送数据的方法,该方法可以应用于上述任一实施例中的发送端的网卡,包括:
步骤301:获取IO配置信息,该IO配置信息包括起始报文的序号、数据块长度L2、用于指示RDMA报文是否包括PI的第一指示信息和用于指示待发送数据是否包括PI的第二指示信息等内容。
发送端的处理器在需要发送待发送数据时,处理器首先通过总线系统向网卡发送IO配置信息,网卡中的处理模块可以通过通信接口从该总线系统中接收该IO配置信息,然后将该IO配置信息保存在网卡上的第二存储器中。
当发送端是存储设备时,处理器通过网卡接收接收端发送的读请求,该读请求包括需要读取的数据的标识,处理器接收该读请求后准备该数据,即准备待发送数据。在该准备的过程中,处理器可以从发送端的第一存储器中获取该数据的标识对应的数据,该数据为待发送数据,获取待发送数据中的数据块的长度L2,确定是否在RDMA报文中包括数据块对应的PI并根据确定结果生成第一指示信息,检测待发送数据中是否包括PI并根据检测结果生成第二指示信息,生成起始报文的序号,从而得到IO配置信息。准备完待发送数据后,处理器可以通过总线系统向网卡发送该IO配置信息。
可选的,上述准备数据和获取IO配置信息的过程也可以由网卡来执行,这样处理器可以不准备数据也可以不用获取IO配置信息。网卡可以直接从发送端的第一存储器中获取该数据的标识对应的数据作为待发送数据,以及获取IO配置信息,且获取IO配置信息的过程与处理器获取的过程相同。
可选的,用户可以事先在发送端中配置RDMA报文是否包括PI,所以处理器或网卡可以根据用户的配置确定是否在RDMA报文中包括数据块对应的PI。
当发送端不是存储设备时,待发送数据为处理器需要存储的数据,处理器获取待发送数据中的数据块的长度L2,确定是否在RDMA报文中包括数据块对应的PI并根据确定结果生成第一指示信息,检测待发送数据中是否包括PI并根据检测结果生成第二指示信息,生成起始报文的序号,从而得到IO配置信息,通过总线系统向网卡发送该IO配置信息。
可选的,待发送数据可以是发送端的处理器在运行业务时生成的或者是发送端接收其他设备发送的。例如,发送端可以为用于运行业务的服务器,待发送数据可以是该服务器接收用户终端发送的数据。
可选的,用户可以事先在发送端中配置RDMA报文是否包括PI,所以处理器或网卡可以根据用户的配置确定是否在RDMA报文中包括数据块对应的PI。
可选的,处理模块在将该IO配置信息保存在第二存储器后,还可以通过网卡的网口向接收端发送该IO配置信息。
第二存储器中可以包括多个存储区,处理模块在将该IO配置信息存储在第二存储器的某个存储区中时,获取该IO配置信息的存储位置,该存储位置包括该存储区的起始地址和该IO配置信息在该存储区中的偏移量。
可选的,处理模块发送该IO信息的过程,可以为:
处理模块可以通过网卡的网口向接收端发送发送send消息,该send消息包括该IO配置信息的存储位置。接收端接收该send消息,根据该send消息确定发送端开始发送数据并根据该send包括的存储位置从发送端中读取该IO配置信息。或者,处理模块根据该网口直接向接收端发送该IO配置信息。
步骤302:获取待发送数据,确定RDMA报文的标准净荷长度L1。
发送端的处理器需要向接收端发送待发送数据时,处理器通过总线系统向网卡发送待发送数据,相应地,网卡的处理模块通过网卡的通信接口从该总线系统上接收待发送数据。
可选的,参见图1-2,待发送数据包括S个等长度的数据块,S为大于0的整数;参见图1-3,待发送数据还包括每个数据块对应的PI,在待发送数据中数据块对应的PI位于该数据块之后且紧随该数据块。
可选的,当待发送数据中的每个数据块的长度为4k时,待发送数据还包括每个数据块对应的元数据,在待发送数据中数据块对应的元数据位于该数据块之后,参见图1-4,该数据块对应的PI可以位于该数据块对应的元数据的左侧,或者,参见图1-5,该数据块对应的PI可以位于该数据块对应的元数据的右侧。
可选的,确定RDMA报文的标准净荷长度L1的操作可以为:
在发送端和接收端位于同一个局域网或私有网络,确定的标准净荷长度L1可以为预设长度,该预设长度可以为4k、2k或1k等。在发送端和接收端不在同一个局域网或私有网络时,根据公网允许的最大传输单元的长度确定标准净荷长度L1,标准净荷长度L1小于公网允许的最大传输单元的长度。其中,公网允许的最大传输单元的长度为1500,所以确定的标准净荷长度L1可以为1k等。
步骤303:在根据第一指示信息确定RDMA报文中包括PI时,判断该标准净荷长度L1是否大于待发送数据中的数据块的长度L2,以及根据第二指示信息判断待发送数据是否包括数据块对应的PI。
该标准净荷长度L1可以是数据块的长度L2的整数倍,或者,数据块的长度L2是标准净荷长度L1的整数倍。
在本步骤中:网卡中的处理模块从网卡的第二存储器中读取IO配置信息,该IO配置信息中包括起始报文的序号、数据块的长度L2、第一指示信息和第二指示信息。根据第一指示信息确定发送给接收端的RDMA报文中是否包括PI,在确定出该RDMA报文中包括PI时,比较该标准净荷长度L1和数据块的长度L2,以及根据第二指示信息判断待发送数据中是否包括每个数据块对应的PI。
步骤304:在该标准净荷长度L1大于待发送数据中的数据块的长度L2以及待发送数据包括数据块对应的PI时,将待发送数据中连续的x个数据块和该x个数据块中的每个数据块对应的PI封装成一个RDMA报文,x=L1/L2,发送该RDMA报文。
在本步骤中,从待发送数据中获取x个数据块和该x个数据块中的每个数据块对应的PI,将该x个数据块和每个数据块对应的PI组成净荷部分,基于该净荷部分生成RDMA报文,该RDMA报文的净荷部分的长度为L1+x*L3,发送该RDMA报文。详细实现过程如下:
网卡中的处理模块可以从待发送数据中读取第一个数据块并根据第一个数据块计算出第一个数据块的CRC,从待发送数据中读取第一个数据块对应的PI;在第一个数据块的CRC和第一个数据块对应的PI相等时,从待发送数据中读取第二个数据块并根据第二个数据块计算出第二个数据块的CRC;在第二个数据块的CRC和第二个数据块对应的PI相等时,按上述读取第二个数据块的方式继续从待发送数据中读取数据块和PI,直至读取到第x个数据块和第x个数据块对应的PI,以及在第x个数据块的CRC和第x个数据块对应的PI相等时,将第一个数据块和第一个数据块对应的PI、第二个数据块和第二个数据块对应的PI、……、第x个数据块和第x个数据块对应的PI组成RDMA报文的净荷部分,该净荷部分的长度为L1+L3*x;在该净荷部分之前添加报文头以及在该净荷部分之后添加校验部分形成第一个RDMA报文,该报文头包括起始报文序号,通过网卡的网口向接收端发送第一个RDMA报文。
在发送完第一个RDMA报文后,网卡中的处理模块可以从待发送数据中读取第x+1个数据块并根据第x+1个数据块计算出第x+1个数据块的CRC,从待发送数据中读取第x+1个数据块对应的PI;在第x+1个数据块的CRC和第x+1个数据块对应的PI相等时,从待发送数据中读取第x+2个数据块并根据第x+2个数据块计算出第x+2个数据块的CRC;在第x+2个数据块的CRC和第x+2个数据块对应的PI相等时,按上述读取第x+2个数据块的方式继续从待发送数据中读取数据块和PI,直至读取到第2x个数据块和第2x个数据块对应的PI,以及在第2x个数据块的CRC和第2x个数据块对应的PI相等时,将第x+1个数据块和第x+1个数据块对应的PI、第x+2个数据块和第x+2个数据块对应的PI、……、第2x个数据块和第2x个数据块对应的PI组成RDMA报文的净荷部分,该净荷部分的长度为L1+L3*x;增加第一个RDMA报文的序号得到第二个RDMA报文的序号,在该净荷部分之前添加报文头以及在该净荷部分之后添加校验部分形成第二个RDMA报文,该报文头包括第二个RDMA报文的序号,通过网卡的网口向接收端发送第二个RDMA报文。
网卡的处理模块按上述封装第二个RDMA报文方式继续从待发送数据中读取第2x+1个数据块和第2x+1个数据块对应的PI、第2x+2个数据块和第2x+2个数据块对应的PI、……、第3x个数据块和第3x个数据块对应的PI,并按上述封装第二个RDMA报文的方式将第2x+1个数据块和第2x+1个数据块对应的PI、第2x+2个数据块和第2x+2个数据块对应的PI、……、第3x个数据块和第3x个数据块对应的PI封装成第三个RDMA报文,通过网卡的网口向接收端发送第三个RDMA报文。然后继续封装RDMA报文,直至将待发送数据中的最后一个数据块和最后一个数据块对应的PI封装成在RDMA报文中并发送至接收端时为止。
其中,在某个数据块的CRC和该数据块对应的PI不等时,表明待发送数据出现数据错误,此时可以停止继续向接收端发送待发送数据,即结束本实施例方法流程。
其中,在待发送数据包括的数据块数目S为x的整数倍时,封装的最后一个RDMA报文中包括x个数据块和每个数据块对应的PI。在待发送数据包括的数据块数目S不是x的整数倍时,封装的最后一个RDMA报文包括的数据块数目和PI数目均小于x。
可选的,网卡的处理模块可能需要经过多次读取操作才能从待发送数据中读取一个数据块,且经过多次计算CRC的操作才能计算出该数据块的CRC,其中,多次读取的数据的总长度等于数据块的长度L2。详细说明如下:
网卡的处理模块从待发送数据的起始位置开始进行第一次读取数据,根据第一次读取的数据进行第一次计算得到CRC,设置目标数据长度为第一次读取的数据长度;继续从待发送数据中进行第二次读取数据,根据第二次读取的数据和第一次计算的CRC进行第二次计算得到CRC,给目标数据长度增加第二次读取的数据长度;继续从待发送数据中进行第三次读取数据,根据第三次读取的数据和第二次计算的CRC进行第三次计算得到CRC;……;从待发送数据中进行第P次读取数据,根据第P次读取的数据和第P-1次计算的CRC进行第P次计算得到CRC,给目标数据长度增加第P次读取的数据长度,P=4、5、6……;当增加后的数据长度等于L2时,表明从待发送数据中读取到第一个数据块且第P次计算的CRC为第一个数据块的CRC;继续从待发送数据中读取L3个字节的数据,该L3个字节的数据为第一个数据块对应的PI。
然后,网卡的处理模块继续从待发送数据中的剩余数据中经过多次读取得到第二个数据块,该多次读取的过程为:处理模块从该剩余数据中进行第一次读取数据,根据第一次读取的数据进行第一次计算得到CRC,设置目标数据长度为第一次读取的数据长度;继续从待发送数据中进行第二次读取数据,根据第二次读取的数据和第一次计算的CRC进行第二次计算得到CRC,给目标数据长度增加第二次读取的数据长度;……;从待发送数据中进行第P次读取数据,根据第P次读取的数据和第P-1次计算的CRC进行第P次计算得到CRC,给目标数据长度增加第P次读取的数据长度;当增加后的数据长度等于L2时,表明从待发送数据中读取到第二个数据块且第P次计算的CRC为第二个数据块的CRC;继续从待发送数据中读取L3字节的数据,该L3字节的数据为第二个数据块的PI信息。重复上述读取第二个数据块和第二个数据块对应的PI的过程直至读取完整个待发送数据。
例如,参见图1-3,假设待发送数据中的数据块长度L2为512,待发送数据包括八个数据块,分别为A1、A2、……、A8,和该八个数据块对应的PI分别为PI1、PI2、……、PI8。假设确定的标准净荷长度L1为1k,这样x为2。网卡的处理模块从图1-3所示的待发送数据中读取第一个数据块A1并根据第一个数据块A1计算出第一个数据块A1的CRC1,从图1-3所示的待发送数据中读取第一个数据块A1对应的PI1;在CRC1和PI1相等时,从图1-3所示的待发送数据中读取第二个数据块A2并根据第二个数据块A2计算出第二个数据块A2的CRC2,从图1-3所示的待发送数据中读取第二个数据块A2对应的PI2;在CRC2和PI2相等时,将A1、PI1、A2和PI2组成RDMA报文的净荷部分,该净荷部分的长度为1k+2*L3;参见图3-2,在该净荷部分之前添加报文头以及在该净荷部分之后添加校验部分形成第一个RDMA报文B1,该报文头包括起始报文的序号,假设该序号为1,通过网卡的网口向接收端发送第一个RDMA报文。
网卡的处理模块继续从图1-3所示的待发送数据中读取第三个数据块A3并根据第三个数据块A3计算出第三个数据块A3的CRC3,从图1-3所示的待发送数据中读取第三个数据块A3对应的PI3;在CRC3和PI3相等时,从图1-3所示的待发送数据中读取第四个数据块A4并根据第四个数据块A4计算出第四个数据块A4的CRC4,从图1-3所示的待发送数据中读取第四个数据块A4对应的PI4;在CRC4和PI4相等时,将A3、PI3、A4和PI4组成RDMA报文的净荷部分,该净荷部分的长度为1k+2*L3;将第一个RDMA报文的序号加1得到第二个RDMA报文的序号2,参见图3-2,在该净荷部分之前添加报文头以及在该净荷部分之后添加校验部分形成第二个RDMA报文B2,该报文头包括第二个RDMA报文的序号2,通过网卡的网口向接收端发送第二个RDMA报文。如图3-2所示,网卡的处理模块按上述封装第二个RDMA报文的方式继续处理,得到并发送第三个RDMA报文B3和第四个RDMA报文B4。
还例如,假设确定的标准净荷长度L1为2k,这样x=4,网卡的处理模块从图1-3所示的待发送数据中读取第一个数据块A1并根据第一个数据块A1计算出第一个数据块A1的CRC1,从图1-3所示的待发送数据中读取第一个数据块A1对应的PI1;在CRC1和PI1相等时,从图1-3所示的待发送数据中读取第二个数据块A2并根据第二个数据块A2计算出第二个数据块A2的CRC2,从图1-3所示的待发送数据中读取第二个数据块A2对应的PI2;在CRC2和PI2相等时,从图1-3所示的待发送数据中读取第三个数据块A3并根据第三个数据块A3计算出第三个数据块A3的CRC3,从图1-3所示的待发送数据中读取第三个数据块A3对应的PI3;在CRC3和PI3相等时,从图1-3所示的待发送数据中读取第四个数据块A4并根据第四个数据块A4计算出第四个数据块A4的CRC4,从图1-3所示的待发送数据中读取第四个数据块A4对应的PI4;在CRC4和PI4相等时,将A1、PI1、A2、PI2、A3、PI3、A4和PI4组成RDMA报文的净荷部分,该净荷部分的长度为2k+4*L3;参见图3-3,在该净荷部分之前添加报文头以及在该净荷部分之后添加校验部分形成第一个RDMA报文C1,该报文头包括起始报文的序号,假设该序号为1,通过网卡的网口向接收端发送第一个RDMA报文C1。
网卡的处理模块从图1-3所示的待发送数据中读取第五个数据块A5并根据第五个数据块A5计算出第五个数据块A5的CRC5,从图1-3所示的待发送数据中读取第五个数据块A5对应的PI5;在CRC5和PI5相等时,从图1-3所示的待发送数据中读取第六个数据块A6并根据第六个数据块A6计算出第六个数据块A6的CRC6,从图1-3所示的待发送数据中读取第六个数据块A6对应的PI6;在CRC6和PI6相等时,从图1-3所示的待发送数据中读取第七个数据块A7并根据第七个数据块A7计算出第七个数据块A7的CRC7,从图1-3所示的待发送数据中读取第七个数据块A7对应的PI7;在CRC7和PI7相等时,从图1-3所示的待发送数据中读取第八个数据块A8并根据第八个数据块A8计算出第八个数据块A8的CRC8,从图1-3所示的待发送数据中读取第八个数据块A8对应的PI8;在CRC8和PI8相等时,将A5、PI5、A6、PI6、A7、PI7、A8和PI8组成RDMA报文的净荷部分,该净荷部分的长度为2k+4*L3;将第一个RDMA报文的序号加1得到第二个RDMA报文的序号2,参见图3-3,在该净荷部分之前添加报文头以及在该净荷部分之后添加校验部分形成第二个RDMA报文C2,该报文头包括第二个RDMA报文C2的序号2,通过网卡的网口向接收端发送第二个RDMA报文C2。
还例如,假设确定的标准净荷长度L1为4k,这样x=8,网卡的处理模块从图1-3所示的待发送数据中读取第一个数据块A1并根据第一个数据块A1计算出第一个数据块A1的CRC1,从图1-3所示的待发送数据中读取第一个数据块A1对应的PI1;在CRC1和PI1相等时,按上述对第一个数据块A1的处理过程继续从待发送数据中读取第二个数据块A2和第二个数据块A2对应的PI2、第三个数据块A3和第三个数据块对应的PI3、……、第八个数据块A8和第八个数据块A8对应的PI8,将A1、PI1、A2、PI2、A3、PI3、A4、PI4、A5、PI5、A6、PI6、A7、PI7、A8和PI8组成RDMA报文的净荷部分,该净荷部分的长度为4k+8*L3;在该净荷部分之前添加报文头以及在该净荷部分之后添加校验部分形成一个RDMA报文,该报文头包括起始报文的序号,通过网卡的网口向接收端发送该RDMA报文。
步骤305:在该标准净荷长度L1大于待发送数据中的数据块的长度L2以及待发送数据不包括数据块对应的PI时,获取待发送数据中连续的x个数据块中的每个数据块对应的PI,将该x个数据块和每个数据块对应的PI封装成一个RDMA报文,x=L1/L2,发送该RDMA报文。
在本步骤中,从待发送数据中获取x个数据块,生成该x个数据块中的每个数据块对应的PI,将该x个数据块和每个数据块对应的PI组成净荷部分,基于该净荷部分生成RDMA报文,该RDMA报文的净荷部分的长度为L1+x*L3,发送该RDMA报文。详细实现过程如下:
网卡中的处理模块可以从待发送数据中读取第一个数据块并根据第一个数据块计算出第一个数据块的CRC,将第一个数据块的CRC作为第一个数据块对应的PI;从待发送数据中读取第二个数据块并根据第二个数据块计算出第二个数据块的CRC,将第二个数据块的CRC作为第二个数据块对应的PI,按上述读取第二个数据块的方式继续从待发送数据中读取数据块,直至读取到第x个数据块以及得到第x个数据块对应的PI时,将第一个数据块和第一个数据块对应的PI、第二个数据块和第二个数据块对应的PI、……、第x个数据块和第x个数据块对应的PI组成报文的净荷部分,该净荷部分的长度为L1+L3*x;在该净荷部分之前添加报文头以及在该净荷部分之后添加校验部分形成第一个RDMA报文,该报文头包括起始报文的序号,通过网卡的网口向接收端发送第一个RDMA报文。
在发送完第一个RDMA报文后,网卡中的处理模块可以从待发送数据中读取第x+1个数据块并根据第x+1个数据块计算出第x+1个数据块的CRC,将第x+1个数据块的CRC作为第x+1个数据块对应的PI;从待发送数据中读取第x+2个数据块并根据第x+2个数据块计算出第x+2个数据块的CRC,将第x+2个数据块的CRC作为第x+2个数据块对应的PI,按上述读取第x+2个数据块的方式继续从待发送数据中读取数据块,直至读取到第2x个数据块以及得到第2x个数据块对应的PI时,将第x+1个数据块和第x+1个数据块对应的PI、第x+2个数据块和第x+2个数据块对应的PI、……、第2x个数据块和第2x个数据块对应的PI组成RDMA报文的净荷部分,该净荷部分的长度为L1+L3*x;增加第一个RDMA报文的序号得到第二个RDMA报文的序号,在该净荷部分之前添加报文头以及在该净荷部分之后添加校验部分形成第一个RDMA报文,该报文头包括第二个RDMA报文的序号,通过网卡的网口向接收端发送第二个RDMA报文。
在发送完第二个RDMA报文后,网卡的处理模块继续按上述封装第二个RDMA报文方式继续从待发送数据中读取第2x+1个数据块和获取第2x+1个数据块对应的PI、读取第2x+2个数据块和获取第2x+2个数据块对应的PI、……、读取第3x个数据块和获取第3x个数据块对应的PI,并按上述处理第二个RDMA报文的方式将第2x+1个数据块和第2x+1个数据块对应的PI、第2x+2个数据块和第2x+2个数据块对应的PI、……、第3x个数据块和第3x个数据块对应的PI封装成第三个RDMA报文,通过网卡的网口向接收端发送第三个RDMA报文。然后继续封装RDMA报文,直至将待发送数据中的最后一个数据块和最后一个数据块对应的PI封装成在RDMA报文中并发送至接收端时为止。
可选的,网卡的处理模块可能需要经过多次读取操作才能从待发送数据中读取一个数据块,且经过多次计算CRC的操作才能计算出该数据块的CRC,详细实现操作可以参见步骤304中的相关内容,在此不再详细说明。
例如,参见图1-2,假设待发送数据中的数据块长度L2为512,待发送数据包括八个数据块,分别为A1、A2、……、A8。假设确定的标准净荷长度L1为1k,这样x为2。网卡的处理模块从图1-2所示的待发送数据中读取第一个数据块A1并根据第一个数据块A1计算出第一个数据块A1的CRC1,将CRC1作为第一个数据块A1对应的PI1;从图1-2所示的待发送数据中读取第二个数据块A2并根据第二个数据块A2计算出第二个数据块A2的CRC2,将CRC2作为第二个数据块A2对应的PI2;将A1、PI1、A2和PI2组成RDMA报文的净荷部分,该净荷部分的长度为1k+2*L3;参见图3-2,在该净荷部分之前添加报文头以及在该净荷部分之后添加校验部分形成第一个RDMA报文B1,该报文头包括起始报文的序号1,通过网卡的网口向接收端发送第一个RDMA报文。
网卡的处理模块从图1-2所示的待发送数据中读取第三个数据块A3并根据第三个数据块A3计算出第三个数据块A3的CRC3,将CRC3作为第三个数据块A3对应的PI3;从图1-2所示的待发送数据中读取第四个数据块A4并根据第四个数据块A4计算出第四个数据块A4的CRC4,将CRC4作为第四个数据块A4对应的PI4;将A3、PI3、A4和PI4组成RDMA报文的净荷部分,该净荷部分的长度为1k+16;将第一个RDMA报文的序号加1得到第二个RDMA报文的序号2,参见图3-2,在该净荷部分之前添加报文头以及在该净荷部分之后添加校验部分形成第二个RDMA报文B2,该报文头包括第二个RDMA报文的序号2,通过网卡的网口向接收端发送第二个RDMA报文。如图3-2所示,网卡的处理模块按上述封装第二个RDMA报文的方式继续处理,得到并发送第三个RDMA报文B3和第四个RDMA报文B4。
还例如,假设确定的标准净荷长度L1为2k,这样x=4,网卡的处理模块从图1-2所示的待发送数据中读取第一个数据块A1并根据第一个数据块A1计算出第一个数据块A1的CRC1,将CRC1作为第一个数据块A1对应的PI1;从图1-2所示的待发送数据中读取第二个数据块A2并根据第二个数据块A2计算出第二个数据块A2的CRC2,将CRC2作为第二个数据块A2对应的PI2;从图1-2所示的待发送数据中读取第三个数据块A3并根据第三个数据块A3计算出第三个数据块A3的CRC3,将CRC3作为第三个数据块A3对应的PI3;从图1-2所示的待发送数据中读取第四个数据块A4并根据第四个数据块A4计算出第四个数据块A4的CRC4,将CRC4作为第四个数据块A4对应的PI4;将A1、PI1、A2、PI2、A3、PI3、A4和PI4组成RDMA报文的净荷部分,该净荷部分的长度为2k+4*L3;参见图3-3,在该净荷部分之前添加报文头以及在该净荷部分之后添加校验部分形成第一个RDMA报文C1,该报文头包括起始报文的序号1,通过网卡的网口向接收端发送第一个RDMA报文C1。
网卡的处理模块从图1-2所示的待发送数据中读取第五个数据块A5并根据第五个数据块A5计算出第五个数据块A5的CRC5,将CRC5作为第五个数据块A5对应的PI5;从图1-2所示的待发送数据中读取第六个数据块A6并根据第六个数据块A6计算出第六个数据块A6的CRC6,将CRC6作为第六个数据块A6对应的PI6;从图1-2所示的待发送数据中读取第七个数据块A7并根据第七个数据块A7计算出第七个数据块A7的CRC7,将CRC7作为第七个数据块A7对应的PI7;从图1-2所示的待发送数据中读取第八个数据块A8并根据第八个数据块A8计算出第八个数据块A8的CRC8,将CRC8作为第八个数据块A8对应的PI8;将A5、PI5、A6、PI6、A7、PI7、A8和PI8组成RDMA报文的净荷部分,该净荷部分的长度为2k+4*L3;将第一个RDMA报文的序号加1得到第二个RDMA报文的序号2,参见图3-3,在该净荷部分之前添加报文头以及在该净荷部分之后添加校验部分形成第二个RDMA报文C2,该报文头包括第二个报文的序号2,通过网卡的网口向接收端发送第二个报文C2。
还例如,假设确定的标准净荷长度L1为4k,这样x=8,网卡的处理模块从图1-2所示的待发送数据中读取第一个数据块A1并根据第一个数据块A1计算出第一个数据块A1的CRC1,将CRC1作为第一个数据块A1对应的PI1;按上述得到第一个数据块A1的方式得到第二个数据块A2和第二个数据块A2对应的PI2、第三个数据块A3和第三个数据块A3对应的PI3、……、第八个数据块A和第八个数据块A8对应的PI8。将A1、PI1、A2、PI2、A3、PI3、A4、PI4、A5、PI5、A6、PI6、A7、PI7、A8和PI8组成RDMA报文的净荷部分,该净荷部分的长度为2k+8*L3;在该净荷部分之前添加报文头以及在该净荷部分之后添加校验部分形成一个RDMA报文,该报文头包括起始报文的序号,通过网卡的网口向接收端发送该RDMA报文。
在标准净荷长度L1大于数据块的长度L2的情况下,封装的每个RDMA报文的净荷部分均包括x个数据块和每个数据块对应的PI,每个RDMA报文的净荷部分的结构相同,因此接收端只需要一种处理逻辑就可以处理各RDMA报文,得到数据块和数据块对应的PI,从而降低了接收端对RDMA报文进行处理的难度,减小了处理RDMA报文的耗时。
步骤306:在该标准净荷长度L1小于或等于待发送数据中的数据块的长度L2以及待发送数据包括数据块对应的PI时,将待发送数据中的一个数据块和该数据块对应的PI封装成y个RDMA报文,y=L2/L1,发送该y个RDMA报文。
在本步骤中,从待发送数据中的一个数据单元的起始位置获取数据,当获取到数据单元的y分之一的数据时,将该数据单元的y分之一的数据组成净荷部分,基于该净荷部分生成RDMA报文,数据单元包括一个数据块和该一个数据块对应的PI,该RDMA报文的净荷部分的长度为L1+L3/y,也就是说该数据单元的y分之一的数据的长度为L1+L3/y;发送该RDMA报文。详细实现如下:
网卡中的处理模块可以从待发送数据中的起始位置读取长度为L1+L3/y的数据,以及根据该长度为L1+L3/y的数据计算得到第一个CRC,将该长度为L1+L3/y的数据作为RDMA报文的净荷部分,在该净荷部分之前添加报文头以及在该净荷部分之后添加校验部分形成第一个RDMA报文,第一个RDMA报文的报文头中包括起始报文的序号,通过网卡的网口向接收端发送第一个RDMA报文。继续从待发送数据中读取长度为L1+L3/y的数据,以及根据该长度为L1+L3/y的数据和第一个CRC计算得到第二个CRC,将该长度为L1+L3/y的数据作为RDMA报文的净荷部分,增加第一个RDMA报文的序号得到第二个RDMA报文的序号,在该净荷部分之前添加报文头以及在该净荷部分之后添加校验部分形成第二个RDMA报文,通过网卡的网口向接收端发送第二个RDMA报文;继续按上述封装第二个RDMA报文方式生成并发送第三个RDMA报文以及计算第三个CRC,生成并发送第四个RDMA报文以及计算第四个CRC、直至生成并发送第y-1个RDMA报文以及计算第y-1个CRC值。网卡中的处理模块可以从待发送数据中的剩余数据读取长度为L1+L3/y-L3的数据,如此读取完第一个数据块,根据该长度为L1+L3/y-L3的数据和第y-1个CRC值计算得到第一个数据块的CRC。网卡中的处理模块可以从待发送数据中的剩余数据中读取L3个字节的数据,该L3个字节的数据为第一个数据块对应的PI,在第一个数据块的CRC和第一个数据块对应PI相等时,增加第y-1个RDMA报文的序号得到第y个RDMA报文的序号,将该长度为L1+L3/y-L3的数据和第一个数据块的PI组成第y个RDMA报文的净荷部分,在该净荷部分之前添加报文头以及在该净荷部分之后添加校验部分形成第y个RDMA报文,该报文头包括第y个RDMA报文的序号,通过网卡的网口向接收端发送第y个RDMA报文。
网卡中的处理模块继续从待发送数据中读取长度为L1+L3/y的数据,以及根据该长度为L1+L3/y的数据计算得到第一个CRC,增加最近上一次生成的RDMA报文的序号得到第一个RDMA报文的序号,将该长度为L1+L3/y的数据作为RDMA报文的净荷部分,在该净荷部分之前添加报文头以及在该净荷部分之后添加校验部分形成第一个RDMA报文,第一个RDMA报文的报文头中包括第一个RDMA报文的序号,通过网卡的网口向接收端发送第一个RDMA报文。继续从待发送数据中读取长度为L1+L3/y的数据,以及根据该长度为L1+L3/y的数据和第一个CRC计算得到第二个CRC,将该长度为L1+L3/y的数据作为RDMA报文的净荷部分,增加第一个RDMA报文的序号得到第二个RDMA报文的序号,在该净荷部分之前添加报文头以及在该净荷部分之后添加校验部分形成第二个RDMA报文,通过网卡的网口向接收端发送第二个RDMA报文;继续按上述封装第二个RDMA报文方式生成并发送第三个RDMA报文以及计算第三个CRC,生成并发送第四个RDMA报文以及计算第四个CRC、直至生成并发送第y-1个RDMA报文以及计算第y-1个CRC值。网卡中的处理模块可以从待发送数据中的剩余数据读取长度为L1+L3/y-L3的数据,如此读取完第二个数据块,根据该长度为L1+L3/y-L3的数据和第y-1个CRC值计算得到第二个数据块的CRC。网卡中的处理模块可以从待发送数据中的剩余数据中读取L3个字节的数据,该L3个字节的数据为第二个数据块对应的PI,在第二个数据块的CRC和第二个数据块对应PI相等时,增加第y-1个RDMA报文的序号得到第y个RDMA报文的序号,将该长度为L1+L3/y-L3的数据和第二个数据块的PI组成第y个RDMA报文的净荷部分,在该净荷部分之前添加报文头以及在该净荷部分之后添加校验部分形成第y个RDMA报文,该报文头包括第y个RDMA报文的序号,通过网卡的网口向接收端发送第y个RDMA报文。继续执行上述对第二个数据块执行的过程,将待发送数据中的其他每个数据块封装置成y个RDMA报文并发送给接收端。
可选的,当待发送数据中的数据块的长度为4k时,标准净荷长度L1通常小于或等于数据块的长度L2,网卡的第二存储器中存储的IO配置信息中还包括数据块对应的元数据和PI之间的位置关系信息。网卡的处理模块可以根据该位置关系信息,确定数据块对应的元数据和PI之间的位置关系。
可选的,在确定数据块对应的PI位于该数据块对应的元数据的左侧时,对于待发送的数据中的任一个数据块,可以将该数据块和该数据块对应的PI封装成y个RDMA报文,该RDMA报文的净荷部分的长度为L1+L3/y。
例如,参见图1-4所示的待发送数据,待发送数据中的数据块长度为4k,假设确定的标准净荷长度L1为1k,这样y=4,RDMA报文的净荷部分的长度为1k+L3/4。网卡中的处理模块可以从图1-4所示的待发送数据中起始位置读取1k+L3/4个字节的数据,以及根据该1k+L3/4个字节的数据计算得到第一个CRC,将该1k+L3/4个字节的数据作为RDMA报文的净荷部分,如图3-4所示,在该净荷部分之前添加报文头以及在该净荷部分之后添加校验部分形成第一个RDMA报文11,该报文头包括起始报文的序号,假设该序号为1,通过网卡的网口向接收端发送第一个RDMA报文11。继续从待发送数据中读取1k+L3/4个字节的数据,以及根据该1k+L3/4个字节的数据和第一个CRC计算得到第二个CRC,将该1k+L3/4个字节的数据作为RDMA报文的净荷部分,第一个RDMA报文11的序号加1得到第二个RDMA报文12的序号2,在该净荷部分之前添加报文头以及在该净荷部分之后添加校验部分形成第二个RDMA报文12,该报文头包括第二个RDMA报文12的序号2,通过网卡的网口向接收端发送第二个RDMA报文12;继续按上述生成并发送第三个RDMA报文13和计算第三个CRC。然后网卡中的处理模块可以从待发送数据中的剩余数据读取1k+L3/4-L3个字节的数据,如此读取完第一个数据块A1,根据该1k+L3/4-L3个字节的数据和第三个CRC计算得到第一个数据块A1的CRC。网卡中的处理模块可以从待发送数据中的剩余数据中读取L3个字节的数据,该L3个字节的数据为第一个数据块A1对应的PI,在第一个数据块A1对应的CRC值和PI相等时,将第三个RDMA报文13的序号加1得到第四个RDMA报文14的序号4,将该1k+L3/4-L3个字节的数据和第一个数据块A1对应的PI组成第四个RDMA报文14的净荷部分,在该净荷部分之前添加报文头以及在该净荷部分之后添加校验部分形成第四个RDMA报文14,该报文头中包括第四个RDMA报文14的序号4,通过网卡的网口向接收端发送第四个RDMA报文14。
网卡中的处理模块继续从图1-4所示的待发送数据中读取L4个字节的元数据1,该L4个字节的元数据1可以丢弃,继续从图1-4所示的待发送数据中读取1k+L3/4个字节的数据,以及根据该1k+L3/4个字节的数据计算得到第一个CRC,将该1k+L3/4个字节的数据作为第一个RDMA报文21的净荷部分,在最近上一次发送的RDMA报文的序号4的基础上加1得到第一个RDMA报文21的序号5,如图3-4所示,在该净荷部分之前添加报文头以及在该净荷部分之后添加校验部分形成第一个RDMA报文21,该报文头包括第一个RDMA报文21的序号5,通过网卡的网口向接收端发送第一个RDMA报文21。继续从待发送数据中读取1k+L3/4个字节的数据,以及根据该1k+L3/4个字节的数据和第一个CRC计算得到第二个CRC,将该1k+L3/4个字节的数据作为报文的净荷部分,将第一个RDMA报文21的序号加1得到第二个RDMA报文22的序号6,在该净荷部分之前添加报文头以及在该净荷部分之后添加校验部分形成第二个RDMA报文22,该报文头包括第二个RDMA报文的序号6,通过网卡的网口向接收端发送第二个RDMA报文22;继续按上述生成并发送第三个RDMA报文23和计算第三个CRC。然后网卡中的处理模块可以从待发送数据中的剩余数据读取1k+L3/4-L3个字节的数据,如此读取完第二个数据块A2,根据该1k+L3/4-L3个字节的数据和第三个CRC计算得到第二个数据块A2的CRC。网卡中的处理模块可以从待发送数据中的剩余数据中读取L3个字节的数据,该L3个字节的数据为第二个数据块对A2应的PI,在第二个数据块A2对应的CRC值和PI相等时,将第三个RDMA报文23的序号加1得到第四个RDMA报文24的序号8,将该1k+L3/4-L3个字节的数据和第二个数据块A2对应的PI组成第四个RDMA报文24的净荷部分,在该净荷部分之前添加报文头以及在该净荷部分之后添加校验部分形成第四个RDMA报文24,该报文头中包括第四个RDMA报文24的序号8,通过网卡的网口向接收端发送第四个RDMA报文24。
还例如,参见图1-4所示的待发送数据,待发送数据中的数据块长度为4k,假设确定的标准净荷长度L1为2k,这样y=2,RDMA报文的净荷部分的长度为2k+L3/2。参见图3-5,这样网卡的处理模块将第一个数据块A1和第一个数据块A1对应的PI1封装成第一个RDMA报文11和第二个RDMA报文12,第一个RDMA报文11的净荷部分包括第一个数据块A1的前长度为2k+L3/2的数据,第二个RDMA报文12的净荷部分包括第一个数据块A1剩余的长度为2k+L3/2-L3的数据和第一个数据块A1对应的长度为L3的PI1。以及将第二个数据块A2和第二个数据块A2对应的PI2封装成第一个RDMA报文21和第二个RDMA报文22,第一个RDMA报文21的净荷部分包括第二个数据块A2的前长度为2k+L3/2的数据,第二个RDMA报文22的净荷部分包括第二个数据块A2的剩余的长度为2k+L3/2-L3的数据和第二个数据块A2对应的长度为L3的PI2。
还例如,参见图1-4所示的待发送数据,待发送数据中的数据块长度为4k,假设确定的标准净荷长度L1为4k,这样y=1,RDMA报文的净荷部分的长度为4k+L3。参见图3-6,这样网卡的处理模块将第一个数据块A1和第一个数据块A1对应的PI1封装成第一个RDMA报文1,第一个RDMA报文1的净荷部分包括第一个数据块A1和第一个数据块A1对应的长度为L3的PI1。以及将第二个数据块A2和第二个数据块A2对应的PI2封装成第二个RDMA报文2,第二个RDMA报文2的净荷部分包括第二个数据块A2和第二个数据块A2对应的长度为L3的PI2。
可选的,在确定数据块对应的PI位于该数据块对应的元数据的右侧时,对于待发送数据中的任一个数据块,可以将该数据块、该数据块对应的元数据和该数据块对应的PI封装成y个RDMA报文,即该RDMA报文的净荷部分的长度为L1+(L4+L3)/y,L4为元数据的长度。
例如,参见图1-5所示的待发送数据,待发送数据中的数据块长度为4k,假设确定的净荷长度为1k,这样x=4,RDMA报文的净荷部分的长度为1k+(L4+L3)/4。网卡中的处理模块可以从图1-5所示的待发送数据中起始位置读取1k+(L4+L3)/4个字节的数据,以及根据该1k+(L4+L3)/4个字节的数据计算得到第一个CRC,将该1k+(L4+L3)/4个字节的数据作为RDMA报文的净荷部分,如图3-7所示,在该净荷部分之前添加报文头以及在该净荷部分之后添加校验部分形成第一个RDMA报文11,该报文头包括起始报文的序号,假设该序号为1,通过网卡的网口向接收端发送第一个RDMA报文11。继续从待发送数据中读取1k+(L4+L3)/4个字节的数据,以及根据该1k+(L4+L3)/4个字节的数据和第一个CRC计算得到第二个CRC,将第一个RDMA报文11的序号加1得到第二个RDMA报文12的序号2,将该1k+(L4+L3)/4个字节的数据作为RDMA报文的净荷部分,在该净荷部分之前添加报文头以及在该净荷部分之后添加校验部分形成第二个RDMA报文12,第二个RDMA报文12的报文头包括第二个RDMA报文12的序号,通过网卡的网口向接收端发送第二个RDMA报文12;继续按上述生成并发送第三个RDMA报文13和计算第三个CRC。然后网卡中的处理模块可以从待发送数据中的剩余数据读取1k+(L4+L3)/4-L3个字节的数据,如此读取完第一个数据块A1和第一个数据块A1的元数据1,根据该1k+(L4+L3)/4-L3个字节的数据和第三个CRC计算得到第一个数据块A1对应的CRC。网卡中的处理模块可以从待发送数据中的剩余数据中读取L3个字节的数据,该L3个字节的数据为第一个数据块A1对应的PI1,在第一个数据块A1对应的CRC和第一个数据块A1对应的PI1相等时,将第三个RDMA报文13的序号加1得到第四个RDMA报文14的序号4,将该1k+(L4+L3)/4-L3个字节的数据和第一个数据块的PI1组成第四个RDMA报文14的净荷部分,在该净荷部分之前添加报文头以及在该净荷部分之后添加校验部分形成第四个RDMA报文14,第四个报文14的报文头包括第四个RDMA报文14的序号4,通过网卡的网口向接收端发送第四个RDMA报文14。
网卡中的处理模块继续可以从图1-5所示的待发送数据中读取1k+(L4+L3)/4个字节的数据,以及根据该1k+(L4+L3)/4个字节的数据计算得到第一个CRC,在最近上一次发送的RDMA报文的序号4的基础上加1得到第一个RDMA报文21的序号5,将该1k+(L4+L3)/4个字节的数据作为RDMA报文的净荷部分,如图3-5所示,在该净荷部分之前添加报文头以及在该净荷部分之后添加校验部分形成第一个RDMA报文21,该报文头包括第一个RDMA报文21的序号5,通过网卡的网口向接收端发送第一个RDMA报文21。继续从待发送数据中读取1k+(L4+L3)/4个字节的数据,以及根据该1k+(L4+L3)/4个字节的数据和第一个CRC计算得到第二个CRC,将第一个RDMA报文21的序号加1得到第二个RDMA报文22的序号6,将该1k+(L4+L3)/4个字节的数据作为RDMA报文的净荷部分,在该净荷部分之前添加报文头以及在该净荷部分之后添加校验部分形成第二个RDMA报文22,第二个RDMA报文22的报文头包括第二个RDMA报文22的序号,通过网卡的网口向接收端发送第二个RDMA报文22;继续按上述生成并发送第三个RDMA报文23和计算第三个CRC。然后网卡中的处理模块可以从待发送数据中的剩余数据读取1k+(L4+L3)/4-L3个字节的数据,如此读取完第二个数据块A2和第二个数据块A2对应的元数据2,根据该1k+(L4+L3)/4-L3个字节的数据和第三个CRC计算得到第二个数据块A2对应的CRC。网卡中的处理模块可以从待发送数据中的剩余数据中读取L3个字节的数据,该L3个字节的数据为第二个数据块A2对应的PI,在第二个数据块A2对应的CRC和第二个数据块A2对应的PI相等时,将第三个RDMA报文23的序号加1得到第四个RDMA报文24的序号8,将该1k+(L4+L3)/4-L3个字节的数据和第二个数据块A2的PI2组成第四个RDMA报文24的净荷部分,在该净荷部分之前添加报文头以及在该净荷部分之后添加校验部分形成第四个RDMA报文24,第四个RDMA报文24的报文头包括第四个RDMA报文24的序号8,通过网卡的网口向接收端发送第四个报文24。
还例如,参见图1-5所示的待发送数据,待发送数据中的数据块长度为4k,假设确定的标准净荷长度L1为2k,这样y=2,RDMA报文的净荷部分的长度为2k+(L4+L3)/2。参见图3-8,这样网卡的处理模块将第一个数据块A1和第一个数据块A1对应的PI1封装成第一个RDMA报文11和第二个RDMA报文12,第一个RDMA报文11的净荷部分包括第一个数据块A1的前长度为2k+(L4+L3)/2的数据,第二个RDMA报文12的净荷部分包括第一个数据块A1的剩余数据、元数据1和第一个数据块A1对应的长度为L3的PI1,该剩余数据和元数据1的长度总和为2k+(L4+L3)/2-L3。以及将第二个数据块A2和第二个数据块A2对应的PI2封装成第一个RDMA报文21和第二个RDMA报文22,第一个RDMA报文21的净荷部分包括第二个数据块2A的前长度为2k+(L4+L3)/2的数据,第二个RDMA报文22的净荷部分包括第二个数据块A2的剩余数据、元数据2和第二个数据块A2对应的长度为L3的PI2,该剩余数据和元数据2的长度总和为2k+(L4+L3)/2-L3。
还例如,参见图1-4所示的待发送数据,待发送数据中的数据块长度为4k,假设确定的标准净荷长度L1为4k,这样y=1,RDMA报文的净荷部分的长度为4k+L4+L3。参见图3-9,这样网卡的处理模块将第一个数据块A1、第一个数据块A1对应的元数据1和第一个数据块A1对应的PI1封装成第一个RDMA报文1,第一个RDMA报文1的净荷部分包括第一个数据块A1、第一个数据块A1对应的元数据1和第一个数据块A1对应的长度为L3的PI1。以及将第二个数据块A2、第二个数据块A2对应的元数据2和第二个数据块A2对应的PI2封装成第二个RDMA报文2,第二个RDMA报文2的净荷部分包括第二个数据块A2、第二个数据块A2对应的元数据2和第二个数据块A2对应的长度为L3的PI2。
步骤307:在该标准净荷长度L1小于或等于待发送数据中的数据块的长度L2以及待发送数据不包括数据块对应的PI时,获取待发送数据中的一个数据块对应的PI,将该数据块和该数据块对应的PI封装成y个RDMA报文,y=L2/L1,发送该y个RDMA报文。
在本步骤中,网卡中的处理模块可以从待发送数据中起始位置读取长度为L1+L3/y的数据,以及根据该长度为L1+L3/y的数据计算得到第一个CRC,将该长度为L1+L3/y的数据作为RDMA报文的净荷部分,在该净荷部分之前添加报文头以及在该净荷部分之后添加校验部分形成第一个RDMA报文,该报文头包括起始报文的序号,通过网卡的网口向接收端发送第一个RDMA报文。继续从待发送数据中读取长度为L1+L3/y的数据,以及根据该L1+L3/y的数据和第一个CRC计算得到第二个CRC,将该长度为L1+L3/y的数据作为RDMA报文的净荷部分,增加第一个RDMA报文的序号得到第二个RDMA报文的序号,在该净荷部分之前添加报文头以及在该净荷部分之后添加校验部分形成第二个RDMA报文,第二个RDMA报文的报文头包括第二个RDMA报文的序号,通过网卡的网口向接收端发送第二个RDMA报文;继续按上述生成并发送第三个RDMA报文和计算第三个CRC,生成并发送第四个RDMA报文和计算第四个CRC、直至生成并发送第y-1个RDMA报文和计算第y-1个CRC值。然后网卡中的处理模块可以从待发送数据中的剩余数据读取长度为L1+L3/y-L3的数据,如此读取完第一个数据块,根据该L1+L3/y-L3的数据和第y-1个CRC计算得到第一个数据块对应的CRC,将第一个数据块对应的CRC作为第一个数据块对应的PI,增加第y-1个RDMA报文的序号得到第y个RDMA报文的序号,将该长度为L1+L3/y-L3的数据和第一个数据块的PI组成第y个RDMA报文的净荷部分,在该净荷部分之前添加报文头以及在该净荷部分之后添加校验部分形成第y个RDMA报文,第y个RDMA报文的报文头包括第y个RDMA报文的序号,通过网卡的网口向接收端发送第y个RDMA报文。
网卡中的处理模块继续从待发送数据中读取长度为L1+L3/y的数据,以及根据该长度为L1+L3/y的数据计算得到第一个CRC,增加最近上一次发送的RDMA报文的序号得到第一个RDMA报文的序号,将该长度为L1+L3/y的数据作为RDMA报文的净荷部分,在该净荷部分之前添加报文头以及在该净荷部分之后添加校验部分形成第一个RDMA报文,该报文头包括第一个RDMA报文的序号,通过网卡的网口向接收端发送第一个RDMA报文。继续从待发送数据中读取长度为L1+L3/y的数据,以及根据该L1+L3/y的数据和第一个CRC计算得到第二个CRC,将该长度为L1+L3/y的数据作为RDMA报文的净荷部分,增加第一个RDMA报文的序号得到第二个RDMA报文的序号,在该净荷部分之前添加报文头以及在该净荷部分之后添加校验部分形成第二个RDMA报文,第二个RDMA报文的报文头包括第二个RDMA报文的序号,通过网卡的网口向接收端发送第二个RDMA报文;继续按上述生成并发送第三个RDMA报文和计算第三个CRC,生成并发送第四个RDMA报文和计算第四个CRC、直至生成并发送第y-1个RDMA报文和计算第y-1个CRC值。然后网卡中的处理模块可以从待发送数据中的剩余数据读取长度为L1+L3/y-L3的数据,如此读取完第二个数据块,根据该L1+L3/y-L3的数据和第y-1个CRC计算得到第二个数据块对应的CRC,将第二个数据块对应的CRC作为第二个数据块对应的PI,增加第y-1个RDMA报文的序号得到第y个RDMA报文的序号,将该长度为L1+L3/y-L3的数据和第二个数据块的PI组成第y个RDMA报文的净荷部分,在该净荷部分之前添加报文头以及在该净荷部分之后添加校验部分形成第y个RDMA报文,第y个RDMA报文的报文头包括第y个RDMA报文的序号,通过网卡的网口向接收端发送第y个RDMA报文。继续执行上述对第二个数据块执行的过程,将待发送数据中的其他每个数据块封装置成y个RDMA报文并发送给接收端。
在标准净荷长度L1小于或等于数据块的长度L2的情况下,将每个数据块和每个数据块对应的PI封装成y个RDMA报文,该y个RDMA报文中前y-1个RDMA报文的净荷部分的结构相同。每个数据块对应的前y-1个RDMA报文的净荷部分的结构均相同,每个数据块对应的第y个RDMA报文的净荷部分的结构也均相同。因此接收端只需要第一和第二种处理逻辑,通过第一种处理逻辑可以处理每个数据块的前y-1个RDMA报文,通过第二种处理逻辑可以处理每个数据块的第y个RDMA报文,从而降低了接收端对RDMA报文进行处理的难度,减小了处理RDMA报文的耗时。
可选的,在根据第一指示信息确定RDMA报文中不包括PI时,可以通过如下(1)至(5)的操作发送待发送数据,实现过程可以为:
(1):判断该标准净荷长度L1是否大于待发送数据中的数据块的长度L2,以及根据第二指示信息判断待发送数据是否包括数据块对应的PI。
(2):在该标准净荷长度L1大于待发送数据中的数据块的长度L2以及待发送数据包括数据块对应的PI时,将待发送数据中连续的x个数据块封装成一个RDMA报文,x=L1/L2,发送该RDMA报文。
在本步骤中,网卡中的处理模块可以从待发送数据中读取第一个数据块并计算出第一个数据块的CRC,从待发送数据中读取第一个数据块对应的PI;在第一个数据块的CRC和第一个数据块对应的PI相等时,从待发送数据中读取第二个数据块并计算出第二个数据块的CRC;在第二个数据块的CRC和第二个数据块对应的PI相等时,按上述读取第二个数据块的方式执行继续从待发送数据中读取数据块和PI,直至在第x个数据块的CRC和第x个数据块对应的PI相等时,将第一个数据块、第二个数据块、……、第x个数据块组成RDMA报文的净荷部分,该净荷部分的长度为L1;在该净荷部分之前添加报文头以及在该净荷部分之后添加校验部分形成第一个RDMA报文,第一个RDMA报文的报文头包括起始报文的序号,通过网卡的网口向接收端发送第一个RDMA报文。
在发送完第一个RDMA报文后,网卡的处理模块继续从待发送数据中读取第x+1个数据块并计算出第x+1个数据块的CRC,从待发送数据中读取第x+1个数据块对应的PI;在第x+1个数据块的CRC和第x+1个数据块对应的PI相等时,从待发送数据中读取第x+2个数据块并计算出第x+2个数据块的CRC;在第x+2个数据块的CRC和第x+2个数据块对应的PI相等时,按上述处理第x+2个数据块的方式执行继续从待发送数据中读取数据块和PI,直至在第2x个数据块的CRC和第2x个数据块对应的PI相等时,将第x+1个数据块、第x+2个数据块、……、第2x个数据块组成RDMA报文的净荷部分,该净荷部分的长度为L1;增加第一个RDMA报文的序号得到第二个RDMA报文的序号,在该净荷部分之前添加报文头以及在该净荷部分之后添加校验部分形成第二个RDMA报文,第二个RDMA报文的报文头包括第二个RDMA报文的序号,通过网卡的网口向接收端发送第二个RDMA报文。
网卡的处理模块按上述封装第二个RDMA报文的方式,继续从待发送数据中读取第2x+1个数据块和第2x+1个数据块对应的PI、第2x+2个数据块和第2x+2个数据块对应的PI、……、第3x个数据块和第3x个数据块对应的PI,并按上述封装第二个RDMA报文的方式将第2x+1个数据块、第2x+2个数据块、……、第3x个数据块封装成第三个RDMA报文,通过网卡的网口向接收端发送第三个RDMA报文。然后继续按上述得到第三个RDMA报文的方式读取数据块和数据块对应的PI,直至将待发送数据中的最后一个数据块和最后一个数据块对应的PI封装成RDMA报文并发送至接收端时为止。
(3):在该标准净荷长度L1大于待发送数据中的数据块的长度L2以及待发送数据不包括数据块对应的PI时,将待发送数据中连续的x个数据块封装成一个RDMA报文,x=L1/L2,发送该RDMA报文。
在本步骤中,网卡中的处理模块可以从待发送数据中读取第一个数据块、第二个数据块、……、第x个数据块,将第一个数据块、第二个数据块、……、第x个数据块组成RDMA报文的净荷部分,该净荷部分的长度为L1;在该净荷部分之前添加报文头以及在该净荷部分之后添加校验部分形成第一个RDMA报文,第一个RDMA报文的报文头包括起始报文的序号,通过网卡的网口向接收端发送第一个RDMA报文。
在发送完第一个RDMA报文后,网卡的处理模块继续从待发送数据中读取第x+1个数据块、第x+2个数据块、……、第2x个数据块,增加第一个RDMA报文的序号得到第二个RDMA报文的序号,将第x+1个数据块、第x+2个数据块和、……、第2x个数据块组成RDMA报文的净荷部分,该净荷部分的长度为L1;在该净荷部分之前添加报文头以及在该净荷部分之后添加校验部分形成第二个RDMA报文,第二个RDMA报文的报文头包括第二个RDMA报文的序号,通过网卡的网口向接收端发送第二个RDMA报文。然后继续按封装第二个RDMA报文的方式读取数据块,直至将待发送数据中的最后一个数据块封装成RDMA报文并发送至接收端时为止。
(4):在该标准净荷长度L1小于或等于待发送数据中的数据块的长度L2以及待发送数据包括数据块对应的PI时,将待发送数据中的一个数据块封装成y个RDMA报文,y=L2/L1,发送该y个RDMA报文。
在本步骤中,网卡中的处理模块可以从待发送数据中起始位置读取长度为L1的数据,以及根据该L1的数据计算得到第一个CRC,将该长度为L1的数据作为RDMA报文的净荷部分,在该净荷部分之前添加报文头以及在该净荷部分之后添加校验部分形成第一个RDMA报文,第一个RDMA报文的报文头包括起始报文的序号,通过网卡的网口向接收端发送第一个RDMA报文。继续从待发送数据中读取长度为L1的数据,以及根据该L1的数据和第一个CRC计算得到第二个CRC,将该长度为L1的数据作为RDMA报文的净荷部分,增加第一个RDMA报文的序号得到第二个RDMA报文的序号,在该净荷部分之前添加报文头以及在该净荷部分之后添加校验部分形成第二个RDMA报文,第二个RDMA报文的报文头包括第二个RDMA报文的序号,通过网卡的网口向接收端发送第二个RDMA报文;继续按上述生成并发送第三个RDMA报文和计算第三个CRC,生成并发送第四个RDMA报文和计算第四个CRC、直至生成并发送第y-1个RDMA报文和计算第y-1个CRC值。然后网卡中的处理模块可以从待发送数据中的剩余数据读取长度为L1的数据,如此读取完第一个数据块,根据该L1的数据和第y-1个CRC计算得到第一个数据块对应的CRC。网卡中的处理模块可以从待发送数据中的剩余数据中读取L3字节的数据,该L3字节的数据为第一个数据块对应的PI,在第一个数据块对应的CRC值和PI相等时,增加第y-1个RDMA报文的序号得到第y个RDMA报文的序号,将该长度为L1的数据组成第y个RDMA报文的净荷部分,在该净荷部分之前添加报文头以及在该净荷部分之后添加校验部分形成第y个RDMA报文,第y个RDMA报文的报文头包括第y个RDMA报文的序号,通过网卡的网口向接收端发送第y个RDMA报文。
网卡中的处理模块继续从待发送数据读取长度为L1的数据,以及根据该L1的数据计算得到第一个CRC,将该长度为L1的数据作为RDMA报文的净荷部分,增加最近上一次发送的RDMA报文的序号得到第一个RDMA报文的序号,在该净荷部分之前添加报文头以及在该净荷部分之后添加校验部分形成第一个RDMA报文,第一个RDMA报文的报文头包括起始报文的序号,通过网卡的网口向接收端发送第一个RDMA报文。继续从待发送数据中读取长度为L1的数据,以及根据该L1的数据和第一个CRC计算得到第二个CRC,将该长度为L1的数据作为RDMA报文的净荷部分,增加第一个RDMA报文的序号得到第二个RDMA报文的序号,在该净荷部分之前添加报文头以及在该净荷部分之后添加校验部分形成第二个RDMA报文,第二个RDMA报文的报文头包括第二个RDMA报文的序号,通过网卡的网口向接收端发送第二个RDMA报文;继续按上述生成并发送第三个RDMA报文和计算第三个CRC,生成并发送第四个RDMA报文和计算第四个CRC、直至生成并发送第y-1个RDMA报文和计算第y-1个CRC值。然后网卡中的处理模块可以从待发送数据中的剩余数据读取长度为L1的数据,如此读取完第二个数据块,根据该L1的数据和第y-1个CRC计算得到第二个数据块对应的CRC。网卡中的处理模块可以从待发送数据中的剩余数据中读取L3字节的数据,该L3字节的数据为第二个数据块对应的PI,在第二个数据块对应的CRC值和PI相等时,增加第y-1个RDMA报文的序号得到第y个RDMA报文的序号,将该长度为L1的数据组成第y个RDMA报文的净荷部分,在该净荷部分之前添加报文头以及在该净荷部分之后添加校验部分形成第y个RDMA报文,第y个RDMA报文的报文头包括第y个RDMA报文的序号,通过网卡的网口向接收端发送第y个RDMA报文。继续执行上述对第二个数据块执行的过程,将待发送数据中的其他每个数据块封装置成RDMA报文并发送给接收端。
(5):在该标准净荷长度L1小于或等于待发送数据中的数据块的长度L2以及待发送数据不包括数据块对应的PI时,获取待发送数据中的一个数据块封装成y个RDMA报文,y=L2/L1,发送该y个RDMA报文。
在本步骤中,网卡中的处理模块可以从待发送数据中起始位置读取长度为L1的数据,将该长度为L1的数据作为RDMA报文的净荷部分,在该净荷部分之前添加报文头以及在该净荷部分之后添加校验部分形成第一个RDMA报文,第一个RDMA报文的报文头包括起始报文的序号,通过网卡的网口向接收端发送第一个RDMA报文。继续从待发送数据中读取长度为L1的数据,将该长度为L1的数据作为RDMA报文的净荷部分,增加第一个RDMA报文的序号得到第二个RDMA报文的序号,在该净荷部分之前添加报文头以及在该净荷部分之后添加校验部分形成第二个RDMA报文,第二个RDMA报文的报文头包括第二个RDMA报文的序号,通过网卡的网口向接收端发送第二个RDMA报文;继续按上述生成并发送第三个RDMA报文,生成并发送第四个RDMA报文、直至生成并发送第y个RDMA报文,实现发送完第一个数据块。
网卡中的处理模块继续从待发送数据中读取长度为L1的数据,将该长度为L1的数据作为RDMA报文的净荷部分,增加最近上一次发送的RDMA报文的序号得到第一个RDMA报文的序号,在该净荷部分之前添加报文头以及在该净荷部分之后添加校验部分形成第一个RDMA报文,第一个RDMA报文的报文头包括第一个RDMA报文的序号,通过网卡的网口向接收端发送第一个RDMA报文。继续从待发送数据中读取长度为L1的数据,将该长度为L1的数据作为RDMA报文的净荷部分,增加第一个RDMA报文的序号得到第二个RDMA报文的序号,在该净荷部分之前添加报文头以及在该净荷部分之后添加校验部分形成第二个RDMA报文,第二个RDMA报文的报文头包括第二个RDMA报文的序号,通过网卡的网口向接收端发送第二个RDMA报文;继续按上述生成并发送第三个RDMA报文,生成并发送第四个RDMA报文、直至生成并发送第y个RDMA报文,实现发送完第二个数据块。然后网卡中的处理模块继续执行上述对第二个数据块执行的过程,将待发送数据中的其他每个数据块封装置成RDMA报文并发送给接收端。
在本申请实施例中,在确定的标准净荷长度L1大于数据块的长度L2时,将待发送数据封装成多个RDMA报文后,每个RDMA报文的净荷部分中均包括x个数据块和每个数据块对应的PI,x=L1/L2,即每个RDMA报文中的净荷部分的结构相同,降低接收端处理RDMA报文的难度,从而降低处理RDMA报文的耗时以及减少处理RDMA报文所需要的硬件资源。在确定的标准净荷长度L1小于或等于数据块的长度L2时,将数据块和数据块对应的PI封装成y个RDMA报文,RDMA报文中的净荷部分的结构间隔y个RDMA报文进行循环变化,y=L2/L1,每个循环中的前y-1个报文的净荷部分结构相同,以及每个循环中的第y个报文的净荷部分结构相同,从而只需要两个处理逻辑就可以处理所有的RDMA报文,降低接收端处理报文的难度,从而降低处理RDMA报文的耗时以及减少处理RDMA报文所需要的硬件资源。
参见图4-1,本申请实施例提供了一种接收数据的方法,该方法可以应用于上述任一实施例中的接收端的网卡。其中发送端通过RDMA报文将待发送数据发送至接收端,一个RDMA报文包括待发送数据中的一个或多个数据块,或者,多个RDMA报文包括待发送数据中的一个数据块,这样接收端从接收的RDMA报文中获取数据块,将获取的数据块组成目标数据,目标数据可以与待发送数据相同,该接收方法包括:
步骤401:获取发送端的IO配置信息,该IO配置信息包括起始报文的序号、待发送数据中的数据块的长度L2、用于指示RDMA报文中是否包括PI的第一指示信息、用于指示待发送数据中是否包括PI的第二指示信息等内容。
可选的,在待发送数据中的数据块长度为4k时,该IO信息还包括元数据与PI之间的位置关系信息。
网卡的处理模块可以获取发送端的IO配置信息,获取过程可以为:
在发送端发送该IO配置信息的存储地址信息时,处理模块通过网卡的网口接收发送端发送的send消息,该send消息包括该IO配置信息的存储地址信息,该存储址地信息包括该IO配置信息所在的存储区的起始位置和在该存储区中的偏移量,该存储区位于发送端中;处理模块根据该存储地址信息通过网卡的网口从发送端中读取该IO配置信息。或者,在发送端直接发送该IO配置信息时,处理模块通过网卡的网口直接接收该IO配置信息。
可选的,处理模块获取到该IO配置信息后,可以先将该IO配置信息保存在网卡的第二存储器中。
步骤402:确定RDMA报文的标准净荷长度L1,然后根据起始报文的序号接收来自发送端的RDMA报文。
可选的,确定RDMA报文的标准净荷长度L1的操作可以为:
在发送端和接收端位于同一个局域网或私有网络时,确定的标准净荷长度L1可以为预设长度,该预设长度可以为4k、2k或1k等。在发送端和接收端不在同一个局域网或私有网络时,根据公网允许的最大传输单元的长度确定标准净荷长度L1,标准净荷长度L1小于公网允许的最大传输单元的长度。其中,公网允许的最大传输单元的长度为1500,所以确定的标准净荷长度L1可以为1k等。
可选的,该RDMA报文包括报文头、净荷部分和校验部分,报文头中包括该RDMA报文的序号。
在本步骤中,网卡的处理模块可以通过网卡的网口接收发送端发送的RDMA报文,从该RDMA报文的报文头中提取该RDMA报文的序号,如果该RDMA报文是首次接收的报文,则比较该RDMA报文的序号和起始报文的序号,如果两者相同,则对该RDMA报文执行后续操作,如果两者不同,则表明发送端发送的RDMA报文在传输的过程出错,丢弃该RDMA报文并停止继续接收发送端的RDMA报文。如果该RDMA报文不是首次接收的RDMA报文,则判断该RDMA报文的序号和最近上次接收的RDMA报文的序号是否连续,如果两者连续,则对该RDMA报文执行后续操作,如果两者不连续,则表明发送端发送的RDMA报文在传输的过程出错,丢弃该RDMA报文并停止继续接收发送端的RDMA报文。
该RDMA报文的序号是在最近上次接收的RDMA报文的序号的基础上生成的,例如,在最近上次接收的RDMA报文的序号的基础上增加1得到该RDMA报文的序号,所以在该RDMA报文的序号和最近上次接收的RDMA报文的序号之间的差值为1时,可以判断出该RDMA报文的序号和最近上次接收的RDMA报文的序号连续。
步骤403:在根据第一指示信息确定RDMA报文中包括PI时,判断该标准净荷长度L1是否大于待发送数据中的数据块的长度L2,以及判断待发送数据是否包括数据块对应的PI。
该标准净荷长度L1是待发送数据中的数据块的长度L2的整数倍。或者,待发送数据中的数据块的长度L2是该标准净荷长度L1的整数倍。
在本步骤中:网卡中的处理模块从网卡的第二存储器中读取IO配置信息,该IO配置信息中包括待发送数据中的数据块的长度L2、起始报文的序号、第一指示信息和第二指示信息。根据第一指示信息确定接收的RDMA报文中是否包括PI,在确定出该RDMA报文中包括PI时,比较该标准净荷长度L1和数据块的长度L2,以及根据第二指示信息判断待发送数据中是否包括每个数据块对应的PI。
步骤404:在该标准净荷长度L1大于待发送数据中的数据块的长度L2以及待发送数据包括数据块对应的PI时,该RDMA报文包括待发送数据中的x个数据块和该x个数据块中的每个数据块对应的PI,x=L1/L2,从该RDMA报文中获取该x个数据块和每个数据块对应的PI。
在本步骤中,网卡的处理模块可以去除该RDMA报文的RDMA报文头和校验部分得到该RDMA报文的净荷部分,从该净荷部分的起始位置读取长度为L2的数据得到第一个数据块,并根据第一个数据块计算出第一个数据块的CRC,从该净荷部分中读取L3个字节的数据得到第一个数据块对应的PI,在第一个数据块的CRC和第一个数据块对应的PI相等时,通过网卡的通信接口向接收端的处理器发送第一个数据块和第一个数据对应的PI。
处理模块继续从该净荷部分读取长度为L2的数据得到第二个数据块,并根据第二个数据块计算出第二个数据块的CRC,从该净荷部分中读取L3个字节的数据得到第二个数据块对应的PI,在第二个数据块的CRC和第二个数据块对应的PI相等时,通过网卡的通信接口向接收端的处理器发送第二个数据块和第二个数据对应的PI。处理模块继续执行该流程以及向接收端的处理器发送第三个数据块和第三个数据对应的PI、……、第x个数据块和第x个数据块对应的PI。
可选的,当通过步骤402的操作接收到位于该RDMA报文之后的下一个RDMA报文,按上述介绍的关于本步骤的详细实现过程对该下一个RDMA报文进行处理,在此不再详细说明。
可选的,接收端的处理器通过总线系统接收网卡发送的数据块和该数据块对应的PI,根据接收顺序将接收的数据块和数据块的PI组成目标数据,此时目标数据与待发送数据相同。在接收端为存储设备时,处理器可以将该目标数据存储在接收端的第一存储器中。在接收端不是存储设备时,处理器可以处理该目标数据。
可选的,在接收端为存储设备时,网卡的处理模块也可以直接将获取的数据块和数据块对应的PI存储在第一存储器中。
其中,在某个数据块对应的CRC和该数据块对应的PI不等时,表明待发送数据出现数据错误,此时可以停止继续接收发送端的RDMA报文,并结束本实施例方法流程。
可选的,网卡的处理模块可能需要经过多次读取操作才能从该净荷部分中读取一个数据块,且经过多次计算CRC的操作才能计算出该数据块的CRC,其中,多次读取的数据的总长度等于数据块的长度L2。详细说明如下:
网卡的处理模块在从该净荷部分中读取第一个数据块时,从该净荷部分的起始位置处进行第一次读取数据,根据第一次读取的数据进行第一次计算得到CRC,设置目标数据长度为第一次读取的数据长度;继续从该净荷部分中进行第二次读取数据,根据第二次读取的数据和第一次计算的CRC进行第二次计算得到CRC,给目标数据长度增加第二次读取的数据长度;继续从该净荷部分中进行第三次读取数据,根据第三次读取的数据和第二次计算的CRC进行第三次计算得到CRC;……;从该净荷部分中进行第P次读取数据,根据第P次读取的数据和第P-1次计算的CRC进行第P次计算得到CRC,给目标数据长度增加第P次读取的数据长度,P=4、5、6……;当增加后的目标数据长度等于L2时,表明从该净荷部分中读取到第一个数据块且第P次计算的CRC为第一个数据块对应的CRC;继续从该净荷部分中读取L3字节的数据,该L3字节的数据为第一个数据块对应的PI。
然后,网卡的处理模块继续从该净荷部分中的剩余数据中经过多次读取得到第二个数据块,该多次读取的过程为:处理模块从该剩余数据中进行第一次读取数据,根据第一次读取的数据进行第一次计算得到CRC,设置目标数据长度为第一次读取的数据长度;继续从该净荷部分中进行第二次读取数据,根据第二次读取的数据和第一次计算的CRC进行第二次计算得到CRC,给目标数据长度增加第二次读取的数据长度;……;从该净荷部分中进行第P次读取数据,根据第P次读取的数据和第P-1次计算的CRC进行第P次计算得到CRC,给目标数据长度增加第P次读取的数据长度;当增加后的目标数据长度等于L2时,表明从该净荷部分中读取到第二个数据块且第P次计算的CRC为第二个数据块对应的CRC;继续从该净荷部分中读取L3字节的数据,该L3字节的数据为第二个数据块对应的PI。重复上述获取第二个数据块的过程直至读取完该净荷部分。
例如,参见图3-2,假设待发送数据中的数据块长度L2为512,以及假设确定的标准净荷长度L1为1k,这样x为2。假设接收到图3-2所示的第一个RDMA报文B1,第一个RDMA报文B1的净荷部分包括第一个数据块A1和第一个数据块A1对应的PI1以及第二个数据块A2和第二个数据块A2对应的PI2;去除第一个RDMA报文的报文头和检验部分得到第一个RDMA报文的净荷部分,从第一个RDMA报文的净荷部分的起始位置读取512个字节的数据得到第一个数据块A1并根据第一个数据块A1计算出第一个数据块对应的CRC1,继续从第一个RDMA报文的净荷部分中读取L3个字节的数据得到第一数据块对应的PI1,在第一个数据块A1对应的CRC1等于第一个数据块A1对应的PI1时,向接收端的处理器发送第一个数据块A1和第一个数据块A1对应的PI1。继续从第一个RDMA报文的净荷部分中读取512个字节的数据得到第二个数据块A2并根据第二个数据块A2计算出第二个数据块A2对应的CRC2,继续从第一个RDMA报文的净荷部分中读取L3个字节的数据得到第二数据块A2对应的PI2,在第二个数据块A2对应的CRC2等于第二个数据块A2对应的PI2时,向接收端的处理器发送第二个数据块A2和第一个数据块A2对应的PI2。
当网卡的处理模块通过网口接收到第二个RDMA报文B2时,第二个RDMA报文B2的净荷部分包括第三个数据块A3和第三个数据块A3对应的PI3以及第四个数据块A4和第四个数据块A4对应的PI4;去除第二个RDMA报文B2的报文头和检验部分得到第二个RDMA报文B2的净荷部分,从第二个RDMA报文B2的净荷部分的起始位置读取512个字节的数据得到第三个数据块A3并根据第三个数据块A3计算出第三个数据块A3对应的CRC3,继续从第二个RDMA报文B2的净荷部分中读取L3个字节的数据得到第三数据块A3对应的PI3,在第三个数据块A3对应的CRC3等于第三个数据块A3对应的PI3时,向接收端的处理器发送第三个数据块A3和第三个数据块A3对应的PI3。继续从第二个RDMA报文B2的净荷部分中读取512个字节的数据得到第四个数据块A4并根据第四个数据块A4计算出第四个数据块A4对应的CRC4,继续从第二个RDMA报文B2的净荷部分中读取L3个字节的数据得到第四数据块A4对应的PI4,在第四个数据块A4对应的CRC4等于第四个数据块A4对应的PI4时,向接收端的处理器发送第四个数据块A4和第四个数据块A4对应的PI4。当接收到图3-2中的第三个RDMA报文B3和第四个RDMA报文B4时,分别对第三个RDMA报文B3和第四RDMA报文B4分别执行上述操作,以将待发送数据中的八个数据块A1、A2、……、A8和该八个数据块的PI1、PI2、……、PI8发送给接收端的处理器。
处理模块通过网卡的通信接口将数据块和PI发送在总线系统上,处理器从该总线系统上接收该数据块和PI,根据接收顺序将接收的数据块和PI组成目标数据,该目标数据和图1-3所示的待发送数据相同。
还例如,假设确定的标准净荷长度L1为2k,这样x=4,假设接收到图3-3所示的第一个RDMA报文C1,第一个RDMA报文C1的净荷部分包括第一个数据块A1、第一个数据块A1对应的PI1、第二个数据块A2、第二个数据块A2对应的PI2、第三个数据块A3、第三个数据块A3对应的PI3、第四个数据块A4和第四个数据块A4对应的PI4。去除第一个RDMA报文C1的报文头和检验部分得到第一个RDMA报文C1的净荷部分,从第一个RDMA报文C1的净荷部分的起始位置读取512个字节的数据得到第一个数据块A1并根据第一个数据块A1计算出第一个数据块对应的CRC1,继续从第一个RDMA报文的净荷部分中读取L3个字节的数据得到第一数据块对应的PI1,在第一个数据块A1对应的CRC1等于第一个数据块A1对应的PI1时,向接收端的处理器发送第一个数据块A1和第一个数据块A1对应的PI1。继续从第一个RDMA报文C1的净荷部分中读取512个字节的数据得到第二个数据块A2并根据第二个数据块A2计算出第二个数据块A2对应的CRC2,继续从第一个RDMA报文C1的净荷部分中读取L3个字节的数据得到第二个数据块A2对应的PI2,在第二个数据块A2对应的CRC2等于第二个数据块A2对应的PI2时,向接收端的处理器发送第二个数据块A2和第一个数据块A2对应的PI2。当接收到图3-3中的第二个RDMA报文C2,对第二个RDMA报文C2执行上述操作,以将待发送数据中的八个数据块A1、A2、……、A8和该八个数据块的PI1、PI2、……、PI8发送给接收端的处理器。
处理模块通过网卡的通信接口将数据块和PI发送在总线系统上,处理器从该总线系统上接收该数据块和PI,根据接收顺序将接收的数据块和PI组成目标数据,该目标数据和图1-3所示的待发送数据相同。
步骤405:在该标准净荷长度L1大于待发送数据中的数据块的长度L2以及待发送数据不包括数据块对应的PI时,该RDMA报文包括待发送数据中的x个数据块和该x个数据块中的每个数据块对应的PI,x=L1/L2,从该RDMA报文中获取该x个数据块。
在本步骤中,网卡的处理模块可以去除该RDMA报文的报文头和校验部分得到该RDMA报文的净荷部分,从该净荷部分的起始位置读取长度为L2的数据得到第一个数据块,并根据第一个数据块计算出第一个数据块的CRC,从该净荷部分中读取L3个字节的数据得到第一个数据块对应的PI,在第一个数据块的CRC和第一个数据块对应的PI相等时,通过网卡的通信接口向接收端的处理器发送第一个数据块。
处理模块继续从该净荷部分读取长度为L2的数据得到第二个数据块,并根据第二个数据块计算出第二个数据块的CRC,从该净荷部分中读取L3个字节的数据得到第二个数据块对应的PI,在第二个数据块的CRC和第二个数据块对应的PI相等时,通过网卡的通信接口向接收端的处理器发送第二个数据块。处理模块继续执行上述操作向接收端的处理器发送第三个数据块、……、第x个数据块。
可选的,当网卡的处理模块接收到位于该RDMA报文之后的下一个RDMA报文,处理模块按上述处理该RDMA报文的相同方式仍对该下一个RDMA报文进行处理,在此不再详细说明。
其中,在某个数据块对应的CRC和该数据块对应的PI不等时,表明待发送数据在传输的过程出现数据错误,此时可以停止继续接收发送端的RDMA报文,并结束本实施例方法流程。
可选的,网卡的处理模块可能需要经过多次读取操作才能从该净荷部分中读取一个数据块,且经过多次计算CRC的操作才能计算出该数据块的CRC,其中,多次读取的数据的总长度等于数据块的长度L2。详细实现过程可以参见上述步骤404中的相关内容,在此不再详细说明。
例如,参见图3-2,假设待发送数据中的数据块长度L2为512,以及假设确定的标准净荷长度L1为1k,这样x为2。假设接收到图3-2所示的第一个RDMA报文B1,第一个RDMA报文B1的净荷部分包括第一个数据块A1和第一个数据块A1对应的PI1以及第二个数据块A2和第二个数据块A2对应的PI2;去除第一个RDMA报文B1的报文头和检验部分得到第一个RDMA报文B1的净荷部分,从第一个RDMA报文B1的净荷部分的起始位置读取512个字节的数据得到第一个数据块A1并根据第一个数据块A1计算出第一个数据块对应的CRC1,继续从第一个RDMA报文的净荷部分中读取L3个字节的数据得到第一数据块对应的PI1,在第一个数据块A1对应的CRC1等于第一个数据块A1对应的PI1时,向接收端的处理器发送第一个数据块A1。继续从第一个RDMA报文的净荷部分中读取512个字节的数据得到第二个数据块A2并根据第二个数据块A2计算出第二个数据块A2对应的CRC2,继续从第一个RDMA报文的净荷部分中读取L3个字节的数据得到第二数据块A2对应的PI2,在第二个数据块A2对应的CRC2等于第二个数据块A2对应的PI2时,向接收端的处理器发送第二个数据块A2。当接收到图3-2中的第二个RDMA报文B2、第三个RDMA报文B3和第四RDMA报文B4时,分别对第二个RDMA报文B1、第三个RDMA报文B2和第四RDMA报文B3分别执行上述操作,以将待发送数据中的八个数据块A1、A2、……、A8发送给接收端的处理器。
处理模块通过网卡的通信接口将数据块发送在总线系统上,处理器从该总线系统上接收该数据块,根据接收顺序将接收的数据块组成目标数据,该目标数据和图1-2所示的待发送数据相同。
还例如,假设确定的标准净荷长度L1为2k,这样x=4,假设接收到图3-3所示的第一个RDMA报文C1,第一个RDMA报文C1的净荷部分包括第一个数据块A1、第一个数据块A1对应的PI1、第二个数据块A2、第二个数据块A2对应的PI2、第三个数据块A3、第三个数据块A3对应的PI3、第四个数据块A4和第四个数据块A4对应的PI4。去除第一个RDMA报文C1的报文头和检验部分得到第一个RDMA报文C1的净荷部分,从第一个RDMA报文C1的净荷部分的起始位置读取512个字节的数据得到第一个数据块A1并根据第一个数据块A1计算出第一个数据块对应的CRC1,继续从第一个RDMA报文C1的净荷部分中读取L3个字节的数据得到第一数据块A1对应的PI1,在第一个数据块A1对应的CRC1等于第一个数据块A1对应的PI1时,向接收端的处理器发送第一个数据块A1。继续从第一个RDMA报文C1的净荷部分中读取512个字节的数据得到第二个数据块A2并根据第二个数据块A2计算出第二个数据块A2对应的CRC2,继续从第一个RDMA报文C1的净荷部分中读取L3个字节的数据得到第二数据块A2对应的PI2,在第二个数据块A2对应的CRC2等于第二个数据块A2对应的PI2时,向接收端的处理器发送第二个数据块A2。继续从第一个RDMA报文C1的净荷部分中读取512个字节的数据得到第三个数据块A3并根据第三个数据块A3计算出第三个数据块A3对应的CRC3,继续从第一个RDMA报文C1的净荷部分中读取L3个字节的数据得到第三数据块A3对应的PI3,在第三个数据块A3对应的CRC3等于第三个数据块A3对应的PI3时,向接收端的处理器发送第三个数据块A3。继续从第一个RDMA报文C1的净荷部分中读取512个字节的数据得到第四个数据块A4并根据第四个数据块A4计算出第四个数据块A4对应的CRC4,继续从第一个RDMA报文的净荷部分中读取L3个字节的数据得到第四数据块A4对应的PI4,在第四个数据块A4对应的CRC4等于第四个数据块A4对应的PI4时,向接收端的处理器发送第四个数据块A4。当接收到图3-3中的第二个RDMA报文C2,对第二个RDMA报文C2执行上述操作,以将待发送数据中的八个数据块A1、A2、……、A8发送给接收端的处理器。处理模块通过网卡的通信接口将数据块发送在总线系统上,处理器从该总线系统上接收该数据块,根据接收顺序将接收的数据块组成目标数据,该目标数据和图1-2所示的待发送数据相同。
在标准净荷长度L1大于数据块的长度L2的情况下,封装的每个RDMA报文的净荷部分均包括x个数据块和每个数据块对应的PI,每个RDMA报文的净荷部分的结构相同,因此只需要一种处理逻辑就可以处理各RDMA报文,得到数据块和数据块对应的PI,从而降低了接收端对RDMA报文进行处理的难度,减小了处理RDMA报文的耗时。
步骤406:在该标准净荷长度L1小于或等于待发送数据中的数据块的长度L2以及待发送数据包括数据块对应的PI时,从连续接收的同一个数据块对应的y个RDMA报文中获取该数据块和该数据块对应的PI,y=L2/L1。
在本步骤中,网卡中的处理模块当接收到起始报文时将该起始报文作为第一个数据块的第一个RDMA报文,去除第一个RDMA报文的报文头和校验部分得到第一个RDMA报文的净荷部分,第一个RDMA报文的净荷部分为第一个数据块中的长度为L1+L3/y的数据,根据该L1+L3/y的数据计算得到第一个CRC;当接收到下一个RDMA报文时,将该RDMA报文作为第一个数据块的第二个RDMA报文,去除第二个RDMA报文的报文头和校验部分得到第二个RDMA报文的净荷部分,第二个RDMA报文的净荷部分为第一个数据块中的长度为L1+L3/y的数据,根据该长度为L1+L3/y的数据和第一个CRC计算得到第二个CRC;按上述对第二个RDMA报文执行的操作,继续对第一个数据块的第三个RDMA报文、……、第y-1个RDMA报文进行相同处理,直至接收到第一个数据块的第y个RDMA报文;去除第y个RDMA报文的报文头和校验部分得到第y个RDMA报文的净荷部分,从第y个RDMA报文的净荷部分的起始位置读取长度为L1+L3/y-L3的数据,将已得到的第一个数据块的y-1个长度为L1+L3/y的数据和该长度为L1+L3/y-L3的数据组成第一个数据块;根据该长度为L1+L3/y-L3的数据和第y-1个CRC计算第一个数据块对应的CRC,继续从第y个RDMA报文的净荷部分中读取剩余的L3个字节的数据得到第一个数据块对应的PI,在第一个数据块对应的PI和第一个数据块对应的CRC相等时,向接收端的处理器发送第一个数据块和第一个数据块对应的PI。
网卡中的处理模块当接收到下一个RDMA报文时将该RDMA报文作为第二个数据块的第一个RDMA报文,去除第一个RDMA报文的报文头和校验部分得到第一个RDMA报文的净荷部分,第一个RDMA报文的净荷部分为第二个数据块中的长度为L1+L3/y的数据,根据该长度为L1+L3/y的数据计算得到第一个CRC;当接收到下一个RDMA报文时,将该RDMA报文作为第二个数据块的第二个RDMA报文,去除第二个RDMA报文的报文头和校验部分得到第二个RDMA报文的净荷部分,第二个RDMA报文的净荷部分为第二个数据块中的长度为L1+L3/y的数据,根据该长度为L1+L3/y的数据和第一个CRC计算得到第二个CRC;按上述对第二个RDMA报文执行的操作,继续对第二个数据块的第三个RDMA报文、……、第y-1个RDMA报文进行相同处理,直至接收到第二个数据块的第y个RDMA报文;去除第y个RDMA报文的报文头和校验部分得到第y个RDMA报文的净荷部分,从第y个RDMA报文的净荷部分的起始位置读取长度为L1+L3/y-L3的数据,将已得到的第二个数据块的y-1个长度为L1+L3/y的数据和该长度为L1+L3/y-L3的数据组成第二个数据块;根据该长度为L1+L3/y-L3的数据和第y-1个CRC计算第二个数据块对应的CRC,继续从第y个RDMA报文的净荷部分中读取剩余的L3个字节的数据得到第二个数据块对应的PI,在第二个数据块对应的PI和第二个数据块对应的CRC相等时,向接收端的处理器发送第二个数据块和第二个数据块对应的PI。按上述读取到第二个数据块的相同方式继续接收RDMA报文并向接收端的处理器发送待发送数据的第三个数据块和第三个数据块对应的PI、第四个数据块和第四个数据块对应的PI。当接收到第三个RDMA报文时重复上述对第二个RDMA报文执行的过程对第三个RDMA报文进行处理。
网卡的处理模块通过网卡的通信接口在总线系统上发送数据块和PI,处理器从该总线系统上接收该数据块和PI,根据接收顺序将接收的数据块和PI组成目标数据,该目标数据和发送端发送的待发送数据相同。
可选的,当待发送数据中的数据块的长度为4k时,标准净荷长度L1通常小于或等于数据块的长度L2,网卡的第二存储器中存储的IO配置信息中还包括数据块对应的元数据和PI之间的位置关系信息。网卡的处理模块可以根据该位置关系信息,确定数据块对应的元数据和PI之间的位置关系。
可选的,在确定数据块对应的PI位于该数据块对应的元数据的左侧时,从连续接收的同一个数据块对应的y个RDMA报文中获取该数据块和该数据块对应的PI。
例如,假设确定的净荷长度为1k,这样y为4。如图3-4所示,网卡中的处理模块当接收到起始报文时将该起始报文作为第一个数据块A1的第一个RDMA报文11,去除第一个RDMA报文11的报文头和校验部分得到第一个RDMA报文11的净荷部分,第一个RDMA报文11的净荷部分为第一个数据块A1中的1k+L3/4个字节的数据,根据该1k+L3/4个字节的数据计算得到第一个CRC;当接收到下一个RDMA报文时,将该RDMA报文作为第一个数据块A1的第二个RDMA报文12,去除第二个RDMA报文12的报文头和校验部分得到第二个RDMA报文12的净荷部分,第二个RDMA报文12的净荷部分为第一个数据块A1中的1k+L3/4个字节的数据,根据该1k+L3/4个字节的数据和第一个CRC计算得到第二个CRC;按上述对第二个RDMA报文12执行的操作,继续对第一个数据块A1的第三个RDMA报文13进行相同处理,当接收到第一个数据块A1的第四个RDMA报文14;去除第四个RDMA报文14的报文头和校验部分得到第四个RDMA报文14的净荷部分,从第四个RDMA报文14的净荷部分的起始位置读取1k+L3/4-L3个字节的数据,将已得到的第一个数据块A1中的3个1k+L3/4个字节的数据和该1k+L3/4-L3个字节的数据组成第一个数据块A1,第一个数据块A1的长度为4k;根据该1k+L3/4-L3个字节的数据和第三个CRC计算第一个数据块A1对应的CRC,继续从第四个RDMA报文14的净荷部分中读取剩余的L3个字节的数据得到第一个数据块A1对应的PI,在第一个数据块A1对应的PI和第一个数据块A1对应的CRC相等时,向接收端的处理器发送第一个数据块A1和第一个数据块A1对应的PI。
网卡中的处理模块当接收到下一个RDMA报文时将该RDMA报文作为第二个数据块A2的第一个RDMA报文21,去除第一个RDMA报文21的报文头和校验部分得到第一个RDMA报文21的净荷部分,第一个RDMA报文21的净荷部分为第二个数据块A2中的1k+L3/4个字节的数据,根据该1k+L3/4个字节的数据计算得到第一个CRC;当接收到下一个RDMA报文时,将该RDMA报文作为第二个数据块A2的第二个RDMA报文22,去除第二个RDMA报文22的报文头和校验部分得到第二个RDMA报文22的净荷部分,第二个RDMA报文22的净荷部分为第二个数据块A2中的1k+L3/4个字节的数据,根据该1k+L3/4个字节的数据和第一个CRC计算得到第二个CRC;按上述对第二个RDMA报文22执行的操作,继续对第二个数据块A2的第三个RDMA报文23进行相同处理,当接收到第二个数据块A2的第四个RDMA报文24;去除第四个RDMA报文24的报文头和校验部分得到第四个RDMA报文24的净荷部分,从第四个RDMA报文24的净荷部分的起始位置读取1k+L3/4-L3个字节的数据,将已得到的第二个数据块A2的3个1k+L3/4个字节的数据和该1k+L3/4-L3个字节的数据组成第二个数据块A2,第二个数据块A2的长度为4k;根据该1k+L3/4-L3个字节的数据和第三个CRC计算第二个数据块A2对应的CRC,继续从第四个RDMA报文24的净荷部分中读取剩余的L3个字节的数据得到第二个数据块A2对应的PI,在第二个数据块A2对应的PI和第二个数据块对应的CRC相等时,向接收端的处理器发送第二个数据块A2和第二个数据块A2对应的PI。按上述读取第二个数据块A2的相同方式继续接收RDMA报文并向接收端的处理器发送待发送数据的第三个数据块A3和第三个数据块A3对应的PI、第四个数据块A3和第四个数据块A3对应的PI……。
网卡的处理模块通过网卡的通信接口在总线系统上发送数据块和PI,处理器从该总线系统上接收该数据块和PI,根据接收顺序将接收的数据块和PI组成目标数据,该目标数据和如图4-2所示的待发送数据相同。
可选的,在确定数据块对应的PI位于该数据块对应的元数据的右侧时,从连续接收的同一个数据块对应的y个RDMA报文中获取该数据块、该数据块对应的元数据和该数据块对应的PI。
例如,假设确定的净荷长度为1k,这样y为4。网卡中的处理模块当接收到起始报文时将该起始报文作为第一个数据块A1的第一个RDMA报文11,假设为图3-7中的起始报文,去除第一个RDMA报文11的报文头和校验部分得到第一个RDMA报文11的净荷部分,第一个RDMA报文11的净荷部分为第一个数据块A1中的1k+(L4+L3)/4个字节的数据,根据该1k+(L4+L3)/4个字节的数据计算得到第一个CRC;当接收到下一个RDMA报文时,将该RDMA报文作为第一个数据块A1的第二个RDMA报文12,去除第二个RDMA报文12的报文头和校验部分得到第二个RDMA报文12的净荷部分,第二个RDMA报文12的净荷部分为第一个数据块A1中的1k+(L4+L3)/4个字节的数据,根据该1k+(L4+L3)/4个字节的数据和第一个CRC计算得到第二个CRC;按上述对第二个RDMA报文12执行的操作,继续对第一个数据块A1的第三个RDMA报文13进行相同处理,当接收到第一个数据块A1的第四个RDMA报文14;去除第四个RDMA报文14的报文头和校验部分得到第四个RDMA报文14的净荷部分,从第四个RDMA报文14的净荷部分的起始位置读取1k+(L4+L3)/4-L3个字节的数据,将已得到的第一个数据块A1中的3个1k+(L4+L3)/4个字节的数据和该1k+(L4+L3)/4-L3个字节的数据组成第一个数据块A1和第一个数据块A1对应的元数据1,第一个数据块A1长度为4k,第一个数据块A1对应的元数据1的长度为L4;根据该1k+(L4+L3)/4-L3个字节的数据和第三个CRC计算第一个数据块A1对应的CRC,继续从第四个RDMA报文14的净荷部分中读取剩余的L3个字节的数据得到第一个数据块A1对应的PI,在第一个数据块A1对应的PI和第一个数据块A1对应的CRC相等时,向接收端的处理器发送第一个数据块A1、第一个数据块A1对应的元数据1和第一个数据块A1对应的PI。
网卡中的处理模块当接收到下一个RDMA报文时将该RDMA报文作为第二个数据块A2的第一个RDMA报文21,去除第一个RDMA报文21的报文头和校验部分得到第一个RDMA报文21的净荷部分,第一个RDMA报文21的净荷部分为第二个数据块A2中的1k+(L4+L3)/4个字节的数据,根据该1k+(L4+L3)/4个字节的数据计算得到第一个CRC;当接收到下一个RDMA报文时,将该RDMA报文作为第二个数据块A2的第二个RDMA报文22,去除第二个RDMA报文22的报文头和校验部分得到第二个RDMA报文22的净荷部分,第二个RDMA报文22的净荷部分为第二个数据块A2中的1k+(L4+L3)/4个字节的数据,根据该1k+(L4+L3)/4个字节的数据和第一个CRC计算得到第二个CRC;按上述对第二个RDMA报文22执行的操作,继续对第二个数据块A2的第三个RDMA报文23进行相同处理,当接收到第二个数据块A2的第四个RDMA报文24,去除第四个RDMA报文24的报文头和校验部分得到第四个RDMA报文24的净荷部分,从第四个RDMA报文24的净荷部分的起始位置读取1k+(L4+L3)/4-L3个字节的数据,将已得到的第二个数据块A2的3个1k+(L4+L3)/4个字节的数据和该1k+(L4+L3)/4-L3个字节的数据组成第二个数据块A2和第二个数据块A2对应的元数据2,第二个数据块A2的长度为4k;根据该1k+(L4+L3)/4-L3个字节的数据和第三个CRC计算第二个数据块A2对应的CRC,继续从第四个RDMA报文24的净荷部分中读取剩余的L3个字节的数据得到第二个数据块A2对应的PI,在第二个数据块A2对应的PI和第二个数据块A2对应的CRC相等时,向接收端的处理器发送第二个数据块A2、第二数据块A2对应的元数据2和第二个数据块A2对应的PI。按上述读取第二个数据块A2的相同方式继续接收RDMA报文并向接收端的处理器发送待发送数据的第三个数据块、第三个数据块对应的元数据和第三个数据块对应的PI、第四个数据块、第四个数据块对应的元数据和第四个数据块对应的PI……。
网卡的处理模块通过网卡的通信接口在总线系统上发送数据块、元数据和PI,处理器从该总线系统上接收该数据块、元数据和PI,根据接收顺序将接收的数据块、元数据和PI组成目标数据,该目标数据和如图1-5所示的待发送数据相同。
步骤407:在该标准净荷长度L1小于或等于待发送数据中的数据块的长度L2以及待发送数据不包括数据块对应的PI时,从连续接收的同一个数据块对应的y个RDMA报文中获取该数据块,y=L2/L1。
在本步骤中,网卡中的处理模块在接收到起始报文时将该起始报文作为第一个数据块的第一个RDMA报文,去除第一个RDMA报文的报文头和校验部分得到第一个RDMA报文的净荷部分,第一个RDMA报文的净荷部分为第一个数据块中的长度为L1+L3/y的数据,根据该L1+L3/y的数据计算得到第一个CRC;当接收到下一个RDMA报文时,将该RDMA报文作为第一个数据块的第二个RDMA报文,去除第二个RDMA报文的报文头和校验部分得到第二个RDMA报文的净荷部分,第二个RDMA报文的净荷部分为第一个数据块中的长度为L1+L3/y的数据,根据该L1+L3/y的数据计算得到第二个CRC;按上述对第二个RDMA报文执行的操作,继续对第一个数据块的第三个RDMA报文、……、第y-1个RDMA报文进行相同处理,直至接收到第一个数据块的第y个RDMA报文;去除第y个RDMA报文的报文头和校验部分得到第y个RDMA报文的净荷部分,从第y个RDMA报文的净荷部分的起始位置读取长度为L1+L3/y-L3的数据,将已得到的第一个数据块的y-1个长度为L1+L3/y的数据和该长度为L1+L3/y-L3的数据组成第一个数据块;根据该长度为L1+L3/y-L3的数据和第y-1个CRC计算第一个数据块对应的CRC,继续从第y个RDMA报文的净荷部分中读取剩余的L3个字节的数据得到第一个数据块对应的PI,在第一个数据块对应的PI和第一个数据块对应的CRC相等时,向接收端的处理器发送第一个数据块。
网卡中的处理模块在接收到下一个RDMA报文时将该RDMA报文作为第二个数据块的第一个RDMA报文,去除第一个RDMA报文的报文头和校验部分得到第一个RDMA报文的净荷部分,第一个RDMA报文的净荷部分为第一个数据块中的长度为L1+L3/y的数据,根据该L1+L3/y的数据计算得到第一个CRC;当接收到下一个RDMA报文时,将该RDMA报文作为第二个数据块的第二个RDMA报文,去除第二个RDMA报文的报文头和校验部分得到第二个RDMA报文的净荷部分,第二个RDMA报文的净荷部分为第二个数据块中的长度为L1+L3/y的数据,根据该L1+L3/y的数据计算得到第二个CRC;按上述对第二个RDMA报文执行的操作,继续对第二个数据块的第三个RDMA报文、……、第y-1个RDMA报文进行相同处理,直至接收到第二个数据块的第y个RDMA报文;去除第y个RDMA报文的报文头和校验部分得到第y个RDMA报文的净荷部分,从第y个RDMA报文的净荷部分的起始位置读取长度为L1+L3/y-L3的数据,将已得到的第二个数据块的y-1个长度为L1+L3/y的数据和该长度为L1+L3/y-L3的数据组成第二个数据块;根据该长度为L1+L3/y-L3的数据和第y-1个CRC计算第二个数据块对应的CRC,继续从第y个RDMA报文的净荷部分中读取剩余的L3个字节的数据得到第二个数据块对应的PI,在第二个数据块对应的PI和第二个数据块对应的CRC相等时,向接收端的处理器发送第二个数据块。按上述读取到第二个数据块的相同方式继续接收RDMA报文并向接收端的处理器发送待发送数据的第三个数据块、第四个数据块……。
在标准净荷长度L1小于或等于数据块的长度L2的情况下,每个数据块对应的前y-1个RDMA报文的净荷部分的结构均相同。每个数据块对应的第y个RDMA报文的净荷部分的结构也均相同。因此接收端只需要第一和第二种处理逻辑,通过第一种处理逻辑可以处理每个数据块的前y-1个RDMA报文,通过第二种处理逻辑可以处理每个数据块的第y个RDMA报文,从而降低了接收端对RDMA报文进行处理的难度,减小了处理RDMA报文的耗时。
可选的,在根据第一指示信息确定RDMA报文中不包括PI时,在此情况下每个RDMA报文的净荷部分的长度为L1,可以通过如下(1)至(5)的操作从RDMA报文中获取数据块,实现过程可以为:
(1):判断该标准净荷长度L1是否大于待发送数据中的数据块的长度L2,以及判断待发送数据是否包括数据块对应的PI。
(2):在该标准净荷长度L1大于待发送数据中的数据块的长度L2以及待发送数据包括数据块对应的PI时,该RDMA报文包括待发送数据中的x个数据块,x=L1/L2,从该RDMA报文中获取该x个数据块,然后再获取每个数据块对应的PI。
在本步骤中,网卡的处理模块可以去除该RDMA报文的报文头和校验部分得到该RDMA报文的净荷部分,从该净荷部分的起始位置读取长度为L2的数据得到第一个数据块,并根据第一个数据块计算出第一个数据块的CRC得到第一个数据块对应的PI,通过网卡的通信接口向接收端的处理器发送第一个数据块和第一个数据对应的PI。
处理模块继续从该净荷部分读取长度为L2的数据得到第二个数据块,并根据第二个数据块计算出第二个数据块的CRC得到第二个数据块对应的PI,通过网卡的通信接口向接收端的处理器发送第二个数据块和第二个数据对应的PI。处理模块继续执行该流程以及向接收端的处理器发送第三个数据块和第三个数据对应的PI、……、第x个数据块和第x个数据块对应的PI。
可选的,当接收到位于该RDMA报文之后的下一个RDMA报文,处理模块仍对该下一个RDMA报文执行上述操作,以将该下一个RDMA报文中的x个数据块和每个数据块对应的PI发送给处理器,在此不再详细说明。处理器接收数据块和PI,根据接收顺序将接收的数据块和PI组成目标数据,该目标数据与发送端的待发送数据相同。
可选的,网卡的处理模块可能需要经过多次读取操作才能从该净荷部分中读取一个数据块,且经过多次计算CRC的操作才能计算出该数据块的CRC,其中,多次读取的数据的总长度等于数据块的长度L2。详细实现过程可以参见上述步骤404中的相关内容,在此不再详细说明。
(3):在该标准净荷长度L1大于待发送数据中的数据块的长度L2以及待发送数据不包括数据块对应的PI时,该RDMA报文包括待发送数据中的x个数据块,x=L1/L2,从该RDMA报文中获取该x个数据块。
在本步骤中,网卡的处理模块可以去除该RDMA报文的报文头和校验部分得到该RDMA报文的净荷部分,从该净荷部分的起始位置读取长度为L2的数据得到第一个数据块,通过网卡的通信接口向接收端的处理器发送第一个数据块。处理模块继续从该净荷部分读取长度为L2的数据得到第二个数据块,通过网卡的通信接口向接收端的处理器发送第二个数据块。处理模块继续执行该流程以及向接收端的处理器发送第三个数据块、……、第x个数据块。
可选的,当接收到位于该RDMA报文之后的下一个RDMA报文,处理模块仍对该下一个RDMA报文执行上述操作,以将该下一个RDMA报文中的x个数据块发送给处理器,在此不再详细说明。处理器接收数据块,根据接收顺序将接收的数据块组成目标数据,该目标数据与发送端的待发送数据相同。
(4):在该标准净荷长度L1小于或等于待发送数据中的数据块的长度L2以及待发送数据包括数据块对应的PI时,从连续接收的同一个数据块对应的y个RDMA报文中获取该数据块,以及获取该数据块对应的PI,y=L2/L1。
在本步骤中,网卡中的处理模块当接收到起始报文时将该起始报文作为第一个数据块的第一个RDMA报文,去除第一个RDMA报文的报文头和校验部分得到第一个RDMA报文的净荷部分,第一个RDMA报文的净荷部分为第一个数据块中的长度为L1的数据,根据该长度为L1的数据计算得到第一个CRC;当接收到下一个RDMA报文时,将该RDMA报文作为第一个数据块的第二个RDMA报文,去除第二个RDMA报文的报文头和校验部分得到第二个RDMA报文的净荷部分,第二个RDMA报文的净荷部分为第一个数据块中的长度为L1的数据,根据该长度为L1的数据和第一个CRC计算得到第二个CRC;按上述对第二个RDMA报文执行的操作,继续对第一个数据块的第三个RDMA报文、……、第y-1个RDMA报文进行相同处理,直至接收到第一个数据块的第y个RDMA报文;去除第y个RDMA报文的报文头和校验部分得到第y个RDMA报文的净荷部分,第y个RDMA报文的净荷部分为第一个数据块中的长度为L1的数据,根据该长度为L1的数据和第y-1个CRC计算第一个数据块对应的CRC,将已得到的第一个数据块的y个长度为L1的数据组成第一个数据块;将第一个数据块对应的CRC作为第一个数据块对应的PI,向接收端的处理器发送第一个数据块和第一个数据块对应的PI。
网卡中的处理模块当接收到下一个RDMA报文时将该RDMA报文作为第二个数据块的第一个RDMA报文,去除第一个RDMA报文的报文头和校验部分得到第一个RDMA报文的净荷部分,第一个RDMA报文的净荷部分为第一个数据块中的长度为L1的数据,根据该长度为L1的数据计算得到第一个CRC;当接收到下一个RDMA报文时,将该RDMA报文作为第二个数据块的第二个RDMA报文,去除第二个RDMA报文的报文头和校验部分得到第二个RDMA报文的净荷部分,第二个RDMA报文的净荷部分为第二个数据块中的长度为L1的数据,根据该长度为L1的数据和第一个CRC计算得到第二个CRC;按上述对第二个RDMA报文执行的操作,继续对第二个数据块的第三个RDMA报文、……、第y-1个RDMA报文进行相同处理,直至接收到第二个数据块的第y个RDMA报文;去除第y个RDMA报文的报文头和校验部分得到第y个RDMA报文的净荷部分,第y个RDMA报文的净荷部分为第一个数据块的长度为L1的数据,根据该长度为L1的数据和第y-1个CRC计算第二个数据块对应的CRC,将已得到的第二个数据块的y个长度为L1的数据组成第二个数据块;将第二个数据块对应的CRC作为第二个数据块对应的PI,向接收端的处理器发送第二个数据块和第二个数据块对应的PI。按上述读取到第二个数据块的相同方式继续接收RDMA报文并向接收端的处理器发送待发送数据的第三个数据块和第三个数据块对应的PI、第四个数据块和第四个数据块对应的PI……。
处理器接收数据块和PI,根据接收顺序将接收的数据块和PI组成目标数据,该目标数据和发送端的待发送数据相同。
(5):在该标准净荷长度L1小于或等于待发送数据中的数据块的长度L2以及待发送数据不包括数据块对应的PI时,从连续接收的同一个数据块对应的y个RDMA报文中获取该数据块,y=L2/L1。
在本步骤中,网卡中的处理模块当接收到起始报文时将该起始报文作为第一个数据块的第一个RDMA报文,去除第一个RDMA报文的报文头和校验部分得到第一个RDMA报文的净荷部分,第一个RDMA报文的净荷部分为第一个数据块中的长度为L1的数据;当接收到下一个RDMA报文时,将该RDMA报文作为第一个数据块的第二个RDMA报文,去除第二个RDMA报文的报文头和校验部分得到第二个RDMA报文的净荷部分,第二个RDMA报文的净荷部分为第一个数据块中的长度为L1的数据;按上述对第二个RDMA报文执行的操作,继续对第一个数据块的第三个RDMA报文、……、第y个RDMA报文进行相同处理,直至处理完第y个RDMA报文;将已得到的第一个数据块的y个长度为L1的数据组成第一个数据块,向接收端的处理器发送第一个数据块。
网卡中的处理模块在接收到下一个RDMA报文时将该RDMA报文作为第二个数据块的第一个RDMA报文,去除第一个RDMA报文的报文头和校验部分得到第一个RDMA报文的净荷部分,第一个RDMA报文的净荷部分为第一个数据块中的长度为L1的数据;当接收到下一个RDMA报文时,将该RDMA报文作为第二个数据块的第二个RDMA报文,去除第二个RDMA报文的报文头和校验部分得到第二个RDMA报文的净荷部分,第二个RDMA报文的净荷部分为第二个数据块中的长度为L1的数据;按上述对第二个RDMA报文执行的操作,继续对第二个数据块的第三个RDMA报文、……、第y个RDMA报文进行相同处理,直至处理完第y个RDMA报文;将已得到的第二个数据块的y个长度为L1的数据组成第二个数据块,向接收端的处理器发送第二个数据块。按上述得到第二个数据块的相同方式继续接收RDMA报文并向接收端的处理器发送第三个数据块、第四个数据块……。
在本申请实施例中,在标准净荷长度L1大于数据块的长度L2时,每个RDMA报文的净荷部分中均包括x个数据块和每个数据块对应的PI,x=L1/L2,即每个RDMA报文中的净荷部分的结构相同,降低接收端处理RDMA报文的难度,从而降低处理RDMA报文的耗时以及减少处理RDMA报文所需要的硬件资源。在标准净荷长度L1小于或等于数据块的长度L2时,RDMA报文中的净荷部分的结构间隔y个RDMA报文进行循环变化,y=L2/L1,每个循环中的前y-1个报文的净荷部分结构相同,以及每个循环中的第y个报文的净荷部分结构相同,从而只需要两个处理逻辑就可以处理所有的RDMA报文,降低接收端处理报文的难度,从而降低处理RDMA报文的耗时以及减少处理RDMA报文所需要的硬件资源。
参见图5,本申请实施例提供了一种发送数据的装置500,所述装置500可以部署在上述图1-1、图2-1、图2-2或图3-1所示实施例提及的发送端中的网卡中,包括:
处理单元501,用于生成RDMA报文,该RDMA报文的净荷部分包括待发送数据中的多个数据块和该多个数据块中的每个数据块对应的PI;或者,该RDMA报文的净荷部分包括待发送数据的一个数据单元或该数据单元中的部分数据,该数据单元包括一个数据块和该一个数据块对应的PI,该数据单元的长度等于该部分数据的长度的整数倍;
发送单元502,用于发送该RDMA报文。
可选的,处理单元501,用于:
获取标准净荷长度L1和待发送数据中的数据块长度L2,
根据标准净荷长度L1和该数据块长度L2生成RDMA报文。
可选的,处理单元501,用于:
在L1大于L2时,从待发送数据中获取x个数据块和该x个数据块中的每个数据块对应的PI,x=L1/L2;
将该x个数据块和每个数据块对应的PI组成净荷部分;
基于该净荷部分生成RDMA报文。
可选的,L1=1024,L2=512,x=2,该RDMA报文的净荷部分包括2个数据块和该2个数据块中的每个数据块对应的PI;或者,
L1=2048,L2=512,x=4,该RDMA报文的净荷部分包括4个数据块和该4个数据块中的每个数据块对应的PI;或者,
L1=4096,L2=512,x=8,该RDMA报文的净荷部分包括8个数据块和该8个数据块中的每个数据块对应的PI。
可选的,处理单元501,用于:
在L1小于或等于L2时,从待发送数据中的一个数据单元的起始位置获取数据;
当获取到该数据单元的y分之一的数据时,y=L2/L1,将该数据单元的y分之一的数据组成净荷部分;
基于该净荷部分生成RDMA报文。
可选的,L1=1024,L2=4096,y=4,该RDMA报文的净荷部分包括该数据单元中的长度为1024+L3/4的数据,L3为该数据单元中的PI长度;或者,
L1=2048,L2=4096,y=2,该RDMA报文的净荷部分包括该数据单元中的长度为2048+L3/2的数据;或者,
L1=4096,L2=4096,y=1,该RDMA报文的净荷部分包括该数据单元。
可选的,该数据单元还包括该数据块对应的元数据,在该数据单元中该数据块对应的PI位于该元数据的右侧;
L1=1024,L2=4096,y=4,该RDMA报文的净荷部分包括该数据单元中的长度为1024+(L4+L3)/4的数据,L3为该数据单元中的PI长度,L4为元数据长度;或者,
L1=2048,L2=4096,y=2,该RDMA报文的净荷部分包括该数据单元中的长度为2048+(L4+L3)/2的数据;或者,
L1=4096,L2=4096,y=1,该RDMA报文的净荷部分包括该数据单元。
在本申请实施例中,处理单元在生成RDMA报文时,由于生成的每个RDMA报文的净荷部分包括待发送数据中的多个数据块和每个数据块对应的保护信息PI,这样每个RDMA报文的净荷部分的结构相同,可以减小接收端处理RDMA报文的难度,耗时以及对硬件资源的需求。或者,由于RDMA报文的净荷部分包括待发送数据的一个数据单元或数据单元中的部分数据,数据单元包括一个数据块和一个数据块对应的PI,数据单元的长度等于该部分数据的长度的整数倍,这样每个数据单元对应的RDMA报文中的净荷部分的结构相同,从而可以减小接收端处理RDMA报文的难度,耗时以及对硬件资源的需求。
参见图6,本申请实施例提供了一种接收数据的装置600,所述装置600可以部署在上述图1-1、图2-1、图2-2或图4-1所示实施例提及的接收端中的网卡中,包括:
接收单元601,用于接收至少一个RDMA报文,RDMA报文的净荷部分包括待发送数据中的多个数据块和该多个数据块中的每个数据块对应的保护信息PI;或者,该RDMA报文的净荷部分包括待发送数据的一个数据单元和该数据单元中的部分数据,该数据单元包括一个数据块和该一个数据块对应的PI,该数据单元的长度等于该部分数据的长度的整数倍;
处理单元602,用于从该至少一个RDMA报文中获取数据块和该数据块对应的PI。
可选的,在L1大于L2时,L1为标准净荷长度,L2为待发送数据中的数据块长度,该RDMA报文的净荷部分包括待发送数据中的x个数据块和该x个数据块中的每个数据块对应的PI,x=L1/L2。
可选的,处理单元602,用于:
在接收到一个RDMA报文时,从该一个RDMA报文中获取x个数据块和该x个数据块中的每个数据块对应的PI。
可选的,L1=1024,L2=512,x=2,该RDMA报文的净荷部分包括2个数据块和该2个数据块中的每个数据块对应的PI;或者,
L1=2048,L2=512,x=4,该RDMA报文的净荷部分包括4个数据块和该4个数据块中的每个数据块对应的PI;或者,
L1=4096,L2=512,x=8,该RDMA报文的净荷部分包括8个数据块和该8个数据块中的每个数据块对应的PI。
可选的,在L1小于或等于L2时,L1为标准净荷长度,L2为待发送数据中的数据块长度,该RDMA报文的净荷部分包括待发送数据的一个数据单元中的y分之一的数据,y=L2/L1。
可选的,处理单元602,用于:
在根据起始报文的序号确定接收到该数据单元对应的y个RDMA报文时,从该y个RDMA报文中获取该数据单元。
可选的,L1=1024,L2=4096,y=4,该RDMA报文的净荷部分包括该数据单元中的长度为1024+L3/4的数据,L3为该数据单元中的PI长度;或者,
L1=2048,L2=4096,y=2,该RDMA报文的净荷部分包括该数据单元中的长度为2048+L3/2的数据;或者,
L1=4096,L2=4096,y=1,该RDMA报文的净荷部分包括该数据单元。
可选的,该数据单元还包括该数据块对应的元数据,在该数据单元中该数据块对应的PI位于该元数据的右侧;
L1=1024,L2=4096,y=4,该RDMA报文的净荷部分包括该数据单元中的长度为1024+(L4+L3)/4的数据,L3为该数据单元中的PI长度,L4为元数据长度;或者,
L1=2048,L2=4096,y=2,该RDMA报文的净荷部分包括该数据单元中的长度为2048+(L4+L3)/2的数据;或者,
L1=4096,L2=4096,y=1,该RDMA报文的净荷部分包括该数据单元。
在本申请实施例中,接收单元接收至少一个RDMA报文,处理单元从至少一个RDMA报文中获取数据块和该数据块对应的PI。由于RDMA报文的净荷部分包括待发送数据中的多个数据块和每个数据块对应的PI,这样每个RDMA报文的净荷部分的结构相同,可以减小处理单元从RDMA报文中获取数据块和数据块对应的PI的难度,耗时以及对硬件资源的需求。或者,由于RDMA报文的净荷部分包括待发送数据的一个数据单元和该数据单元中的部分数据,该数据单元包括一个数据块和该一个数据块对应的PI,该数据单元的长度等于该部分数据的长度的整数倍,这样每个数据单元对应的RDMA报文中的净荷部分的结构相同,相比目前每个RDMA报文的净荷部分的结构不同,可以减小处理单元从处理RDMA报文的难度,耗时以及对硬件资源的需求。
参见图7,图7所示为本申请实施例提供的一种发送数据的装置700示意图。该装置700可以是图1-1、图2-1、图2-2或图3-1所示实施例提及的发送端的网卡或是该网卡中的部分,该装置700包括至少一个处理器701、至少一个存储器702、至少一个通信接口703、至少一个网口704和总线705。
该装置700是一种硬件结构的装置,可以用于实现图5所述的装置中的功能单元或图2-2所示的实施例中功能单元。例如,本领域技术人员可以想到图5所示的装置500中的处理单元501或图2-2所示实施例中的处理模块44可以通过该至少一个处理器701调用至少一个存储器702中的代码来实现,图5所示的装置500中的发送单元502可以通过至少一个网口704来实现。
上述总线705可包括一通路,在上述组件之间传送信息。上述存储器702可以包括至少一个寄存器。上述处理器701可以是由多个电子元器件组成的集成电路。
可选的,该装置700包括至少一个处理器701、至少一个存储器702、至少一个通信接口703、至少一个网口704和总线705可以集成在一块印制电路板(Printed CircuitBoard,PCB)或多块PCB上。
参见图8,图8所示为本申请实施例提供的一种接收数据的装置800示意图。该装置800可以是图1-1、图2-1、图2-2或图3-1所示实施例提及的接收端的网卡或是该网卡中的部分,该装置800包括至少一个处理器801、至少一个存储器802、至少一个通信接口803、至少一个网口804和总线805。
该装置800是一种硬件结构的装置,可以用于实现图6所述的装置中的功能单元或图2-2所示的实施例中功能单元。例如,本领域技术人员可以想到图6所示的装置600中的处理单元602或图2-2所示实施例中的处理模块44可以通过该至少一个处理器801调用至少一个存储器802中的代码来实现,图6所示的装置600中的接收单元601可以通过至少一个网口804来实现。
上述总线805可包括一通路,在上述组件之间传送信息。上述存储器802可以包括至少一个寄存器。上述处理器801可以是由多个电子元器件组成的集成电路。
可选的,该装置800包括至少一个处理器801、至少一个存储器802、至少一个通信接口803、至少一个网口804和总线805可以集成在一块PCB或多块PCB上。
参见图1-1,本申请实施例还提供了一种通信系统,所述系统包括:如图5或图7所述的装置和如图6或图8所述的装置;其中,如图5或图7所述的装置可以为发送端,如图6或图8所述的装置可以接收端。
本领域普通技术人员可以理解实现上述实施例的全部或部分步骤可以通过硬件来完成,也可以通过程序来指令相关的硬件完成,所述的程序可以存储于一种计算机可读存储介质中,上述提到的存储介质可以是只读存储器,磁盘或光盘等。
以上所述仅为本申请的可选实施例,并不用以限制本申请,凡在本申请的精神和原则之内,所作的任何修改、等同替换、改进等,均应包含在本申请的保护范围之内。