1. 引言
几年来,高容量宽带网络使多媒体应用称为可能,多媒体的应用又要求网络提供服务质量QoS保证,IETF在QoS的实现上提出许多模型,包括:综合服务/资源预留IntServ/RSVP[1] 、区分服务DifServ[2] 、多协议标签交换协议MPLS[3] 、流量工程和约束路由CBR[4] 、子网带宽管理SBM。
在这几种模型中,最早出现的是IntServ/RSVP模型,该模型是针对单个流进行资源预留,中间路由器要保存各个流的状态,当数据流的数量增加时,维护流状态的信息量会很大,增加路由器的负担,并且每个路由器必须是RSVP路由器。所以该模型实现成本较高,扩展性差,不适合在大型网络中使用。
DiffServ模型的出现,是为了改变IntServ/RSVP模型的鲁棒性和扩展性问题。所以从根本上来说DiffServ模型与IntServ/RSVP模型是一脉相承的。DiffServ把复杂性放在网络的边界路由器,边界路由器对用户数据进行分类,标记,整形,内部核心路由器查看DS值,再根据PHB[5] 进行转发。DS是用户数据分组的优先级,根据优先级不同,DiffServ提供不同等级的QoS。PHB是仅是外特性的描述,表明在一个特定的路由器上分组所应获得的服务。DiffServ的特点:扩展性好,适合在大型网络中使用,但是只提供一种相对的服务质量,并不提供全网端到端服务质量保证。
MPLS模型在流量规划方面,实现了快速转发,但不能选择路由,必须和CBR合作。
这些方案各有优势,但都不能完全满足IP网络的QoS控制。因此在实现过程中需要对以上模型进行改进,或者把两种模型结合起来使用。
本文针对DiffServ在大型网络中使用时,路由器中的路由器表会很长,处理路由表信息时间成本增加,影响路由器的转发速度问题提出的一种改进方法。
DiffServ路由器转发过程是:在转发一个数据分组之前先查看路由器,找到目的地址,在其路由表中进行匹配,根据匹配的结果转发到相应的端口。该方式的主要问题是:当网络规模很大时,路由表很很长,此外每个路由器都要深入分析数据分组的头部,并且和路由表作匹配,这样浪费路由器的处理时间。
本文改进的方法是:不改变DiffServ基础结构的前提下,利用IPv6数据分组中的流标签字段,路由器转发时根据流标签字段,流标签相同的IPv6分组,沿相同的路径转发出去,不需要为每个数据分组选择路径,大大提高了转发的速度。
2. 新DiffServ结构设计
本文在原有DiffServ结构的基础上,物理结构并没有太大改变,主要是功能的增加。功能的增加表现在两个方面:一是,路由器转发表的改变;二是,在DS区域中,内部增加了一个LAR[6] 路由器,此路由器的功能主要是为本区域中的数据流分发数据流局部标签,边界路由器的功能为数据流分发并改写全局数据流标签。结构图如图1所示。
2.1. 边界路由器
在新DiffServ模型中,边界路由器将IPv6分组的通信量类型[7] 字段重新标记为DSCP字段。并把IPv6分组映射到不同的PHB。如图1所示。
DiffServ工作组已经推荐了DSCP和PHB之间的映射关系。如表1所示。
在图2中,边界路由器根据DSCP的值,判断把IPv6分组应归为哪个队列。其中EF[8] 、AF、BF是PHB的值。路由器根据PHB的值为IPv6分组分配相应的资源。

Figure 1. The new DiffServ Structure
图1. 新DiffServ结构

Figure 2. The TOS field is mapped to PHB
图2. TOS字段映射到PHB

Table 1. The recommended DSCP value
表1. 推荐的DSCP的值
路由器使用流标签转发表的过程如图3所示:当边界路由器,在完成DSCP到PHB映射以后,分析IPv6分组的头部信息,检查流标签信息是否在转发表里。如果流标签信息在转发表里,就在转发表里找到与流标签和源地址信息对应的转发端口号,按端口号转发出去。如果流标签信息不在转发表里,路由器分析IPv6分组的头部信息,检查一下跳端口、修正跳到跳[9] 选项,优化路由选项报头的地址和指针等,路由器记录上述结果,最终形成转发表[10] 。存储到高速缓存中,把流标签和源地址作为查询高速缓存相应流状态信息的关键字。转发表结构如如表2所示。
具有相同的源地址、目的地址流标签的IPv6分组属于同一业务数据流,所以当路由器中队列EF(AF或BF)接收到一个新的IPv6分组时,检测到相同的流标签时,就根据高速缓存[11] 中状态信息查询关键字(由流标签和源地址生成)。找出流标签的状态信息,采用相同的路径转发出去,不需要为每一个数据分组重新选择路由,大大提高了数据分组的转发速度。
AF、BF队列的转发表结构和EF队列的转发表结构是一样的。
2.2. 核心路由器
核心路由器除了不具备标记,整形等功能外,其他的功能和边界路由器是一样的,把源地址和流标签字段作为关键字,相同流标签和源地址的IPv6分组按相同的路径转发出去。
3. 流标签结构的设计
流标签结构的设计方案是:建立在DiffServ的基础上,第一比特为“0”表示通信流启用的默认的尽力而为[12] 的服务,为“1”表示启用的是区分服务。

