分组转发是指在互联网络中路由器转发IP分组的物理传输过程与数据报转发机制。根据分组的目的IP地址与源IP地址是否属于同一个子网可分为直接转发和间接转发

先简单介绍一下路由器,从下图(a)中可以看出,路由器的主要工作就是为经过路由器的每个数据包寻找一条最佳的传输路径,并将该数据有效地传送到目的站点。由此可见,选择最佳路径的策略即路由算法是路由器的关键所在。为了完成这项工作,在路由器中保存着各种传输路径的相关数据——路由表(Routing Table),供路由选择时使用,表中包含的信息决定了数据转发的策略。在实际上的路由器中,像下图中所示的“直接”和“其他”的几个字符并没有出现在路由表中,而是被记为0.0.0.0 。

可以把整个的网络拓扑简化为下图(b)所示的那样。在简化图中,网络变成了一条链路,但每一个路由器旁边都注明其IP地址。使用这样的简化图,可以使我们不必关心某个网络内部的具体拓扑以及连接在该网络上有多少台主机,因为这些对于研究分组转发问题并没有什么关系。这样的简化图强调了在互联网上转发分组时,是从一个路由器转发到下一个路由器。在路由表中,对每一条路由最主要的是以下两个信息:(目的网络地址,下一跳地址)

  • 假设:有四个 A 类网络通过三个路由器连接在一起。每一个网络上都可能有成千上万个主机。
  • 可以想象,若按目的主机号来制作路由表,每一个路由表就有 4 万个项目,即 4 万行(每一行对应于一台主机),则所得出的路由表就会过于庞大。
  • 但若按主机所在的网络地址来制作路由表,那么每一个路由器中的路由表就只包含 4 个项目(每一行对应于一个网络),这样就可使路由表大大简化。

根据目的网络地址就能确定下一跳路由器,这样做的结果是:

	* IP 数据报最终一定可以找到目的主机所在目的网络上的路由器(可能要通过多次的间接交付)。

	* 只有到达最后一个路由器时,才试图向目的主机进行直接交付。

特定主机路由

	* 虽然互联网所有的分组转发都是基于目的主机所在的网络,但在大多数情况下都允许有这样的特例,即为特定的目的主机指明一个路由。

	* 采用特定主机路由可使网络管理人员能更方便地控制网络和测试网络,同时也可在需要考虑某种安全问题时采用这种特定主机路由。

默认路由 (default route)

不是 N1 和 N2,就一律选择默认路由,把数据报先间接交付路由器 R1,让 R1 再转发给下一个路由器。

必须强调指出

  • IP 数据报的首部中没有地方可以用来指明“下一跳路由器的 IP 地址”。

  • 当路由器收到待转发的数据报,不是将下一跳路由器的 IP 地址填入 IP 数据报,而是送交下层的网络接口软件。

  • 网络接口软件使用 ARP 负责将下一跳路由器的 IP 地址转换成硬件地址,并将此硬件地址放在链路层的 MAC 帧的首部,然后根据这个硬件地址找到下一跳路由器。

关于路由表

  • 路由表没有给分组指明到某个网络的完整路径。

  • 路由表指出,到某个网络应当先到某个路由器(即下一跳路由器)。

  • 在到达下一跳路由器后,再继续查找其路由表,知道再下一步应当到哪一个路由器。

  • 这样一步一步地查找下去,直到最后到达目的网络。

下图为分组转发算法示意图:

划分子网和构造超网

上面所讨论的是IP层怎样根据路由表的内容进行分组转发,而没有涉及到路由表一开始是如何建立的以及路由表中的内容应如何进行更新。但是在进一步讨论路由选择之前,我们还要先介绍划分子网和构造超网这两个非常重要的概念。

划分子网

1)从两级IP地址到三级IP地址

在早期,原来的两级IP地址的设计不够合理。

