4.1 认识路由

路由不仅存在于路由器中,也存在于操作系统中,不仅Linux系统有,Windows中也存在。本节将简单介绍路由的概念。

4.1.1 路由的基本概念

路由器传递数据包的方法与现代邮政系统工作机制相似,先按行政区域划分设立邮局。如果信件传递仅发生在邮局内部,则直接分拣投递即可,例如北京市东城区某小区发往东城区另一小区的信件,只需在东城区邮政局分拣投递即可。如果信件发往外埠则需要借助邮政局间的运输网络,例如由北京市东城区发往四川省成都市成华区的邮件,则需要东城区邮政局将邮件交由北京市邮政局,再由北京市邮政局通过运输网络发往四川省,然后层层下发直到邮件到达收件人手中。

数据包的传递过程与邮政系统类似,也是先将计算机分组划分成不同子网,然后通过子网间的路由器传递数据包,如图4.1所示。

图4.1 子网拓扑

在图4.1中共有2个交换机和路由器及3台计算机,共包含192.168.0.0/24、192.168.1.0/24、192.168.2.0/24 3个子网,本例中各设置的IP地址等信息均已在图中。需要特别说明的是图中所示的MAC地址正确格式应为“00-51-5B-C0-00-08”或“00:51:5B:C0:00:08”,此处为方便说明简写为A、B、C等格式。

与邮政系统类似,当数据包发送的目标地址为同一子网时,数据包由交换机直接传送给目标主机。例如当PC1发送数据包给PC2时,PC1会首先发送ARP广播寻找PC2的MAC地址,ARP广播会发送给子网192.168.0.0/24中的所有计算机。图中所示的PC2和IP地址为192.168.0.1的路由器接口均会收到广播,但只有PC2会回应PC1的广播并将其MAC地址反馈给PC1。当PC1收到PC2的MAC地址后,将目的IP、MAC地址正确写入数据包,然后交由交换机发送给PC2,数据包传输过程完成了。

另一种情况是PC1发送的数据包目的地址与PC1不在同一子网时,这时就与邮政系统类似,PC1会将数据包交给自己的“上级”默认网关。例如在图4.1中PC1发送数据包给PC3,数据包发送过程如下:

(1)由于PC1与PC3的地址不在同一子网,因此PC1会将数据包的MAC地址修改为D发送出去,交换机会将数据包交给192.168.0.1,即路由器。

(2)与路由器相连的网络分别为192.168.0.0/24和192.168.1.0/24,因此路由器并不知道网络192.168.2.0/24位于何处,此时就需要借助路由条目的帮助。为了能将数据包成功发往PC3,路由器中就需要一条指向192.168.2.0/24的路由条目,这个条目指明数据包的下一跳地址为192.168.1.2。

(3)根据路由条目指示,路由器会将数据包目的MAC地址修改为F将数据包发送给路由器2。

(4)路由器2与192.168.2.0/24直接相联,因此收到数据包后,路由器2会将目的MAC修改为C发送给交换机,交换机再将数据包交给PC3,数据包传输完成。

纵观上述过程,无论是数据包发送给默认网关,还是由一个路由器发送给另一个路由器,都离不开路由的参与。

4.1.2 路由的原理

在4.1.1节中介绍了路由的基本作用,但路由运作的机制比较复杂,本小节将简要介绍路由的基本原理。

一个路由条目至少包含3个要素:子网,子网掩码和下一跳地址(在有些设备中使用的是下一跳设备),其主要含义如下:

●子网:目标子网的网络号,默认路由的子网号为0.0.0.0。

●子网掩码:目标子网的子网掩码,默认路由的子网掩码为0.0.0.0。

●下一跳地址:目标子网数据包的转发地址。在有些路由器中可以使用下一跳设备,设备通常是本地接口。

通常计算机中会有多条路由条目,计算机发出数据包时会进行计算,将目标IP地址与路由条目中的子网掩码按位与,即二进制按位做乘法。如果按位与的结果与路由条目的子网相同,则采用此路由条目的下一跳地址作为转发目的地。例如在图4.1中,路由器发往PC3的数据包地址为192.168.2.2,与192.168.2.0/24网络的子网掩码按位与的结果为192.168.2.0,与子网相同,因此就会将数据包转发给192.168.1.2。

无论是计算机还是路由器,在计算路由时都遵循精确匹配原则,即如果多条路由条目都匹配目标地址,则使用最精确的条目作为转发路径。例如IP地址192.168.2.2能同时匹配192.168.0.0/16和192.168.2.0/24,但基于精确匹配原则,最终将使用192.168.2.0/24这条路由条目。