Figure 3. The process of the routers using the flow label
图3. 路由器使用流标签过程

Table 2. The structure of the forwarding (EF queue)
表2. 转发表的结构(EF队列)
为了在大型网络中能方便管理流标签,本文将20位流标签字段分为前6位的“全局流标签”和后14位的“局部流标签”。如图4。
4. 流标签的分配和管理
为了使全网的流标签不发生混乱,正在使用的流标签不出现重复的现象。就要对流标签进行统一的分配和管理。
4.1. 流标签的分配
DiffServ模型是一种层次化结构,分为DS区域和DS区两级。DS区是有多个DS区域组成的。在每个DS区域中安装有一个流标签分配路由器,为该区域的数据流分配局部流标签LFL,以及为外部区域进到该区域的外部流分配全局流标签GFL。LAR(LAR1、LAR2)中保存DS区域(DS1区域、DS2区域)中正在使用的LFL流标签和GFL流标签。并用洪泛的方法向本区域内所有的路由器告知自己的IP地址。为了容错,每个域内设置两个LAR,一个主LAR,一个备用LAR。
4.2. 流标签的分配过程
局部流标签LFL[13] 的申请过程如下:
1) 主机PC1需要发送IPv6分组之前,要向最近路由器ER1发出流标签请求报文request[14] 。报文中包含分组的源地址和目的地址。
2) ER1收到请求报文request后,向DS1区域中LAR1转发此报文。
3) LAR1在局部流标签库中,找到一个没有使用的局部流标签LFL1,同时根据IPv6分组的目的地址判断,目的地址是否在DS1区域中,如果在此区域中,LAR1把全局流标签GFL1值置为0,由GFL1 + LFL1组合成完整的流标签,封装到分配报文answer中,向ER1发送流标签的分配报文answer[15] ,ER1再把分配报文answer传送到主机PC1,当PC1收到分配报文answer时,从中取出完整的流标签信息,分配给IPv6分组。
如果判断IPv6分组目的地址不在DS1区域中,就要申请全局GFL1流标签,申请过程如下:
1) LAR1根据目的地址,向边界路由器ER2发送全局流标签GFL1申请报文ask[16] ,并等待回复。
2) ER2向相邻的区域DS2的边界路由器ER3转发全局流标签GFL1申请报文ask,并等待确认。申请报文ask中包含DS1的编号[17] 。
3) ER3向DS2区域内的路由器LAR2转发申请报文ask,并等待回复。
4) LAR2判断流的目的地址是否在DS2内,如果不是,重复步骤1)~3),如果是向ER3发送回复[18] 报文message。报文message中包含GFL1信息。ER3把回复报文message发送ER2,ER2再转发此报文给LAR1。LAR1从报文message中取出GFL1,然后组合GFL1 + LFL1形成完整的流标签,发送给主机PC1,主机把完整的流标签分配给IPv6分组。
4.3. 流标签的管理
流标签的管理主要是流标签的分配和释放,流标签的分配主要有LAR路由器完成的。比如在DS1

Figure 4. The structure of the Flow Label
图4. 流标签的结构
区域的中LAR1路由器主要为本区域主机中数据流分配局部流标签,同时,为其他区域发送到本区域的数据流分配全局流标签。
流标签的释放可以用定时器,定时释放流标签。
5. 结束语
本文是DiffServ模型和IPv6流标签结合起来使用,把路由器的路由器表改变为转发表,当路由器接收到一个IPv6分组时,流标号相同时,查找转发表的关键字,根据相同的路径发送出去,这种方法要比DiffServ模型查找路由器表、分析目的地址头部的速度快,从整体上提高路由器的转发速度。