了解用于在 MX 系列路由器上对流量进行负载均衡的算法
在设备的入口接口上收到数据包时,数据包转发引擎 (PFE) 会执行查找以识别转发下一跃点。如果存在到同一下一跃点目标的多个等价路径 (ECMP),则可以将入口 PFE 配置为在下一跃点之间分配流量。同样,可能需要在聚合接口(如聚合以太网)的成员链路之间分配流量。实际转发下一跃点的选择基于对所选数据包标头字段和多个内部字段(如 接口索引)的哈希计算结果。您可以配置散列算法使用的一些字段。
对于具有模块化端口集中器 (MPC) 和 5 类 FPC 的 MX 系列路由器,请在
forwarding-options enhanced-hash-key层次结构级别上为支持的流量类型配置哈希。有关默认情况下包含哪些字段、哪些流量系列的详细信息,请参见下方。在 Junos OS 18.3R1 版中,计算增强散列的默认方法已更改,以便改进作为家庭多服务传输的 IP 隧道、IPv6 流和 PPPoE 有效负载的熵。可以通过设置各自的 no- 命令来禁用这些默认值。
对于带有 DPC 的 MX 系列路由器,请在
forwarding-options hash-key层级为支持的流量类型配置哈希。
Junos 支持不同类型的负载平衡。
-
按前缀负载平衡 – 每个前缀仅映射到一个转发下一跃点。
-
每数据包负载平衡 – 活动路由中目标的所有下一跃点地址都将安装在转发表中(Junos 中的 术语“按数据包 负载平衡”等同于其他供应商所说的 “按流 负载平衡”)。有关详细信息,请参阅 配置每个数据包的负载均衡 。
-
随机数据包负载平衡 – 为每个数据包随机选择下一跃点。此方法适用于带有 MPC 线卡的 MX 路由器,用于聚合以太网接口和 ECMP 路径。要配置按数据包的随机喷雾负载平衡,请在
[edit interfaces aex aggregated-ether-options load-balance]层次结构级别包含per-packet语句。有关详细信息,请参阅示例:配置聚合以太网负载平衡。 -
按数据包随机喷洒负载平衡 –当自适应负载平衡选项失败时,按数据包随机喷洒负载平衡作为最后手段。它确保 ECMP 的成员在不考虑带宽的情况下获得相同的负载。“按数据包”会导致数据包重新排序,因此仅当应用程序吸收重新排序时,才建议这样做。按数据包随机喷洒可消除由于软件错误而导致的流量不平衡,但数据包散列除外。
从 Junos OS 20.2R1 版开始,您可以在配备 MPC10E(MPC10E-15C-MRATE 和 MPC10E-10C-MRATE)线卡的 MX240、MX480 和 MX960 路由器以及配备 MX2K-MPC11E 线卡的 MX2010 和 MX2020 路由器上配置每个数据包的随机负载平衡。
-
自适应负载平衡 - 自适应负载平衡 (ALB) 是一种纠正真正流量不平衡的方法,方法是使用反馈机制在聚合以太网捆绑包中的链路和等价多路径 (ECMP) 下一跃点上分配流量。当数据包流的流量速率变化很大时,ALB 会优化流量分配。ALB 使用反馈机制,通过调整 AE 束内链路上的带宽和数据包流来纠正流量负载不平衡。
-
用于聚合以太网捆绑包的多个数据包转发引擎上的 ALB
从 Junos OS 20.1R1 版开始,在 MX 系列 MPC 上,在聚合以太网捆绑包之间,ALB 会在同一线卡上的多个入口数据包转发引擎 (PFE) 之间均匀地重新分配流量。在早期版本中,ALB 被限制为单个 PFE,同时在 AE 捆绑包中重新分配流量。这影响了灵活性和冗余。默认情况下,ALB 处于禁用状态。
您可以通过在
[edit interfaces ae-interface aggregated-ether-options load-balance]层次结构级别设置adaptive语句来配置 ALB。有关详细信息,请参阅 配置自适应负载平衡 。
-
ECMP 下一跃点的多个 PFE 上的 ALB
从 Junos OS 20.1R1 版开始,您可以在同一线卡上的多个入口 PFE 之间为 ECMP 下一跃点配置 ALB,以实现流量和冗余的均匀分配。在早期版本中,ECMP 下一跃点的 ALB 仅限于单个 PFE。这种限制影响了灵活性和冗余性。ALB 会动态监控每个流量贡献的流量负载与整体 ECMP 链路负载级别的关系,然后在达到阈值时采取纠正措施。
您可以通过在层次结构级别下
[edit chassis]配置ecmp-alb命令来为 ECMP 下一跃点配置 ALB。有关更多信息,请参阅 ecmp-alb 。
注意:ALB 适用于驻留在同一线卡上的多个 PFE。驻留在不同线卡上的 PFE 将不支持此功能。
对于驻留在不同线卡上的 PFE,即使启用了 ALB,入口流量也可能导致出口端口上的负载不均匀。
-
还提供几个附加配置选项:
每插槽散列函数配置 –此方法基于每个 PIC 插槽的唯一负载均衡散列值,仅对带有 DPCE 和 MS-DPC 线卡的 M120、M320 和 MX 系列路由器有效。
-
对称负载平衡 –此方法在 802.3ad LAG 上提供对称负载平衡。用于对称负载平衡的哈希是在层次结构级别设置
interface的。它可确保给定的双工流量在两个方向上遍历相同的设备,并且在 MX 系列路由器上可用。注意:在 MX 系列设备上,从 Junos OS 25.2R1 版开始,如果启用了对称负载平衡且 ECMP 对 AE 束使用多级负载平衡,则 ECMP 链路引用的通过 AE 的流量分布不均匀。一级 ECMP 负载平衡仍将均匀分布。
MX MPC 和 T 系列 5 类 FPC 规格
MX MPC 和 T Series 5 类 FPC 上的散列计算算法对于第 3 层地址交换或第 4 层传输端换的数据包生成相同的结果。例如,源地址为 192.0.2.1、目标地址为 203.0.113.1 的数据包的哈希计算结果与源地址为 203.0.113.1、目标地址为 192.0.2.1 的数据包的哈希计算结果相同。
为避免可能出现的数据包重新排序,分段 IPv4 数据包的哈希计算中从不使用第 4 层传输协议端口。对于流的第一个分段(由 more fragment 标头中的位标识)和所有后续分段(由非零分段偏移量标识)都是如此。第一个片段和后续片段始终通过同一下一跃点进行转发。
Junos 18.3R1 及更高版本中使用的散列算法
在大多数情况下,在哈希计算中包含第 3 层和第 4 层字段信息所生成的结果足以实现流量的公平分配。但是,在 IP-in-IP 或 GRE 隧道等情况下,仅靠第 3 层和第 4 层字段信息可能不足以产生具有足够熵的散列,以实现负载平衡。例如,在 MX 系列路由器传输 GRE 流的部署中,GRE 封装隧道通常作为具有相同源和目标以及相同 GRE 密钥的单个流出现。随着隧道上流量的增加,胖流量还会显著加剧链路利用率的不平衡。另一个示例是,在用户边缘部署中,当 MX PE 路由器被用作 VPLS PE 设备时,路由器将宽带用户流量从接入设备回传到中央宽带网络网关 (BNG)。在这种情况下,只有用户 MAC 地址和 BNG 路由器 MAC 地址可用于散列。但是,由于 BNG MAC 很少,用户 MAC 也相对较少,典型的第 3 层和第 4 层字段不足以创建最佳负载平衡的散列。
因此,对于具有 Trio MPC 并运行 Junos OS 18.3R1 或更高版本的 MX 系列路由器,默认 enhanced-hash-key 计算已更改。下面列出了更改的摘要:
对于 GRE 数据包,如果外部 IP 数据包不是分段数据包(第一个分段或任何后续分段),并且内部数据包为 IPv4 或 IPv6,则除了外部源地址和目标地址外,还使用内部数据包的源地址和目的地址进行哈希计算。如果内部 IP 数据包的协议是 TCP 或 UDP,并且内部 IP 数据包不是分段(第一个分段或任何后续分段),则还包括内部数据包的第 4 层端口。同样,如果外部 IP 数据包不是分段数据包,而内部数据包是 MPLS,则顶部内部标签包含在哈希计算中。
对于 PPPoE 数据包,如果内部数据包为 IPv4 或 IPv6,则包括内部数据包的源地址和目的地址。如果内部 IP 数据包的协议是 TCP 或 UDP,并且内部 IP 数据包不是分段,则包含第 4 层端口。可以通过在
forwarding-options enhanced-hash-key family multiservice层次结构级别配置no-payload选项来禁用 PPPoE 内部数据包字段的包含。对于 IPv6,IPv6 标头流标签字段包含在哈希计算中。 RFC 6437 介绍了 IPv6 标头中的 20 位流标签字段。
no-flow-label在层次结构中forwarding-options enhanced-hash-key family inet6设置选项以禁用新的默认值。
用于通过 IPv4 发送的 GRE 流量的哈希字段
这些列表显示了在 Junos 18.3R1 及更高版本中用于非分片数据包的散列计算字段。默认情况下,除非另有说明,否则在哈希计算中使用该字段。另外,需要注意的是,哈希中使用的 IP 和端口字段是对称的,也就是说,交换字段不会改变哈希结果。
IPv4、GRE
GRE 密钥
来源地址和目标地址;对称
协议
DSCP(已禁用)
传入接口索引(禁用)
IPv4、GRE 中的 IPv4
有效负载(内部 IPv4:源端口和目标端口、IP 地址);对称
GRE 密钥
GRE 协议 = IPv4
来源地址和目标地址;对称
协议
DSCP(已禁用)
传入接口索引(禁用)
IPv4、GRE 中的 IPv6
有效负载(内部 IPv6:源端口和目标端口、IP 地址);对称
GRE 密钥
GRE 协议 = IPv6
来源地址和目标地址;对称
协议
DSCP(已禁用)
传入接口索引(禁用)
IPv4、GRE 中的 MPLS
有效负载(内部 MPLS:顶部标签)
GRE 密钥
GRE 协议 = MPLS
来源地址和目标地址;对称
协议
DSCP(已禁用)
传入接口索引(禁用)
Junos 17.2 及更高版本中使用的 IPv4、L2TPv2
通过配置
forwarding-options enhanced-hash-key family inet l2tp-tunnel-session-identifier选项,可以启用 L2TPv2 隧道 ID 和会话 ID 的加入。请注意,瞻博网络不建议在默认情况下启用此选项。这是因为 L2TP 会话识别基于目标 UDP 端口匹配 (1701),并且此端口可能并非专门用于 L2TP 传输,因此从数据包中提取隧道和会话 ID 字段可能并不总是准确的。会话 ID
隧道 ID
源端口和目标端口
来源地址和目标地址;对称
协议 (UDP)
DSCP(已禁用)
传入接口索引(禁用)
用于通过 IPv6 发送的 GRE 流量的哈希字段
该列表显示了用于对非分片数据包进行哈希计算的字段。默认情况下,除非另有说明,否则在哈希计算中使用该字段。另外,需要注意的是,哈希中使用的 IP 和端口字段是对称的,也就是说,交换字段不会改变哈希结果。
IPv6、GRE
GRE 密钥
来源地址和目标地址;对称
下一个标题
流标签(Junos 18.3 及更高版本)
流量类(已禁用)
传入接口索引(禁用)
IPv6、GRE 中的 IPv4(Junos 18.3 及更高版本)
有效负载(内部 IPv4:源端口和目标端口、IP 地址);对称
GRE 密钥
GRE 协议 = IPv4
来源地址和目标地址;对称
下一个标题
流标签(Junos 18.3 及更高版本)
流量类(已禁用)
传入接口索引(禁用)
IPv6、GRE 中的 IPv6(Junos 18.3 及更高版本)
有效负载(内部 IPv6:源端口和目标端口、IP 地址);对称
GRE 密钥
GRE 协议 = IPv6
来源地址和目标地址;对称
下一个标题
流标签(Junos 18.3 及更高版本)
流量类(已禁用)
传入接口索引(禁用)
IPv6、GRE(Junos 18.3 及更高版本)中的 MPLS)
有效负载(内部 MPLS:顶部标签);对称
GRE 密钥
GRE 协议 = MPLS
来源地址和目标地址;对称
下一个标题
流标签
流量类(已禁用)
传入接口索引(禁用)
用于 IPv4 的哈希字段
除非另有说明,否则该列表显示了用于非分片数据包哈希计算的字段。默认情况下,除非另有说明,否则在哈希计算中使用该字段。另外,需要注意的是,IP 字段和端口字段的哈希是对称的,也就是说,交换字段不会改变哈希结果。
IPv4,非 TCP 或 UDP,或分段数据包
来源地址和目标地址;对称
协议
DSCP(已禁用)
传入接口索引(禁用)
IPv4、TCP 和 UDP、非分段数据包
源端口和目标端口;对称
来源地址和目标地址;对称
协议
DSCP(已禁用)
传入接口索引(禁用)
IPv4、PPTP
GRE 密钥的 16 个最低有效位
来源地址和目标地址;对称
协议
DSCP(已禁用)
传入接口索引(禁用)
到目标端口 2152 的 IPv4、GTP、UDP 流量
可以在选项中
forwarding-options enhanced-hash-key family inet gtp-tunnel-endpoint-identifier启用包含 GPRS 隧道协议 (GTP) 隧道端点标识符 (TEID)。请注意,瞻博网络不建议在默认情况下启用此选项。这是因为 GTP 会话识别基于目标 UDP 端口匹配 (2152),并且此端口可能并非专门用于 GTP 传输,因此从数据包中提取 TEID 字段可能并不总是准确的。GTP TEID(禁用)
源端口和目标端口
来源地址和目标地址;对称
协议
DSCP(已禁用)
传入接口索引(禁用)
用于 IPv6 的散列字段
除非另有说明,否则该列表显示了用于非分片数据包哈希计算的字段。默认情况下,除非另有说明,否则在哈希计算中使用该字段。另外,需要注意的是,IP 字段和端口字段的哈希是对称的,也就是说,交换字段不会改变哈希结果。
IPv6、非 TCP 和 UDP 数据包,或由发起方分段的 TCP 和 UDP 数据包
来源地址和目标地址;对称
下一个标题
流标签(Junos 18.3 及更高版本)
流量类(已禁用)
传入接口索引(禁用)
IPv6、非分段 TCP 和 UDP 数据包
源端口和目标端口;对称
来源地址和目标地址;对称
下一个标题
流标签(Junos 18.3 及更高版本)
流量类(已禁用)
传入接口索引(禁用)
IPv6、PPTP
GRE 密钥的 16 个最低有效位
来源地址和目标地址;对称
下一个标题
流标签(Junos 18.3 及更高版本)
流量类(已禁用)
传入接口索引(禁用)
IPv6、GTP
可以在层次结构级别启用
forwarding-options enhanced-hash-key family inet gtp-tunnel-endpoint-identifier包含 GPRS 隧道协议 (GTP) 隧道端点标识符 (TEID)。请注意,瞻博网络不建议在默认情况下启用此选项。这是因为 GTP 会话识别基于目标 UDP 端口匹配 (2152),并且此端口可能并非专门用于 GTP 传输,因此从数据包中提取 TEID 字段可能并不总是准确的。GTP TEID(默认禁用;在
forwarding-options enhanced-hash-key family inet gtp-tunnel-endpoint-identifier层次结构级别启用。源端口和目标端口
来源地址和目标地址;对称
下一个标题
流标签(Junos 18.3 及更高版本)
流量类(已禁用)
传入接口索引(禁用)
用于多服务的哈希字段
家族多服务散列配置适用于以 family ccc、 vpls或 bridge的形式进入路由器的数据包。该列表显示了用于对非分片数据包进行哈希计算的字段。默认情况下,除非另有说明,否则在哈希计算中使用该字段。另外,需要注意的是,哈希中使用的 IP 和端口字段是对称的,也就是说,交换字段不会改变哈希结果。
以太网、非 IP 或非 MPLS
如果配置了有效负载信息,则会从未标记的数据包或最多有两个 VLAN 标记的数据包中提取有效负载信息。
外部 802.1p(禁用)
源和目标 MAC;对称
传入接口索引(禁用)
以太网,IPv4
有效负载(内部 IPv4:源端口和目标端口、IP 地址);对称
外部 802.1p(禁用)
源和目标 MAC;对称
传入接口索引(禁用)
以太网,IPv6
有效负载(内部 IPv6:源端口和目标端口、IP 地址);对称
外部 802.1p(禁用)
源和目标 MAC;对称
传入接口索引(禁用)
以太网、MPLS
有效负载(内部 MPLS:顶部标签加上内部 IPv4 和 IPv6 字段);对称。有关相关信息,请参阅下面用于 MPLS、Junos 18.3 及更高版本的散列字段。
外部 802.1p(禁用)
源和目标 MAC;对称
传入接口索引(禁用)
PPPoE(数据包)中的 IPv4
有效负载(内部 IPv4:源端口和目标端口、IP 地址);对称
PPP 协议 IPv4 版本 0x1,类型 0x1
外部 802.1p(禁用)
源和目标 MAC;对称
传入接口索引(禁用)
PPPoE(数据包)中的 IPv6
有效负载(内部 IPv6:源端口和目标端口、IP 地址);对称
PPP 协议 IPv6 版本 0x1,类型 0x1
外部 802.1p(禁用)
源和目标 MAC;对称
传入接口索引(禁用)
用于 MPLS、Junos 18.3 及更高版本的哈希字段
该列表显示了用于对非分片数据包进行哈希计算的字段。默认情况下,除非另有说明,否则在哈希计算中使用该字段。另外,需要注意的是,哈希中使用的 IP 和端口字段是对称的,也就是说,交换字段不会改变哈希结果。
MPLS、封装 IPv4 或 IPv6
-
有效负载(内部 IPv4:源端口和目标端口、IP 地址);对称
-
有效负载(内部 IPv6:源和目标端口、IP 地址、下一个报头);对称
-
标签 1..16(20 位)
-
外部标签 EXP(禁用)
传入接口索引(禁用)
-
以太网伪线中的 MPLS、IPv4 或 IPv6
有效负载(以太网伪线中的 IPv4/IPv6)
-
标签 2..16(20 位)
-
外部标签 EXP(禁用)
-
标签 1(20 位)
传入接口索引(禁用)
-
MPLS、以太网伪线中的 MPLS
-
有效负载(以太网伪线中 MPLS 标签堆栈条目的两个顶部标签)
-
标签 2..16(20 位)
-
外部标签 EXP(禁用)
-
标签 1(20 位)
-
传入接口索引(禁用)
-
MPLS、平均信息量标签
检测到熵标签时,不会处理有效负载字段,并且指标不会包含在哈希计算中
-
标签 1..16(20 位)
-
外部标签 EXP(禁用)
传入接口索引(禁用)
-
从 Junos 14.1 到 Junos 18.3 用于 MPLS 的哈希字段
该列表显示了用于对非分片数据包进行哈希计算的字段。默认情况下,除非另有说明,否则在哈希计算中使用该字段。另外,需要注意的是,哈希中使用的 IP 和端口字段是对称的,也就是说,交换字段不会改变哈希结果。
MPLS、封装 IPv4 或 IPv6
有效负载(内部 IPv4:源端口和目标端口、IP 地址);对称
有效负载(内部 IPv6:源和目标端口、IP 地址、下一个报头);对称
标签 2.8(20 位)
外部标签 EXP(禁用)
标签 1(20 位)
传入接口索引(禁用)
以太网伪线中的 MPLS、IPv4 或 IPv6
有效负载(以太网伪线中的 IPv4/IPv6)
标签 2.8(20 位)
外部标签 EXP(禁用)
标签 1(20 位)
传入接口索引(禁用)
-
MPLS、以太网伪线中的 MPLS
-
有效负载(以太网伪线中 MPLS 标签堆栈条目的两个顶部标签)
-
标签 2..16(20 位)
-
外部标签 EXP(禁用)
-
标签 1(20 位)
-
传入接口索引(禁用)
-
MPLS、平均信息量标签
检测到熵标签时,不会处理有效负载字段,并且指标不会包含在哈希计算中
标签 2.8(20 位)
外部标签 EXP(禁用)
标签 1(20 位)
传入接口索引(禁用)
对于具有 MPC 的 MX 系列路由器,用于散列计算和负载平衡的 Junos 更新列表
Junos Release |
Change |
18.3R1 |
在默认哈希计算中包括 IPv6 流标签、内部 GRE 标头和内部 PPPoE。 将 MPLS 标签堆栈深度增加到 16 个标签。 |
17.2R1 |
L2TP 封装的 IPv4 和 IPv6 数据包的负载平衡。 |
16.1R1 |
包括带有控制字的 EoMPLS 有效负载哈希。 引入仅基于源和仅目标的散列。 |
15.1R1 |
跨 AE 成员链路提供有针对性的静态接口分布。 在默认散列计算中包括 MPLS 封装的 PPPoE 有效负载的源、目标和 MAC。 |
14.2R3 |
增加 LAG 和 MC-LAG 的扩展。 |
14.2R2 |
提供包含 10G、40G 和 100G 链路的聚合以太网捆绑包。 |
14.1R1 |
将 aeX 接口创建与 增加聚合以太网接口命名空间。 为 ECMP 下一跃点提供自适应负载平衡。 |
13.3R1 |
包括针对自适应、按数据包随机和周期性再平衡负载平衡的增强功能。 |
11.4R1 |
提供跨 ECMP 下一跃点的负载共享。 |