目录

简介

先决条件

要求

使用的组件

背景信息

如何避免CEF极化

简介

本文档介绍思科快速转发(CEF)极化如何导致次优使用通向目的网络的冗余路径。当散列算法选择特定路径且冗余路径保持完全未使用时，CEF极化是影响。

先决条件

要求

本文档没有任何特定的要求。

使用的组件

本文档中的信息基于在Supervisor引擎720上运行的Cisco Catalyst 6500交换机。

本文档中的信息都是基于特定实验室环境中的设备编写的。本文档中使用的所有设备最初均采用原始（默认）配置。如果您使用的是真实网络，请确保您已经了解所有命令的潜在影响。

背景信息

CEF根据由路由协议填充的路由表交换数据包，例如增强型内部网关路由协议(EIGRP)和开放最短路径优先(OSPF)。一旦计算了路由表(RIB),CEF就会执行负载均衡。在分层网络设计中，可以有许多第3层(L3)等价冗余路径。考虑此拓扑，流量从接入层通过分布层和核心层流入数据中心。

假设为了从路由器1(R1)[左上角]到达网络10.1.1.1，有两条等价路径(L1、L2)。 使用哪条链路由散列算法决定。默认情况下，源IP(SIP)和目标IP(DIP)用作散列算法中的参数。

以下是散列算法工作原理的说明：

当只有两条路径时，交换机/路由器对SIP和DIP的低位位（需要选择两条链路中的任一条时为一位，3-4条链路为两位，依此类推）执行排它或(XOR)操作。同一SIP和DIP的XOR操作始终会导致数据包使用同一链路。

然后，数据包会传递到分布层，在分布层使用相同的散列算法和相同的散列输入，并为所有流选择一个链路，使其他链路未得到充分利用。此过程称为CEF极化(使用相同的哈希算法和相同的哈希输入，这会导致对所有流使用单个等价多路径(ECMP)链路)。

此示例更详细地说明了此过程：

1. 从10.240.18.1发往10.240.20.1的流量进入路由器A的网络，并由CEF交换。由于有两条等价路径通往10.240.20.0/24网络，因此数据包中的源地址和目的地址将通过哈希算法，结果是用于到达目的地的特定路径。在这种情况下，数据包采用的路径是通往路由器C。从那里，数据包将转到路由器F，然后转到其最终目的地。

2. 从10.240.18.2发往10.240.20.1的流量进入路由器A的网络，并且也是CEF交换的。由于有两条等价路径通往10.240.20.0/24网络，因此数据包中的源地址和目的地址会通过哈希算法，CEF会选择路径。在这种情况下，数据包采用的路径是通往路由器B。

3. 从10.240.18.3发往10.240.20.1的流量进入路由器A的网络，并且是CEF交换的。由于有两条等价路径通往10.240.20.0/24网络，因此数据包中的源地址和目的地址会通过哈希算法，CEF会选择路径。在这种情况下，数据包采用的路径是通往路由器B。

4. 源自10.240.18.2和10.240.18.3的数据包都到达路由器B，路由器B又有两条等价路径可到达10.240.20.1。它通过哈希算法再次运行这些源和目标对组，其结果与路由器A上的哈希算法相同已生成。这意味着两个数据包流都沿一条路径（在本例中为指向路由器E的链路）传输。通往路由器D的链路没有收到任何流量。

5. 在路由器E上收到源自10.240.18.2和10.240.18.3的流量后，会沿着通往路由器F的路径进行交换，然后转到其最终目的地。

如何避免CEF极化

1. 在网络每层的默认（SIP和DIP）和完全（SIP + DIP + Layer4端口）散列输入配置之间进行替换。

Catalyst 6500为散列算法提供了一些选择：

- 默认 — 使用源IP地址和目的IP地址，为每条链路分配不等的权重以防止极化。

- 简单 — 使用源IP地址和目的IP地址，并为每条链路赋予相等的权重。

- 完整 — 使用不等权重的源和目的IP地址以及第4层端口号。

- 完全简单 — 使用源IP地址和目的IP地址以及第4层端口号，并为每条链路赋予相等的权重。

6500(config)#mls ip cef load-sharing ?

full    load balancing algorithm to include L4 ports

simple  load balancing algorithm recommended for a single-stage CEF router

6500(config)#mls ip cef load-sharing full ?

simple  load balancing algorithm recommended for a single-stage CEF router

<cr>
目前，没有用于检查使用中的负载分担算法的命令。要了解正在使用哪种方法，最好通过show running-config命令检查当前配置。如果目前没有以 mls ip cef load-sharing 开头的配置，则正在使用的是默认的源和目标不等权重算法。

注意：1)Catalyst 6500不支持每个数据包负载共享。2)完整选项不包含哈希中的通用ID。如果在多层拓扑的每一层都使用，则极化是可能的。建议将此命令与simple选项结合使用，以实现更好的负载共享，并减少硬件邻接。

2. 在网络每层的偶数和奇数ECMP链路之间进行替换。

CEF负载均衡不取决于协议路由在路由表中的插入方式。因此，OSPF路由与EIGRP的行为相同。在分层网络中，有多台路由器在一行中执行负载分担，它们都使用相同的算法进行负载分担。

默认情况下，哈希算法以这种方式进行负载均衡：

1: 1

2: 7-8

3: 1-1-1

4: 1-1-1-2

5: 1-1-1-1-1

6: 1-2-2-2-2-2

7: 1-1-1-1-1-1-1

8: 1-1-1-2-2-2-2-2
冒号前的数字表示等价路径的数量。冒号后的数字表示每个路径转发的流量比例。

这意味着：

- 对于两条等价路径，负载分担率为46.666%-53.333%，而不是50%-50%。

- 对于三条等价路径，负载分担率为33.33%-33.33%-33.33%（如预期）。

- 对于四条等价路径，负载分担率为20%-20%-20%-40%，而不是25%-25%-25%-25%-25%。

这说明，当ECMP链路数量偶数时，流量不会进行负载均衡

禁用CEF极化的一种方法是反极化权重，该权重在12.2(17d)SXB2版中引入。

要启用反极化权重，请输入以下命令：

6500(config)# mls ip cef load-sharing full simple
如果有两条等价路径且两条路径均需使用，请使用此命令。添加关键字simple后，硬件可以使用与Cisco IOS® CEF邻接中相同数量的邻接关系。如果没有simple关键字，硬件将安装额外的邻接条目以避免平台极化。

3. Cisco IOS引入了一个名为unique-ID/universal-ID的概念，有助于避免CEF极化。此算法称为通用算法（当前Cisco IOS版本中的默认），将32位路由器特定值添加到哈希函数（称为通用ID — 这是交换机启动时随机生成的值，可手动控制）。 这为每台路由器上的散列函数植入了唯一ID，从而确保同一源/目标对的散列值在路径中不同的路由器上转换为不同的值。此过程可提供更好的全网络负载分担并避免极化问题。由于硬件限制，此唯一 — ID概念不适用于偶数个等价路径，但对于奇数个等价路径，它非常适用。为了解决此问题，当有偶数条等价路径时，Cisco IOS会向硬件邻接表添加一条链路，以便系统相信有奇数条等价链路。

要配置通用ID的自定义值，请使用：

6500(config)ip cef load-sharing algorithm universal