1.6 分层机制
路由设计的优化
分层机制是工程学和日常生活中用于降低问题复杂性的经典方法,通过分层机制,每次可以仅面对一个层级的复杂性。以开车为例,开车时司机关注的就是开车,而不是汽车引擎或其他系统如何运转。汽车就是一个分层的系统,某一层关注汽车运行,某一层关注汽车前进,而另一层则关注汽车刹车等。
对于故障排查和网络设计来说,一个优秀的解决方案必须能够将系统分解为多个抽象的模块,每个模块与系统的关联度最小。网络采用的就是大家熟悉的七层OSI(Open System Interconnection,开放系统互连)参考模型(虽然IP是围绕大家相对陌生的四层模型开发的)。在处理物理层问题时,几乎不用考虑IP地址和TCP参数,只要关注电信号或光信号即可,其他层也类似。与此相反,一个糟糕的设计方案无法将问题细分或者说打破了分层的边界。大家可能都已经发现,凡是棘手的网络故障,通常都涉及层间交互或携带了跨层信息。
这些理念也同样适用于网络设计和网络技术本身。分层网络可以实现故障隔离,从而可以在较小的参数范围内逐一进行故障排查。本节将详细讨论网络设计过程中用到的分层概念,即利用分层机制隐藏信息以及分离功能。
1.6.1 隐藏信息
由于大型、复杂网络包含了很多重要信息,以便为一些常用系统提供实时处理和响应能力,因而能否实现很好的信息隐藏功能成为网络设计成功与否的关键。通常可以隐藏两类网络信息:
拓扑结构信息;
可达性信息。
1.隐藏拓扑结构信息
拓扑结构是网络的物理布局或互连图。如果从报文级的角度来看待拓扑结构,那么拓扑结构就是一系列连接和设备组成的集合,用来为网络中的流量传送提供物理路径,也就是为流量提供可用的传送路径。
三种类型的路由协议(链路状态、距离矢量和路径矢量)在处理拓扑结构信息时存在一定的差异。
链路状态路由协议直接利用拓扑结构信息计算去往所有可达目的地的最佳路径。每台设备都向外宣告其所有链路的状态,该信息被用来构造去往每个目的地的有向图(directed graph),其中,有向图是物理拓扑结构的一个子集,仅包含至少要去往某些目的地的路径。
运行距离矢量路由协议的路由器仅向其对等体宣告可达性信息,而不宣告拓扑结构信息,并且通过比较邻居们宣告的去往目的地的各条路径的开销,来确定每个可达目的地的最佳路径,也就是说,在确定最佳路径时不考虑网络的拓扑结构。
路径矢量路由协议向外宣告路由更新在网络中穿越的一系列“路由跳数”,该信息并不是去往目的地的实际路径,而是路径可能穿越的系统集合。该路径证明所宣告的路径是无环路的。由于路径矢量路由协议并不利用开销来确定去往目的地的无环路路径,因而可以依据开销来选择次优路由,以支持或实现某种路由策略。
图1-10解释了拓扑结构信息在每种路由协议中的不同处理方式。
在链路状态路由协议中,路由器C向路由器B泛洪其直连的所有链路的信息,路由器B则将这些信息再发送给路由器A。路由器B也向路由器A和路由器C泛洪其直连的所有链路的信息。利用这些信息,路由器A可以构造反映网络拓扑结构信息的有向图,并选择穿越网络的最佳无环路路径。路由器A知道其与路由器B是直接相连的,而路由器B也同样宣称其与路由器A的连接性。由于路由器A和路由器B都宣称与对方的连接性,因而该链路进入树中。同样,路由器B与路由器C之间的链路也进入树中,而且路由器C宣称其连接在子网10.1.1.0/24上(该信息也在有向图内),从而路由器A发现其拥有去往子网10.1.1.0/24的路径,下一跳是路由器B。
如果每对路由器都能接收到对方泛洪的链路状态信息,则它们位于同一个泛洪域(flooding domain)中。为了构造一致的无环路由,同一泛洪域内的每台路由器都必须共享相同的网络拓扑结构视图。链路状态网络几乎不可能由单一泛洪域组成,通常都被划分为多个“域”(在OSPF中被称为area,在IS-IS中被称为domain)。位于泛洪域边界的路由器会为域中的每个可达目的地都加上整个域的开销并向外宣告,因而在计算开销时,这些目的地就像直接连接在域边界路由器上一样。之后,由域边界路由器通过隐藏泛洪域内的网络拓扑结构信息来汇总(summary)来自泛洪域的路由信息。
在距离矢量路由协议中,路由器D宣告其可以去往10.1.1.0/24且开销为10,该路由宣告没有提供任何拓扑结构信息,路由器B和路由器C只知道路由器D能够到达该目的地,而不知道路由器D究竟是通过哪条路径到达该目的地。路由器B和路由器C加上各自去往路由器D的开销并向路由器A宣告其可达10.1.1.0/24,这些路由宣告中也同样不包含任何拓扑结构信息。此时,路由器A知道路由器B和路由器C都能直达10.1.1.0/24,但开销不同,距离矢量路由协议基于“拥有最小度量的路径不可能是环路(只要该路径上的每台路由器都加入了各自去往下一跳的开销)”的几何定律。由于每跳都隐藏了网络背后的拓扑结构信息,因而每台路由器都仅宣告指定开销下可到达的特定目的地。
在路径矢量路由协议中,路由更新所穿越的每个节点都会附加一个标志,以便向更新消息指示本节点。如果网络中的节点接收到的路由更新中包含了自己附加的标志,那么就表示该更新属于有环路的路径,从而拒绝该更新。虽然路径矢量路由协议中的路径似乎提供了网络的拓扑结构信息,但实际情况并非如此,这些路径仅仅是保证不存在环路。由于对路由进行过滤或聚合操作之后,就会丢失网络的拓扑结构信息,从而不可能从路由更新中的路径来了解整个网络的拓扑结构信息。
通过分析上述目前仍在应用的三类路由协议,可以看出这三类路由协议都在一定程度上隐藏了拓扑结构信息:
链路状态协议在泛洪域的边界隐藏拓扑结构信息;
距离矢量协议在每个路由跳上隐藏拓扑结构信息;
路径矢量协议利用路由过滤和聚合机制隐藏拓扑结构信息。
本书将在第2章的层次化网络设计以及后面章节有关链路状态和路径矢量路由协议的部署中继续讨论上述概念。
2.隐藏可达性信息
准确来说,可达性信息并没有真的被隐藏起来,而只是被汇总(summarized)或被聚合(aggregated)了,如图1-11所示。
图中路由器A通过IP地址为10.1.1.1和10.1.1.5的接口分别与主机10.1.1.2和10.1.1.6相连,当路由器A向路由器B宣告路由0.1.1.0/30时,实际效果如下:
“通过我可以去往IP地址10.1.1.0~10.1.1.3。”
因此路由器A汇总了其所连接的IP地址的信息。此外,路由器A还同时宣告了路由10.1.4.0/30,实际效果如下:
“通过我可以去往IP地址10.1.1.4~10.1.1.7。”
路由器B接收到这两条路由宣告之后,就知道了IP地址10.1.1.0~10.1.1.7的可达性信息,此时路由器B不再构造两条路由更新来宣告这8个IP地址的可达性信息,而是简单地宣告10.1.1.0/29即可,相应的效果如下:
“通过我可以去往IP地址10.1.1.0~10.1.1.7。”
因此路由器B汇总或聚合了接收自路由器A的路由信息,这就是路由协议隐藏可达性信息的实现方式。
从技术上来说,这种方式并不是隐藏了可达性信息,而仅仅是进行了可达性汇总,但进行汇总时,也确实将精细化可达性信息隐藏到较粗略的可达性信息中。换言之,汇总或聚合隐藏的是可达性信息的指定性。
第2章将继续详细讨论路由汇总问题。
1.6.2 功能分离
分层网络设计的两大主要目的之一就是实现功能分离,通常网络需要完成以下工作:
提供用户和服务所连接的位置;
实施相应的策略,包括标记数据包(用于QoS)、实施接纳控制、实施安全测量以及路由策略等;
聚合网络流量和拓扑结构信息;
转发网络内主要拓扑区域或站点之间的流量;
连接到外部网络或互联网。
如果在同一个网络位置完成上述所有工作目标,那么网络故障的检测与排除操作将非常困难,因此需要拆分上述工作目标,由网络的不同层面实现不同的功能。
第2章将详细介绍网络的层次化结构以及各层网络所实现的特定功能。