《Cloud Native Data Center Networking》(云原生数据中心网络设计)读书笔记 -- 04路由协议的选择

news2024/9/28 3:28:51

本章要回答的问题:

  • 路由是如何工作的?
  • 有哪些类型的路由协议?
  • 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的不同点

image-20240324232359923

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的路由信息的简化流程

image-20240818223403452

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 中是这样处理的)。

链路状态协议解析

链路状态协议的信息交换过程比前面展示的距离矢量协议更为复杂。

image-20240818223453219

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仅支持两层结构:骨干区域和非骨干区域。

image-20240406210639932

假设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。

image-20240818234148086

如果使用链路状态协议的常见部署模式,那么在每个 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。

image-20240406222418210

这种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 之间的链接断开时会发生什么:

  1. S11对外发送一个新的LSA, 在该LSA中声明自己和L11之间的链接已被删除。这个LSA会被传播到整个pod中, 首先通知到leaf路由器, 然后会被传播到其他 spine路由器。由于 LSA在链路状态协议中的泛洪方式, 一个路由器节点会接收到同一数据包的多个副本。

  2. 类似地, L11也会发送更新的LSA, 在该LSA中声明自己和S11之间的链接已被删除。和S11发出的LSA一样,该LSA 也会被泛洪。

  3. 网络中的每个节点都会根据这些新的 LSA 重新计算其 SPF (最短路径)

  4. 其他 leaf路由器意识到不能再通过 S11 到达 L11,因此将 S11 从到L11及其子网前缀路由条目的下一跳列表中删除。

  5. 所有的 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吗?(如果是,那就选择它)

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2052655.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

DESeq2差异基因分析和批次效应移除

差异基因鉴定 基因表达标准化 不同样品的测序量会有差异,最简单的标准化方式是计算counts per million (CPM),即原始reads count除以总reads数乘以1,000,000。 这种计算方式的缺点是容易受到极高表达且在不同样品中存在差异表达的基因的影响&#xff…

FunClip,音视频识别,自动化剪辑,文本校对,智能纠错,导出SRT

今天给大家介绍一个自动化剪辑项目——FunClip,该项目是由阿里开源的,可以识别音频、视频中的文字,一键剪辑和添加字幕。 FunClip是一款高效的自动化视频剪辑工具,它利用语音识别技术对视频内容进行分析。用户可以在识别结果中选择所需的文本…

重生奇迹MU 梦幻骑士 真正生而高贵的职业

作为重生奇迹MU梦幻骑士中真正生而高贵的职业,圣骑士是玩家们最为追捧的职业之一。在游戏内,圣骑士拥有着强大的防御和治疗能力,成为团队中不可或缺的存在。如果你正准备选择一个强大的职业,那么不妨考虑成为一名圣骑士&#xff0…

选择文件摆渡系统要遵守的“三要”和“三不要”原则

文件摆渡系统不仅可以实现企业网络隔离后的数据摆渡需求,同时也可以视作企业数据安全及网络安全建设的重要组成部分。文件摆渡系统的选择也很关键,在企业进行筛选时,应该遵守“三要”和“三不要”原则。 “三要”之一:要安全 文件…

MySQL对事务的支持

5.MySQL对事务的支持情况: 5.1. 查看存储引擎对事务的支持情况 : 1.SHOW ENGINES 命令来查看当前 MySQL 支持的存储引擎都有哪些,以及这些存储引擎是否支持事务2.下图可以能看出在 MySQL 中,只有InnoDB类型的存储引擎是支持事务…

轻松搞定 Java7 新特性,示例丰富

Java 7 是 Java 语言的一个主要版本,于 2011 年 7 月 28 日正式发布。 由 Sun Microsystems 开发并由 Oracle 公司发布的一个重要版本,它带来了许多新功能特性,增强了编程语言的能力和性能。 以下是一些 Java 7 的主要新功能特性&#xff1…

基于SSM的体育馆预约管理系统---附源码84196

摘 要 体育馆作为一个重要的运动场所,需要进行预约管理以保证资源的合理利用和场馆秩序的维护。传统的人工预约管理方式存在效率低、容易出错等问题,因此,在互联网高速发展的当下,需要设计和实现一个基于SSM的体育馆预约管理系统&…

关于LLC知识9