第一,IP地址空间的利用率有时很低。有的单位申请到了一个B类地址网络,但所连接的主机数并不多,可是又不愿意申请一个足够使用的C类地址,理由是考虑到今后可能的发展。第二,给每一个物理网络分配一个网络号会使路由表变得太大因而使网络性能变坏。第三,两级IP地址不够灵活。有时情况紧急,一个单位需要在新的地点马上开通一个新的网络。但是在申请到一个新的IP地址之前,新增加的网络是不可能连接到互联网上工作的。

为解决上述问题,从1985年起在IP地址中又增加了一个“子网号字段”,使两级IP地址变成为三级IP地址,它能够较好地解决上述问题,并且使用起来也很灵活。这种做法叫做划分子网(subnetting) [RFC 950]。或子网寻址子网路由选择 。划分子网己成为互联网的正式标准协议。

划分子网是通过借用IP地址的若干位主机位来充当子网地址从而将原网络划分为若干子网而实现的。划分子网的思路如下:

划分子网时,随着子网地址借用主机位数的增多,子网的数目随之增加,而每个子网中的可用主机数逐渐减少。

以C类网络为例,原有8位主机位,2的8次方即256个主机地址,默认子网掩码255.255.255.0。借用1位主机位,产生2个子网,每个子网有126个主机地址;借用2位主机位,产生4个子网,每个子网有62个主机地址……每个网中,第一个IP地址(即主机部分全部为0的IP)和最后一个IP(即主机部分全部为1的IP)不能分配给主机使用,所以每个子网的可用IP地址数为总IP地址数量减2;根据子网ID借用的主机位数,我们可以计算出划分的子网数、掩码、每个子网主机数:

如上表所示的C类网络中,若子网占用7位主机位时,主机位只剩一位,无论设为0还是1,都意味着主机位是全0或全1。由于主机位全0表示本网络,全1留作广播地址,这时子网实际没有可用主机地址,所以主机位至少应保留2位。

总之,当没有划分子网时,IP地址是两级结构.划分子网后IP地址变成了三级结构。划分子网只是把IP地址的主机号这部分进行再划分,而不改变IP地址原来的网络号。

2)子网掩码

子网掩码(subnet mask)又叫网络掩码、地址掩码、子网络遮罩,它是一种用来指明一个IP地址的哪些位标识的是主机所在的子网,以及哪些位标识的是主机的位掩码。子网掩码不能单独存在,它必须结合IP地址一起使用。子网掩码只有一个作用,就是将某个IP地址划分成网络地址和主机地址两部分。子网掩码是一个32位地址,用于屏蔽IP地址的一部分以区别网络标识和主机标识,并说明该IP地址是在局域网上,还是在远程网上。

子网掩码的计算:

如上图所示,IP地址,与掩码进行与运算,得到子网主机地址,但是需要注意的是,上图只是该IP下的一个子网之一,172.16.0.0(10101100 00010000 0000 0000) 是一个B类地址,采用上图的掩码,255.255.240.0(11111111 11111111 11110000 00000000),进行与运算,那么该IP的子网占用主机位四位,也就是说,该网络下,地址以11111111 11111111 0000 到 11111111 11111111 1111 开头的,分属于不同的子网,每个子网可以有0000 00000001 到 1111 11111111 (1 ~ 4094)台不等数量的主机。

通过简单的计算,读者不难得到这样的结论:划分子网增加了灵活性,但却减少了能够连接在网络上的主机总数。

如果没有子网呢?使用子网掩码可以更便于查找路由表。现在互联网的标准规定:所有的网络都必须使用子网掩码,同时在路由器的路由表中也必须有子网掩码这一栏。如果一个网络不划分子网,那么该网络的子网掩码就使用默认子网掩码。默认子网掩码中I的位置和IP地址中的网络号字段net-id正好相对应。因此,若用默认子网掩码和某个不划分子网的IP地址逐位相“与”(AND),就应当能够得出该IP地址的网络地址来。这样做可以不用查找该地址的类别位就能知道这是哪一类的IP地址。

使用子网时分组的转发

在划分子网的情况下,分组转发的算法必须做相应的改动。

