数据中心路由
数据中心有何不同?
在上一节中,我们设计了 Clos 网络,这种网络在服务器之间创建了多条路径。服务器可以通过网络中的不同路径同时进行高带宽通信。
如果我们将标准路由算法应用于这些网络拓扑,会出现什么问题呢?
到目前为止,我们的路由协议会在源端和目的端之间选择一条单一路径。如果所有流量都使用同一条路径,我们就无法充分利用 Clos 网络中所有额外的链路。理想情况下,我们希望修改路由协议,使数据包能够在相同端点之间使用多条路径。

假设 A 和 B 的上行带宽为 200 Gbps,交换机到交换机的链路带宽为 100 Gbps。如果 A 和 B 之间的所有流量都被迫走绿色路径,那么红色路径就会被闲置。如果我们允许数据包走不同的路径,本来可以实现全速传输数据。
此外,当存在多个同时进行的连接时,我们希望这些连接使用不同的路径,以最大化带宽。

假设所有链路的带宽都是 100 Gbps。在这个例子中,多个连接在竞争带宽。如果 A-B 和 C-D 连接都选择同一条路径,那么 R1-R2 和 R2-R4 链路就会被过度使用(在 100 Gbps 的容量上承载 200 Gbps 的流量)。如果 A-B 和 C-D 使用不同的路径,本来可以实现全速传输数据。
等价多路径(ECMP)路由
在等价多路径路由中,我们的目标是找到所有最短路径(具有相同成本),并在这些路径之间对数据包进行负载均衡。
如果一个数据包到达路由器,但存在多条都是有效最短路径的出链路,路由器应该选择哪条链路呢?路由器需要一个函数(可以理解为一段代码),它接收一个数据包,并输出链路的选择。这个函数应该能在等价路径之间适当地对流量进行负载均衡。

一种可能的策略是轮询。如果有两条最短路径的出链路,我们的函数可以规定:所有奇数编号的数据包通过链路 1 发送,所有偶数编号的数据包通过链路 2 发送。
这种方法存在哪些问题呢?等价路径并不一定意味着所有路径的延迟都相同。(请记住,成本是由运营商根据他们喜欢的任何指标来定义的。)如果我们将所有奇数数据包通过一条慢链路发送,而所有偶数数据包通过一条快链路发送,那么 TCP 接收方可能会先收到所有偶数数据包,而奇数数据包还未到达。TCP 会关注数据包的乱序问题,因此接收方将被迫缓存偶数数据包,直到缺失的奇数数据包到达,这会导致性能下降。
一种更智能的策略是查看数据包头部的一些字段,并利用这些字段来做出确定的链路选择。我们可以查看哪些字段呢?
我们可以使用目的 IP 来在最短链路之间进行选择。(毕竟我们在路由中已经在使用目的 IP 了。)但是,如果很多源端都向同一个目的端发送数据包呢?所有数据包都具有相同的目的 IP,因此它们都会被映射到同一条最短链路。我们并没有在各种最短链路之间对数据包进行负载均衡。

如果我们使用源 IP 来在最短链路之间进行选择呢?如果一个源端向很多目的端发送数据包,我们会遇到类似的问题。所有数据包都具有相同的源端,因此它们都会被映射到同一条最短链路。

我们可以不只看一个字段,而是同时查看源 IP 和目的 IP。为了在最短链路之间进行负载均衡,我们可以对源 IP 和目的 IP 进行哈希,然后将得到的哈希值映射到一条链路(类似于哈希表的工作方式)。源 IP 和目的 IP 一起包含了足够的熵,避免了我们之前遇到的问题,即具有相同源端或相同目的端的许多连接被映射到同一条链路。

我们还有一个问题:如果在相同的源端和目的端之间存在多个大型连接,我们不希望所有这些连接都映射到同一条链路。为了解决这个问题,我们可以额外查看 TCP 或 UDP 头部中的源端口和目的端口。
更一般地说,我们所描述的所有问题(TCP 连接中的乱序、一条链路上有太多连接)都可以通过将每个连接放在单独的链路上来解决。为了唯一标识一个连接,我们需要一个五元组:(源 IP、目的 IP、协议、源端口、目的端口)。请注意,我们需要协议来区分使用相同 IP 和端口的 TCP 和 UDP 连接。两个数据包属于同一个连接,当且仅当它们具有相同的五元组。

通过对这 5 个值进行哈希,我们可以确保同一连接中的数据包使用相同的路径(避免乱序问题),并且我们可以在不同路径之间对连接进行负载均衡。这种方法有时被称为按流负载均衡。现代商用路由器通常内置了读取这 5 个值的支持。
按流负载均衡确保每条链路被大致相同数量的连接使用,尽管它没有考虑连接大小的不同。从技术上讲,考虑连接大小是可能的,但这样做成本更高(路由器需要做更多工作),而且收益不大(按流负载均衡在均衡不同大小的连接方面已经做得相当好),因此在实践中不会这样做。
多路径距离矢量协议
为了最大化带宽,我们应该让数据包沿着不同的路径发送,即使它们要去往同一个目的端(例如,如果这些数据包属于不同的连接)。这意味着我们必须修改路由协议,使路由器了解所有最短路径,而不仅仅是一条。
在标准的距离矢量协议中,如果我们收到一个新路径的通告,而该路径的成本等于已知的最佳成本,我们不会接受这条新路径。但是,为了记住所有最低成本路径,我们实际上应该接受这条等价成本路径,并将这两条路径都存储在转发表中。现在,在转发表中,一个目的端可以映射到多个下一跳,只要它们都具有相同的最小成本。

在这个例子中,R1 从 R4 和 R3 都收到了通告,两者都宣称可以在 2 跳内到达 B。我们的转发表将 R4 和 R3 都存储为可能的下一跳,两者的最小成本都是 3。

在转发数据包时,路由器对五元组进行哈希,将大约一半的连接转发到 R3,另一半转发到 R2。
多路径链路状态协议
在链路状态协议中,我们泛洪通告,以便每个节点都拥有网络的完整图景。通常,每个节点计算到每个目的端的最短路径来填充转发表。为了支持多条路径,每个节点需要改为为每个目的端计算所有最短路径。
与修改后的距离矢量协议一样,转发表现在可以为给定的目的端包含多个下一跳。
(注:文档部分内容可能由 AI 生成)