组播地址分配方法

文档序号:7599488阅读:259来源:国知局
专利名称:组播地址分配方法
技术领域
本发明涉及计算机分布式虚拟环境领域,尤指一种应用在该领域中的组播地址分配方法。

背景技术
组播是一种一对多的通信机制,发送一次信息即可将该信息发送至需要相同数据的同一组用户。由于组播的这一特性,使得组播技术成为大规模分布式虚拟环境所需要依赖的主要通讯手段,组播地址分配也就成为建立通道的关键所在。由于路由器所能支持的组播地址数目是有限的,可同时加入主机的组播地址数目也是有限的,然而分布式虚拟环境所需求的组播地址数目却是巨大的,因而组播地址分配方法成为分布式虚拟环境中的重要问题之一。
分布式虚拟环境发展至今,主要有四类组播地址分配方法 一、基于数据本身的内容进行的组播地址分配方法,典型例子就是各种形式的网格分配方法,即预先将组播地址分配给网格单元。该方法的优点是计算量小,发送方和接收方之间不需要进行匹配,缺点是随着虚拟空间的规模增大,组播地址需求增加极其迅速,而且组播地址浪费严重。
二、基于数据发送方的组播地址分配方法。该方法在数据的发送方为每个数据源分配组播组,数据发送方根据所有的发布/订购包括区域相关信息进行匹配计算,并指导接收方加入相应的组播组。这种方法一般采用一个对象实例分配一个组播地址的方法,对仿真节点进行分配的粒度过高,不符合普通的应用需求。同时这种方法需要仿真节点知道虚拟环境中周围的实体以及这些实体所使用的组播地址,从而给网络带来了额外的数据传输。
三、基于数据接收方的组播地址分配方法。该方法基于数据接收目标,为每种目的节点的组合分配组播组。一旦发送方知道了目标节点列表,它就可以把数据向代表这些目标的组播地址发送。这种方法的优点是仿真节点不会收到不想接收的数据,并且接收方(目标节点)不需要知道发送方的信息,没有额外的数据传输。然而,对于一个全连接的仿真来说,如果有N台主机,这种机制需要的组播组数量将是2N-1。
四、从全局通讯连接信息出发,把组播地址分配问题转化为最优问题求解,根据算法求解进行组播地址分配。
综上所述,无论上述哪种组播地址分配方法都是采用组播地址的预分配,即预先把组播地址分配好,不能随着某处通讯量的加大或者减少来随时调整所分配的组播地址,从而不能有效利用组播地址资源。


