ICND1考试要求你对**基本路由**(basic routing)及**数据包流经某个网络的过程**(packet flow accross a network),有所掌握。我们也会**对各种路由协议背后的技术有所了解**(take a look at the technology behind routing protocols)。
务必要清楚,路由协议**不会**跨越网络发送数据包。它们是用来确定路由的最佳路径(their role is to determaine the best path for routing)。受路由的那些协议(routed protocols)才真正发出数据,而一个最常见的受路由协议实例,就是 IP 。
可能会要求你对自一个网络接收,并以另一个网络为目的地的数据包所发生的事情进行解释。首先,路由器通过移除二层帧的头部和尾部,实现三层数据包的解封装; 接着,路由器查看该 IP 数据包的目的 IP 地址,以找出路由表中的最佳路径; 最后,路由器将该三层数据包封装为一个新的二层帧,并将该帧从离开接口转发出去,那么**封装方式就可能从以太网变为HDLC**。此过程在下图10.4中进行了演示。
图10.7展示了离开路由器`A`前往路由器`B`的同样数据包。这里有着一次路由查找,接着数据包就被从接口`E1` **交换出去**(there is a route lookup and then the packet is switched out of interface `E1`)。类型`800`(`Type 800`)表明该数据包是一个 IPv4 数据包。
正是某种路由协议,才令到路由器实现如何达到其它网络的动态学习。路由协议还令到路由器实现与其它路由器或主机,就学习到的网络信息进行交换。这些路由协议可用于连接内部园区网络(connecting interior/internal campus networks),也用于连接不同企业或路由域(connecting different enterprises or **routing domains**)。因此,不光要掌握这些路由协议的复杂之处,还要牢固掌握何时在何种情况下要用这种路由协议,而不用另一种的原因。
### 平坦及层次化路由算法
**Flat and Hierarchical Routing Algorithms**
路由协议算法要么以平坦路由系统运作,要么就以层次化路由系统运作(routing protocol algorithms operate using either a flat routing system or a hierarchical routing system)。层次化路由系统在路由器纳入到被称作域、区域或自治系统的逻辑分组中时,采用的是层次化方法(a hierarchical routing system uses a layered approach wherein routers are placed in logical groupings referred to as domains, areas, or autonomous systems)。这样做允许网络中的不同路由器完成各自特定任务,从而优化在这些层上完成的功能。层次化系统中的一些路由器可与其它域或区域的路由器通信,而其他路由器只能与同一域或区域中的路由器进行通信。这样做可以减少该域中路由器必须处理信息的数量,从而实现网络内的快速收敛。
一个 IP 地址是分作两部分的。第一部分指明了网络地址,而第二部分指明的是主机地址。在设计某个网络时,就会用到某种 IP 分址方案,来将网络中的主机及设备进行唯一区分。该 IP 分址方案应是层次化的,且应建立在传统的逻辑层次化模型上。这样做就能实现该分址方案于网络中提供出一些指定点位,在这些点位完成有效的路由汇总。
通过图10.9可以看出,那些分支局(接入层)到地区局路由器(分布层)都是双线路接入(the branch offices(Access Layer) are dual-homed to the regional office routers(Distribution Layer))。这些层都是采用思科设计模型(Cisco design models)定义出来的。采用某种层次化分址方案,就令到分布层路由器将仅一条的那些分支局子网的汇总路由,通告给核心层。这样做保护了核心层免受任何位处分布层和接入层之间路由器路由抖动的影响,因为除非某条汇总路由所继承自的那些更为具体前缀都从路由表中移除,该条汇总路由是不会抖动的(this protects the Core Layer from the effects of any route flapping between the Distribution and Access Layer routers, because a summary route will not flap until every last one of the more specific prefixes from which it is derived is removed from the routing table)。这又带来了该区域稳定性的提升。此外,核心层路由表大小得以极大地减小。
### 管理距离
**Administrative Distance**
管理距离用于决定一个路由信息來源对另一个的可靠性(administrative distance is used to determine the reliability of one source of routing information from another)。一些路由信息来源被认为相较其它源更为可靠;那么,当自两种或更多不同路由协议得出两种或更多到同一目的的路径时,管理距离就可用于决定到某个目的网络或网络节点的最优或首选路径。
**管理距离是一个仅影响本地路由器的本地有意义值**。该值不会在路由域中传播(this value is not propagated throughout the routing domain)。因此,对一台路由器上某个或某些路由来源默认管理距离的修改,仅影响那台路由器对路由信息来源的选用。表10.1展示了思科 IOS 软件中所用到的默认管理值(考试要求掌握这些值)。
Invalid after 0 seconds, hold down 0, flushed after 0
Outgoing update filter list for all interfaces is not set
Incoming update filter list for all interfaces is not set
Redistributing: isis
Address Summarization:
None
Maximum path: 4
Routing for Networks:
Serial0/0
Routing Information Sources:
Gateway Distance Last Update
10.0.0.2 115 00:06:53
Distance: (default is 115 )
```
### 路由度量值
**Routing Metrics**
各种路由协议算法都会用到度量值,度量值是一个关联到特定路由的数值(routing protocol algorithms use metrics, which are numerical values that are associated with specific values)。使用这些数值来从路由协议学习到的路径中,从最优先到最不优先的顺序,进行优先选用(these values are used to prioritise or prefer routes learned by the routing protocol, from the most preferred to the least preferred)。本质上具有较低路由度量值的路由,就是该路由协议的较高优先顺序的路由。具有最低度量值的路由,通常就是到目的网络代价最小,或者说最优的路由。该条路由将被放入到路由表,并被用于将数据包转发到目的网络。
在涉及路由算法时,成本指的是通信成本(the cost, as it pertains to routing algorithms, refers to communication cost)。比如,某公司选择按传输的数据、或按使用时间付费的私有链路,而不是公共链路,就会造成成本的使用。**中间系统到中间系统(IS-IS)路由协议支持一个可选的,度量链路使用成本的费用度量值**(an optional expense metric)。依据不同协议,配置成本会有所不同。
负载对不同的人来说有不同的意思。例如,在一般计算术语中,负载是指某项计算资源,譬如 CPU ,当前的使用量。而在此处,负载是指某个特定路由器接口使用的比例(load, as it applies in this context, refers to the degree of use for a particular router interface)。接口上的负载是一个`255`的分数。比如,一个`255/255`的负载就表明该接口已完全饱和,而一个`128/255`的负载则表明该接口是`50%`饱和的。默认情况下,负载是按`5`分钟平均值计算的(真实世界中常使用**接口配置命令`load-interval 30`**将其修改为一个最小的`30s`)。**接口负载值可用于 EIGRP 中的度量值计算**。
思科路由器在决定使用位于路由表中的何条路由,来将流量转发到某个目的网络或节点时,采用的是最长前缀匹配规则(the longest prefix match rule)。在决定采用何条路由表条目来将流量路由至计划的目的网络或节点时,更长,或者说更具体的条目优先于像汇总地址那样的,不那么具体的条目。
最长前缀或最具体路由将用于路由流量到目的网络或节点,此时就会**忽视该最具体路由来源的管理距离**,如有多条经由同样路由协议学习到的重叠前缀,也甚至会忽视分配给该最长前缀的路由协议度量值。表10.3演示了某台将数据包发往地址`1.1.1.1`的路由器上路由选择的顺序。该顺序是基于最长前缀匹配查找的(this order is based on the longest prefix match lookup)。
如没有生成一张包含远端网络路由条目的路由表,或称之为路由信息库,路由器就不能将数据包转发到这些远端网络(without a populated routing table, or Routing Information Base(RIB), that contains entries for remote networks, routers will not be able to forward packets to those remote networks)。路由表可能包含了一些特定网络的条目或简单的一条默认路由。转发进程(the forwarding process)使用路由表中的信息将流量转发到目的网络或主机。路由表本身不会去实际转发流量。
01:29:15: RIP: received v2 update from 172.16.1.2 on Serial0
01:29:15:192.168.2.0/24 via 0.0.0.0
```
## 被动接口
**Passive Interfaces**
路由协议设计和配置的一个重要考虑,就是要限制不必要的对等传送(an important routing protocol design and configuration consideration is to limit unnecessary peerings), 如下图10.10所示。这是通过使用被动接口实现的, 被动接口可以阻止路由器在指定接口上形成路由邻接关系(routing adjacencies)。基于特定路由协议,此功能的使用会有所不同,但其做法通常有以下两类。
被动接口的一个用例实例就是用于防止路由协议数据自分布层对等传送( peerings )到接入层,就如同上面的图10.10所示。当留有三层跨越这些性质不同的接入层交换机的对等传输时(也就是在跨越交换机区块的不同交换机上有着多台主机),就只会增加内存负载、路由协议更新开销及更多的复杂性。同样,如发生了某条链路故障,流量会经由一台邻居接入交换机传输,而到达另一个 VLAN 成员处(by having Layer 3 switches across the different Access Layer switches(i.e., having multiple hosts on different switches across switch blocks) you are basically adding memory load, routing protocol update overhead, and more complexity. Also, if there is a link failure, the traffic may transit through a neighbouring Access Layer switch to get to another VLAN member)。
最短路径优先算法通过路由器创建出到某个区域或网络骨干中的所有主机的最短路径树,该路由器处于树的根部,并由该路由器完成树的生成计算。为让 SPF 算法以正确的方式工作,区域中的所有路由器都要有同样的数据库信息。在 OSPF 中,数据库信息同步是通过数据库交换过程实现的(the SPF algorithm creates a shortest-path tree to all hosts in an area or in the network backbone with the router that is performint the calculation at the root of that tree. In order for the SPF algorithm to work in the correct manner, all routers in the area should have the same database information. In OSPF, this is performed via the database exchange process)。
距离矢量是一种**用距离或跳数计数作为主要度量值**,来决定最佳转发路径的路由协议。距离矢量路由协议又是主要建立在Bellman-Ford算法基础上。距离矢量路由协议发送其邻居路由器的完整路由表,以保持这些路由器有关网络状态的最新信息(Distance Vector routing protocols periodically send their neighbour routers copies of their entire routing tables to keep them up to date on the state of the network)。**在某个小型网络中这也许可以接受,而当网络增大时,通过网络发送的流量数量就会增长**。所有距离矢量路由协议都有着以下的特征。
保持计数器用于阻止那些先前通告的网络由于宕掉而被放回到路由表中(hold-down timers are used to prevent networks that were previously advertised as down from being placed back into the routing table)。在路由器收到一个某网络宕掉的更新时,就启动它的保持计数器。该计数器告诉路由器在接受任何那个网络的状态变化之前,等待一段指定的时间。
在保持期间,路由器压制住该网络并阻止通告出无效信息(during the hold-down period, the router suppresses the network and prevents advertising false information)。就算路由器收到来自网络可达的其它路由器(它们可能没有收到网络宕掉的触发更新)的信息,也不会将数据包路由到该不可达网络。此机制设计用于阻止黑洞流量(the router also does not route to the unreachable network, even if it receives information from another router(that may not have recieved the triggered update)that the network is reachable. This mechanism is designed to prevent black-holing traffic)。
链路状态路由协议属于层次化的路由协议,采用区域的概念(the concept of areas),在网络中对路由器进行分组。这样做令到链路状态协议比起距离矢量协议能够更好地伸缩并以一种效率更高的方式运行。运行链路状态路由协议的路由器,创建出一个包含了网络全部拓扑的数据库。这样做令到同一区域中的路由器,都有着网络的同样视图(the same view of the network)。
链路状态路由协议通过发送链路状态通告(Link State Advertisement),或者说链路状态数据包(Link State Packets)给位于同一区域内其它路由器的方式运作。这些数据包包含了有关链路所连接的接口、链路度量值及链路其它变量的信息。随着路由器对这些信息的积累,它们就运行 SPF 算法并计算出到各台路由器及目的网络的最短(最佳)路径。使用接收到的链路状态信息,路由器建立其链路状态数据库(the Link State Database, LSDB)。在相邻两台路由器的 LSDBs 同步了时,就说它们形成了邻接关系。
距离矢量路由协议因其过于简单的“依据传言的路由”方法,而容易造成大问题(it is a known fact that Distance Vector routing protocols are prone to major problems as a result of their simplistic "routing by rumor" approach)。距离矢量和链路中台协议采用不同方法来防止路由故障。有下面这些最为重要的机制。
将某数据包预期的目的地址与 IP 路由表进行匹配,需要使用一些路由器的 CPU 运算周期。企业路由器可能有着数十万的路由条目,并能对同样数量的数据包与这些条目进行匹配。在尝试以尽可能高的效率来完成这个过程中,思科构建出了各种不同的交换方法(various switching methods)。第一种叫做进程交换(process switching), 而它用到路由查找及已分级的最佳匹配方法(uses the route lookup and best match already outlined)。此方式又在快速交换(fast switching)之上进行了改进。路由器生成的最近转发数据包 IP 地址清单,连同 IP 地址匹配下的数据链路层地址会被复制下来。作为对快速转发的改进,思科快速转发(Cisco Express Forwarding, CEF)技术得以构建。当下思科路由器的所有型号,默认运行的都是 CEF 。
CEF运行于数据面(the data plane), 是一种拓扑驱动的专有交换机制(a topology-driven proprietary switching mechanism), 创建出捆绑到路由表(也就是控制面,the control plane)的转发表。开发 CEF 是为消除因基于数据流交换中用到的,进程交换的首个数据包查找方法出现的性能问题(CEF was developed to eliminate the performance penalty experencied due to the first-packet process-switched lookup method used by flow-based switching)。 CEF 通过允许为基于硬件的三层路由引擎用到的路由缓存,在接收到某个传输流的任何数据包之前,将所有三层交换所需的必要信息,包含到硬件当中。照惯例保存在路由缓存中的信息,现在是保存在 CEF 交换的两个数据结构中。这两个数据结构提供了高效率包转发的优化查找,它们分别成为 FIB (Forwarding Information Base, 转发信息库)和邻居表。
CEF使用一个 FIB 来做出基于 IP 目的地址前缀的交换决定(CEF uses a FIB to make IP destination prefix-based switching decisions)。 FIB 在概念上与路由表或信息库是相似的。 FIB 维护着包含在 IP 路由表中的转发信息的一个镜像。也就是说, FIB 包含了来自路由表中的所有 IP 前缀。
创建邻接关系表来包含所有直连的下一跳。邻接节点就是只有一跳的节点(也就是直接连接的)。在发现邻接关系后,就生成了该邻接关系表。一旦某个邻居成为邻接关系,将用于到达那个邻居的一个叫作 MAC 字串或 MAC 重写(a MAC string or a MAC rewrite)的数据链路层头部,就被创建出来并存入到邻接表中。在以太网段上,头部信息依次包含了目的 MAC 地址、源 MAC 地址以及以太网类型( EtherType )。
而一旦某条路由得到解析,就会指向到一个邻接的下一跳。如在邻接表中找到了某个邻接,那么一个指向该适当邻接的指针就在 FIB 条目中进行缓存(as soon as a route is resolved, it points to an adjacent next hop. If an adjacency is found in the adjacency table, a pointer to the appropriate adjacency is cached in the FIB element)。而如果存在到某个同样目的网络的多条路径,则指向每条邻接的所有指针就会被加入到load-sharing结构体中,这样做可以实现负载均衡。当多条前缀加入到 FIB 时,那些需要例外处理的前缀,会以特别邻接关系进行缓存。
默认下,所有基于 CEF 技术的思科 Catalyst 交换机都使用**一个中心化三层交换引擎**(a central Layer 3 switching engine),在那里由单独的处理器对交换机中所有端口上接收到的流量,做出全部的三层交换决定。尽管思科 Catalyst 交换机中用到的三层交换引擎提供了高性能,但在某些网络中,即便使用单独的三层交换引擎来完成所有三层交换,仍然不能提供足够的性能。为解决这个问题,思科`Catalyst 6500`系列交换机允许通过使用特别的转发硬件对 CEF 进行优化(to address this issue, Cisco Catalyst 6500 series switches allow for CEF optimisation through the use of specialised forwarding hardware)。 CEF 优化有两种实现方式,加速的 CEF 或分布式 CEF 。
加速的 CEF 允许让 FIB 的一个部分分布到`Catalyst 6500`交换机中的具备此功能的线路卡模块上去(Accelerated CEF allows a portion of the FIB to be distributed to capable line card modules in the Catalyst 6500 switch)。这样做令到转发决定在本地线路卡上使用本地存储的缩小的 CEF 表做出。假如有 FIB 条目在缓存中没有找到,就会向三层交换引擎发出需要更多 FIB 信息的请求。
- 性能改善,improved performance -- 比起快速交换路由缓存技术, CEF 是较少CPU-密集的(CEF is less CPU-intensive than fast-switching route caching)。那么就有更多的 CPU 处理能力用在譬如 QoS 和加密等的三层业务上。
- 迅速恢复的能力, resilience -- CEF提供了大型动态网络中无例可循水平的数据交换一致性和稳定性。在动态网络中,快速交换缓存条目由于路由变化而频繁地过期和作废。这些变动能够引起流量经由使用路由表的进程交换而不是使用路由缓存的快速交换(CEF offers **an unprecedented level of switching consistency and stability** in large dynamic networks. In dynamic networks, fast-switching cache entries are frequently invalidated due to routing changes. These changes can cause traffic to be process-switched using the routing table rather than fast-switched using the route cache)。
当在网络设备上配置路由时,必须按照设计小心仔细地配置**静态或动态路由**(static or dynamic routing)。如存有故障而无法通过网络发送/接收流量,这时多半有着某种配置问题。在初次设置某台路由器时,总会有一些类型的配置问题要你去排除。而如果某台路由器已经运行了一段时间,而突然完全没有了流量(没有通信),就要做一下情况分析,看看路由协议有没有如预期那样发挥功能。
在处理路由故障时,标准方法就是依据路由表来检查沿路径的每条路由(when troubleshooting routing issues the standard approach is to follow the routing table for every route along the path)。可能会要执行一下`traceroute`,来准确找出数据包去了哪里,并看看路径上的那些路由器。采用这种方法,就可以准确知道可能是哪台设备引起的该故障,同时可以开始调查某些特定路由器上的路由表了。