1、上图有多条增益曲线,是每种不同的输出负载都对应一条增益曲线,在f1时候每个曲线都汇聚一点,说明只要输出电压频率f1时,不论输出负载是多少,增益是一样的,不受负载影响G1(Lr与Cr发生谐振&…

[单master节点k8s部署]21.EFK日志收集平台介绍

大型系统是一个分布式部署的架构,不同的服务模块部署在不同的服务器上,问题出现时,大部分情 况需要根据问题暴露的关键信息,定位到具体的服务器和服务模块,构建一套集中式日志系统,可以提高 定位问题的效率…

构建自己的语音助手

在我最近发布关于如何构建自己的 RAG 并在本地运行它的帖子之后。今天,我们更进一步,不仅实现了大型语言模型的对话能力,还增加了听力和口语能力。这个想法很简单:我们将创建一个语音助手,让人想起标志性钢铁侠电影中的…

基于asp.net的办公协同管理系统源码分享

今天给大家分享一个asp.net开发的webform框架的办公协同管理系统源码SQLserver数据库 1.主要功能 这个项目是帮助一个学生指导的毕业设计,包含用户登陆、用户管理、车辆 管理、文件管理、个人中心、后台管理、文件上传、人事管理、系统日志等 等模块。2.开发工具及…

【Django-vue-admin学习笔记】页面自动计算日期差额的方法

在许多应用场景中,尤其是在管理系统中,经常需要对日期进行动态计算和展示,以帮助用户了解关键日期的即时状态。例如,在学生宿舍管理系统中,显示学生的退宿倒计时可以帮助管理人员有效监控即将到期的宿舍安排,并及时进行必要的调整。这样的功能不仅提高了管理效率,也增加…

H5接入企微JS-SDK,使用wx.previewFile进行文件预览

最近上项目,需求是做一个附件预览并且可以进行保存到手机、用其他应用打开的需求的需求,用企微的JS-SDK的wx.previewFile就可以满足以上的需求了 详细的可以参考:企业微信官方文档 前端 1、在项目的index.html中添加:jweixin-1.2…

两种用MATLAB绘制色块的方法

绘制色块首先可以想到用填充像素的方式 % 定义图像的尺寸 imageSize 500;% 创建一个 imageSize x imageSize x 3 的矩阵,每个像素都是绿色 % RGB颜色模型中绿色的值为 [0, 1, 0] greenImage zeros(imageSize, imageSize, 3); greenImage(:, :, 2) ones(imageSiz…

Kubeadm快速安装 Kubernetes集群

Kubernetes的基础概念 Kubernetes(通常简称为K8s)是一个开源的容器编排系统,用于自动化部署、扩展和管理容器化应用程序。Kubernetes 提供了强大的抽象能力,使得开发者能够专注于应用程序的逻辑,而无需担心底层容器的…

某框架路由渗透

前言 某天在互联网平台上看待DWR路由的文章,然后去搜索了一下相关的信息,发现该DWR路由技术挺久远的,因此就简单的学习了一下该路由,然后发现该DWR路由也可能存在漏洞点,因此找了某站进行测试看看是否有无啥收获&…

学习笔记 韩顺平 零基础30天学会Java(2024.8.15)

P512 ArrayList底层源码2 P513 Vector注意事项 最近有点懈怠,要去新的环境上学了,有点焦虑,调整状态ing,准备开始研一,希望能继续本科的荣耀!! PS:本科应该算是荣耀的吧哈哈哈哈哈

高性价比运动耳机都有哪些?五大高性价比运动耳机推荐

对于很多人来说,大家可能会选择听音乐来放松身心,打发掉无聊的时间。开放式耳机对比入耳式耳机的优势就是既能听到耳机内的声音又能感知环境音,很适合在户外以及办公时使用。像我每天坐地铁上下班的时候都会习惯戴耳机,但以前戴入…

微信视频号评论采集秘籍:三招让你迅速收集用户反馈

在短视频盛行的今天,微信视频号以其庞大的用户基数成为品牌与用户互动的重要阵地。但如何从海量评论中迅速收集有价值的用户反馈,成为众多内容创作者与营销人员的难题。本文将揭秘三招实用技巧,助你高效采集微信视频号评论,精准把…

使用HTML和cgi控制I.MX6ULL开发板上的LED

一.HTML文件 <!DOCTYPE html> <html><head><meta charset"utf-8"><title>LED_device</title> </head><body><form action"/cgi-bin/led.cgi" method"post"><p>LED设备号</…