发明内容
本发明要解决的问题是提供一种能够充分利用组播地址资源的组播地址分配方法。
为了解决上述问题,本发明组播地址分配方法的技术方案包括下述步骤 10)组播地址静态预分配,该步骤又进一步分为, 11)将路径空间划分为多个网格单元和12)为网格单元分配组播地址; 20)若网格单元中的对象数超过网格单元对象数的上限,则对该网格单元进一步划分,并为新形成的网格单元分配组播地址,所述对象指仿真实体; 30)若网格单元中的对象数低于网格单元对象数的下限,则删除该网格单元,回收分配给其的组播地址。
所述步骤11)又进一步分为 步骤110)若占用路径空间中的区域的对象少,则该区域的网格单元密度小; 步骤111)若占用路径空间中的区域的对象多,则该区域的网格单元密度大。
所述步骤12)又进一步分为 步骤120)若对象不可能或者不应该加入该网格单元所对应的路径空间,则不为其分配组播地址,或者为所有这些网格单元分配一个组播地址; 步骤121)若对象可能加入该网格单元所对应的路径空间,则为其分配一个组播地址,并以二维点阵的形式来表示组播地址在网格单元的分配,每一个网格单元作为二维点阵的一个结点,其中, handle_mapping[m-1][n-1],表示第m行第n列的结点的组播地址; 结点以组播地址句柄减去一个基准值作为标识结点的索引,组播地址句柄是组播地址的唯一标识,而基准值的大小是所有组播地址的句柄的最小值。
所述步骤20)中对网格单元进一步划分指以点-区域四分树的形式划分,所述点-区域四分树是完全四叉树,指每次将一个结点划分成四个子结点,其所包含的结点中要么是叶结点要么是父结点。
所述结点由下列属性表示 层数,用于表示该结点生长的层数,其中,组播地址静态预分配时建立的结点的层数为0,每生长一次层数加1,所述生长指该结点的进一步划分; 三个子结点的索引,用于表示该结点的三个子结点的位置,其中,0表示空; 叶结点,用于表示该结点是否是叶结点; 组播地址句柄,是组播地址的唯一标识。
所述步骤20)又进一步分为 21)若结点中的对象数超过结点对象数的上限,则从组播地址句柄获得结点的索引; 22)若该结点是内部结点,则退出,所述内部结点指父结点; 23)若该结点是未分配结点,则退出,所述未分配结点指未为该结点分配组播地址; 24)找出三个未用的组播地址句柄; 25)根据这三个组播地址句柄分别创建三个子结点并为每一个子结点分配一个组播地址; 26)将该结点设置为内部结点。
所述步骤24)进一步分为 241)判断当前空组播地址句柄索引是否合法; 242)若不正确,重新设置,否则步骤243)根据当前空组播地址句柄索引查找空组播地址句柄; 244)若所有组播地址已分配完一遍,再从头开始查找组播地址句柄。
所述步骤30)进一步分为 31)若结点中的对象数低于结点对象数的下限,通过组播地址句柄得到该结点的索引并对其进行合法性检查,否则退出; 32)若该结点是叶结点,销毁该结点,释放组播地址句柄并退出; 33)递归删除第一子结点,第二子结点,第三子结点; 34)重新设置原内部结点为叶结点或者还原为组播地址静态预分配时建立的结点。
与现有技术相比,本发明组播地址分配方法的有益效果是 由于若网格单元中的对象数超过网格单元对象数的上限,就对该网格单元进一步划分,并为新形成的网格单元分配组播地址,换句话说,若某处的对象数过多,也就表明其需要更多的组播地址来进行通讯,那么就给它分配更多的组播地址。若网格单元中的对象数低于网格单元对象数的下限,就回收为该网格单元分配的组播地址,换句话说,若某处的对象数过少,也就表明其不再需要那么多的组播地址进行通讯,此时就将分配给其的组播地址回收,以便于将组播地址分配给需要的区域。因而本发明组播地址分配方法能够随着某处对象数的多少来随时调整组播地址的分配,即实现了分配组播地址的动态分配,从而能够充分利用组播地址资源。



图1是按传统网格单元划分方法划分的网格单元示意图; 图2是本发明组播地址分配方法的流程图; 图3是以三国鼎立的地形图为例划分的网格单元示意图; 图4是组播地址分配的一例的示意图; 图5是结点生长的流程图; 图6是结点回收的流程图; 图7(a)和(b)是PR四分树生长的示意图; 图8是退化的PR四分树的示意图。