无分类编址CIDR(构造超网)

无分类域IBS路由选择CIDR (Classless Inter-Domain Routing. CIDR的读音是“sider" )。

1)网络前缀

CIDR最主要的特点有两个:

1. CIDR消除了传统的A类、B类和C类地址以及划分子网的概念。

CIDR把32位的IP地址划分为前后两个部分。前面部分是“网络前缀”(network-prefix)(或简称为“前缀”),用来指明网络,后面部分则用来指明主机。因此CIDR使IP地址从三级编址 (使用子网掩码)又回到了两级编址,但这己是无分类的两级编址。其记法是{<网络前缀>,<主机号>} 。CIDR还使用“斜线记法”(slash notation),或称为CIDR记法,即在IP地址后面加上斜线“/”,然后写上网络前缀所占的位数。例如128.14.35.7/20。

2. CIDR把网络前缀都相同的连续的IP地址组成一个“CIDR地址块”。

我们只要知道CIDR地址块中的任何一个地址,就可以知道这个地址块的起始地址(即最小地址)和最大地址,以及地址块中的地址数。例如,128.14.35.7/20=10000000 00001110 00100011 00000111,这个地址所在的地址块中的最小地址和最大地址可以很方便地得出:

由于一个CIDR地址块中有很多地址,所以在路由表中就利用CIDR地址块来查找目的网络。这种地址的聚合常称为路由聚合(route aggregation),它使得路由表中的一个项目可以表示原来传统分类地址的很多个(例如上千个)路由。这减少路由器了之间的路由选择信息的交换,从而提高了整个互联网的性能。

从上图可看出,每一个CIDR地址块中的地址数一定是2的整数次幕。除最后几行外,CIDR地址块都包含了多个C类地址(是一个C类地址的2^n倍,n是整数),这就是“构成超网”这一名词的来源。使用CIDR的一个好处就是可以更加有效地分配IPv4的地址空间,可根据客户的需要分配适当大小的CIDR地址块。

2)最长前缀匹配

在使用CIDR时,由于采用了网络前缀这种记法,IP地址由网络前缀和主机号这两个部分组成,因此在路由表中的项目也要有相应的改变。这时,每个项目由**“网络前缀”“下一跳地址”组成。但是在查找路由表时可能会得到不止一个匹配结果**。这样就带来一个问题:我们应当从这些匹配结果中选择哪一条路由呢?

正确的答案是:应当从匹配结果中选择具有最长网络前缀的路由。这叫做最长前缀匹配((longest-prefix matching),这是因为网络前缀越长,其地址块就越小,因而路由就越具体(more specific)。最长前缀匹配又称为最长匹配最佳匹配

3)使用二叉线索查找路由表

使用CIDR后,由于要寻找最长前缀匹配,使路由表的查找过程变得更加复杂了。当跳由表的项目数很大时,需要设法减小路由表的查找时间。为了进行更加有效的查找,通常是把无分类编址的路由表存放在一种层次的数据结构中,然后自上而下地按层次进行查找.这里最常用的就是二叉线索(binary trie),它是一种特殊结构的树。IP地址中从左到右的比特值决定了从根节点逐层向下层延伸的路径,而二叉线索中的各个路径就代表路由表中存放的各个地址。

下图用一个例子来说明二叉线索的结构。图中给出了5个IP地址。为了简化二叉线索的结构,可以先找出对应于每一个IP地址的唯一前缀(unique prefix)。所谓唯一前缀就是在表中所有的IP地址中,该前缀是唯一的。这样就可以用这些唯一前缀来构造二叉线索。在进行查找时,只要能够和唯一前缀相匹配就行了。

完成IP的分组转发及路由选择同时,为了更有效地转发IP数据报和提高交付成功的机会,因此需要配合网络层 网际控制报文协议ICMP (Internet Control Message Protocol) [RFC 792]协议 。

可参考:https://blog.51cto.com/11659526/2451909 中 “ICMP协议(网际控制报文协议)”