本章要回答的问题:
- 路由是如何工作的?
- 有哪些类型的路由协议?
- Clos 拓扑中的路由协议是如何工作的?
- 什么是无编号接口,以及为什么无编号接口如此重要?
- 如何确定最适合自己需求的路由协议?
路由概述
用最简单的话来说,路由是使用数据包的目的 IP 地址将数据包从其发送源转发到目的地的过程。
IP 路由要求每个路由器独立做出数据包转发决策,而不需要依赖其他路由器。因此IP 路由器只关注如何找到到达数据包最终目的地的路径上的下一跳,可以说 IP路由的这种处理方法有点“目光短浅”。但其实这是一种优势,因为它允许 IP 轻松地绕过故障进行路由。
路由包括以下步骤:
1)在路由表中查找数据包的目的地 IP 地址,以获取可以到达该目的地 IP 的所有下一跳节点的列表。
2)从该列表中选择一个条目作为下一跳路由
3)确定下一跳的 MAC 地址。
4)更新数据包和帧头,包括重写数据包头中的目的 MAC 地址和 TTL。
5)通过所选下一跳指定的网络接口将数据包转发出去。
路由表查找的原理
路由表中包含了多个条目,每个条目是一个键值对,键为IP 地址前缀,值为一个列表,列表中是该 IP 地址前缀的所有可用的下一跳。
-
路由表具有可以用单个条目表示多个IP地址的能力:IP地址前缀和匹配:LPM (longest prefix match, 最长前缀匹配)
-
每个路由表条目中包含一个可用下一跳的列表
-
列表中的每个下一跳都包含一个出向接口
-
当下一条是一台路由器时,条目中还包含该路由器的IP地址
-
当数据包到达的路由器的地址和目的地址相同,或与目的地址位于同一子网时,路由过程将成功结束。
-
然后路由器会查找IP neighbor表(也称为ARP/ND表),使用目的IP地址和出向接口来找到目的节点的MAC地址,并通过MAC地址将数据包转发到该节点。
-
如果ARP/ND表中没有对应的条目,则使用ARP(IPV4)或NDP(IPV6)来找到该IP地址的MAC地址
路由终止的原因:
- 没有可用的路由
- 由于错误无法转发数据包
在这种情况下,数据包将被丢弃,原始发送方收到ICMP错误消息(Internet Control Message Protocol)
路由表条目的类型
- 直连路由
这些路由来自于和设备网络接口直接连接的子网。当为网络接口分配地址时,网络协议栈 (Linux 内核或者厂商协议栈)会自动向路由表中添加此类路由条目。例如,**在 Linux 中为一个网络接口添加IP 地址 10.1.1.1/24,Linux 内核会自动将 10.1.1.0/24(对应的子网) 加到其路由表中。**这样,当收到一个目的地为该子网中IP地址的数据包时,内核就知道应该如何正确地转发该包。通过这种方式不需要使用到路由协议,直连路由就能够允许设备和直接连接的对端节点进行通信。
- 静态路由
由管理员手工添加的路由,优先级高于路由协议产生的路由。
静态路由的优先级高于路由协议产生的路由,并且始终会被遵守。如果静态路由中的下一跳网络接口出现故障(例
如链路断开了),则该静态路由会被标记为不可用。
- 动态路由
这些路由是由路由协议经过计算生成的,路由协议会和网络中的对端路由节点进行通信,并通过学习计算出到不同目的地的最短路径。动态路由通常占路由表中条目的大部分。也有部分动态路由不是通过路由协议生成的。例如在服务器上,DHCP (Dynamic Host Configuration Protocol,动态主机配置协议)会自动添加一条指向网关的缺省路由,这是它通过和 DHCP服务器通信学习得来的。
RIB和FIB
由于多个实体(路由协议、网络堆栈、运营商)提供相同或冲突的信息而产生的许多冲突中的一些问题。为了解决这些问题,路由实现将路由表分为两部分。
第一个与控制平面软件相关联,称为路由信息库(RIB)。
另一个用于数据包转发期间的数据路径,称为转发信息库(FIB)。
在这本书中,当我们说“路由表”时,我们指的是FIB。(注:中文版此处有误,本文和英文版原著保持一致)
RIB 中包含了通过各种不同方式 (直连,静态,路由协议) 获得的路由信息。一个称为 RIB 管理器的软件组件从这些信息中筛选需要发送到 FIB 的内容。每种方式生
成的路由信息都有一个距离值,当多种不同的方式为相同的地址前缀都生成了路由信息时,RIB 管理器会选择具有最小距离值那一条路由。**在这几种方式中,直连路由具有最小的距离值,静态路由的距离值比通过路由协议获取的路由更小。**RIB管理器将选出来的路由推送到 FIB,并用于数据包转发。
图 5-3 展示了 RIB 和FIB的不同点
Linux路由表展示
eos#show ip ro
VRF: default
Codes: C - connected, S - static, K - kernel,
O - OSPF, IA - OSPF inter area, E1 - OSPF external type 1,
E2 - OSPF external type 2, N1 - OSPF NSSA external type 1,
N2 - OSPF NSSA external type2, B I - iBGP, B E - eBGP,
R - RIP, I L1 - IS-IS level 1, I L2 - IS-IS level 2,
O3 - OSPFv3, A B - BGP Aggregate, A O - OSPF Summary,
NG - Nexthop Group Static Route, V - VXLAN Control Service,
DH - Dhcp client installed default route
Gateway of last resort:
S 0.0.0.0/0 [1/0] via 192.168.121.1, Management1
C 10.10.0.0/24 is directly connected, Vlan10
O 10.20.0.0/24 [110/20] via 10.127.0.0, Ethernet1
via 10.127.0.2, Ethernet2
C 10.127.0.0/31 is directly connected, Ethernet1
C 10.127.0.2/31 is directly connected, Ethernet2
C 10.254.0.1/32 is directly connected, Loopback0
O 10.254.0.2/32 [110/10] via 10.127.0.0, Ethernet1
via 10.127.0.2, Ethernet2
C 192.168.121.0/24 is directly connected, Management1
eos#
其对端路由器上的Linux内核的输出是这样的:
vagrant@vx:~$ ip route show
default via 192.168.121.1 dev eth0
10.10.0.0/24 proto ospf metric 20
nexthop via 10.127.0.1 dev swp1 weight 1
nexthop via 10.127.0.3 dev swp2 weight 1
10.20.0.0/24 dev vlan20 proto kernel scope link src 10.20.0.1
10.127.0.0/31 dev swp1 proto kernel scope link src 10.127.0.0
10.127.0.2/31 dev swp2 proto kernel scope link src 10.127.0.2
10.254.0.1 proto ospf metric 20
nexthop via 10.127.0.1 dev swp1 weight 1
nexthop via 10.127.0.3 dev swp2 weight 1
192.168.121.0/24 dev eth0 proto kernel scope link src 192.168.121.44
vagrant@vx:~$
Linux中 ip route show
的输出是内核FIB的输出,而不是RIB的输出。 因此,RIB维护的信息如距离,不会显示在输出中。
metric
当存在多个具有相同距离的路由时,Linux内核总是选择具有最小metric的路由。这可以用于实现高级功能,如ip快速重路由,其中备份路由被设置了更高的metric,因此仅在主路由无效时使用。
weight
当存在多个下一跳时使用,以确定下一跳中流量分布的比例。例如,考虑具有两个下一跳的路由,一个跳的权重为2,另一个跳权重为1。内核在权重为2的下一跳上发送三分之二的数据包流,在权重为1的下一跳上发送三分之一。通常,所有下一跳具有相同的权重,并且流在所有下一个跳中均匀分布。
为了查看RIB中的距离,操作员必须从路由协议栈如Free Range Routing (FRR)的角度检查路由表。这种情况下的显示看起来更像传统供应商堆栈的显示:
vx# show ip route
Codes: K - kernel route, C - connected, S - static, R - RIP,
O - OSPF, I - IS-IS, B - BGP, E - EIGRP, N - NHRP,
T - Table, v - VNC, V - VNC-Direct, A - Babel, D - SHARP,
F - PBR,
> - selected route, * - FIB route
K>* 0.0.0.0/0 [0/0] via 192.168.121.1, eth0, 00:37:56
O>* 10.10.0.0/24 [110/110] via 10.127.0.1, swp1, 00:36:20
* via 10.127.0.3, swp2, 00:36:20
O 10.20.0.0/24 [110/10] is directly connected, vlan20, 00:36:38
C>* 10.20.0.0/24 is directly connected, vlan20, 00:36:38
O 10.127.0.0/31 [110/100] is directly connected, swp1, 00:37:55
C>* 10.127.0.0/31 is directly connected, swp1, 00:37:56
O 10.127.0.2/31 [110/100] is directly connected, swp2, 00:37:54
C>* 10.127.0.2/31 is directly connected, swp2, 00:37:56
O>* 10.254.0.1/32 [110/110] via 10.127.0.1, swp1, 00:37:47
* via 10.127.0.3, swp2, 00:37:47
O 10.254.0.2/32 [110/0] is directly connected, lo, 00:37:55
C>* 10.254.0.2/32 is directly connected, lo, 00:37:56
C>* 192.168.121.0/24 is directly connected, eth0, 00:37:56
vx#
可以在上面的输出中清楚地看到 RIB 的处理。到 10.127.0.0/31的路由在两行中都有定义:以O开头的行表示该路由是由OSPF生成的,另一个以C开头的行表示该条是直连路由。如直连路由前的星号 (*) 所示,由于直连路由的距离值更小,直连路由胜出了OSPF路由。在缺省情况下,OSPF生成路由的距离值为110。
路由协议概述
通过和其他节点交换路由可达性信息,路由协议在网络中的所有路由器之间自动构建了一致的转发拓扑。有很多种定义路由协议的方法,但它们的本质都是相同的。
一个路由协议主要执行以下任务:
1、记录本地状态(链路,地址等)
2、交换目的地可达性的有关信息。
3、通过和其他节点通信,学习得到目的地的相关信息,并计算到这些目的地的最短路径。
4、将到这些目的地的下一跳写入路由表完成这些任务有各种不同的方法。例如,对于任务 3,有的协议可能会集中进行路径计算,而另一些协议则让每个路由器自主计算路径。前一种模式为 OpenFlow 和集中控制面的发展开辟了道路,后一种则是经典的IP 路由模式,也是 Internet 的工作方式。
距离矢量协议和链路状态协议
对于数据中心来说,距离矢量协议的唯一实际选择是BGP协议。
这两种类型的路由协议之间的主要区别在于它们选择如何传递路由信息。
- 距离矢量协议携带到每个目的网络的距离。
- 链路状态协议携带路由器与其邻居的连通性信息。
在距离矢量协议中,路由器只告诉邻居路由器自己到达每个目标子网的距离,而不告知是如何学习到此信息的。
在链路状态协议中,路由器只告诉邻居路由器自己直接连接到的网络或者节点,每个路由器根据这些链路状态信息计算出目标子网的可达性。
距离矢量协议解析
通告R1的路由信息的简化流程
1)R1告知R2和R3 自己可以到达两个距离为 1的网络。R1之所以这样做,是因为它已经通过配置知道其对端的路由器是 R2 和 R3。同时,R1还被配置为从其
逻辑路由接口收集这两个网络的子网信息。如果未明确配置路由器发布其本地连接的子网或地址,则路由器就不会发布这些信息。
2)R2 收到 R1的这条路由通告后,由于没有其他如何到达这两个网络的信息,因此 R2 接受 R1的这条路由信息作为到达这两个网络的最佳路径。现在,从R2
的角度来看,到达这两个网络的方法是通过通往 R1 的链路 P1。然后 R2 将此信息发布到配置为可以与 R2通信的其他路由器,即R4。但是在这条路由通告中,
R2 将距离值增加为 2。换句话说,在将信息通告给其他路由器之前,每一跳都会使距离加 1。同时,R3 也会执行和 R2 相同的步骤。
3)假设在收到 R3 的路由通告之前,R4 先收到来自 R2 的路由通告。在收到 R2 的路由通告时,由于 R4 还没有学习到访问这两个网络的其他方法,因此它计算出
到达这两个网络的最佳路径是通过 R2。由于 R4 被配置为可以与 R2和R3 通信,并且 R4 是通过 R2 获得到达这两个网络的路由信息的,因此 R4 此时唯一需要通告的路由器就是 R3。R4告知R3它可以以3的距离到达这两个网络。在这之前R3 已经通过 R1 得知了这两个网络的可达性信息,并且距离为 1。因为通过 R4的距离值3更大,因此在收到了 R4 的通告后,R3 不会修改已经存在的路由信息,到达这两个网络的最佳路径依然是通过 R1。此时 R3 也没有新的信息可以向 R1通告。
在收到 R1的通告后,R3 也会告知 R4 可以以2的距离到达这两个网络。当 R4 收到该路由通告后,它计算出通过 R3 到达这两个网络的距离和通过 R2的距离相同。因此 R4 更新其路由信息:可以通过 R2和R3 到达这两个网络。由于在收到 R3 的路由通告后,到子网 10.1.1.0/24和 10.1.2.0/24 的距离没有改变,因此 R4不需要给 R2发送路由通告。
在路由信息交换结束后,所有路由器都已经知道如何有效地到达这两个网络,到此工作已经完成。这里有一个小细节是 R4 和 R1 都需要选择一条到达对方的“最佳路线”。即使 R4通过R2和R3到R1的距离相同,R4也必须选择其中一个作为最佳路径,而将另一个作为该最佳路径的等价路径(这部分在不同的距离矢量协议中有所不同,但在 BGP 中是这样处理的)。
链路状态协议解析
链路状态协议的信息交换过程比前面展示的距离矢量协议更为复杂。
1)图5-5(a)所示,所有路由器都会与其对端路由器交换自己的链路状态信息,这一点与距离矢量协议的行为方式不同。运行距离矢量协议的路由器在和对端
节点建立会话后,如果没有要通告的路由,则不会再向对端发送任何消息。与之相反,使用链路状态协议的路由器在会话建立后会将其链路状态信息发布给
对端。即使那些只连接到其他路由器的路由器 (例如 R2 和 R3),也会与其对端交换这些链路信息。例如,R2 告诉R1 自己有两个链路,一个连接到 R1,另
个连接到 R4。当然,R1和 R4 也会向外通告其本地连接到的子网信息,但与距离矢量协议不同的是,这些子网信息是作为本地连接的属性进行通告的 (还
有其他一些方法通告这些子网信息,例如通过路由重分发,但我们暂时将其忽略)。在图 5-5 中,使用不同颜色来区别不同路由器的LSA (Link-State Advertisements,链路状态通告)。
LSA 是路由器中的 Link State Advertisement(链路状态通告)的缩写。LSA 是在OSPF(Open Shortest Path First)和IS-IS(Intermediate System to Intermediate System)等路由协议中使用的数据包格式之一。
2)与距离矢量协议不同的是,当路由器从对端路由器接收到一个 LSA时,如果它之前没有此 LSA 中的信息,或此 LSA 中的信息比其拥有的更新,则它会将此LSA 数据包原样泛洪到与其连接的所有路由器。在一些特定的链路状态协议中,泛洪规则可能变得复杂,但是在所有路由协议中,未经过修改的泛洪的基本行为都是相同的。LSA 的唯一变化是,每个路由器都会在泛洪之前增加LSA字段的 age (年龄)。当然,洪泛时不会将数据包发送回其进入的端口。其他路由器对来自 R1的 LSA 的泛洪如图 5-5 (b) 所示,图中数字表示数据包发送的顺序。假设 R4 在收到R3 泛洪过来的 R1的LSA之前,先收到来自R2的R1的LSA,则R4会将来自R2的RI的LSA 泛洪到R3。R4将忽略从R3 泛洪过来的R1的LSA,因为它与从R2泛洪过来的RI的LSA相同。同样,R3 也会丢弃R4 发送过来的 R1的LSA,因为它与从 R1直接发送过来的 LSA 相同。
3)完成此过程后,所有四个路由器中都包含其他路由器中的 LSA 的相同副本。
4)一个路由器收到 LSA 后,除了继续传播该 LSA,还将触发路径的重新计算。此路径计算会找出到其他路由器的最短路径。假设和之前距离矢量协议的例子一样,R4 在接收到 R3 的信息之前,先接收到来自 R2 的信息,R4 首先了解到它可以通过 R2 到达 R1。由于 R1 已经宣告其连接到两个子网,因此 R4 还计算出到这些子网的最短路径是通过其前一步计算出的到 R1 的路径。当收到 R3 的LSA 后,R4 会更新此路由信息,表明既可以通过 R2,也可以通过 R3 到达 R1及 R1 连接的子网。
比较距离矢量协议和链路状态协议
链路状态和距离矢量协议的扩展
链路状态中,每个路由器都携带了网络中所有路由器之间的邻接关系信息,随着网络的扩展,这部分信息可能会变得非常庞大。
此外为了使每个路由器内保存的信息能及时更新,在路由器之间的邻接关系变化之后需要发送信息通知,这显著增加了路由协议交换的信息数量。
为了减少大型网络中的信息数量和内存消耗,链路状态协议将网络划分为一个分层的结构。
IS-IS calls uses the intuitive term level for each part of the hierarchy, whereas OSPF calls it an area.
在一个给定的层级或区域内,所有路由器都知道彼此之间的邻接关系。
但如果一个区域的某个路由器没有接口连接到另一区域,则该路由器就不会知道另一个区域的详细的链路状态信息。在这种情况下,该路由器仅知道区域边界路由器告知的信息。
当跨越层级或区域时,链路状态协议的处理与距离矢量协议类似。
OSPF仅支持两层结构:骨干区域和非骨干区域。
假设R1和R4之间的链路中断,会导致其他路由器中的转发状态发生变化。
**达到最终正确状态所需的时间称为收敛。**分为单个节点的收敛和整个网络的收敛两种情况。
在链路状态协议中,由于在转发路由器的链路状态信息时无需进行任何修改,因此信息可以迅速地传播到所有节点。因为所有路由器都有最新的链路状态信息,因此它们可以并行地进行路径计算。在距离矢量协议中,因为路由器通告的是其到某一个子网前缀的距离,路由器在转发任何更新消息之前必须先计算距离。因此,从理论上讲,链路状态协议的收敛速度应比距离矢量协议快。此外,距离矢量协议还有其他一些机制,例如采用一个抑制计时器来避免“无穷计数”问题。所有这些都导致了距离矢量协议与链路状态协议相比,具有收敛较慢的说法。但 BGP 并非如此,尤其是在数据中心中时,我们将在本章后续对此稍作介绍。此外,LSA 的这种快速传播仅发生在同一层级内。跨越层级时,传播会因为区域边界路由器对 LSA 的合并而减慢速度。
无编号接口
- 已编号的接口时具有独立IP地址的接口;
- 无编号接口就是没有独立IP地址的接口;
无编号接口会从另一个已编号的接口借用IP地址。此无编号接口通常会借用回环接口的IP 地址(一个全局有效的 IP 址而不是仅主机可用的 127.x.x.x 子网中的地址),因为回环接口始终存在。
借用IP地址可能会导致依赖。
Clos网络极大地改变了这一情况。在Clos拓扑中,最佳做法是在相邻层中的两个节点之间只允许一条链路。这使得识别两个相邻节点之间遍历的链路变得容易。为每个接口分配一个单独的IP地址是多余的。此外,数据中心内的最佳实践建议不要公布接口地址,以减少恶意软件的攻击向量并减少FIB大小。编号接口也使路由器配置的自动化复杂化。出于这些原因,在数据中心,无编号的接口是一大优势。
OSPF和IS-IS 协议从一开始就支持无编号接口,但尽管协议上支持,却很少有供应商实现了这一特性,特别是基于以太网的 OSPF 实现。FRR 是一个流行的开源路由协议软件包,支持了 OSPF和IS-IS 协议的无编号接口。
路由配置的复杂度
我是谁?
每个路由器配置中都包含一个身份字段,通常称为路由器ID。其他路由器使用路由器ID来识别信息发送方。这在故障排除中也很有用。路由器ID通常是一个32位整数,通常在BGP和OSPF(v2和v3)中以IPv4地址的形式写出。常见做法是将路由器ID设置为回环接口的IP地址。 IS-IS使用了一个相当长的格式的系统ID,形如XX.XXXX.XXXX.XXXX.XXXX.XX,用于识别发言者。
我和谁交谈?
在链路状态协议中这非常简单,只是连接其邻居节点的接口名称。除此以外,还需要配置 IS-IS 层次结构中链路的层级或者 OSPF 中链路的区域。
在 BGP 中,选项则要复杂得多。不但需要配置对端节点的IP 地址,还必须配置一个与邻居有关的关键 BGP 概念,即ASN (Autonomous System Number,自治系统编号)
如果IP 地址或ASN配置不正确,就不能和对端节点建立会话以及交换任何路由信息。在FRR 中,可以直接为 BGP配置连接到邻居路由器的接口名称,而不用指定对端的IP地址,也不必指定对端的 ASN编号。这使得对 BGP的配置像 OSPF的配置一样简单。
我要告诉他们什么?
下一个问题是在建立通信后向对端节点通告什么内容。在链路状态协议中,配置路由器用于路由通信的接口将自动通告该接口的IP 地址。对于不需要和其他路由器建立对等关系的接口,例如回环接口,可以通过命令配置该接口上需要通告的地址。
在距离矢量协议中,使用网络声明来指定需要通告的子网前缀。
如果有多个网络地址族,必须“激活”每个地址族以启动该地址族的路由通告。
在这两类协议中,子网前缀都必须先存在于本地路由表中,才能对外发布这些子网前缀的路由信息。另一种常见的方式是使用“重分发”来进行路由通告,这指的是选出通过其他方法(例如直连路由或静态路由)得到的地址,然后对外发送此地址的路由通告。
从上面可以看出,链路状态协议和距离矢量协议的复杂度在本质上大致相当
Clos网络中的路由协议
图 5-7 展示了一个三层 Clos 拓扑,其中 L ∗ L* L∗是leaf路由器, S ∗ S* S∗是 spine 路由器,而 S S ∗ SS* SS∗是 super spine 路由器。这个拓扑中使用了第 2 章中图2-5 © 描述的 pod 结构。图中有两个 pod: Pod1和Pod 2。
如果使用链路状态协议的常见部署模式,那么在每个 pod 中,leaf 路由器和 spine 路由器之间的链路属于第 1 层级 (区域),spine 路由器 super spine 路由器之间的链路属于第 2(骨干) 层级 (区域) 。
链路或节点失效时的链路状态和距离矢量协议
BGP在Clos网络中的行为
BGP的行为主要围绕着为每个节点分配 ASN (自治系统编号) 相关。ASN 是 BGP中的核心概念之一。每个运行 BGP 协议的路由器都必须有一个 ASN 编号。
假设图5-6 中路由器的ASN是其名称中的数字后缀,即R1的ASN为1,R6的ASN为6,依此类推,那么从 R6 发往 R7的 10.1.1.0/24 子网前缀的路由通告中带有
一个值为 6-3-1的ASPATH。
Using the BGP deployment model described in Chapter 15
- 每个 leaf路由器都有自己的 ASN.
- 一个 pod 内所有的 spine 路由器都具有相同的 ASN。
- 每个 pod 中的spine 路由器与其他 pod 中的 spine 路由器具有不同的ASN
- 所有 super spine 路由器都具有相同的 ASN。
这种ASN分配方式避免了BGP的路径搜寻问题,实现了简单的自上而下的路由。
这种自上而下的路由避免了数据包在Clos拓扑的不同层级之间来回反复发送。
图5-8解释了自上而下路由的具体含义,例如,来自SS2的流量不能被发送到SSp。
这意味着Leaf路由器之间可以彼此通信,但同一个Pod中的spine路由器不能相互通信,super spine路由器之间也不能相互通信。
假设图中的网络发生变化,如L11和S11之间的链路断开。
则S11将向连接到它的所有其他Leaf路由器发送更新,告知这些Leaf自己不能再连接到L11以及L11连接到的本地子网。接受到S11的路由通告后,这些Leaf路由器将删除通过S11到达L11的路由。L11也会通知自己所在pod中与之连接的spine路由器自己与S11的链路断开了, 因为这些路由器与S11的ASN编号相同, 它们在收到消息后忽略了这次更新。S11 还向与之连接的super spine节点发送了L11 及其本地连接子网连接断开的更新消息, super spine 节点根据收到的消息更新了路由表, 以表明无法再通过S11到达L11及其连接的子网。除了以上这些消息以外, 没有其他需要发送的路由更新消息,可以看到网络发生变化后的路由更新过程非常简单。
L11和S11断链之后, L11还是可以通过S11以外的spine 路由器到达其他leaf路由器, 因此L11 只会删除到S11的路由。由于 pod中的所有spine 路由器被配置了相同的ASN, 因此这些spine路由器之间不能相互通信, L11的更新将被pod中的其他 spine路由器丢弃。
在数据中心中, 最佳实践是将BGP的通告时间间隔设置为0, 这样可以在网络变化时立即发布路由更新。在服务提供商网络中, 路由通告时间间隔的默认值为30s, 因此管理员必须手动将该时间间隔改为0。
链路链接状态协议在 Clos 网络中的行为
在IS-IS或OSPF中, Clos拓扑中的每个 pod都位于其自己的层级或区域中(属于层级1或非骨干区域) 。spine交换机是连接骨干区域和非骨干区域的区域边界路由器, spine 交换机和super spine 交换机一起形成了2级(或骨干) 路由器。
让我们看一下当 S11 和L11 之间的链接断开时会发生什么:
-
S11对外发送一个新的LSA, 在该LSA中声明自己和L11之间的链接已被删除。这个LSA会被传播到整个pod中, 首先通知到leaf路由器, 然后会被传播到其他 spine路由器。由于 LSA在链路状态协议中的泛洪方式, 一个路由器节点会接收到同一数据包的多个副本。
-
类似地, L11也会发送更新的LSA, 在该LSA中声明自己和S11之间的链接已被删除。和S11发出的LSA一样,该LSA 也会被泛洪。
-
网络中的每个节点都会根据这些新的 LSA 重新计算其 SPF (最短路径)
-
其他 leaf路由器意识到不能再通过 S11 到达 L11,因此将 S11 从到L11及其子网前缀路由条目的下一跳列表中删除。
-
所有的 leaf路由器还会根据收到的区域汇总通告重新计算路区域的路由。S11会将更新发送到其在骨干区域中的邻居 -超级 spine 路由器,该更新将在骨干区域
传播,直到骨干区域中的所有路由器都收到了该更新为止。我们假设在这种情况下,spine 路由器不会汇总路由信息 (有关汇总的详细信息,请参见“Clos 网络中的路由汇总”)。每个骨干区域路由器都会重新计算其路由。在 (超级) Spine 路由器上去往 L11及其路由前缀的下一跳列表中,将指向 S11 的下一跳删除。其他 pod 中的 leaf路由器在计算后发现没有任何变化,因此不会对自己的本地路由进行更新
链接状态的这些额外计算和消息交换有一个可能的好处: 断链时正在被发往 L11 的所有数据包最终都可以到达 L11。但是这些数据包很可能会产生环路或发生乱序。在转发拓扑收敛到最终状态期间,正在发送的数据包可能会发生环路。所有路由协议中都会发生这种情况,所以需要在Ip头中使用TTL(存活时间)来避免环路。路由器在转发数据包之前会递减 TTL,当 TTL的值为0时,数据包将被丢弃。
如果遇到太多的乱序数据包,TCP 将无法正常工作。在这种情况下,TCP 会认为发生了丢包,从而减小其拥塞窗口,导致传输性能降低。因此,链路状态协议的这点微不足道的好处被 TCP 对乱序包的处理抵销了。
Clos网络中的路由汇总
路由是可扩展的。这就是路由可以被用于构建如Internet 等大型网络的原因。路由之所以能够扩展,是由于路由可以对IP 地址进行汇总。路由汇总采用单个 IP 地址前缀通告多个网络的可达性。如本章前面所述,前缀 10.1.1.0/24 汇总了从 10.1.1.0到 10.1.1.255的256个地址的路由。类似地,10.1.0.0/16 汇总了到 64000个IP 地址的路由。这些汇总带来的节省非常可观。路由汇总在 Clos 网络中是如何工作的呢?
Clos网络仅在leaf路由器上进行路由汇总,不能在spine路由器上汇总。
假如图5-8 中的 spine 路由器 SI1 通告了一条 10.1.0.0/16 的汇总路由,该路由包含了 pod 中所有 leaf 路由器通告的IP 前缀。如果 S11和 LI1的链路断开了,由于 S11 对外通告的是该条汇总路由而不只是 L11的P 前缀,它仍然会收到需要发送到L11 的流量,包括来自其他 pod 或来自外部网络的流量。这种情况下,S11 要么无法将数据包传递到 L11 (对于 BGP 的情况),要么会导致数据包在其他 spine和leaf之间反复发送(对于 OSPF或IS-IS 的情况)
安全与保障
需要对通信的双方都进行配置后,路由器之间才能进行对等互联并交换路由信息。该方式足以避免恶意软件的欺骗攻击。此外,路由协议还支持一些安全措施,以防止未授权的访问并可以保护数据包的完整性。通常不必担心数据中心内路由协议的安全性,但是随着主机上运行的路由协议 (以 Kube-router和Calico 等方式)的出现保护路由状态的安全性和完整性不被主机引入的意外或恶意错误而影响就变得非常重要。
用于保护路由协议安全的最小的额外配置是设置一个密码,配对的路由器双方交按该密码后才能配对成功。BGP,OSPF 和IS-IS 均支持设置密码。所有这些路由协议都提供了密码验证的方式。
由于 BGP 运行在TCP 之上,因此从理论上讲可以支持基于 TCP 的安全机制,例如TLS (Transport Layer Security,安全传输层协议) 和TCP 认证选项,不过还没有BGP 协议实现这样做。BGP 也可以与 IPsec 一起使用,但这种情况并不常见。
OSPF 运行在IP 之上,因此除密码外还可以使用 IPsec 支持消息的加密。IS-IS 运行在以太网之上,因此除密码外没有其他安全选项。
Calico和Kube-router 使用了 BGP,因此安全性对 BGP非常重要。我知道一些Cumulus 的客户在主机上部署了 FRR 来使用 OSPF,但这种情况非常少。
确保路由协议具有适当的保护措施也很重要,这可以防止人为错误或恶意软件发布的错误路由消息导致的网络故障。保护措施的一个例子是配置路由协议以确保只从邻居路由器接受某些指定地址前缀的路由通告,并且只向邻居路由器通告某些指定地址前缀 (例如只通告缺省路由)
路由过滤是最常用的保护措施,大多数路由套件通过 route-map 或一种过滤语言来支持路由过滤。FRR 支持 route-map。BGP对route-map 提供了最广泛的支持,在BGP 中,可以为特定的邻居路由器或者每个路由器在入向和出向上进行 route-map配置。OSPF和IS-IS 通过 distribute-list 命令提供入向的路由过滤。
总而言之,BGP 对安全性和保障措施提供了最广泛的支持。由于应用程序的基础设施软件已经开始在它们运行的主机上使用 BGP,BGP的这些安全和保障措施就显得更加重要。
双向检测转发 BFD
BFD (Bidirectional Forwarding Detection,双向转发检测)是一种用于检测两个路由器之间路径故障的标准协议,这些故障包括电缆,接口以及转发管道本身的故障。 BFD 协议具有足够细的检测粒度,可以在不到一秒的时间范围内检测出故障。尽管BFD通常与路由协议结合使用,但 BFD是一个单独的协议,与任何特定的路由协议或媒介无关。
在高速网络中,能够快速发现故障的能力非常重要,但有些故障发生后可能很难被立即发现,例如当电缆在一个方向上发生故障但在另一方向上继续工作时。所有路由协议都采用了计时器来检测故障。如果路由协议必须自行检测所有故障,则管理员必须将 keepalive 或 hello 计时器设置以较高的频率(例如不到一秒钟)运行。但是高频率的计时器检测给路由进程带来了不必要的负担,此外,如果存在多个路由协议,例如同时运行 OSPF 之类的内部路由协议和 BGP 等外部路由协议,那么让每个路由协议都采用一个高频率的计时器来捕获相同的故障则显得多余。因此发明了BFD来解决这些问题。采用 BFD 后,路由协议不用再设置高频率的计时器。BFD检测到故障后会通知路由协议采取适当的措施来进行处理,例如拆除与该链路关联的路由会话。
当路由器通过共享的媒体层连接在一起时(如接入 - 汇聚 - 核心网络那样),BFD扮演着更为重要的角色,因为它可以捕获在点对点链路中不容易发现的问题,例如链路故障。在数据中心中,所有路由器间链路都是点对点的,因此你可能想在这种情况下 BFD 是否是多余的?因为点对点链路的电缆断裂可以立即被发现,并不需要BFD。但是 BFD 可以被用于捕获一些导致链路部分故障的问题,例如单向线路故障或芯片故障。BFD 唯一无法捕获的故障是路由协议进程本身挂起不响应的情况,只有路由协议的计时器才能捕获这种错误,但是这种情况在健壮的路由协议栈中很少见。
BFD协议在 RFC 5880和RFC 5881 两个标准文档中定义。BFD 有许多不同的模式。最常见的实现是使用两个独立的单向会话,称为异步模式。FRR 支持 BFD。最后点需要注意的是; BFD 仅在路由器之间工作,并不支持网桥之间的链路。
数据中心对路由协议的需求
基本需求
紧于 Clos 拓扑在数据中心的统治地位,数据中心对路由协议的基本要求如下:
- 为指定的网络分发网络前缀的路由信息。几乎所有情况都涉及 IPv4 地址前缀,在某些情况下也可能需要分发 IPv6 地址前缀。
- 支持整个网络中路由状态的快速收敛。
- 当一个路由器因维护或者下线被停用之前,支持将发向它流量逐渐导向其他路由器。这类支持的例子包括IS-IS 的过载位,OSPF的 max-metric 选项以及 BGP用于导流的各种选项。
- 支持易于自动化的网络配置。
进阶需求
下面是来自于一些更高级的部署方式的需求,例如涉及网络虚拟化或主机的路由:
-
多协议支持。部分需求来自想要运行需要桥接网络支持的遗留程序,或具需要支持多租户的企业。但主要需求来自对网络虚拟化的支持。
-
支持大规模网络,也就是说需要支持从几台路由器到数万台路由器。
-
支持在服务器上运行。随着 Calico和 Kube-router 的出现,路由协议不再只是在路由器上运行,也可能会在服务器上运行。因此,既适用于主机又适用于路由器的路由协议变得很重要。服务器通常运行开源版本的路由协议,常见的有 FRR,BIRD和goBGP。
-
使用尽可能少的协议。 这一点在需要多协议支持时尤为重要。使用的协议越少,可能出错的地方也就越少,需要进行故障定位的地方也就越少。因此使用单个 eBGP 会话比使用 OSPF + PIM +iBGP 更好
-
支持大量的地址前缀。这一点在服务器需要通告每个独立的容器地址或使用EVPN时尤为重要。
-
支持过滤入向和出向的路由通告。
-
支持通信安全(至少在建立会话时)。
少见的或前瞻性的需求
- 支持 MPLS 和分段路由。这种方式在一些最先进的网络运营商中被大量使用。
- 从单个节点(或仅几个节点) 获得整个网络的物理连接信息的能力。一些网络运营商需要使用此连通性信息在一个中心位置运行全局路径优化算法,并将优化后的关于某些流的路由信息推送到各个节点上。
- 将地址前缀通告扩展到数百万条路由。
选择路由协议
以下几个因素决定了如何为你的网络选择正确的路由协议。大部分是技术因素,但也有非技术因素。根据作者的经验,大部分网络使用了 BGP 作为数据中心内的路由协议,OSPFv2 紧随其后。
有时,路由协议会被捆绑到一个更复杂的产品中一起使用,例如Cisco ACI (Application-Centric Infrastructure,应用中心型基础设施) 产品使用了 IS-IS 与 BGP 作为基础协议。在这种情况下,客户不一定能控制所选择的协议。
下面这些问题可以帮助你确定哪种路由协议最适合你的网络。作者遵循的一个标准是使用尽可能少的协议
- 只需要支持 IPv4 吗? (如果这样的话,你有非常多的选择)
- 你需要支持 EVPN吗?(如果需要支持,那答案就是 BGP)
- 你需要支持 IPv6 吗?
- 你需要将路由器和主机进行对等互联吗?(如果需要支持,那答案就是 BGP)
- 你的供应商支持无编号接口吗? (如果支持,那就使用这些协议)
- 你是否有针对特定协议的内部专业知识?
- 你的供应商只支持使用 eBGP的 EVPN吗?(如果是,那就选择它)