公开/公告号CN1545274A
专利类型发明专利
公开/公告日2004-11-10
原文格式PDF
申请/专利权人 中兴通讯股份有限公司;
申请/专利号CN200310103877.5
申请日2003-11-18
分类号H04L12/54;
代理机构11127 北京三友知识产权代理有限公司;
代理人王一斌
地址 518057 广东省深圳市南山区高新技术产业园科技南路中兴通讯大厦A座6层
入库时间 2023-12-17 15:34:51
法律状态公告日
法律状态信息
法律状态
2018-11-09
未缴年费专利权终止 IPC(主分类):H04L12/54 授权公告日:20070131 终止日期:20171118 申请日:20031118
专利权的终止
2007-01-31
授权
授权
2005-01-12
实质审查的生效
实质审查的生效
2004-11-10
公开
公开
技术领域
本发明涉及一种在组播数据包转发时实现减少内存占用空间的方法,特别是在组播数据包转发时,通过链表队列的改进实现减少内存占用空间的方法。本发明适用于计算机软件技术领域,尤其是网络通信领域。
背景技术
随着宽带的发展,多媒体业务诸如:流媒体,视频会议和视频点播等,正在成为信息传送的重要组成部分。多媒体的相关服务需求的日益增长刺激了IP组播技术的普及和发展,成为新一代网络的不可缺少的关键技术。
从技术角度看,组播技术可以分为控制层面和数据层面。控制层面是指支持组播技术的各种协议,如IGMP,PIM-DM,PIM-SM,DVMRP等,由这些协议完成对组播组的管理和控制。数据层面是指组播数据包的转发。本发明主要涉及组播数据包的转发。
在以软件转发为主的系统中,组播包的转发是将每个组播包复制发送到相应的单板或端口。每次发送时,内存中都拷贝一份数据包。这种发送方法的效率是非常低的。
一个常见的系统框图如图1所示。
在数据包发送时,必然涉及到发送队列的设置过程。与本发明方法所特别相关的是对链表队列进行的改进。
为了更好的描述组播包的发送,需要先介绍一下使用链表发送单播包的过程。
在使用链表发送单播包时,由链表组成的各个发送队列之间是完全独立的,每一个队列使用各自私有的队列的描述字Queue Descriptor和队列中每个包的描述字Packet link。
队列的描述字包括Queue count,Head pointer,Tail pointer域,含义如下所列:
Queue count:是指当前队列中的待发送包的个数,也即是Packetlink的个数,称为计数器。
Head pointer:是指队列中第一个packet link的地址,称为头指针。
Tail pointer:是指对应队列中最后一个packet link的地址,称为尾指针。
队列中每个包的描述字,包括next address,packet info域,含义如下所列:
next address:是指下一个Packet link的地址。
Packet info:是指数据包的信息,一般用于描述包的长度,包的起始地址等信息。
链表的组织结构如图2所示。
在单播转发中,收到一个数据包,查找到包的出队列后,就要把数据包加入相应的队列,我们称为入队列。发送线程则是在队列中读取包的描述信息,按顺序发送,我们称为出队列。
入队列的处理流程如下:
第一步:程序查找到需要放置的出队列的队列号;
第二步:读出队列的队列描述字Queue Descriptor;
第三步:把需要添加的包的描述字Packet link添加到队列的最后,即修改队尾包描述字packet link中的下一个包描述字指针next address为需要入队的packet link的地址;
第四步:修改队列的描述字Queue Descriptor以反应新的变化,修改队列描述字中的尾指针tail pointer为需要入队的packet link地址;
第五步:将队列描述字中的计数器Queue Count加1。流程结束。
入队列的处理流程如图3所示。
出队列的处理流程如下:
第一步:读出制定队列的队列描述字Queue Descriptor;
第二步:判断队列描述字中的计数器Queue Count是否为0,如果为0出队列流程直接结束,如果不为0,将计数器Queue Count减1后继续执行第三步;
第三步:根据队列描述字中的头指针head pointer读取需要出队列的包描述字packet link;
第四步:修改队列描述字中的头指针head pointer为需要出队列的包描述字packet link的下一个包描述字,即需要出队列的包描述字paeket link的next address。流程结束。
出队列的处理流程如图4所示。
上面介绍了单播的入队列和出队列的流程,对于以拷贝方式的组播发送,就是查找到多个队列号,拷贝数据包,加入到多个队列。而出队列的发送方式与单播包相同,只是重复发送。
这样使用拷贝方式的组播发送的入队列流程为:
第一步:查找一个出队列号,如果没有找到,则结束发送流程,如果找到,则进入第二步操作;
第二步:拷贝要发送的数据包;
第三步:按照单播的方式入队列,入队列操作完成后返回第一步。
组播包的入队列流程如图5所示。
这种方式的主要问题在于:
由于每一个队列发送完数据包后都将本队列中该包的包描述字Packet link出队列,并释放相应的存放数据包的内存空间。所以,多个队列就需要对数据包进行多次拷贝,并生成新的数据包描述字以添加到各个队列中。这样就占用了很多不必要的空间,同时也降低了程序的效率。
发明内容
本发明的目的是在现有代码和数据结构的基础上进行改进,提供一种在组播数据包转发时实现减少内存占用空间的方法,特别是在组播数据包转发时,通过链表队列的改进实现减少内存占用空间的方法,解决以拷贝方式实现的组播发送方式存在空间浪费和效率低下的问题。
本发明是这样实现的:
一种在组播数据包转发时实现减少内存占用空间的方法,其特征在于:
在内存中只存有一份需要转发数据包的拷贝;
在内存中只存在一条由包描述字连接而成的链表,各个发送队列的队列描述字通过头指针连接到该链表;
在最后一个和该链表相连的队列发送结束后,将该数据包占用的空间归还给缓存(buffer)。
所述由包描述字连接而成的链表是把需要入队列的组播包的包描述字加入到所有的队列中,并在包描述字中增加每个队列发送本数据包结束的标志位。
所述每个队列发送结束后判断一下所有的标志位,如果本次发送不是最后一次发送,就置一下本队列发送结束标志,但不归还数据包的缓存,如果本次发送是最后一次发送,就归还数据包的缓存。
所述包描述字中增加每个队列发送本数据包结束的标志位,通过在包描述字的结构中增加发送数据包结束标志位图(Tx OK Bitmap域)实现,在每个队列发送结束后,需要判断和修改该域。
一种在组播数据包转发时实现减少内存占用空间的方法,包括组播包入队列、组播包出队列:
组播包入队列进一步包括如下步骤:
第一步:取得下一个出队列的队列号;
第二步:按照单播的方式入队列,不拷贝数据包和生成新的数据包描述字,不需要判断该数据包是否需要在这个队列中发送;
第三步:判断是否是最后一个出队列,如果不是则返回第一步,如果是则结束入队列,
组播包出队列进一步包括如下步骤:
第一步:按照单播的方式出队列,修改队列中指针的结构,修改队列描述字中的头指针,不释放出队列的数据包描述字的空间,不归还数据包的空间;
第二步:判断这个包是否需要在本队列发送,如果是则进行第三步,如果不是,则进行第四步;
第三步:发送本数据包;
第四步:读取该包描述字中的发送数据包结束标志位图,判断是不是最后一次发送,如果不是则在发送数据包结束标志位图中设置本队列发送结束标志位,如果是最后一次发送,则需要归还数据包所占的空间,释放该包描述字的空间。
使用本发明后,数据包实现零拷贝发送,而且各个队列发送线程的关联性很小,发送时不需要相互等待,大大提高了组播发送的效率。
附图说明
图1是基于CPU的组播转发系统框图;
图2是发送单播包的发送链表队列示意图;
图3是单播发送链表入队列流程图;
图4是单播发送链表出队列流程图;
图5是拷贝方式下组播发送的入链表队列流程图;
图6是改进后的组播队列数据包描述字结构图;
图7是改进后的组播发送链表队列示意图;
图8是改进后的多播发送链表入队列流程图;
图9是改进后的多播发送链表出队列流程图;
图10是应用本发明方法的一个具体实施实例的系统框图。
具体实施方式
本发明对组播入队列的方法进行改进,在内存中只有一份(或几份)数据包的拷贝,同时在内存中也只存在一条包描述字连接而成的链表,各个发送队列的队列描述字通过头指针bead pointer连接到这条链表。发送数据包时,只有在最后一个和该链表相连的队列发送结束后,才将该数据包占用的空间归还给缓存(buffer)。这样会节省数据包的拷贝时间,提高组播的转发效率。
具体说来,就是把需要入队列的组播包的包描述字packet link加入到所有的队列中,而不管最终是否需要发送,并在包描述字packet link中增加每个队列发送本数据包结束的标志位,每个队列发送结束后判断一下所有的标志位,如果本次发送不是最后一次发送,就置一下本队列发送结束标志,但不归还数据包的缓存,如果本次发送是最后一次发送,就归还数据包的缓存。
对于图2的队列描述字Queue Descriptor结构基本不做改变,只是改变包描述字packet link的结构,其中,下一个包描述字号地址nextaddress和包信息packet info域的定义没有改变,新增加了发送数据包结束标志位图tx OK bitmap域,这个域在入队列时不需要填写。只有在每个队列发送结束后,需要判断和修改这个域。如图6所示。
经过修改以后的组播链表的组织结构发生了变化。
由链表组成的发送队列不再是完全独立的,每一个队列仍然使用各自私有的队列的描述字Queue Descriptor,但由每个包的描述字Packetlink组成的链表则是公用的,各个队列的描述字中的计数器QueueCount,头指针Head Pointer,尾指针Tail Pointer字段都是相同的,因为它们公用同一条队列。
组播的链表的组织结构如图7所示。
具体实施后,组播包入队列和出队列流程都需要进行具体的改动:
组播包入队列流程:
第一步:取得下一个出队列的队列号;
第二步:按照单播的发放入队列,并不需要数据包的拷贝和新的数据包描述字packet link的生成。这里并不需要判断这个包是否需要在这个队列中发送;
第三步:判断是否是最后一个出队列,如果不是则返回第一步,如果是则结束入队列流程。
组播包入队列的流程如图8所示。
组播包出队列流程:
第一步:按照单播的方式出队列,修改队列中指针的结构,修改队列描述字Queue Descriptor中的Head pointer头指针,但并不释放出队列的数据包描述字packet link的空间,也不归还数据包的空间;
第二步:判断这个包是否需要在本队列发送,如果是则进行第三步,如果不是,则进行第四步;
第三步:发送本数据包;
第四步:读取该包描述字packet link中的发送数据包结束标志位图Tx OK Bitmap,判断是不是最后一次发送,如果不是则在发送数据包结束标志位图Tx OK Bitmap中设置本队列发送结束标志位。如果是最后一次发送,则需要归还数据包所占的空间,释放该包描述字packet link的空间。
第五步:流程结束。
改进后的组播包出队列的流程如图9所示。
在本公司某型号的DSLAM产品中,需要在网络处理器上完成组播发送,主要是从上行以太网端口发送组播数据流到ADSL用户,由于是微码转发,需要重复发送。在使用本发明以前,数据包需要拷贝发送,发送的效率比较低。使用本发明后,数据包实现零拷贝发送,而且各个队列发送线程的关联性很小,发送时不需要相互等待,大大提高了组播发送的效率。
具体实施的系统框图如图10所示。
数据包从PHY/MAC芯片或交换芯片接收到网络处理器后,由接收引擎把数据包保存在缓存中交给协议处理引擎处理,在进行必要的协议处理,路由查找后,如果是组播包,就按照本发明把数据包加入到所有端口的发送队列,然后由发送引擎发送,并由最后一个发送结束的引擎归还缓存。
机译: 多媒体数据处理设备,包括该多媒体数据处理设备的多媒体系统以及一种多媒体数据记录方法,当记录多媒体数据时,通过优化内存使用量能够长时间记录数据
机译: 减少数据的方法,特别是从检测光学记录的数据时发现的方法,以及该程序的实现
机译: 一种减少计算机内存需求,从而减少电信数据传输需求的方法;