4.1.3 Linux系统中的路由表

在计算机中通常不止一个路由条目,能正常通信的计算机至少有两个路由条目,而路由器中的路由条目可能会更多。这些路由条目存储于路由表中,如果要在Linux系统中查看路由表,可以使用route命令,如【示例4-1】所示。

【示例4-1】

  [root@localhost ~]# route
  Kernel IP routing table
  Destination  Gateway       Genmask        Flags  Metric Ref  Use Iface
  default       172.16.45.1  0.0.0.0        UG      0       0    0    eno16777736
  172.16.45.0  0.0.0.0       255.255.255.0 U       0       0    0    eno16777736

在示例4-1中,命令输出了两个路由条目,第一条是指向默认网关的默认路由,第二条是与计算机直接相连的子网路由。命令输出中Flags字段中的U表示路由条目可用,G表示正在使用的网关。

4.1.4 静态路由和动态路由

在4.1.1小节中介绍了数据包如何从PC1发送到PC3的整个过程,当数据包到达192.168.0.1后,路由器将会计算下一步的路径,其依据就是路由器中保存的路由条目。本小节将介绍这些路由条目的来源及分类。

路由的来源有三种,第一种是路由器和计算机根据自身的网络连接自动生成的直联路由,即与自身所在同一子网的路由,只要网络持续连接直联路由就会一直存在并生效;第二种是由管理员手动添加的静态路由,静态路由仅适合于网络运作简单的环境,Linux系统中添加的路由多为静态路由;最后一种是由动态路由协议生成的动态路由。

静态路由的缺点很明显,当路由器数量增加时,子网数量也增多,这时就需要在每个路由器上为每个子网添加路由,否则就会出现无法访问的问题。如果其中一台路由器出现问题,路由条目就会失效,也会造成无法访问的问题。

为了解决静态路由的这些问题,动态路由协议应运而生,动态路由协议会根据网络状况调整各路由器的路由条目,最大程度上保持网络通畅。常见的动态路由协议有RIP、OSPF、BGP、IGRP等。

(1)RIP(Routing Information Protocol,路由信息协议)是最简单的路由协议,RIP协议要求路由器以30秒为周期,向相邻的路由器交换信息,从而让每个路由器都建立路由表。RIP建立的路由表以距离为单位,通过一个路由器称为一跳,RIP总是希望数据包通过最少的跳数到达目的地。RIP最大的优点是配置简单,但仅适用于小型网络,如果跳数超过15,数据包将不可达。由于路由器每30秒向相邻路由器交换信息,因此RIP协议的收敛时间相对较长(收敛时间是指路由协议让每个路由器建立精确并稳定的路由表的时间长度,时间越长,网络发生变化后,路由表生成得越慢,网络稳定需要的时间也越长)。

(2)OSPF(Open Shortest Path First,开放最短路径优先)是一个相对比较复杂的动态路由协议。OSPF一般用于一个路由域内,称为自治系统(Autonomous System)。在这个自治系统内部,所有加入到OSPF的路由器都会通过路由协议相互交换信息,以维护自治系统的结构数据库,最后路由器会通过数据库计算出OSPF路由表。与RIP相比,OSPF协议根据链路状态计算路由表,更适合于大型网络,其收敛速度也更快。

(3)BGP(Border Gateway Protocol,边界网关协议)是一个用来处理自治系统之间的路由关系的路由协议,最适合处理像Internet这样十分巨大的网络。BGP即不完全是距离矢量协议,也不完全像OSPF那样使用链路状态,BGP使用的是通路向量路由协议。BGP使用TCP协议进行可靠的传输,同时还使用了路由汇聚、增量更新等功能,极大地增加了网络可靠性和稳定性。

(4)IGRP(Interior Gateway Routing Protocol,内部网关路由协议)是由Cisco公司设计的专用于Cisco设备上的一种路由协议。IGRP是一种距离向量路由协议,其要求路由器以90秒为周期向其相邻的路由器发送路由表的全部或部分,由此区域内的所有路由器都可以计算出所有网络的距离。由于使用网络延迟、带宽、可靠性及负载等都被用作路由选择,因此IGRP的稳定性相当不错。

动态路由协议除了上面介绍的4种之外,还有许多例如IS-IS等,此处不再赘述,感兴趣的读者可自行参考相关资料了解。