开门见山,先上一张全景图。
在 TCP/IP 通信中,网络层的作用是实现终端的点对点通信。IP 协议通过 IP 地址将数据包发送给目的主机,能够让互联网上任何两台主机进行通信。IP 地址可以识别主机和路由器,路由器可以把全世界的网络连接起来。
路由器可以连接多个网络。它有多个端口,分别连接不同的网络区域。通过识别目的 IP 地址的网络号,再根据路由表进行数据转发。路由器会维护一张路由表,通过路由表的信息,路由器才能正确的转发 IP 报文。
路由是网络设备根据 IP 地址对数据进行转发的操作。当路由器收到一个数据包时,它根据数据包的目的 IP 地址查询路由表,如果有匹配的路由条目,就根据查询结果将数据包转发出去,如果没有任何匹配的路由条目,则将数据包丢弃,这个过程就是 IP 路由。除了路由器,三层交换机、防火墙、负载均衡设备甚至主机等设备都可以进行路由操作,只要这个设备支持路由功能。
为了将数据包发给目的节点,所有节点都维护着一张路由表。路由表是路由器通过各种途径获得的路由条目,每一个路由条目包含目的网段地址 / 子网掩码、路由协议、出接口、下一跳 IP 地址、路由优先级和度量值等信息。路由表记录 IP 包在下一跳应该发给哪个路由器。IP 包根据路由表在各个数据链路上传输。
一个实际的网络中,一台路由器通常包含多条路由条目,这些路由条目从不同的来源获取。路由表的来源可分为三类,分别是直连路由、静态路由和动态路由。
直连路由:路由器直接连接的路由条目,只要路由器接口配置了 IP 地址,接口状态正常,就会自动生成对应的直连路由。
静态路由:通过命令手动添加的路由条目就是静态路由。
动态路由:通过路由协议从相邻路由器动态学习到的路由条目。
不同来源的路由有不同的优先级,优先级的值越小,则路由的优先级就越高。当存在多条目的网段相同,但来源不同的路由时,具有最高优先级的路由成为最优路由,将被加入到路由表中,而其它路由则处于未激活状态,不显示在路由表中。
路由协议的默认优先级如下:
路由环路是数据转发形成死循环,不能正确到达目的地。
路由环路的主要生成原因是配置错误的路由或网络规划错误导致。比如:在两台路由器上配置到相同目的地址的路由表项,下一跳互相指向对方,就会造成路由环路。另外某些动态路由协议配置不当,也有可能产生环路。
一条路由条目,无论是静态的还是动态的,都需要关联到一个出接口,出接口指的是设备要到达目的网络是的出站接口。路由的出接口可以是这个设备的物理接口,如千兆网口,也可以是逻辑接口,如 VLAN 接口,或者是隧道接口等。其中有一种接口非常特殊,那就是 Null 接口,只有一个编号,那就是 0 。Null0 是一个系统保留的逻辑接口,当网络设备在转发数据包时,如果使用出接口 Null0 的路由,那么数据包将被丢弃,就像被扔进了一个黑洞里,因此出接口为 Null0 的路由条目又被称为黑洞路由。
黑洞路由是一种非常有用的路由条目,适用于如下场景:
在网络使用中,按需将数据包指向黑洞路由,实现流量过滤。
在已经部署路由汇总的网络中,用于防止数据转发出现环路。
在部署了 NAT 的网络中,用于防止数据转发出现环路。
在 BGP 网络中,用于发布特定网段的路由。
静态路由是手动添加完成的。如果有 100 个网段,一个路由器就需要设置将近 100 条路由信息。网络使用过程中,不可避免的出现网段新增、删除、修改等情况,这些更新的路由信息需要在所有路由器上进行设置。还有一个不可忽视的问题,一旦某个路由器出现故障,数据传输无法自动绕过故障节点,只能通过手动设置才能恢复正常。
如果是使用动态路由,提前设置好路由协议,路由器之间会定期交换路由信息,路由器会知道网络中其它网段的信息,动态生成路由表。如果网络出现变化,网段需要增删改时,只需要在相应的路由器上配置动态路由即可。不需要像静态路由那样,在所有路由器上进行修改。对于大型网络,路由器个数较多时,主要使用动态路由协议。
即使网络上的节点出现故障,只要有一个可绕行的其它路径,那么路由器的路由表会自动重新设置,数据包也会自动选择这个路径。
采用路由协议后,网络拓扑结果变化的响应速度会大大提升。无论网络正常的增删改,还是异常的网络故障,相邻的路由器都会检测到变化,会把拓扑的变化通知网络中其它的路由器,使它们的路由表产生相应的变化。这个过程比手动对路由表的修改要快很多,也准确很多。
对于少于 10 个路由器的小型网络,静态路由或许已经能够满足需求,但是在大中型网络中,通常会使用动态路由协议,或者动态路由与静态路由协议相结合的方式来建设这个网络。
路由器之间需要运行相同的路由协议,才能相互交换路由信息。每种路由协议都有自己的语言,即相应的路由协议报文。如果两台路由器启动了相同的路由协议,那么就有了相互通信的基础。不同的路由协议,有相同的目的,就是计算和维护路由表。通常工作过程包含 4 个阶段:
邻居发现阶段:运行了路由协议后,路由器会主动把自己的网段信息发送给相邻的路由器。既可以使用广播发送路由协议消息,也可以单播将路由协议消息发送给指定的邻居路由器。
交换路由信息阶段:发现邻居后,每台路由器都将自己的路由信息发送给相邻的路由器,相邻路由器又发送给下一个相邻的路由器。经过一段时间后,每台路由器都会收到网络中所有的路由信息。
计算路由阶段:每一台路由器都会运行某种算法,计算出最终的路由表来。
维护路由阶段:为了感知突然发送的网络故障,比如:设备故障或线路中断等,路由协议规定相邻两台路由器之间,应该周期性发送协议报文。如果路由器在一段时间内,没收到邻居发来的协议报文,就认为邻居路由器失效。
随着 IP 网络的发展,网络规模已经很大了,无论哪种路由协议都不能完成全网的路由计算,因此网络分成了很多个自治系统( AS , Autonomous System )或路由选择域 ( Routing Domain )。自治系统可以制定自己的路由策略,并管理自治系统内进行具体路由控制的路由器集合。
每个自治系统都有一个唯一的自治系统编号,它的基本思路是希望通过不同的编号来区分不同的自治系统。通过路由协议和自治系统编号,路由器可以确定路由路径和路由信息的交换方式。某个自治系统缺乏足够的安全机制,就可以利用编号改变路径回避它。
自治系统的编号范围是 1 ~ 65535
,其中 1 ~ 64511
是注册的因特网编号,64512 ~ 65535
是专用网络编号。
自治系统(路由选择域)内部动态路由使用的协议是域内路由协议,即 IGP 。而自治系统之间的路由控制使用的是域间路由协议,即 EGP 。
IGP 和 EGP 的关系,跟 IP 地址网络号和主机号的关系类似。根据 IP 地址的网络号在网络中进行路由选择,根据主机号在网段内部进行主机识别一样。既可以根据 EGP 在区域网络之间进行路由选择,也可以根据 IGP 在区域网络内部进行主机识别。
路由协议被分为 EGP 和 IGP 两个层次。没有 EGP 就不可能有世界上各个不同机构网络之间的通信,没有 IGP 机构内部也就不可能进行通信。
IGP 是指在同一个自治系统内交换路由信息的路由协议。RIP 、RIP2 、OSPF 属于 IGP 。IGP 的主要目的是发现和计算自治系统内的路由信息。
EGP 与 IGP 不同,EGP 用于连接不同的自治系统,并在不同自治系统间交换路由信息。EGP 的主要目的是使用路由策略和路由过滤等手段,控制路由信息在自治系统间的传播。BGP 属于 EGP 。
按照路由的算法和路由信息的交换方式,路由协议可以分为距离矢量( Distance-Vector ,D-V )路由协议和链路状态( Link-State )路由协议。其中典型的距离矢量协议是 RIP ,典型的链路状态协议是 OSPF 。
距离矢量路由协议指的是基于距离矢量的路由协议,RIP 是最具代表性的距离矢量路由协议。距离矢量这个概念包含两个关键的信息:距离和方向,其中距离是指到达目的网络的度量值(即所要经过路由器的个数),而方向指的是到达目的网络的下一跳设备。
每一台运行距离矢量路由协议的路由器会周期性的将自己的路由表通告出去,相邻的路由器收到路由信息并更新自己的路由表,再继续向其它直连的路由器通告路由信息,最终网络中的每台路由器都能知道各个网段的路由,这个过程称为路由的泛洪过程。
路由器之间互换目的网络的方向和距离的信息,并以这些信息更新路由表。这种方法在处理上比较简单,不过由于只有距离和方向的信息,所以当网络构造变得复杂时,在获得稳定的路由信息之前需要消耗一定时间(即路由收敛时间长),也极易发生路由循环等问题。
运行链路状态路由协议的路由器会使用一些特殊的信息描述网络的拓扑结构和 IP 网段,这些信息被称为链路状态信息( LSA ),所有路由器都会产生自己直连接口的链路状态信息。
路由器将网络中泛洪的链路状态信息搜集起来,存入一个数据库中,这个数据库就是 LSDB (链路状态数据库),LSDB 是对整个网络的拓扑结构及 IP 网段的描述,路由器拥有相同的 LSDB 。对于任何一台路由器,网络拓扑都完全一样。
接下来所有的路由器都基于 LSDB 使用最短路由优先算法进行计算,得到一棵已自己为根的、无环路的最短路径树,并将得到的路由加载到路由表中。
链路状态算法使用增量更新机制,只有当链路的状态发生变化时,才发送路由更新信息。
相比距离矢量路由协议,链路状态路由协议具有更大的扩展性和更快的收敛速度,但是它的算法消耗更多的内存和 CPU 处理能力。
不同的路由协议,有不同的特点。各个路由协议的性能指标体现如下:
协议计算的正确性:是指路由协议的算法会不会产生错误的路由导致网络环路。不同的路由协议使用的算法不同,因此路由正确性也不相同。链路状态路由协议(如 OSPF )在算法上杜绝了产生路由环路的可能性,比距离矢量路由协议更优。
路由收敛速度:路由收敛是指全网路由器的路由表达到一致状态。收敛速度快,意味着网络拓扑结构发生变化时,路由器能够更快的感知,并及时更新相应的路由信息。OSPF 、BGP 等协议的收敛速度快于 RIP 。
协议所占的系统开销:路由器在运行路由协议时,需要消耗的系统资源,比如:CPU 、内存等。工作原理的不同,各个路由协议对系统资源的需求也不同。OSPF 路由技术的系统开销要大于 RIP 协议。
协议自身的安全性:是指协议设计时,有没有考虑防止网络攻击。OSPF 、RIPv2 有相应的防止攻击的认证方法,而 RIPv1 没有。
协议适用网络规模:不同路由协议所适用的网络规模、拓扑结构不同。RIP 协议有 16 跳的限制,所以只能应用在较小规模的网络中;而 OSPF 可以应用在几百台路由器的大规模网络中;BGP 能够管理全世界所有的路由器,其所管理的网络规模大小只受系统资源的限制。
各种路由协议都需要使用 IP 来进行报文封装,但其细节有所不同。
RIP 协议是最早的路由协议,是为小型网络中提供简单易用的动态路由。RIP 协议报文采用 UDP 封装,端口号是 520 。由于 UDP 是不可靠的传输层协议,所以 RIP 协议需要周期性的广播协议报文来确保邻居收到路由信息。
OSPF 是目前应用最广泛的路由协议,可为大中型网络提供分层的、可靠的路由服务。OSFP 直接采用 IP 进行封装,所有协议报文都由 IP 封装后进行传输,协议号是 89 。IP 是尽力而为的网络层协议,本身是不可靠的,所以为了保证传输的可靠性,OSPF 采用了复杂的确认机制来保证传输可靠。
BGP 采用 TCP 来保证协议传输的可靠性,TCP 端口号是 179 。BGP 不需要自己设计可靠传输机制,降低了协议报文的复杂度和开销。
几种主要的路由协议表如下:
end