在“查表判断转发目标”这一点上,路由器和交换机的大体思路是类似的
,不过具体的工作过程有所不同。交换机是通过MAC头部中的接收方MAC地址来判断转发目标的,而路由器则是根据IP头部中的IP地址来判断的
。由于使用的地址不同,记录转发目标的表的内容也会不同。
路由器中的表叫作路由表,其中包含的信息如图3.13所示。
路由器根据“IP地址”判断转发目标。
最左侧的目标地址列记录的是接收方的信息。这里的IP地址只包含表示子网的网络号部分的比特值,而表示主机号部分的比特值全部为0。路由器会将接收到的网络包的接收方IP地址与路由表中的目标地址进行比较,并找到相应的记录。交换机在地址表中只匹配完全一致的记录,而路由器则会忽略主机号部分,只匹配网络号部分。打个比方,路由器在转发包的时候只看接收方地址属于哪个区,××区发往这一边,××区发往那一边。
在匹配地址的过程中,路由器需要知道网络号的比特数,因此路由表中还有一列子网掩码。子网掩码的含义和第1章的图1.9(b)中介绍的子网掩码基本相同,通过这个值就可以判断出网络号的比特数。
路由器会忽略主机号,只匹配网络号。
上面这些介绍可以帮助大家大致理解路由器的工作方式,如果要进一步深入,还需要再思考一些问题。刚才我们说过,目标地址列中的IP地址表示的是子网,但也有一些例外,有时地址本身的子网掩码和路由表中的子网掩码是不一致的,这是路由聚合的结果。路由聚合会将几个子网合并成一个子网,并在路由表中只产生一条记录。要搞清楚这个问题,我们还是看一个例子。如图3.14所示,我们现在有3个子网,分别为10.10.1.0/24、10.10.2.0/24、10.10.3.0/24,路由器B需要将包发往这3个子网。在这种情况下,路由器B的路由表中原本应该有对应这3个子网的3条记录,但在这个例子中,无论发往任何一个子网,都是通过路由器A来进行转发,因此我们可以在路由表中将这3个子网合并成10.10.0.0/16,这样也可以正确地进行转发,但我们减少了路由表中的记录数量,这就是路由聚合。经过路由聚合,多个子网会被合并成一个子网,子网掩码会发生变化,同时,目标地址列也会改成聚合后的地址。
相对地,还有另外一些情况,如将一个子网进行细分并注册在路由表中,然后拆分成多条记录。
从结果上看,路由表的子网掩码列只是用来在匹配目标地址时告诉路由器应该匹配多少个比特。而且,目标地址中的地址和实际子网的网络号可能并不完全相同,但即便如此,路由器依然可以正常工作。
此外,通过上述方法,我们也可以将某台具体计算机的地址写入路由表中,这时的子网掩码为255.255.255.255,也就是说地址中的全部32个比特都为1。这样一来,主机号部分比特全部为0可以表示一个子网,主机号部分比特不全部为0可以表示某一台计算机,两种情况可以用相同的规则来处理[插图]。
路由表的子网掩码列只表示在匹配网络包目标地址时需要对比的比特数量。
关于目标地址和子网掩码我们先讲到这里。接下来在子网掩码的右边还有网关和接口两列,它们表示网络包的转发目标。根据目标地址和子网掩码匹配到某条记录后,路由器就会将网络包交给接口列中指定的网络接口(即端口)[插图],并转发到网关列中指定的IP地址。
最后一列是跃点计数,它表示距离目标IP地址的距离是远还是近。这个数字越小,表示距离目的地越近;数字越大,表示距离目的地越远。
路由表记录维护的方式和交换机也有所不同。交换机中对MAC地址表的维护是包转发操作中的一个步骤,而路由器中对路由表的维护是与包转发操作相互独立的,也就是说,在转发包的过程中不需要对路由表的内容进行维护。
对路由表进行维护的方法有几种,大体上可分为以下两类。
(a)由人手动维护路由记录
(b)根据路由协议机制,通过路由器之间的信息交换由路由器自行维护路由表的记录
其中(b)中提到的路由协议有很多种,例如RIP、OSPC、BGP等都属于路由协议。