本发明涉及分组转发设备的管理技术,特别涉及一种报文传输方法和装置。
背景技术:
随着互联网的迅猛发展,网络带宽迅速增加,分组转发设备尤其是高端路由器的接口速度和队列数也随之迅速增加。为了适应接口速度和队列数增加的速度,一般路由器的网络处理器芯片都会内置专门的流量管理系统来完成对高速数据流的管理,再将报文缓存经过处理后输出。
现有技术大多采用在芯片外部挂存储芯片来存储数据,在芯片内部采用链表结构进行管理,以链表的每个节点对应每个报文切片的存储空间,预先记录链表的首尾节点,对于除首尾节点外的中间节点和硬件的固有读延迟,从当前链表节点作为地址读取下一节点,到真正读取到该地址里存储的数据内容,需要若干个时钟周期,这一段时间内链表也是无法有效使用的。因此,在采用单链表结构的情况下,现有技术无法解决均匀出队的问题。
技术实现要素:
为解决现有存在的技术问题,本发明实施例主要提供一种报文传输方法和装置,能够在采用单链表结构的情况下,解决均匀出队的问题。
本发明实施例的技术方案是这样实现的:
第一方面,本发明实施例提供一种报文传输方法,所述方法包括:
报文队列输出报文时,获取在报文输入所述报文队列时建立的一条与所述报文队列对应的链表,所述链表包括一个或多个组块,每个组块包括一个或多个切片,所述切片与所述报文队列中的报文切片的地址一一对应;
根据所述链表指针指向的第i个组块的地址,从所述第i个组块中依次获取 切片,所述i是正整数;
根据各切片对应的报文切片的地址,从所述报文队列中输出所述报文切片,并将所述链表指针指向第i+1个组块的地址。
结合第一方面,在第一种可实现方式中,所述根据所述链表指针指向的第i个组块的地址,从所述第i个组块中依次获取切片包括:
获取基地址,所述基地址是每个组块的偏移地址;
根据所述基地址依次使用所述第i个组块中的每个切片,其中,所述第i个组块中第j个切片的偏移地址等于基地址加上所述j与指定值的积,所述j是正整数。
结合第一种可实现方式,在第二种可实现方式中,在同一链表中,每个组块的切片个数相同。
结合第一方面、第一种和第二种可实现方式中任一种可实现方式,在第三种可实现方式中,在所述报文队列输出报文之前,报文输入所述报文队列之时,所述方法还包括:
建立与所述报文队列对应的一条所述链表;
保存所述链表的每个组块中的切片个数和所述末个组块中已占用的切片个数。
结合第三种可实现方式,在第四种可实现方式中,所述建立与所述报文队列对应的一条所述链表包括:
若所述报文队列未存储报文,则生成一条所述链表,所述链表包括一个组块;将分配给所述报文队列的第一缓存区域的首节点的地址保存为所述链表的首个组块的地址和末个组块的地址;将存储至所述报文队列的报文切片的地址依次与所述链表的切片对应;
若所述报文队列存储有报文,则判断所述链表中是否存在无对应信息的切片;
若所述链表中存在无对应信息的切片,则将存储至所述报文队列的报文切片的地址依次与所述无对应信息的切片相对应;
若所述链表中不存在无对应信息的切片,则判断所述链表是否只包括一个组块;
若所述链表只包括一个组块,则生成一个新的末个组块,将分配给所述报文队列的第二空闲缓存的首节点地址保存为所述第二个组块的地址和所述新的末个组块的地址;将存储至所述报文队列的报文切片的地址依次与所述链表的切片对应;
若所述链表包括多个组块,则生成一个新的末个组块,将分配给所述报文队列的第三空闲缓存的首节点地址保存为所述新的末个组块的地址;将存储至所述报文队列的报文切片的地址依次与所述链表的切片对应。
结合第一方面,在第五种可实现方式中,当多个报文队列输出报文时,所述方法还包括:
获取与所述多个报文队列一一对应的链表;
按照所述多个报文队列的输出顺序,依次从所述多个报文队列输出报文。
第二方面,本发明实施例一种报文传输装置,所述装置包括:
获取链表单元,用于报文队列输出报文时,获取在报文输入所述报文队列时建立的一条与所述报文队列对应的链表,所述链表包括一个或多个组块,每个组块包括一个或多个切片,所述切片与所述报文队列中的报文切片的地址一一对应;
获取地址单元,用于根据所述链表指针指向的第i个组块的地址,从所述第i个组块中依次获取切片,所述i是正整数;
获取报文单元,用于根据各切片对应的报文切片的地址,从所述报文队列中输出所述报文切片,并将所述链表指针指向第i+1个组块的地址。
结合第二方面,在第一种可实现方式中,所述获取切片单元具体用于:
获取基地址,所述基地址是每个组块的偏移地址;
根据所述基地址,依次使用所述第i个组块中的每个切片,其中,所述第i个组块中第j个切片的偏移地址等于基地址加上所述j与指定值的积,所述j是正整数。
结合第一种可实现方式,在第二种可实现方式中,在同一链表中,每个组块的切片个数相同。
结合第二方面、第一种和第二种可实现方式中任一种可实现方式,所述装置还包括:
建立单元,用于建立与所述报文队列对应的一条所述链表;
保存单元,用于保存所述链表的每个组块中的切片个数和所述末个组块中已占用的切片个数。
结合第三种可实现方式,在第四种可实现方式中,所述建立单元具体用于:
若所述报文队列未存储报文,则生成一条所述链表,所述链表包括一个组块;将分配给所述报文队列的第一缓存区域的首节点的地址保存为所述链表的首个组块的地址和末个组块的地址;将存储至所述报文队列的报文切片的地址依次与所述链表的切片对应;
若所述报文队列存储有报文,则判断所述链表中是否存在无对应信息的切片;
若所述链表中存在无对应信息的切片,则将存储至所述报文队列的报文切片的地址依次与所述无对应信息的切片相对应;
若所述链表中不存在无对应信息的切片,则判断所述链表是否只包括一个组块;
若所述链表只包括一个组块,则生成一个新的末个组块,将分配给所述报文队列的第二空闲缓存的首节点地址保存为所述第二个组块的地址和所述新的末个组块的地址;将存储至所述报文队列的报文切片的地址依次与所述链表的切片对应;
若所述链表包括多个组块,则生成一个新的末个组块,将分配给所述报文队列的第三空闲缓存的首节点地址保存为所述新的末个组块的地址;将存储至所述报文队列的报文切片的地址依次与所述链表的切片对应。
结合第二方面,在第五种可实现方式中,当多个报文队列输出报文时,
所述获取链表单元,还用于获取与所述多个报文队列一一对应的链表;
所述获取报文单元,还用于按照所述多个报文队列的输出顺序,依次从所述多个报文队列输出报文。
本发明实施例提供的报文传输方法和装置,在报文队列输出报文时,先获取在报文输入所述报文队列时建立的与所述报文队列对应的链表,所述链表包括一个或多个组块,每个组块包括一个或多个切片,该切片与所述报文队列中的报文切片的地址一一对应;再根据链表指针指向的第i个组块的地址,从第i个组块中依次获取该组块的各个切片;根据各切片对应的报文切片的地址,从报文队列中输出所述报文切片,并将链表指针指向第i+1个组块的地址。这样一来,当前组块中切片使用完成之后,链表指针已经指向下一个组块的地址,下一个组块中的切片就可以立刻被使用,无需浪费几个时钟周期来等待指针指向下一个组块的地址;因此,减少了报文队列输出所浪费的时间,保证了使用各个组块中切片的连续性,从而解决了均匀输出队列的问题。
附图说明
图1为本发明实施例提供一种报文传输方法的流程图;
图2为本发明实施例提供的链表的示意图;
图3为本发明实施例提供另一种报文传输方法的流程图;
图4为本发明实施例提供再一种报文传输方法的流程图;
图5为本发明实施例提供又一种报文传输方法的流程图;
图6为本发明实施例提供的进程执行过程的示意图;
图7为本发明实施例提供一种报文传输装置的结构示意图;
图8为本发明实施例提供又一种报文传输装置的结构示意图。
具体实施方式
实施例一
本发明实施例提供一种报文传输方法,如图1所示,该方法可以包括:
步骤101、报文队列输出报文时,获取在报文输入该报文队列时建立的一 条与该报文队列对应的链表,该链表包括一个或多个组块,每个组块包括一个或多个切片,该切片与该报文队列中的报文切片的地址一一对应。
这里,该链表保存着输入报文队列的报文的排列顺序和位置,各个组块对应着一段报文切片,示例的,报文输入报文队列,该报文队列有一个链表相对应,链表如图2所示,假设该报文被分为16个报文切片,该链表中包括三个组块,每个组块包括六个切片,其中,划斜杠的切片表示有报文切片的地址对应,未划斜杠的切片表示没有报文切片的地址对应。组块1的6个切片依次对应着前6个报文切片的地址,组块2的切片依次对应着第7至第12个报文切片的地址,组块3的切片依次对应着第13至16个报文切片的地址。这里,本实施例中所述的组块和现有技术中的链表的节点是相同的。
步骤102、根据链表指针指向的第i个组块的地址,从第i个组块中依次获取该组块的各个切片。
这里,i是正整数。
具体的,获取基地址,该基地址是每个组块的偏移地址;根据基地址依次使用所述第i个组块中的每个切片,其中,第i个组块中第j个切片的偏移地址等于基地址加上j与指定值的积,该j是正整数。这里,该链表可以包括三个指针,头指针、尾指针和链表指针。首指针指着首个组块的地址,尾指针指着末个组块的地址,链表指针则指着下一个被使用的组块。
优选的,在同一链表中,每个组块的切片个数相同。本发明实施例优选的指定值是1,基地址是0。例如,图2中组块2的第6个切片的偏移地址是0+6*1,即为6。
步骤103、根据各切片对应的报文切片的地址,报文队列中输出报文切片,并将链表指针指向第i+1个组块的地址。
如图2所示,该链表中头指针指向组块1的地址,尾指针指向组块3的地址。当组块1对应的报文切片正在输出,链表指针指向组块2;当组块2对应的报文切片正在输出,链表指针指向组块3。
相较于现有技术,本发明实施例可以在获取当前组块的切片的同时,链表 指针指向下一个组块的地址,因此,当前组块中切片使用完成之后,链表指针已经指向下一个组块的地址,下一个组块中的切片就可以立刻被使用,无需浪费几个时钟周期来等待指针指向下一个组块的地址,这样,减少了报文队列输出所浪费的时间,保证了使用各个组块中切片的连续性,从而解决了均匀输出队列的问题。
进一步的,如图3所示,所述方法还包括:
步骤100a、建立报文队列对应的一条链表。
具体的,若报文队列未存储报文,则建立一条链表,链表包括一个组块,将分配给报文队列的第一缓存区域的首节点的地址,保存为链表的首个组块的地址和末个组块的地址,将存储至所述报文队列的报文切片的地址依次与所述链表的切片对应;若报文队列存储有报文,则判断链表中是否存在无对应信息的切片;若链表中存在无对应信息的切片,则将存储至报文队列的报文切片的地址依次与无对应信息的切片相对应;若链表中不存在无对应信息的切片,则判断链表是否只包括一个组块;若所述链表只包括一个组块,则生成一个新的末个组块,将分配给所述报文队列的第二空闲缓存的首节点地址保存为所述第二个组块的地址和所述新的末个组块的地址,将存储至所述报文队列的报文切片的地址依次与所述链表的切片对应;若所述链表包括多个组块,则生成一个新的末个组块,将分配给所述报文队列的第三空闲缓存的首节点地址保存为所述新的末个组块的地址,将存储至所述报文队列的报文切片的地址依次与所述链表的切片对应。这里,第一缓存区域、第二缓存区域和第三缓存区域并无特殊不同,只是为了区分三个缓存区域并不一定是同一个缓存区域。
步骤100b、保存链表的每个组块中的切片个数和末个组块中已占用的切片个数。
相应的,报文输出队列时,需要获取链表的首个组块的地址、第二个组块的地址、末个组块的地址、每个组块中的切片个数、末个组块中已占用的切片个数和队列标记,在队列输出初始时,链表的头指针指向首个组块的地址,尾指针指向末个组块的地址,链表指针指向第二个组块,对于首个组块的第1个 切片,获取基地址,计算得到第1个切片的偏移地址,获取首个组块的第1个切片,根据第1个切片确定出与只对应的报文切片的地址,输入该报文切片,依次类推,直到获取到首个组块的最后一个切片为止,与此同时,链表指针指向使用完组块的下一个组块的地址,重复上述输入报文切片的过程,直到获取最后一个组块中与报文切片对应的组块,并输出相应的报文停止。
进一步的,当多个报文队列输出报文时,所述方法还包括:获取与多个报文队列一一对应的链表;按照多个报文队列的输出顺序,依次从多个报文队列输出报文。这样,本发明实施例提供的方法可以同时获取各个报文队列的链表,再按照报文队列的顺序,依次输出报文,因此,一个报文队列输出报文切片之后,无需再获取下一个报文队列的链表,下一个报文队列可以直接输出报文切片,从而将获取链表的时间节省下来,保证了多个报文队列输出的连续性,从而达到了均匀输出的要求。
实施例二
本发明实施例提供一种报文传输方法,该方法应用于报文输入报文队列。其中,本发明实施例的组块第i个切片的偏移地址等于基地址0加上切片的顺序号乘以指定值1,count-i用于在报文输入报文队列时,记录组块中已占用的切片个数,也就是当前使的切片的序号数。如图4所示,该方法可以包括:
步骤201、获取队列标识。
这里,队列标记表示链表对应的报文队列是否存储有报文。这里,本发明实施例中队列标识是空标记,当空标记为1时,说明报文队列中未存储报文或者报文已经输出队列了,当空标记为0,则说明队列报文中存储着有报文。
步骤202、判断空标记是否为1,若是,则执行步骤203;若否,则执行步骤204。
步骤203、若空标记为1,则生成一条链表,该链表包括一个组块,将分配给报文队列的第一缓存区域的首节点的地址保存为链表的首个组块的地址和末个组块的地址,将count-i置为0,将队列空标记置为非空。
这里,该链表可以包括若干个组块(chunk),每个组块中又包括相同个数 的切片(block),链表的每个节点都对应着存储着的报文的切片的存储空间。链表的首个组块的地址对应着报文队列的首个节点的地址,链表的末个组块的地址对应着报文队列的末个节点的地址。
步骤204、若空标记为0,则判断count-i是否等于0,若是,则执行步骤205;若否,则执行步骤208。
当count-i等于0时,说明链表不存在无对应信息的切片。当count-i不等于0时,说明链表中某一个或几个组块中的切片没有对应的信息。
步骤205、若count-i等于0,则判断链表的首个组块的地址是否等于末个组块的地址,若是,则执行步骤206;若否,则执行步骤207。
这里,当链表的首个组块的地址等于末个组块的地址,则说明链表只包括一个组块,当链表的首个组块的地址不等于末个组块的地址,则说明链表包括至少两个组块。
步骤206、若链表的首个组块的地址等于末个组块的地址,则生成一个新的末个组块,将分配给报文队列的第二空闲缓存的首节点地址保存为第二个组块的地址和新的末个组块的地址,执行步骤208。
步骤207、若链表的首个组块的地址不等于末个组块的地址,则生成一个新的末个组块,将分配给报文队列的第三空闲缓存的首节点地址保存为新的末个组块的地址。
步骤208、以count-i为每个组块的偏移地址,依次按将当前组块的切片与输入报文队列的报文切片的地址相对应。
步骤209、判断是否有下一个报文切片输入报文队列,若是,则执行步骤204;若否,则执行步骤210。
步骤210、若无报文切片输入报文队列,则保存队列标记和末个组块中与报文切片对应。
这里,无报文切片输入报文队列说明报文输入完成。
值得说明的是,当每次count-i等于每个组块的切片个数,且还需要继续使用切片,表明当前组块的切片已经被占用了,需要占用下一个切片的切片,此 时,count-i将置为0,从新开始计数。
实施例三
本发明实施例提供一种报文传输方法,该方法用于在实施例二的报文输入报文队列之后,实施多个已存储报文的报文队列输出报文,假设本发明实施例在同时接收到三个报文队列(报文队列1、报文队列2和报文队列3)请求输出报文之后,如图5所示,该方法包括:
步骤301、报文传输装置为三个报文队列各分配一个进程,该进程用于执行报文队列输出报文。
步骤302、三个进程进入准备阶段,报文传输装置获取报文队列1对应的链表、队列标记和末个组块的count-i、首个组块的地址、第二个组块的地址和末个组块的地址,获取链表中切片对应的报文切片。
这里,各自报文队列对应的链表、队列标记和末个组块的count-i、首个组块的地址、第二个组块的地址和末个组块的地址都是在报文输入报文队列时存储好的。
步骤303、报文队列1的进程进入执行阶段,报文队列2和报文队列3的进程进入等待阶段,报文传输装置根据获取报文队列1对应的链表、队列标记和末个组块的count-i、首个组块的地址、第二个组块的地址和末个组块的地址,获取链表中切片对应的报文切片。
具体的,链表指针指向首个组块的地址,依次使用该进程中报文所在的链表首个组块的所有切片,同时,链表指针指向第二个组块的地址;依次使用第二个组块的所有切片,同时,链表指针指向第三个组块的地址;使用第三个组块的所有切片,依次类推,直到末个组块的切片。
这里,使用任一个组块的切片可以具体包括:假设count-i用于在报文输入报文队列时,记录组块中与报文切片对应的切片个数,为了便于理解,相应的设置count-o,count-o用于在报文输出报文队列时,记录组块中已使用切片的个数。链表指针指向该组块的地址之后,根据基地址和count-o、指定值,计算出下一个切片的偏移地址,该偏移地址等于count-o乘以1,根据该偏移地址, 获取出下一个切片,从而获取切片对应的报文切片的地址,输出报文切片。对于末个组块,当末个组块的count-o等于预先保存的末个组块的count-i时,报文队列中取出的报文切片就是最后的报文切片,此报文队列输出报文完毕,这里,count-o是指当报文输出报文队列时,记录组块中与报文切片对应的切片个数,也就是当前使的切片的序号数。
值得说明的是,本发明实施例提供的偏移地址的算法不限于此,每个切片的偏移地址同样可以为上一个切片的偏移地址加上指定值。这里,本实施例中确定报文队列输出完成,还可以包括:队列标识为空;或链表中每个组块的count-o都为0。
步骤304、报文队列2的进程进入执行阶段,报文队列3进入等待阶段,报文传输装置根据获取报文队列2对应的链表、队列标记和末个组块的count-i、首个组块的地址、第二个组块的地址和末个组块的地址,获取链表中切片对应的报文切片。
步骤305、报文队列3的进程进入执行阶段,报文传输装置根据获取报文队列3对应的链表、队列标记和末个组块的count-i、首个组块的地址、第二个组块的地址和末个组块的地址,获取链表中切片对应的报文切片。
本发明实施例提供的进程的具体执行顺序如图6所示。值得说明的是,步骤303至305在报文输出所使用的方法相同,因此,本实施例只在步骤303中详述,步骤304和步骤305中就不在复述;一般情况下,报文输出报文队列完毕,相应的进程就被释放,但是当如下几种情况发生,相应的进程将会排在之前所有队列的后面,等待下次调用:队列非空,即队列深度不为0;或队列所在端口不处于流控状态;或进程没有占用满。
实施例四
本发明实施例提供一种报文传输装置40,如图7所示,该装置40可以包括:
获取链表单元401,用于报文队列输出报文时,获取在报文输入所述报文队列时建立的一条与所述报文队列对应的链表,所述链表包括一个或多个组块, 每个组块包括一个或多个切片,所述切片与所述报文队列中的报文切片的地址一一对应。
获取地址单元402,用于根据所述链表指针指向的第i个组块的地址,从所述第i个组块中依次获取切片,所述i是正整数。
获取报文单元403,用于根据各切片对应的报文切片的地址,从所述报文队列中输出所述报文切片,并将所述链表指针指向第i+1个组块的地址。
相较于现有技术,本发明实施例可以在获取当前组块的切片的同时,链表指针指向下一个组块的地址,因此,当前组块中切片使用完成之后,链表指针已经指向下一个组块的地址,下一个组块中的切片就可以立刻被使用,无需浪费几个时钟周期来等待指针指向下一个组块的地址,这样,减少了报文队列输出所浪费的时间,保证了使用各个组块中切片的连续性,从而解决了均匀输出队列的问题。
进一步的,所述获取切片单元403具体用于:
获取基地址,所述基地址是每个组块的偏移地址;
根据所述基地址,依次使用所述第i个组块中的每个切片,其中,所述第i个组块中第j个切片的偏移地址等于基地址加上所述j与指定值的积,所述j是正整数。
优选的,在同一链表中,每个组块的切片个数相同。
进一步的,如图8所示,所述装置40还包括:
建立单元404,用于建立与所述报文队列对应的一条所述链表。
保存单元405,用于保存所述链表的每个组块中的切片个数、所述末个组块中已占用的切片个数和所述队列标记,所述队列标记表示所述报文队列是否列存储报文。
进一步的,所述建立单元404具体用于:
若所述报文队列未存储报文,则生成一条所述链表,所述链表包括一个组块;将分配给所述报文队列的第一缓存区域的首节点的地址保存为所述链表的首个组块的地址和末个组块的地址;将存储至所述报文队列的报文切片的地址 依次与所述链表的切片对应;
若所述报文队列存储有报文,则判断所述链表中是否存在无对应信息的切片;
若所述链表中存在无对应信息的切片,则将存储至所述报文队列的报文切片的地址依次与所述无对应信息的切片相对应;
若所述链表中不存在无对应信息的切片,则判断所述链表是否只包括一个组块;
若所述链表只包括一个组块,则生成一个新的末个组块,将分配给所述报文队列的第二空闲缓存的首节点地址保存为所述第二个组块的地址和所述新的末个组块的地址;将存储至所述报文队列的报文切片的地址依次与所述链表的切片对应;
若所述链表包括多个组块,则生成一个新的末个组块,将分配给所述报文队列的第三空闲缓存的首节点地址保存为所述新的末个组块的地址;将存储至所述报文队列的报文切片的地址依次与所述链表的切片对应。
进一步的,当多个报文队列输出报文时,
所述获取链表单元401,还用于获取与所述多个报文队列一一对应的链表;
所述获取报文单元402,还用于按照所述多个报文队列的输出顺序,依次从所述多个报文队列输出报文。
在实际应用中,所述获取链表单元401、获取地址单元402、获取报文单元403、建立单元404和保存单元405均可由位于终端中的中央处理器(Central Processing Unit,CPU)、微处理器(Micro Processor Unit,MPU)、数字信号处理器(Digital Signal Processor,DSP)、或现场可编程门阵列(Field Programmable Gate Array,FPGA)等实现。
以上所述,仅为本发明的较佳实施例而已,并非用于限定本发明的保护范围。