具体实施例方式 IP(Internet Proctocol,网络协议)协议采用D类地址来支持组播,每个D类地址代表一组主机,故组播地址范围从224.0.0.0到239.255.255.255。一些组播地址被指定为永久地址,在RFC(Request For Comments,请求注解)最新分配列表中列出,例如224.0.0.1代表该子网内所有系统组,224.0.0.3代表该子网内所有路由器组等。故组播地址的资源是有限的。
维是属性值变化的坐标轴,以名称标识。路径空间是维的一个命名序列,该序列形成的多维坐标系统是仿真中属性值的数据空间。组播地址分配也就是将一定数量的组播地址“点”按照一定的规律放置到路径空间的一些小单元中。
传统的网格分配法按照预定义的规则将路径空间划分成固定大小的网格单元(Cell),为每一个网格单元分配一个组播地址。将区域和划分的网格单元进行重叠匹配,就可以确定区域所覆盖的网格单元。所述区域指对象(即仿真实体)的感知范围,对象只对该范围内的信息感兴趣而忽略该范围以外的信息,或者对象只向该范围发布信息。订购该区域的接收方应加入这些网格单元对应的组播地址,发布更新区域的发送方则向网格单元所对应的组播地址发送数据,这样接收方就能够接收到发送方发送的数据。
如图1所示,路径空间被划分为A1至A5、B1至B5、C1至C5、D1至D5共20个网格单元,接收方a的订购区域S1,与其关联的网格单元为B3、B4、B5、C3、C4和C5,也就是说接收方a加入了网格单元B3、B4、B5、C3、C4和C5所对应的组播地址;发送方b的更新区域U1,与其关联的网格单元为A2、A3、B2和B3,也就是说发送方b向A2、A3、B2和B3所对应的组播地址发送数据;发送方c的更新区域U2,与其关联的网格单元为C2、C3、D2和D3,也就是说发送方c向网格单元C2、C3、D2和D3所对应的组播地址发送数据。
由于对象,即仿真实体,也指网格单元所对应的路径空间的组播地址的使用者,在路径空间中的分布密度是不均匀的,这样会出现有些网格单元所对应的组播地址没有被使用,因而造成大量组播地址的浪费。
如图2所示,本发明组播地址分配方法,包括下述步骤 10)组播地址静态预分配,该步骤又进一步分为, 11)将路径空间划分为多个网格单元和12)为网格单元分配组播地址; 20)若网格单元中的对象数超过网格单元对象数的上限,则对该网格单元进一步划分,并为新形成的网格单元分配组播地址,所述对象指网格单元所对应的路径空间的组播地址的使用者,即仿真实体; 30)若网格单元中的对象数低于网格单元对象数的下限,则将删除该网格单元,回收分配给其的组播地址。
所述步骤11)又进一步分为 步骤110)若占用路径空间中的区域的对象少,则该区域的网格单元密度小; 步骤111)若占用路径空间中的区域的对象多,则该区域的网格单元密度大。
所述步骤12)又进一步分为 步骤120)若对象不可能或者不应该加入该网格单元所对应的路径空间,则不为其分配组播地址,或者为所有这些网格单元分配一个组播地址; 步骤121)若对象可能加入该网格单元所对应的路径空间,则为其分配一个组播地址,并以二维点阵的形式来表示组播地址在网格单元的分配,每一个网格单元作为二维点阵的一个结点,其中, handle_mapping[m-1][n-1],表示第m行第n列的结点的组播地址; 结点以组播地址句柄减去一个基准值作为标识结点的索引,组播地址句柄是组播地址的唯一标识,而基准值的大小是所有组播地址的句柄的最小值。
所述步骤20)中对网格单元进一步划分指以点-区域四分树(PR四分树,Point-Region Quadtree)的形式划分,所述PR四分树是完全四叉树,指每次将一个结点划分成四个子结点,其所包含的结点中要么是叶结点要么是包含4个叶结点的父结点。
如图4所示,将路径空间划分为9个不均匀的网格单元,1、2、3、4、5、6分别代表组播地址分配到相应的网格空间中。组播地址1所在的网格单元中的黑点表示加入该网格单元所对应的组播地址的对象。当某个区域(譬如组播地址1所在的网格单元)的对象数量增多时,需要为该区域分配更多的组播地址,这时将组播地址1所在的网格单元进行四等分,四等分后形成的四个小网格单元的组播地址分别为1、7、8和9,如图7(a)所示。如果组播地址7所在的网格单元的对象仍然密集,则将组播地址7所在的网格单元再次生长。如图7(b)所示,组播地址1生长两次后的PR四分树结构。
由于PR四分树的内部结点也需要分配组播地址,如图7中的组播地址句柄1和7不能重复使用,因而这种分配存在一定的组播地址浪费。不考虑内部结点的第一子结点的二次生长,可以将内部结点的第一个子女退化到内部结点中,这样,PR四分树就可以从完全四叉树退化到完全三叉树。如图8所示,退化的PR四分树使每个结点与已用的组播地址句柄一一对应,故使用退化的PR四分树来表示结点,结点的数据结构为 //退化的PR四分树结点结构 typedef struct{int level;//结点生长的层数(0表示组播地址静态预分配时 建立的结点)int split_node[3];//01,10,11三个子结点索引.0表示空.3=2**2-1.bool is_leaf; //是否叶结点int groupHandle;//组播地址句柄 }tree_node; 其中 所述结点由下列属性表示 层数,用于表示该结点生长的层数,其中,组播地址静态预分配时建立的结点的层数为0,每生长一次层数加1,所述生长指该结点的进一步划分; 三个子结点的索引,用于表示该结点的三个子结点的位置,其中,0表示空; 叶结点,用于表示该结点是否是叶结点; 组播地址句柄,是组播地址的唯一标识。
本发明组播地址分配方法通过判断网格单元中对象的数目来决定是将该网格单元所对应的组播地址回收以待分配给其它网格单元,还是为该网格单元再分配些组播地址,从而实现组播地址的动态分配。
对于对象多的区域,表明其需要更多的组播地址以进行通讯,故在对象多的区域划分的网格单元的密度要大些;相应地,对于对象小的区域,划分的网格单元的密度要小些。如图3所示,以三国鼎立的二维地形为例,在三方战端频繁的地点,可以将网格线的距离减小,增加网格单元的密度,其它地点可以适当放宽网格线的距离,如边荒地区、远海等地点。
对于对象不可能或不应该进入的网格单元,不分配组播地址,或者考虑可能有少数对象进入,可为所有这些网格单元分配一个组播地址。如图3所示,将边荒地区、远海等地点设置为反选状态,不分配组播地址,该例中一共划分了400个网格单元,实际分配了146个网格单元,所分配的组播地址数目大大降低,组播地址占用率降到36.5%。
二维点阵Grid用来表示组播地址在网格单元中的分配,其结构为 //m,nint  //dimension X上的划分value_of_X[m]int(已归一化)  //dimension Y上的划分value_of_Y[n]int(已归一化)  //组播地址数组handle_mapping[m-1][n-1]int  typedef struct{  //X轴点的个数  int num_of_X;  //Y轴点的个数  int num_of_Y;  //X轴点的值,int[num_of_X]  U32*value_of_X;  //Y轴点的值,int[num_of_Y]  U32*value_of_Y;  //二维网格单元数组,记录组播地址句柄编号.  int[num_of_X-1][num_of_Y-1]  int**handle_mapping;   }Grid; 如图5所示,所述步骤20)又进一步分为 21)若结点中的对象数超过结点对象数的上限,则从组播地址句柄获得结点的索引; 22)若该结点是内部结点,则退出,所述内部结点指父结点; 23)若该结点是未分配结点,则退出,所述未分配结点指未为该结点分配组播地址; 24)找出三个未用的组播地址句柄; 25)根据这三个组播地址句柄分别创建三个子结点并为每一个子结点分配一个组播地址; 26)将该结点设置为内部结点。
所述步骤24)进一步分为 241)判断当前空组播地址句柄索引是否合法; 242)若不正确,重新设置,否则步骤243)根据当前空组播地址句柄索引查找空组播地址句柄; 244)若所有组播地址已分配完一遍,再从头开始查找组播地址句柄。
上述步骤中,若结点中的对象数目超过节点对象数的上限,表明在该结点处的对象数目过多,其需要更多的组播地址来进行通讯,故应对该结点再分配些组播地址。首先从组播句柄获得结点的索引,若该结点是内部结点,因为内部结点不能再次生长,故退出,否则表示是叶结点或未分配结点。若该结点是未分配结点,表明该结点未分配组播地址,不能生长,故退出,否则表示该结点为已分配结点(组播地址静态预分配时建立的结点或者各退化的PR四分树上的结点)。该结点为已分配结点,找出三个未用的组播地址句柄。
找出3个未用的组播地址句柄的伪代码为 //查找空组播地址句柄,其中空组播地址句柄索引min_null_index用以指示开始寻找空组播地址句柄的起始位置,group_count_static表示组播地址静态预分配时分配的组播地址数目,group_count表示组播地址的总数目。
//查找空组播地址句柄函数int findNullNode(){  int temp=min_null_index;  //(1)对当前空组播地址句柄进行合法性检查,这里的合法性是指空组播<br/>地址句柄应该从下标为group_count_static的元素开始  if((min_null_index<group_count_static)  ‖(min_null_index>=group_count))   min_null_index=group_count_static;  //(2)根据当前空组播地址句柄记录查找  //min_null_index指在第一个空节点处,空结点以其level属性为0作为标<!-- SIPO <DP n="7"> --><dp n="d7"/>识  if(quadtree[min_null_index].level==0){  min_null_index=findNextNullNode(min_null_index);  return temp;  }  //(3)如地址已分配完一遍,从头重新开始  //min_null_index无效,从头开始重新找被释放的组播地址空间  temp=findNextNullNode(group_count_static);  //再找下一个并记录  min_null_index=findNextNullNode(temp);  return temp;}//查找下一个空组播地址句柄int findNextNullNode(int index){  int i=index+1;  while(i<group_count){  //空结点以其level属性为0作为标识  if(quadtree[i].level==0)  //找到空组播地址句柄并返回  return i;  }  //没有空组播地址句柄返回-1  return-1;} 为每一个新的组播地址句柄创建一个结点,将原结点设置为内部结点,新创建的结点为该结点的子结点,这样,该结点实现了生长。
结点生长算法的伪代码如下所示,其中group_index是结点的索引,group_handle是组播地址句柄,base_group_handle是为从组播地址句柄获得结点的索引而设置的基准值,其大小是组播地址句柄中的最小值。
//生长一层(包括子结点)int grow(int group_handle){  //(1)由组播地址句柄得到结点的索引;  int group_index=group_handle-base_group_handle;  //(2)检查该结点是否已是树,树不能再次生长;  if(quadtree[group_index].is_leaf=false)  //已是树,不能再生长  return 0;  //(3)检查该结点是否是种子,未在某棵树上的非种子结点不能生长;<!-- SIPO <DP n="8"> --><dp n="d8"/>  if((quadtree[group_index].level==0)  &amp;&amp;(group_index>group_count_static-1))  //动态组播地址,但尚未在某棵树上  return-1;  if(group_count-group_count_used<3)  //组播地址不够了  return-2;  //(4)找出3个未用的组播地址句柄;  //找出3个空的组播地址  int a0,a1,a2;  a0=findNullNode();  a1=findNullNode();  a2=findNullNode();  //(5)分别生成子结点并进行设置;  int level=quadtree[group_index].level;  if(a0)  quadtree[a0].level=level+1;  if(a1)  quadtree[a1].level=level+1;  if(a2)  quadtree[a2].level=level+1;  //(6)将子结点分配给新的位置。  //分配给新的位置&amp;设置新的3+1个节点信息  quadtree[group_index].is_leaf=false;  quadtree[group_index].split_node
=a0;  quadtree[group_index].split_node[1]=a1;  quadtree[group_index].split_node[2]=a2;  quadtree[a0].is_leaf=true;  quadtree[a1].is_leaf=true;  quadtree[a2].is_leaf=true;  group_count_used+=3;  return 1;} 在路径空间中检索出需要组播地址生长的网格单元,也就是结点,检索的关键码是空间属性。所述空间属性是指空间坐标的值。检索包括下述步骤 ●检索二维点阵,找出组播地址静态预分配时建立的结点。该步骤根据空间属性在二维点阵中确定横纵坐标,并在该结点所属的网格中确定相对位置; ●若该结点已经生长成具有子结点的PR四分树,以该结点为树的根结点(或称为内部结点),在这棵退化的PR四分树中检索所需的叶结点。
实现上述检索的伪代码为 INT SEARCH(U32x,U32y){  //(1)查找森林中该空间位置在组播地址静态预分配时建立的结点   //根据grid计算横坐标值   INTi=COLUMN(y);   //根据grid计算纵坐标值   INTj=ROW(x);   IF(Grid.handle_mapping[i][j]==0)   //此处未分配组播地址  RETURN 0;  //(2)检索该位置的树   FLOAT fx=(x-Grid.value_of_X[j-1])*1.0/(Grid.value_of_X[j]-Grid.value_of_[j-1]);   FLOAT fy=(y-Grid.value_of_Y[i-1])*1.0/(Grid.value_of_Y[i]-Grid.value_of_Y[i-1]);   RETURN SearchInTree(fx,fy,mapping_grid.handle_mapping[i]j]);  } 在二维点阵中查找组播地址静态预分配时建立的结点以二分法方法分别在横纵轴上进行检索。所述横纵轴分别指路径空间的第一维和第二维,其坐标的划分分别按照从小到大的顺序记录在Grid.value_of_X[]与Grid.value_of_Y[]中。
采用二分法计算组播地址静态预分配时建立的结点的横坐标的伪代码为 //根据grid计算横坐标值  INT COLUMN(U32x){   //二分法查找的起点   INT i=0;   //二分法查找的终点   INT j=Grid.num_of_X-1;   //初始化二分法查找的中点m为零   INT m=0;  //边界情况   IF(x<=Grid.value_of_X[1])   //左边界   RETURN i;   IF(x>=Grid.value_of_X[j-1])<!-- SIPO <DP n="10"> --><dp n="d10"/>  //右边界  RETURN j-1;   //二分法搜索   j--;   WHILE(i<=j){  //设置二分法查找的中点  m=(i+j)/2;  IF(x<Grid.value_of_X[m])   j=m-1;  ELSE   i=m+1;   }   RETURN i;} 采用二分法计算组播地址静态预分配时建立的结点的纵坐标与上述同理,不再赘述。
通过空间属性与根结点的相对坐标(fx,fx)来比较确定进一步要搜索的子结点,对原空间属性乘2求余以确定在子结点中新的空间属性,进行深度搜索,直至查找到叶结点。由于每一个网格单元(结点)采用退化的PR四分树表示,每一结点又可称为一棵树,多个结点也就构成了森林。对退化的PR四分树检索的伪代码为 //在PR四分树中进行结点的搜索//在树中进行结点的搜索int search_in_tree(float x,float y,int d_group_index){  //叶结点,检索成功  if(quadtree[d_group_index].is_leaf==true)  return d_group_index;  //内部结点,需要进一步确定子结点  int num=0;  //第一子结点已退化  if((x>0.5)&amp;&amp;(y<=0.5))  //第二子结点(对应退化的PR四分树的第一子结点)  num=0;  else if((x<=0.5)&amp;&amp;(y>0.5))  //第三子结点(对应退化的PR四分树的第二子结点)  num=1;  else if((x>0.5)&amp;&amp;(y>0.5))  //第四子结点(对应退化的PR四分树的第三子结点)<!-- SIPO <DP n="11"> --><dp n="d11"/>  num=2;  //x,y进行1的模运算,确定在子结点中的空间属性  x*=2;  y*=2;  if(x>=1)  x=x-1;  if(y>=1)  y=y-1;  //搜索子结点  return search_in_tree(x,y,quadtree[d_group_index].split_node[num]);} 如图6所示,所述步骤30)进一步分为 31)若结点中的对象数低于结点对象数的下限,通过组播地址句柄得到该结点的索引并对其进行合法性检查,否则退出;所述合法性是指结点的索引值应该是大于0并且小于或等于组播地址总数目的整数; 32)若该结点是叶结点,销毁该结点,释放组播地址句柄并退出; 33)递归删除第一子结点,第二子结点,第三子结点; 34)重新设置原内部结点为叶结点或者还原为组播地址静态预分配时建立的结点。
实现步骤30)的伪代码如下 其中group_index表示结点的索引,group_handle表示组播地址句柄,base_group_handle表示组播地址句柄的起始值; //回收组播地址函数int prune(int group_handle){  //(1)由组播地址句柄得到结点的索引,并对索引进行合法性检查;  int group_index=group_handle-base_group_handle;  if(group_index<0‖group_index>group_count)  return-1;  //(2)如果该结点是叶结点,释放组播地址并返回;  if(quadtree[group_index].is_leaf){   quadtree[group_index].level=0;   return 1;  }  //(3)递归删除所有子结点;  int a0,a1,a2;  //a0,a1,a2分别是该结点的第一、二、三个子结点(退化的PR四分树)  a0=quadtree[group_index].split_node
;<!-- SIPO <DP n="12"> --><dp n="d12"/>  a1=quadtree[group_index].split_node[1];  a2=quadtree[group_index].split_node[2];  //删除该结点的第一、二、三个子结点(退化的PR四分树)  quadtree[group_index].split_node
=0;  quadtree[group_index].splii_node[1]=0;  quadtree[group_index].split_node[2]=0;  if(a0){  //考虑到a0可能有子结点,递规删除  prune(a0);  group_count_used--;  }  if(a1){  //考虑到a1可能有子结点,递规删除  prune(a1);  group_count_used--;  }  if(a2){  //考虑到a2可能有子结点,递规删除  prune(a2);  group_count_used--;  }  //(4)重新设置有关组播地址句柄。  //如果该结点不是组播地址静态预分配时分配的结点,则设为叶子结点,否则设为非叶子结点  if(group_index<group_count_static)  quadtree[group_index].is_leaf=true;  else  quadtree[group_index].is_leaf=false;  return 0;} 若结点中的对象数低于结点对象数的下限,表明该结点中的对象数过少,其不再需要那么多的组播地址进行通讯,故回收分配给其的组播地址。若该结点是叶结点,释放该结点的组播地址句柄,否则该结点为内部结点,则递归删除该内部结点的三个子结点。该内部结点的子结点都删除后,将该结点重新设置为叶结点或者还原为组播地址静态预分配时建立的结点。
下面以实例来描述采用本发明组播地址分配方法动态分配组播地址的过程。
由于组播地址的动态分配方法与具体的组播地址值无关,因此,本发明的前提是仿真用户已经根据自己的需要确定了在仿真过程中所使用的组播地址集合。
如图4所示,将路径空间划分为9个不均匀的网格单元,为网格单元1、2、3、4、5、6分别分配组播地址,比如分配的组播地址分别是225.0.0.3,225.0.0.4,225.0.0.5,225.0.0.6,225.0.0.7,225.0.0.8,而其余的三个网格由于对象不可能或者不应该加入该网格单元所对应的路径空间,从而不为其分配组播地址(或者为所有这些网格单元分配一个组播地址,本实例采取不为其分配组播地址的方法)。这样完成了组播地址的静态预分配过程。
当组播地址225.0.0.3所在的网格单元的对象数量增多并需要为该区域分配更多的组播地址时,这时将组播地址225.0.0.3所在的网格单元进行四等分,四等分后形成的四个小网格单元分别为1、7、8和9,如图7(a)所示。这时找出三个未用的组播地址,比如225.0.0.9,225.0.0.10,225.0.0.11,并分别作为小网格单元7、8、9的组播地址,这样实现了网格单元的生长。如果组播地址225.0.0.9所在的网格单元的对象仍然密集,则将组播地址225.0.0.9所在的网格单元再次生长。随着仿真过程的推进,如果1、7、8和9四个小网格单元的对象数减少到一定数目,则释放网格单元7、8和9的组播地址225.0.0.9,225.0.0.10和225.0.0.11,并将1、7、8和9四个小网格单元合并成一个大的网格单元1,该大的网格单元的组播地址是225.0.0.3。释放的组播地址225.0.0.9,225.0.0.10和225.0.0.11作为空闲组播地址可以再次使用。通过上述过程实现了组播地址的动态分配。
以上所述仅是本发明组播地址分配方法的优选实施方式,应当指出,对于本技术领域的普通技术人员来说,在不脱离本发明组播地址分配方法原理的前提下,还可以作出若干改进和润饰,这些改进和润饰也应视为本发明组播地址分配方法的保护范围。
权利要求
1、一种组播地址分配方法,包括下述步骤
10)组播地址静态预分配,该步骤又进一步分为,
11)将路径空间划分为多个网格单元和12)为网格单元分配组播地址;
20)若网格单元中的对象数超过网格单元对象数的上限,则对该网格单元进一步划分,并为新形成的网格单元分配组播地址,所述对象指仿真实体;
30)若网格单元中的对象数低于网格单元对象数的下限,则删除该网格单元,回收分配给其的组播地址。
2、如权利要求1所述的组播地址分配方法,其特征在于,所述步骤11)又进一步分为
步骤110)若占用路径空间中的区域的对象少,则该区域的网格单元密度小;
步骤111)若占用路径空间中的区域的对象多,则该区域的网格单元密度大。
3、如权利要求2所述的组播地址分配方法,其特征在于,所述步骤12)又进一步分为
步骤120)若对象不可能或者不应该加入该网格单元所对应的路径空间,则不为其分配组播地址,或者为所有这些网格单元分配一个组播地址;
步骤121)若对象可能加入该网格单元所对应的路径空间,则为其分配一个组播地址,并以二维点阵的形式来表示组播地址在网格单元的分配,每一个网格单元作为二维点阵的一个结点,其中,
handle_mapping[m-1][n-1],表示第m行第n列的结点的组播地址。
4、如权利要求3所述的组播地址分配方法,其特征在于,所述步骤20)中对网格单元进一步划分指以点-区域四分树的形式划分,所述点-区域四分树是完全四叉树,指每次将一个结点划分成四个子结点,其所包含的结点中要么是叶结点要么是父结点。为了进一步减少组播地址资源的浪费,完全四叉树退化成完全三叉树。
5、如权利要求4所述的组播地址分配方法,其特征在于,所述结点由下列属性表示
层数,用于表示该结点生长的层数,其中,组播地址静态预分配时建立的结点的层数为0,每生长一次层数加1,所述生长指该结点的进一步划分;
三个子结点的索引,用于表示该结点的三个子结点的位置,其中,0表示空;
叶结点,用于表示该结点是否是叶结点;
组播地址句柄,是组播地址的唯一标识。
6、如权利要求5所述的组播地址分配方法,其特征在于,所述步骤20)又进一步分为
21)若结点中的对象数超过结点对象数的上限,则从组播地址句柄获得结点的索引;
22)若该结点是内部结点,则退出,所述内部结点指父结点;
23)若该结点是未分配结点,则退出,所述未分配结点指未为该结点分配组播地址;
24)找出三个未用的组播地址句柄;
25)根据这三个组播地址句柄分别创建三个子结点并为每一个子结点分配一个组播地址;
26)将该结点设置为内部结点。
7、如权利要求6所述的组播地址分配方法,其特征在于,所述步骤24)进一步分为
241)判断当前空组播地址句柄索引是否合法;
242)若不正确,重新设置,否则步骤243)根据当前空组播地址句柄索引查找空组播地址句柄;
244)若所有组播地址已分配完一遍,再从头开始查找组播地址句柄。
8、如权利要求5所述的组播地址分配方法,其特征在于,所述步骤30)进一步分为
31)若结点中的对象数低于结点对象数的下限,通过组播地址句柄得到该结点的索引并对其进行合法性检查,否则退出;
32)若该结点是叶结点,销毁该结点,释放组播地址句柄并退出;
33)递归删除第一子结点,第二子结点,第三子结点;
34)重新设置原内部结点为叶结点或者还原为组播地址静态预分配时建立的结点。
全文摘要
本发明公开了一种组播地址分配方法,包括步骤10)组播地址静态预分配,该步骤又进一步分为,11)将路径空间划分为多个网格单元和12)为网格单元分配组播地址;20)若网格单元中的对象数超过网格单元对象数的上限,则对该网格单元进一步划分,并为新形成的网格单元分配组播地址,所述对象指仿真实体;30)若网格单元中的对象数低于网格单元对象数的下限,则删除该网格单元,回收分配给其的组播地址。本发明组播地址分配方法能够随着某处对象数的多少来随时调整组播地址的分配,即实现了分配组播地址的动态分配,从而能够充分利用组播地址资源。
文档编号H04L29/12GK1610326SQ200410091190
公开日2005年4月27日 申请日期2004年11月23日 优先权日2004年11月23日
发明者周忠, 吴威, 黄海 申请人:北京航空航天大学
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1