Cisco ACI中的数据平面与控制平面

Cisco ACI中的数据平面与控制平面

如果是标准 VXLAN EVPN Fabric:(注意不是ACI)

Underlay 使用 IS-IS(或者 OSPF/BGP)建立 IP Fabric,实现各个 VTEP/Loopback 地址之间的可达性;Overlay 使用 VXLAN 封装数据,而 BGP EVPN 负责分发 MAC/IP/VNI 等 Overlay Endpoint 信息,构成 Overlay Control Plane。

这个说法是非常准确的。

但是如果是 Cisco ACI:

Underlay 使用 IS-IS 建立 Fabric IP Reachability;Overlay 数据平面使用 VXLAN;ACI 内部的 Endpoint 信息控制主要依赖 COOP 和 ACI Fabric Control Plane,而不能简单地等同于传统标准 VXLAN EVPN 的 BGP EVPN Control Plane。


我们讨论的是经典的 Cisco ACI Fabric,那么:Overlay 的 Endpoint Control Plane 核心是 COOP,而不是传统 VXLAN EVPN 架构中的 BGP EVPN。

可以把 ACI 简化成:


                 Cisco ACI Fabric

┌─────────────────────────────────────┐
│              APIC                   │
│        Policy / Management          │
└─────────────────────────────────────┘

                OVERLAY
┌─────────────────────────────────────┐
│          VXLAN Data Plane           │
│                                     │
│     Endpoint Control Plane:         │
│               COOP                  │
└─────────────────────────────────────┘

                UNDERLAY
┌─────────────────────────────────────┐
│              IS-IS                  │
│                                     │
│        IP Fabric / ECMP             │
│        TEP Reachability             │
└─────────────────────────────────────┘

可以这样记

Underlay


IS-IS

负责:

Leaf / Spine Fabric 的路由可达性
TEP(Tunnel Endpoint)地址的可达性
ECMP 路径
Fabric Topology

也就是说:

IS-IS = 让整个 ACI Fabric 的网络设备能够互相进行 IP 通信。

Overlay

VXLAN + COOP

VXLAN:负责数据封装和转发
COOP:负责 Endpoint 信息的控制平面

例如某台服务器:

MAC: AA:AA:AA:AA:AA:AA
IP : 10.1.1.10

连接在:

Leaf 101

Leaf 101 会把这个 Endpoint 的位置注册到 Fabric 的 COOP Directory 中。其他 Leaf 如果需要找到这个 Endpoint,可以查询相应的信息。

所以可以理解为:

Server

Leaf 101

│ Endpoint Registration

Spine COOP Directory

│ Endpoint Location

Leaf 102
与传统 VXLAN EVPN 最大的区别
普通 VXLAN EVPN Fabric
Underlay

IS-IS / OSPF / BGP


IP Fabric


VXLAN Overlay

BGP EVPN

其中:

BGP EVPN 负责 MAC/IP Endpoint 的分发。

Cisco ACI
Underlay

IS-IS


IP Fabric


VXLAN Overlay

COOP

其中:

COOP 负责 Fabric 内 Endpoint Location 的 Directory/Mapping 功能。

但有一个概念上的细节

如果非常严谨地说,不要把 COOP 简单理解成“整个 Overlay 的唯一控制平面”。

ACI 实际上有多个控制机制协同工作:

IS-IS:Fabric Underlay 的路由和拓扑
COOP:Endpoint Directory / Endpoint Location
APIC:Policy 和配置的集中管理与下发
VXLAN:Overlay Data Plane

所以我个人认为最准确的说法是:

在 Cisco ACI 中,Underlay Routing Control Plane 主要使用 IS-IS;Overlay 的数据封装使用 VXLAN;Fabric 内部 Endpoint Location/Directory 的控制机制使用 COOP,而不是传统 VXLAN EVPN Fabric 所使用的 BGP EVPN。

这个说法会比较准确。

下一步可以继续深入一个非常关键的问题:COOP 到底是如何工作的?Endpoint 从 Leaf 学到之后,为什么要注册到 Spine?Spine 又如何回答其他 Leaf 的查询? 这个过程理解了以后,你对 ACI 的 Overlay Control Plane 基本就真正理解了。

先建立整体架构

假设我们有这样一个 ACI Fabric:

+-------------------+
| APIC |
| Policy / Config |
+---------+---------+
|
|
=================================
FABRIC

+---------+
| Spine 1 |
| COOP |
+---------+
/
/
+------+ +------+
| Leaf1 | | Leaf2 |
+---+---+ +---+---+
| |
Server A Server B

现在:

Server A
MAC: AA:AA:AA:AA:AA:AA
IP : 10.1.1.10

连接在 Leaf 1。

而 Server B:

MAC: BB:BB:BB:BB:BB:BB
IP : 10.1.1.20

连接在 Leaf 2。

假设 Server B 想访问 Server A。

  1. Endpoint Learning:Leaf 先学习 Endpoint

Server A 第一次发送数据包:

Server A

│ Frame

Leaf 1

Leaf 1 看到:

Source MAC = AA:AA:AA:AA:AA:AA
Source IP = 10.1.1.10

于是 Leaf 1 学习:

Endpoint AA:AA:AA:AA:AA:AA
Location = Leaf 1

Leaf 1 的 Endpoint Table 可以理解为:

MAC Location

AA:AA:AA:AA:AA:AA Local

这一步叫:

Endpoint Learning

  1. Leaf 把 Endpoint 注册到 COOP

接下来非常重要。

Leaf 1 不只是自己知道:

“这个 MAC 在我这里。”

它还会向 Fabric 注册:

AA:AA:AA:AA:AA:AA

│ Registration

COOP Directory

ACI 的 Spine 上运行 COOP Directory。

逻辑上变成:

COOP Database

Endpoint:
AA:AA:AA:AA:AA:AA

Location:
Leaf 1

所以:

Leaf 负责学习 Endpoint,Spine 负责维护 Endpoint Directory。

你可以把它理解成:

Leaf = 学习 Endpoint
Spine = Endpoint Directory
4. 为什么需要 COOP?

现在 Server B 想发送数据给 Server A。

Server B


Leaf 2

Leaf 2 收到:

Destination MAC:
AA:AA:AA:AA:AA:AA

但是 Leaf 2 不知道这个 MAC 在哪里。

传统二层网络可能会:

Unknown MAC


Flood

也就是说:

Leaf 2

├──── Flood ──── Leaf 1
├──── Flood ──── Leaf 3
├──── Flood ──── Leaf 4

但是 ACI 不希望大量依赖这种 Flooding。

所以 Leaf 2 会:

询问 COOP Directory:这个 Endpoint 在哪里?

Leaf 2

│ COOP Query

Spine

│ COOP Database Lookup

Endpoint Location = Leaf 1

然后 Spine 返回:

AA:AA:AA:AA:AA:AA


Located at Leaf 1
5. Leaf 2 得到答案之后怎么办?

Leaf 2 现在知道:

Destination MAC


Located at Leaf 1

于是 Leaf 2 将数据封装进 VXLAN:

+-----------------------------------+
| Outer IP Header |
| |
| Source = Leaf 2 TEP |
| Destination = Leaf 1 TEP |
+-----------------------------------+
| UDP |
+-----------------------------------+
| VXLAN |
| |
| VNI |
+-----------------------------------+
| Original Ethernet Frame |
| |
| Src MAC = Server B |
| Dst MAC = Server A |
+-----------------------------------+

然后:

Server B

Leaf 2

│ VXLAN Encapsulation


Spine

│ IP Underlay Forwarding


Leaf 1


Server A

注意:

Spine 在这个数据流中通常只负责 Underlay IP 转发。

Spine 不需要:

解封 VXLAN
学习所有 Endpoint 的 Data Plane 转发表
像传统二层交换机一样转发 MAC

它根据 Outer IP Header 转发:

Destination = Leaf 1 TEP

这也是 Spine 可以实现高性能转发的一个重要原因。

  1. 整个流程总结
    Phase 1:Endpoint Learning
    Server A


    Leaf 1

Learn:
MAC = AA
IP = 10.1.1.10
Phase 2:COOP Registration
Leaf 1

│ Register Endpoint

COOP Spine

AA → Leaf 1
Phase 3:COOP Query
Server B


Leaf 2

"Where is MAC AA?"


COOP
Phase 4:COOP Reply
COOP

"MAC AA is at Leaf 1"
Phase 5:VXLAN Forwarding
Leaf 2

│ VXLAN

Underlay IP Fabric


Leaf 1


Server A
7. 你现在可以这样理解 ACI

我建议你在脑子里建立这个模型:

┌─────────────────────────────────────┐
│ APIC │
│ │
│ Policy & Configuration │
└──────────────────┬──────────────────┘

┌─────────────────────────────────────┐
│ CONTROL │
│ │
│ Underlay: IS-IS │
│ Endpoint Directory: COOP │
└─────────────────────────────────────┘

┌─────────────────────────────────────┐
│ DATA │
│ │
│ VXLAN Encapsulation │
│ IP Fabric + ECMP │
└─────────────────────────────────────┘
一句话版本

IS-IS 负责“网络设备之间怎么到达”;COOP 负责“Endpoint 在哪里”;VXLAN 负责“数据怎么封装和传过去”;APIC 负责“策略是什么”。

这四句话基本就是理解 Cisco ACI 架构的核心。


我这里有一个问题,coop负责 endpoint在哪里,那它需要记录 endpoint在哪个Leaf的那个接口吗?就是具体在 Leaf的哪个接口上需要体现吗?

我理解你想问的是:COOP 是否需要精确记录 Endpoint 在哪个 Leaf,以及具体连接在哪个 Leaf 的哪个接口(port)?

答案是:要区分两层信息。

简短答案
COOP 主要记录的是:

这个 Endpoint 所在的 Leaf/VTEP(TEP)在哪里。

例如:

Endpoint:
MAC = AA:AA:AA:AA:AA:AA
IP = 10.1.1.10

Location:
Leaf 101
VTEP = 10.0.0.101

COOP Directory 的核心任务是让其他 Leaf 知道:

「我要发送给这个 Endpoint,应该把 VXLAN Tunnel 封装到哪个 Leaf/VTEP?」

那么具体在哪个接口呢?

例如:

Server A

│ Ethernet

Leaf 101
Ethernet1/10

Leaf 101 自己本地会知道:

MAC AA


Local Port = Ethernet1/10

因此逻辑上可以理解成:

COOP Directory:
MAC AA → Leaf 101 / TEP

Leaf 101 Local Table:
MAC AA → Ethernet1/10

也就是说:

远端 Leaf 只需要知道:
MAC AA → Leaf 101

然后建立 VXLAN:

Source VTEP Destination VTEP
Leaf 102 ─────► Leaf 101
到达 Leaf 101 后:

Leaf 101 才使用自己的本地 Endpoint 信息:

MAC AA → Ethernet1/10

最终发送给 Server A。

整个逻辑可以画成这样
Server B


Leaf 102

│ COOP 查询
│ "MAC AA 在哪里?"

COOP Directory

│ Reply:
│ "在 Leaf 101"

Leaf 102

│ VXLAN Tunnel
│ Destination = Leaf 101 TEP

Leaf 101

│ Local Endpoint Lookup
│ MAC AA → Ethernet1/10

Ethernet1/10


Server A
所以一个非常重要的理解是

你可以把 Endpoint Location 分成两层:

第一层:Fabric-Level Location
Endpoint → 哪个 Leaf?

这个是 COOP 特别关心的。

例如:

MAC AA → Leaf 101 / TEP
第二层:Local Leaf-Level Location
Endpoint → Leaf 上哪个 Port?

例如:

MAC AA → Ethernet1/10

这是 Leaf 自己本地 Endpoint Table / Forwarding Table 所关心的。

所以你可以记住这句话:

COOP 解决“Endpoint 在哪台 Leaf”;目标 Leaf 自己解决“Endpoint 在哪个具体接口”。

这个理解非常接近 Cisco ACI Endpoint Learning 和 Forwarding 的核心逻辑


这时如果一个endpoint从leaf1的一个E1/10挪到了E1/20口,这时候会发生什么?

这种同一台Leaf上的端口变更,一般只更新本地的 endpoint table,不需要更新 COOP,因为在 Fabric 看来,这个 MAC 仍然在 Leaf1上。只有当这个 endpoint 跨 Leaf 移动,比如从 Leaf1 移到 Leaf2,才需要更新 COOP 目录,把映射改成指向 Leaf2。因为 COOP关心的是“在哪台 Leaf”,而不是“Leaf 上的哪个物理端口”。Leaf 内部再用本地表决定从哪个端口发出去。这个分层让 Fabric既高效又不会被物理端口的细节撑爆。这样解释清楚吗?


刚才说到那个coop会存储这些信息,endpoint的上线之后会告诉coop directory,也就是SPINE会有这些信息。假设现在有个EP: 10.1.1.1从leaf A上来,它告诉了coop(SPINE),那spine主动告诉那个leaf B吗 ?

是个非常关键的问题,也是 COOP 和 EVPN 最大的区别之一。答案是 COOP 不会主动通知所有的 Leaf,而是更像一个被动的目录查询服务。比如 Server A 在 Leaf A 上,Leaf A 把这个 endpoint 注册到 COOP 目录里,这时不会推送给其他 Leaf。只有当 Leaf B 真正要找1.1.1.1 的时候,才向 COOP 发起查询,然后 COOP 回答说:“这个 endpoint 在 Leaf A。”这种按需查询的方式可以让控制平面消息量保持可控。也正因为如此,ACI 的 COOP 更像是一个目录服务,而不是传统意义上会广播变化的路由协议。你问得很到位,这正是很多人一开始容易混淆的地方。


COOP 为什么部署在 Spine,而不是 Leaf?以及多台 Spine 如何共同组成分布式 COOP Directory?

这个问题非常关键。我们把它分成两部分讲。

  1. 为什么 COOP 放在 Spine,而不是 Leaf?

核心原因是:Spine 在 ACI Fabric 里天然适合做“集中目录服务”,而 Leaf 负责接入和 Endpoint Learning。

可以这样分工:

Leaf:

  • 连接 Server / VM / Endpoint
  • 学习 Endpoint
  • 维护本地 Endpoint 信息
  • VXLAN 封装/解封

Spine:

  • 维护 COOP Directory
  • 回答 Endpoint Location 查询
  • Underlay IP 转发

假设有 200 台 Leaf。

如果每个 Leaf 都要维护全 Fabric 的所有 Endpoint:

Leaf 1 ← 所有 Endpoint
Leaf 2 ← 所有 Endpoint
Leaf 3 ← 所有 Endpoint
...
Leaf 200 ← 所有 Endpoint

那每一台 Leaf 都需要保存大量 Endpoint 信息,而且每次 Endpoint 上线、下线、迁移,都可能需要大规模同步。

ACI 不采用这种方式。

而是:

COOP Directory
Spine Layer
┌───────┬───────┐
│ │ │
Spine1 Spine2 Spine3
│ │ │
───────┴───────┴───────┴──────
Leaf1 Leaf2 Leaf3

Leaf 只需要知道:

我本地的 Endpoint 在哪里。

如果要找远端 Endpoint,就去查 COOP。

  1. 为什么 Spine 特别适合做 Directory?

ACI 的 Spine 是 Fabric 的中心层。

从任何 Leaf 到任何 Spine,都只有一跳:

Leaf A

├──── Spine 1
├──── Spine 2
└──── Spine 3

因此:

Leaf 很容易访问 COOP
查询路径非常短
可以使用多台 Spine 提供冗余
不需要 Leaf-to-Leaf 控制平面全互联

所以逻辑上:

Leaf 是“数据来源”,Spine 是“目录中心”。

  1. 多台 Spine 怎么组成分布式 COOP Directory?

这里就进入 COOP 最有意思的地方:不是每一台 Spine 都保存所有 Endpoint。

假设有三台 Spine:

COOP Directory

Spine 1 Spine 2 Spine 3
? ? ?

ACI 会通过一种分布式的机制,把 Endpoint 信息分布到不同的 Spine 上。

可以概念化理解成:

Endpoint MAC/IP


Hash Calculation

├────► Spine 1
├────► Spine 2
└────► Spine 3

例如:

MAC AA → Hash → Spine 1
MAC BB → Hash → Spine 2
MAC CC → Hash → Spine 3

所以不同 Endpoint 会分布到不同 Spine 上。

  1. Leaf A 注册 Endpoint 时发生什么?

假设:

Endpoint A
IP = 1.1.1.1
MAC = AA:AA:AA:AA:AA:AA

Located at:
Leaf A

Endpoint A 接入 Leaf A 后:

Endpoint A


Leaf A

Leaf A 学到 Endpoint,然后计算:

Hash(Endpoint A)


Which COOP Spine owns this Endpoint?


Spine 2

然后注册:

Leaf A

│ COOP Registration

Spine 2


Endpoint A → Leaf A

当然,实际机制还会涉及冗余副本,不只是简单的“一条信息只放在一台 Spine”。

  1. Leaf B 查询时怎么办?

假设 Leaf B 要找:

1.1.1.1

它同样可以根据 Endpoint 信息计算:

Hash(1.1.1.1 / MAC)


COOP Spine 2

然后:

Leaf B

│ COOP Query:
│ Where is 1.1.1.1?

Spine 2

│ Lookup

1.1.1.1 → Leaf A

Spine 2 回复:

"Endpoint 1.1.1.1
is located behind Leaf A"

然后 Leaf B 才进行 VXLAN 封装:

Outer Source IP = Leaf B TEP
Outer Dest IP = Leaf A TEP

最终:

Leaf B

│ VXLAN

IP Underlay


Leaf A


Endpoint A
6. 一个很重要的概念:COOP 是 Directory,不是传统路由表

你可以把它和 DNS 类比——只是帮助理解,不代表协议完全相同。

DNS:
www.example.com

IP Address

COOP:
Endpoint MAC/IP

Leaf / VTEP Location

所以 COOP 的主要工作不是:

“我把所有 Endpoint 信息广播给所有 Leaf。”

而是:

“Endpoint 信息注册到 Directory,需要的时候进行查询。”

最终你可以记住这个完整流程
Endpoint 上线


Leaf 学习 Endpoint


COOP Registration


Distributed Spine COOP Directory

│ (按 Hash 分布)

──────────────────────────────

│ 其他 Leaf 需要通信

COOP Query


找到对应 Endpoint Directory


Reply:
Endpoint → Destination Leaf / TEP


VXLAN Tunnel

一句话总结:

Leaf 负责发现 Endpoint,COOP Spine 负责保存和查询 Endpoint 的 Fabric 级位置,而多台 Spine 通过分布式 Hash/Directory 机制共同承担整个 Endpoint Database。

顺便纠正一下我前面一个说法:我之前用“COOP 不会主动通知所有 Leaf”来帮助你和 EVPN 对比,这个方向是对的,但更严谨地说,ACI 还有缓存、注册/更新和 Endpoint Mobility 等机制,不能简单理解成“永远只有查询、绝对没有任何更新通知”。核心模型仍然是 directory-based,而不是把所有 Endpoint 路由信息全量分发给每个 Leaf。


按以上说法,如果Leaf A把 host A信息通过hash算法计算后选择告诉了spine 1 , 那Leaf B下的host B要访问 host A时,要找spine 1查询 ,假设以有4台spine, 那leaf B咋知道找哪台spine问?它咋会知道找spine 1查询?

你这个问题问到了 COOP 最核心的机制。你的逻辑是完全正确的:

如果 Leaf A 把 Host A 注册到了某个特定的 Spine,例如 Spine 1,那么 Leaf B 怎么知道应该去问 Spine 1,而不是随机问四台 Spine?

关键就在于:Leaf B 并不是靠“记住 Host A 在 Spine 1”来查询的,而是所有 Leaf 使用相同的 COOP 哈希算法。

举个完整例子

假设 Fabric 有 4 台 Spine:

┌─────────┐
│ Spine 1 │
└─────────┘

COOP Entry

┌────┴────┐
│ Host A │
│1.1.1.1 │
└─────────┘

Spine 1 Spine 2 Spine 3 Spine 4

Host A:

IP = 1.1.1.1
MAC = AA:AA:AA:AA:AA:AA
第一步:Leaf A 学习 Host A
Host A


Leaf A

Leaf A 学到:

MAC = AA:AA:AA:AA:AA:AA
IP = 1.1.1.1

然后 Leaf A 使用 Fabric 统一的 COOP Hash 算法:

Hash(MAC AA)


Hash Result = 1


COOP Spine 1

所以:

Leaf A

│ COOP Registration

Spine 1

Spine 1 记录:

Host A → Leaf A / VTEP A
第二步:Host B 要访问 Host A

Host B:

Host B


Leaf B

Leaf B 收到一个去往 Host A 的数据包:

Destination IP = 1.1.1.1
Destination MAC = AA:AA:AA:AA:AA:AA

Leaf B 本地没有这个 Endpoint。

所以它需要查询 COOP。

Leaf B 怎么知道问哪台 Spine?

Leaf B 也运行完全相同的 Hash 算法。

Leaf B 知道:

Fabric COOP Group
+
Available Spine COOP Members
+
Endpoint Key

然后它计算:

Hash(Host A)


Hash Result = 1


Spine 1

因此:

Leaf B

│ COOP Query

Spine 1

这就是答案。

一个简单的类比

假设公司有 4 个档案柜:

Cabinet 1
Cabinet 2
Cabinet 3
Cabinet 4

所有员工都知道同一个规则:

员工编号 % 4

那么:

Employee ID = 101

101 % 4 = 1

于是:

员工 101 的资料永远应该放在 Cabinet 1。

任何人想找 101,都可以自己算:

101 % 4 = 1

然后直接去 Cabinet 1。

不需要事先问:“101 在哪个柜子?”

COOP 的思路类似这个概念。

那如果 Spine 1 挂了怎么办?

这个问题又非常重要。

COOP 不能这样设计:

Host A


Only Spine 1

因为:

Spine 1 Down


Host A Information Lost

所以实际的 COOP Directory 会考虑冗余和多个 Directory 节点。

概念上可以理解:

Hash(Host A)


Primary Directory
Spine 1

└── Backup / Replica
Spine 3

因此:

Leaf B

├── Primary → Spine 1

└── Failure → Alternate/Replica
但这里我想纠正我上一条回答的一个地方

我上一条回答用了这个非常简化的模型:

Leaf 根据 Hash(Endpoint),直接算出“这个 Endpoint 属于 Spine 2”。

这个模型用来帮助理解 Distributed Directory 是可以的,但对于真实 Cisco ACI 的 COOP 实现来说,这个说法过于简化了。

实际 COOP 涉及:

COOP Group
Directory 的 分区/分布机制
一致性哈希思想
Directory 节点成员变化
Replica / redundancy
Anycast 等机制

所以你现在提出的:

Leaf B 怎么知道找 Spine 1?

恰恰是 COOP 设计里最关键的问题之一。

概念上,答案是:

Leaf A 和 Leaf B 都拥有关于 COOP Directory 集群成员和映射规则的共同认知,因此可以根据相同的规则定位负责某个 Endpoint 的 Directory 节点,而不是靠 Leaf A 单独告诉 Leaf B。

用一句话回答你的问题

Leaf A 和 Leaf B 不需要互相告诉对方“Host A 在 Spine 1”。它们依据 Fabric 共享的 COOP Directory 成员信息和一致的映射/哈希规则,对同一个 Endpoint 得出相同的 Directory 位置,因此 Leaf B 可以知道该向哪个 COOP Directory 节点查询。


我们下一步可以继续画一个4 台 Spine + 2 台 Leaf 的完整时序图,从:

Host A 上线 → Leaf A 学习 → COOP Registration → Host B 发包 → Leaf B 查询 → COOP Reply → VXLAN 转发

完整走一遍。这个过程画出来之后,COOP 的整个工作机制会非常直观。

场景:4 台 Spine,2 台 Leaf
SPINE LAYER
┌──────────┬──────────┬──────────┬──────────┐
│ Spine 1 │ Spine 2 │ Spine 3 │ Spine 4 │
│ COOP │ COOP │ COOP │ COOP │
└────▲─────┴──────────┴──────────┴──────────┘

Host A Directory Entry

┌────────────┴─────────────────────────────┐
│ │
Leaf A Leaf B
│ │
Host A Host B
1.1.1.1 1.1.1.2
Phase 1:Host A 上线

Host A 连接到 Leaf A:

Host A
IP = 1.1.1.1
MAC = AA:AA:AA:AA:AA:AA

Host A 发出数据:

Host A


Leaf A

Leaf A 学习到:

Endpoint:
IP = 1.1.1.1
MAC = AA:AA:AA:AA:AA:AA

Location:
Leaf A

Leaf A 的本地信息可以理解为:

Endpoint A

├── MAC = AA
├── IP = 1.1.1.1
└── Local Interface = Eth1/10
Phase 2:Leaf A 向 COOP 注册

现在 Leaf A 不只是自己保存。

它需要告诉 Fabric:

“1.1.1.1 / MAC AA 在我这里。”

概念上:

Leaf A

│ COOP Registration

COOP Directory

我们用一个简化的 Hash 模型:

Endpoint Key


Hash / Directory Mapping


Spine 1

于是:

Leaf A

│ Register:
│ 1.1.1.1 → Leaf A

Spine 1

Spine 1 的 Directory 中有:

1.1.1.1


Leaf A

更准确一点:

Endpoint A


Destination VTEP = Leaf A TEP
Phase 3:Host B 要访问 Host A

现在 Host B:

Host B
IP = 1.1.1.2

发送数据:

Destination = 1.1.1.1

数据进入:

Host B


Leaf B

Leaf B 查自己的本地 Endpoint Table:

Do I know 1.1.1.1?

No.

于是 Leaf B 需要进行 Endpoint Resolution。

Phase 4:Leaf B 怎么知道找哪台 Spine?

这里就是你刚才问的核心。

Leaf B 根据:

Endpoint = 1.1.1.1

以及 Fabric 的:

COOP Directory Mapping Rules
+
COOP Group Information

进行 Directory 定位。

概念上:

1.1.1.1


Hash / Mapping


Spine 1

所以 Leaf B 不需要问:

“Host A 到底在哪个 Spine?”

它可以根据相同的规则直接定位:

Leaf B

│ COOP Query
│ "Where is 1.1.1.1?"

Spine 1
Phase 5:Spine 1 查询 Directory

Spine 1 收到:

Where is 1.1.1.1?

然后查:

COOP Directory

1.1.1.1


Leaf A TEP

于是回复 Leaf B:

1.1.1.1 is reachable through:

Leaf A
TEP = x.x.x.x

逻辑上:

Leaf B

│ Query

Spine 1

│ Reply:
│ Endpoint → Leaf A

Leaf B
Phase 6:Leaf B 建立 VXLAN 转发信息

现在 Leaf B 知道:

Destination Endpoint:
1.1.1.1

Remote Location:
Leaf A

Destination VTEP:
Leaf A TEP

于是 Leaf B 封装:

┌───────────────────────────────┐
│ Outer IP Header │
│ │
│ Src = Leaf B TEP │
│ Dst = Leaf A TEP │
├───────────────────────────────┤
│ UDP │
├───────────────────────────────┤
│ VXLAN │
│ VNI │
├───────────────────────────────┤
│ Original Packet │
│ │
│ Host B → Host A │
└───────────────────────────────┘
Phase 7:Underlay 转发

VXLAN 包进入 Underlay:

Leaf B

│ Outer Destination:
│ Leaf A TEP

Spine

│ IS-IS Routing / ECMP

Leaf A

这里非常重要:

Spine 负责 Underlay IP 转发,但它不需要在 Data Plane 中查“Host A 在哪里”。

它只看:

Outer IP Destination


Leaf A TEP
Phase 8:Leaf A 最后转发到具体端口

VXLAN 包到达 Leaf A:

Leaf A

Leaf A 解封装:

VXLAN Decapsulation


Destination MAC = AA

Leaf A 的本地 Endpoint Table:

MAC AA


Eth1/10

于是:

Leaf A


Eth1/10


Host A
整个过程串起来
① Host A 上线

Host A


Leaf A learns:
Host A → Eth1/10

② COOP Registration

Leaf A


COOP Directory
Host A → Leaf A TEP

③ Host B 发包

Host B


Leaf B

"I don't know Host A"

④ COOP Query

Leaf B

│ Where is Host A?

COOP Directory

⑤ COOP Reply

COOP

│ Host A → Leaf A TEP

Leaf B

⑥ VXLAN

Leaf B

│ VXLAN

IP Underlay


Leaf A

⑦ Local Forwarding

Leaf A


Eth1/10


Host A
最重要的三层记忆
Endpoint → 哪个 Leaf?

COOP

Leaf → 怎么找到具体 Endpoint?

Local Endpoint Table

Leaf A → Leaf B 怎么传数据?

VXLAN + IS-IS Underlay

所以整个 ACI 的逻辑可以浓缩成一句:

COOP 负责找到 Endpoint 所在的 Fabric 位置,VXLAN 负责把流量送到目标 Leaf,目标 Leaf 再根据本地 Endpoint 表把流量送到具体物理接口。


上面的处理过程中没有涉及到广播的处理,
主机A要访问主机B时,一开始是没有arp表象的, 所以主机A必定会发arp request ,那这种arp 广播又会如何处理?

我们刚才的流程直接从“Leaf B 要找 Host A”开始,其实跳过了 ARP/广播这一层。真实网络里通常首先发生的是 Endpoint Resolution。

我们把场景改得更真实一点。

场景
Host A
IP = 1.1.1.1
MAC = AA:AA:AA:AA:AA:AA

Leaf A

Host B
IP = 1.1.1.2
MAC = BB:BB:BB:BB:BB:BB

Leaf B

假设 Host A 要访问:

1.1.1.2

但是 Host A 的 ARP Table 里面没有 Host B:

Host A ARP Table

1.1.1.2 → ???

那么第一步一定是 ARP。

Phase 1:Host A 发送 ARP Request

Host A 会发送:

ARP Request

Who has 1.1.1.2?
Tell 1.1.1.1

它的 Ethernet Header 是:

Source MAC = AA:AA:AA:AA:AA:AA
Destination MAC = FF:FF:FF:FF:FF:FF

也就是说:

ARP Request 是二层广播。

Host A

│ ARP Broadcast

Leaf A
Phase 2:Leaf A 学习 Host A

Leaf A 收到 Host A 的 ARP Request 时,首先会看到:

Source MAC = AA
Source IP = 1.1.1.1

因此 Leaf A 可以学习:

Endpoint A

IP = 1.1.1.1
MAC = AA
Port = Eth1/10

然后:

Leaf A

│ Endpoint Registration

COOP Directory

因此 COOP 知道:

1.1.1.1 / AA


Leaf A
Phase 3:ARP Broadcast 怎么到达其他 Leaf?

这是你问题里最关键的部分。

ARP Request 是 Broadcast:

Destination MAC = FF:FF:FF:FF:FF:FF

但是在 VXLAN Overlay 里,不能简单理解成:

Leaf A 对所有其他 Leaf 做普通广播。

ACI 会根据 Bridge Domain (BD) 的 Flooding / Endpoint Resolution 机制处理这种 BUM 流量。

概念上:

Host A

│ ARP Request

Leaf A

│ VXLAN Encapsulation

├────────► Leaf B

├────────► Leaf C

└────────► 其他属于同一 BD 的 Leaf

这就是:

BUM Traffic

Broadcast
Unknown Unicast
Multicast

但是这里出现一个很有意思的问题

假设 Leaf A 不知道:

Host B 到底在哪台 Leaf?

那么传统二层网络通常:

Broadcast → Flood Everywhere

而 ACI 的设计目标之一就是:

尽可能减少不必要的 Flooding。

因此 ACI 可以结合 Endpoint Directory、ARP 处理机制等进行优化。

Phase 4:Host B 收到 ARP Request

假设 ARP Broadcast 最终到达 Leaf B:

Leaf A

│ VXLAN BUM Traffic

Leaf B


Host B

Host B 发现:

Who has 1.1.1.2?

这正好是自己的 IP。

于是 Host B 回复:

ARP Reply

1.1.1.2 is BB:BB:BB:BB:BB:BB

ARP Reply 通常是:

Unicast

Host B:

Source MAC = BB
Source IP = 1.1.1.2

Leaf B 因此学习:

Endpoint B

IP = 1.1.1.2
MAC = BB
Port = Eth1/20

然后注册:

Leaf B

│ COOP Registration

COOP Directory

1.1.1.2 → Leaf B
Phase 5:ARP Reply 返回 Host A

现在 Leaf B 要把 ARP Reply 发给 Host A。

它知道:

Destination MAC = AA

如果 Leaf B 本地没有 Endpoint A 的具体位置,它可以进行 Endpoint Resolution:

Leaf B

│ Where is MAC AA?

COOP Directory

│ Reply:
│ AA → Leaf A

Leaf B

然后:

Leaf B

│ VXLAN Unicast
│ Destination VTEP = Leaf A

Leaf A


Host A
Phase 6:Host A 获得 ARP 信息

Host A 收到:

ARP Reply:

1.1.1.2
MAC = BB

于是 Host A 的 ARP Table:

1.1.1.2 → BB:BB:BB:BB:BB:BB

现在 Host A 就可以真正发送业务数据:

Host A

│ Destination MAC = BB

Leaf A

Leaf A 查询本地 Endpoint 信息或者通过 COOP 获得:

MAC BB → Leaf B

然后:

Leaf A

│ VXLAN Unicast

Leaf B


Host B
所以完整过程其实是
① Host A 没有 ARP

Host A


ARP Request
"Who has 1.1.1.2?"

② Leaf A 学习 Host A

Host A → Leaf A

③ ARP/Broadcast 处理

Leaf A

├── VXLAN BUM
└──→ Leaf B

④ Host B 收到 ARP

Host B


ARP Reply

⑤ Leaf B 学习 Host B

Host B → Leaf B

⑥ 必要时查询 COOP

MAC AA → Leaf A

⑦ ARP Reply 回到 Host A

⑧ Host A 获得 MAC BB

⑨ 正常业务流量

Host A

│ VXLAN Unicast

Leaf B


Host B
一个特别重要的点

ACI 里面我们后面还要讨论 ARP Gleaning / ARP Flooding / ARP Proxy(或者更准确地说 Endpoint Resolution 的优化机制)。

因为实际 ACI 并不总是简单地:

ARP Request → Flood 到所有 Leaf

不同的 Bridge Domain 设置 会影响:

ARP Flooding
Unknown Unicast Flooding
GARP
Endpoint Learning
COOP Resolution

所以你现在提出“先考虑 ARP 广播”,实际上正好是理解 ACI Forwarding 的下一层关键问题。


ACI中关于bum流量的处理详细说下

可以。ACI 里的 BUM(Broadcast、Unknown Unicast、Multicast) 是理解 VXLAN Overlay 非常关键的一块,而且它和我们刚才讲的 COOP 是连在一起的。

先给你一个总框架:

ACI Fabric

┌─────────────┐
│ Spine │
│ IS-IS │
└──────┬──────┘

VXLAN │ VXLAN

┌──────────┴──────────┐
│ │
Leaf A Leaf B
│ │
Host A Host B

ACI 的核心思想是:

Unicast 尽量走 Endpoint-to-Endpoint 的 VXLAN,而 BUM 流量则通过专门的 VXLAN BUM/Flooding 机制在属于同一个 BD 的 Leaf 之间传播。

  1. 什么叫 BUM?

BUM 是三个东西:

B = Broadcast
U = Unknown Unicast
M = Multicast

例如:

Broadcast

ARP Request:

Who has 10.1.1.2?

Dst MAC:
FF:FF:FF:FF:FF:FF
Unknown Unicast

Leaf 收到:

Dst MAC = AA:AA:AA:AA:AA:AA

但是 Leaf 不知道这个 MAC 在哪里。

于是:

Unknown Unicast

Flood
Multicast

例如:

Host A

│ 224.1.1.1

Multicast

这种也属于 BUM。

  1. 为什么 VXLAN Fabric 需要专门处理 BUM?

因为 ACI 是一个 Overlay。

假设:

Host A

Leaf A

Host A 发一个 Broadcast:

FF:FF:FF:FF:FF:FF

但是 Host B 在:

Leaf B

Host C 在:

Leaf C

那么这个 Broadcast 必须跨越:

Leaf A

Spine

Leaf B / Leaf C

所以需要一种机制把:

一个 Leaf 上的 BUM 流量复制到其他相关 Leaf。

  1. ACI 的关键:BD 决定 BUM Flooding Domain

这里非常重要。

ACI 不是整个 Fabric 都 Flood。

而是根据 Bridge Domain(BD) 来确定 Flooding Domain。

比如:

BD-Web

├── Leaf A
├── Leaf B
└── Leaf C

那么 BD-Web 里的 BUM 流量,只需要传播到:

承载这个 BD 的相关 Leaf。

不会因为 Host A 发了一个 ARP,就让整个 Fabric 所有 Leaf 都收到。

  1. BD 和 VLAN 不完全是一回事

传统网络你可能习惯:

VLAN 10

Broadcast Domain

ACI 里更重要的是:

Bridge Domain

Subnet

Flooding / Forwarding Domain

例如:

Tenant
└── VRF
└── BD-10
└── Subnet 10.1.1.0/24

BD 定义了一个二层转发域。

  1. Broadcast 到底怎么走?

我们用你刚才的 ARP 场景。

Host A
10.1.1.1


Leaf A

Host A:

ARP Request

Who has 10.1.1.2?

Destination MAC:

FF:FF:FF:FF:FF:FF

Leaf A 判断:

这是 Broadcast。

于是需要把它发送到这个 BD 的其他相关 Leaf。

  1. Leaf A 怎么把 Broadcast 送到其他 Leaf?

这里就是 VXLAN 的作用。

ACI 会把 BUM 流量进行 VXLAN 封装。

概念上:

Original Ethernet Frame


VXLAN Encapsulation


ACI Fabric

变成:

Outer IP
Source = Leaf A TEP
Destination = BUM / Multicast mechanism


UDP 4789


VXLAN


Original ARP Frame
7. 这里要注意:ACI 的 BUM 不是简单地“Spine 广播”

这是很多人容易误解的地方。

Spine 本身不是传统二层交换机。

它的主要工作仍然是:

IP Underlay Forwarding

Leaf A 把 BUM 封装以后,Spine 根据 Underlay 进行转发。

也就是说:

Leaf A

│ VXLAN BUM

Spine

│ IP Forwarding

Leaf B
Leaf C

Spine 不需要学习:

Host A → Eth1/10
Host B → Eth1/20

这种 Endpoint 细节。

  1. ACI 怎么知道哪些 Leaf 属于这个 BD?

这和 COOP 以及 ACI Fabric 的配置/控制信息有关。

APIC 配置:

Tenant

VRF

BD

EPG

Leaf

Fabric 知道:

BD-10
├── Leaf A
├── Leaf B
└── Leaf C

所以当 Leaf A 有 BD-10 的 Broadcast:

BD-10 Broadcast

├── Leaf B
└── Leaf C
9. Unknown Unicast 怎么处理?

这个比 Broadcast 更有意思。

假设:

Host A

Leaf A

发送:

Dst MAC = BB:BB:BB:BB:BB:BB

但 Leaf A 不知道 BB 在哪里。

那么就出现:

Unknown Unicast

ACI 根据 BD 的相关配置决定怎么处理。

其中一个非常重要的配置就是:

Unknown Unicast Flooding

如果开启:

Unknown Unicast

Flood

BD 内相关 Leaf

如果没有开启,则可以采取更受控的处理方式,而不是像传统二层交换网络一样无条件 Flood。

所以 ACI 可以通过 BD 的策略控制 BUM 行为。

  1. Multicast 怎么处理?

Multicast 更复杂。

例如:

Host A

│ 224.1.1.1

Leaf A

假设:

Host B → Leaf B
Host C → Leaf C

都加入了:

224.1.1.1

那么 ACI 不应该简单地:

Leaf A
├── Leaf B
├── Leaf C
├── Leaf D
├── Leaf E
└── Leaf F

因为只有 B/C 真正需要这个 Multicast。

所以 Multicast 会涉及:

IGMP
Multicast group
BD
VXLAN
Fabric multicast tree
11. ACI 中一个很重要的概念:Multicast Tree

可以把它理解成:

Spine
/ |
/ |
Leaf A Leaf B Leaf C
│ │
Host B Host C

如果 B/C 加入 Multicast Group:

224.1.1.1

那么 Fabric 可以构造相应的树:

Source
Leaf A


Spine
/
▼ ▼
Leaf B Leaf C
│ │
Host B Host C

这样 Multicast 流量不会无意义地到处复制。

  1. ARP 是 BUM 里面最重要的一个实际例子

回到我们刚才的问题。

Host A:

10.1.1.1

要找:

10.1.1.2

没有 ARP:

ARP Table

10.1.1.2 → ???

于是:

Host A

│ Broadcast ARP

Leaf A

接下来 ACI 根据 BD 的配置和 Endpoint Resolution 机制处理这个 ARP。

可能涉及:

ARP Flooding
+
Endpoint Learning
+
COOP
+
ARP Gleaning / Proxy 等优化机制

所以不能简单地说“ACI 的 ARP 一定 Flood”。

这点非常重要。

  1. 为什么 ACI 要做这些优化?

因为如果完全按照传统二层网络:

Host A ARP


所有 Leaf


所有 Host

规模一大,问题非常严重。

假设:

500 Leaf
100,000 Endpoints

大量 ARP:

ARP

Flood

500 Leaf

100,000 Hosts

会造成非常严重的 BUM 压力。

ACI 的设计目标就是:

尽量把 Endpoint 信息变成已知状态,然后让后续流量尽量走 Unicast VXLAN。

  1. 这就把 COOP 和 BUM 联系起来了

你现在可以把它们放在一起看:

Endpoint Learning


COOP


Endpoint Location


Unicast VXLAN

而另外一条路径:

BUM Traffic


BD Flooding Domain


VXLAN BUM Forwarding

┌──────┼──────┐
▼ ▼ ▼
Leaf B Leaf C Leaf D

所以:

COOP 主要解决“已知 Endpoint 在哪里”。

BUM 机制解决“本来就需要复制给多个接收者的流量怎么跨 Fabric 传播”。

  1. 最后给你一个非常重要的判断方法

以后看到一个 ACI 数据包,你可以先问:

这是 Unicast 还是 BUM?

如果是:

Known Unicast

通常:

COOP / Endpoint Information

Destination Leaf

VXLAN Unicast

而如果是:

Broadcast
Unknown Unicast
Multicast

就进入:

BUM Processing

BD / Flooding Domain

VXLAN BUM

相关 Leaf
一句话把整个 ACI Forwarding 串起来:

Endpoint Learning + COOP 让 ACI 尽量把通信变成 Known Unicast;对于 ARP、Broadcast、Unknown Unicast 和 Multicast 这些无法直接按单一 Endpoint 转发的流量,则由 BD 所定义的 BUM/Flooding 机制通过 VXLAN 在 Fabric 中传播。


还有一个值得我们下一步专门掰开的点:ACI 到底有没有“VXLAN Multicast Group”,Spine 到底是不是在做真正的 IP Multicast,以及 PIM 在这里到底扮演什么角色。 这部分一旦搞清楚,你就会真正明白 ACI 的 BUM 是怎么穿过 Spine 的。

ACI 的 BUM 并不是简单地“Leaf 把广播丢给 Spine,然后 Spine 再广播给所有 Leaf”。
它背后实际上有 VXLAN、Multicast Tree、Underlay Multicast,以及 PIM 等机制参与。

  1. 先看最重要的一张图

假设:

Spine 1 Spine 2
/ \ /
/ \ /
Leaf A Leaf B Leaf C Leaf D
│ │ │
Host A Host B Host C

Host A 发一个 ARP Broadcast:

Host A

│ Broadcast

Leaf A

ACI 要解决的问题是:

这个 Broadcast 应该送到哪些 Leaf?

比如 Host B、C 属于同一个 BD,而 Host D 不属于:

BD-Web

Leaf A ─ Host A
Leaf B ─ Host B
Leaf C ─ Host C

Leaf D ─ 不属于 BD-Web

那么:

Host A


Leaf A

│ BUM

Fabric
├────► Leaf B
└────► Leaf C

✕ Leaf D

这就是 Flooding Domain 的概念。

  1. 那 Spine 是怎么把这个 BUM 流量送出去的?

这里需要引入:

Underlay Multicast

ACI Fabric 的 Underlay 不只是单纯的 Unicast IP Routing。

对于需要 Multicast/BUM 的场景,Fabric 可以建立相应的 Multicast Distribution Tree。

概念上:

Spine

┌─────┴─────┐
│ │
Leaf B Leaf C

Leaf A 发出的 BUM 流量进入这个 Tree。

所以你可以理解:

Spine 是 Fabric 的核心转发节点,Multicast Tree 让 BUM 流量能够高效地复制到需要它的 Leaf。

  1. PIM 在这里干什么?

这就是你刚才问的重点。

PIM(Protocol Independent Multicast) 是 Underlay Multicast 的控制协议之一。

它的作用不是:

“告诉我 Host A 在哪个 Leaf。”

那是 COOP/Endpoint Learning 负责的。

PIM 解决的是:

“这个 Multicast 流量的树应该怎么建立?”

所以要把两个问题严格分开:

COOP

└── Endpoint 在哪里?

PIM / Multicast

└── Multicast/BUM 流量怎么沿着 Tree 传播?

这是两个完全不同的问题。

  1. 一个非常直观的类比

假设:

COOP 是“通讯录”
张三 → 101办公室
李四 → 205办公室

你问:

张三在哪里?

通讯录告诉你:

101办公室。

Multicast Tree 是“道路系统”

如果你要把一份文件同时送给:

办公室 101
办公室 205
办公室 308

你需要的是:

怎么走一条路,把东西送到这些地方。

所以:

COOP
= Endpoint Location Directory

Multicast Tree
= BUM Traffic Distribution Path
5. VXLAN 在这里又是什么?

VXLAN 是数据平面封装。

Host A 发出的原始 ARP:

┌──────────────────────┐
│ Ethernet │
│ Destination = FF:FF │
│ ARP Request │
└──────────────────────┘

Leaf A 把它封装成 VXLAN:

┌───────────────────────────┐
│ Outer IP │
│ │
│ Source = Leaf A TEP │
│ Destination = Multicast │
├───────────────────────────┤
│ UDP 4789 │
├───────────────────────────┤
│ VXLAN │
│ VNI │
├───────────────────────────┤
│ Original Ethernet │
│ ARP Broadcast │
└───────────────────────────┘

所以:

VXLAN 是“怎么装”;Multicast Tree 是“怎么送”。

  1. 为什么不能直接用普通 IP Broadcast?

因为 Leaf A 和 Leaf B 中间是一个 Layer-3 IP Fabric:

Leaf A


Spine


Leaf B

二层 Broadcast 本身不能直接穿过普通的 L3 Router。

所以需要:

L2 Broadcast

VXLAN Encapsulation

L3 Multicast / BUM Transport

VXLAN Decapsulation

L2 Broadcast

这就是 Overlay/Underlay 的经典配合。

  1. 完整走一次 ARP

现在我们把所有东西串起来。

Host A:

10.1.1.1

要找:

10.1.1.2

没有 ARP:

ARP Table:

10.1.1.2 → ?

于是:

① Host A 发 Broadcast
Host A

│ ARP Request

Leaf A
② Leaf A 识别为 BUM
Destination MAC
FF:FF:FF:FF:FF:FF

Broadcast

BUM Processing
③ Leaf A 做 VXLAN 封装
Leaf A

│ VXLAN

│ VNI = BD 对应的 VNI

Underlay
④ Underlay Multicast Tree

流量进入相应的 Multicast Tree:

Spine
/
/
Leaf B Leaf C
⑤ Leaf B / Leaf C 解封装
Leaf B


VXLAN Decapsulation


Original ARP Broadcast


Host B

如果 Host B 是:

10.1.1.2

它回复:

ARP Reply

10.1.1.2 is
BB:BB:BB:BB:BB:BB

然后后续就开始进入 Known Unicast。

  1. 这里 COOP 又回来了

Host B 回复的时候:

Host B


Leaf B

Leaf B 学习:

10.1.1.2
MAC BB
Port Eth1/20

然后 Endpoint 信息进入 Fabric 的 Endpoint Directory。

于是以后:

Host A → Host B

就不需要每次都 Broadcast。

可以变成:

Host A


Leaf A

│ COOP / Endpoint information


Leaf B


Host B

数据直接:

VXLAN Unicast
9. 所以 ACI 的设计目标非常漂亮

第一次不知道:

Host A


ARP Broadcast


BUM


找到 Host B

然后学习:

Host B

COOP / Endpoint information

以后:

Host A


Known Unicast


VXLAN


Host B

也就是:

第一次可能需要 BUM,学习完成后尽量变成 Unicast。

  1. 但是还有一个非常重要的 ACI 特性

你后面学习 ACI 的时候,一定会遇到:

ARP Flooding

和:

ARP Gleaning

以及:

Endpoint Data Plane Learning

这些机制。

因为现代 ACI 并不是简单粗暴地:

每一个 ARP

整个 BD

Flood

它可以通过 Endpoint 信息和 ARP 相关机制减少不必要的 Flooding。

所以实际生产环境里,你可能会看到:

ARP Request

├── 已知 Endpoint
│ ↓
│ 可以优化处理

└── 未知 Endpoint

Flood / Glean

这也是为什么单纯说:

“ACI 的 ARP 就是 VXLAN + Multicast Flooding”

是不够准确的。

  1. 最后把四个协议/机制放在一起

你现在应该形成这个框架:

Cisco ACI

APIC

│ Policy

┌──────────────┐
│ Leaf │
└──────────────┘
│ │
Endpoint │ │ BUM
Learning │ │
▼ ▼
COOP VXLAN BUM
│ │
│ ▼
│ Multicast Tree
│ │
│ ▼
│ Spine


Endpoint Location

Underlay


IS-IS


IP Reachability

一句话记忆:

IS-IS 解决“Leaf/Spine 怎么互相到达”;COOP 解决“Endpoint 在哪台 Leaf”;VXLAN 负责 Overlay 封装;而 BUM 流量则通过 ACI 的 Flooding/Multicast 机制跨越这个 VXLAN Fabric。


还有一个特别值得下一步搞清楚的地方:ACI 里面的 Multicast 到底是“真正的 IP Multicast”,还是有时候使用 ingress replication?不同版本/不同配置下有什么区别。 这个会直接影响你在抓包时看到的 Outer IP、Multicast Group 和 VXLAN VNI。

这里我们把 ACI 里的 Multicast、VXLAN BUM、PIM、Ingress Replication 这几个东西彻底分开。这个地方很容易和普通 VXLAN EVPN 混淆。

先给你结论:

ACI 的 BUM 流量并不是简单等于“VXLAN + 一个固定的 IP Multicast Group”。ACI 会根据 Fabric/BD/Multicast 相关配置和流量类型,使用相应的 BUM 转发机制。

而且有一个很重要的认知:

不要把“COOP 查 Endpoint”和“Multicast Tree 转发 BUM”混成一个控制平面。

一、先把三种东西分开

假设:

Host A

Leaf A


Spine


Leaf B

Host B

我们现在有三个问题。

问题 1:Host B 在哪里?
COOP


Host B → Leaf B

这是 Endpoint Location。

问题 2:ARP Broadcast 怎么从 Leaf A 到 Leaf B?
BUM Forwarding


VXLAN BUM Transport

这是 BUM 数据平面。

问题 3:Fabric 的 Underlay 怎么把 VXLAN 包送过去?
IS-IS


IP Reachability

这是 Underlay Routing。

所以:

COOP

Endpoint Location

BUM mechanism

BUM Distribution

IS-IS

Underlay Reachability

VXLAN

Overlay Encapsulation

这四个东西职责不同。

二、什么叫 Ingress Replication?

这个概念非常重要。

假设:

Leaf A

│ BUM

需要发送给:
Leaf B
Leaf C
Leaf D

如果使用 Ingress Replication:

Leaf A 收到一次 Broadcast:

Broadcast


Leaf A

然后 Leaf A 自己复制:

Leaf A
/ |
/ |
▼ ▼ ▼
VXLAN VXLAN VXLAN
│ │ │
▼ ▼ ▼
Leaf B Leaf C Leaf D

也就是说:

复制动作发生在入口 Leaf。

这就是:

Ingress Replication

三、如果使用 Multicast Tree 呢?

那就不一样。

Leaf A 只需要把一个 VXLAN BUM 流量送入 Multicast Tree:

Leaf A

│ 1 copy

Spine
/
▼ ▼
Leaf B Leaf C

网络中的 Multicast forwarding 会负责复制。

所以:

Ingress Replication
Leaf A
├── Copy 1 → Leaf B
├── Copy 2 → Leaf C
└── Copy 3 → Leaf D
Multicast Tree
Leaf A


Multicast Tree
/ |
▼ ▼ ▼
B C D

复制发生的位置不同。

四、为什么 VXLAN 需要 Multicast?

因为 VXLAN 本身只是封装:

Original Frame


VXLAN Header


Outer IP / UDP

它自己并不解决:

“我要把这个 Broadcast 送给哪 20 台 Leaf?”

所以需要 BUM transport。

传统 VXLAN 网络非常常见的设计是:

VXLAN
+
Underlay IP Multicast
+
PIM

例如:

Leaf A

│ VXLAN BUM

IP Multicast


PIM Tree

├──── Leaf B
├──── Leaf C
└──── Leaf D
五、PIM 到底做什么?

PIM 是:

Protocol Independent Multicast

它不是 VXLAN。

它也不是 COOP。

它属于 Underlay Multicast Control Plane。

可以理解成:

PIM 帮助 Underlay 建立 Multicast forwarding tree。

例如:

Multicast Source


Spine
/
▼ ▼
Leaf B Leaf C

PIM 负责建立/维护这样的 multicast forwarding state。

六、这里特别容易产生一个错误

千万不要理解成:

COOP 告诉 PIM Host B 在 Leaf B。

不是。

COOP:

Host B

Leaf B

PIM:

Multicast Group

Multicast Tree

完全是两个维度。

七、把 ARP 例子完整走一遍

现在:

Host A
10.1.1.1

Leaf A

Host B:

10.1.1.2

Leaf B

Host A 没有 Host B 的 ARP:

10.1.1.2 → ???
Step 1:Host A 发 ARP Broadcast
Host A

│ FF:FF:FF:FF:FF:FF

Leaf A
Step 2:Leaf A 判断这是 BUM
Broadcast

BUM Processing
Step 3:ACI 对 BUM 做 VXLAN 封装
Original ARP

VXLAN

Outer IP
Step 4:BUM Transport

这里根据具体机制:

Option A:

Ingress Replication

或者:

Option B:

Multicast-based forwarding
Step 5:到达 Leaf B
Leaf B


VXLAN Decapsulation


ARP Request


Host B
Step 6:Host B 回复
ARP Reply

10.1.1.2

BB:BB:BB:BB:BB:BB

这个回复通常是:

Unicast

然后 Leaf B 学习 Endpoint。

八、然后就进入 Known Unicast

之后 Host A 再访问 Host B:

Host A


Leaf A

│ Destination = Host B

│ VXLAN Unicast

Leaf B


Host B

这时候:

不需要每次再做 BUM Flood。

这就是 ACI 为什么要维护 Endpoint information。

九、你现在应该把 ACI 数据流分成两种
Known Unicast
Endpoint 已知

Host A

Leaf A

│ VXLAN Unicast

Leaf B

Host B

主要依赖:

Endpoint Information / COOP

BUM
Endpoint 不需要知道具体一个目的地
或者本身就是多目的地

Broadcast
Unknown Unicast
Multicast


BUM Processing


VXLAN BUM Transport


相关 Leaf
十、最后给你一张“脑图”

这个你可以直接记住:

ACI


┌───────┴────────┐
│ │
Unicast BUM
│ │
│ ┌─────┼─────┐
│ │ │ │
│ B U M
│ │ │ │
│ └─────┼─────┘
│ │
▼ ▼
Endpoint Flooding /
Resolution Multicast
│ │
▼ ▼
COOP VXLAN BUM
│ │
▼ ▼
Destination Multiple
Leaf Leafs
│ │
└───────┬────────┘

VXLAN


Underlay


IS-IS
最关键的一句话:

COOP 解决的是“一个 Endpoint 在哪里”;BUM 机制解决的是“一份流量需要送给多个潜在接收者”;VXLAN 负责把 Overlay 流量封装起来;IS-IS/PIM 等 Underlay 机制负责提供底层传输能力。


Cisco ACI中的数据平面与控制平面

如果是标准 VXLAN EVPN Fabric:(注意不是ACI)

Underlay 使用 IS-IS(或者 OSPF/BGP)建立 IP Fabric,实现各个 VTEP/Loopback 地址之间的可达性;Overlay 使用 VXLAN 封装数据,而 BGP EVPN 负责分发 MAC/IP/VNI 等 Overlay Endpoint 信息,构成 Overlay Control Plane。

这个说法是非常准确的。

但是如果是 Cisco ACI:

Underlay 使用 IS-IS 建立 Fabric IP Reachability;Overlay 数据平面使用 VXLAN;ACI 内部的 Endpoint 信息控制主要依赖 COOP 和 ACI Fabric Control Plane,而不能简单地等同于传统标准 VXLAN EVPN 的 BGP EVPN Control Plane。


我们讨论的是经典的 Cisco ACI Fabric,那么:Overlay 的 Endpoint Control Plane 核心是 COOP,而不是传统 VXLAN EVPN 架构中的 BGP EVPN。

可以把 ACI 简化成:


                 Cisco ACI Fabric

┌─────────────────────────────────────┐
│              APIC                   │
│        Policy / Management          │
└─────────────────────────────────────┘

                OVERLAY
┌─────────────────────────────────────┐
│          VXLAN Data Plane           │
│                                     │
│     Endpoint Control Plane:         │
│               COOP                  │
└─────────────────────────────────────┘

                UNDERLAY
┌─────────────────────────────────────┐
│              IS-IS                  │
│                                     │
│        IP Fabric / ECMP             │
│        TEP Reachability             │
└─────────────────────────────────────┘

可以这样记

Underlay


IS-IS

负责:

Leaf / Spine Fabric 的路由可达性
TEP(Tunnel Endpoint)地址的可达性
ECMP 路径
Fabric Topology

也就是说:

IS-IS = 让整个 ACI Fabric 的网络设备能够互相进行 IP 通信。

Overlay

VXLAN + COOP

VXLAN:负责数据封装和转发
COOP:负责 Endpoint 信息的控制平面

例如某台服务器:

MAC: AA:AA:AA:AA:AA:AA
IP : 10.1.1.10

连接在:

Leaf 101

Leaf 101 会把这个 Endpoint 的位置注册到 Fabric 的 COOP Directory 中。其他 Leaf 如果需要找到这个 Endpoint,可以查询相应的信息。

所以可以理解为:

Server

Leaf 101

│ Endpoint Registration

Spine COOP Directory

│ Endpoint Location

Leaf 102
与传统 VXLAN EVPN 最大的区别
普通 VXLAN EVPN Fabric
Underlay

IS-IS / OSPF / BGP


IP Fabric


VXLAN Overlay

BGP EVPN

其中:

BGP EVPN 负责 MAC/IP Endpoint 的分发。

Cisco ACI
Underlay

IS-IS


IP Fabric


VXLAN Overlay

COOP

其中:

COOP 负责 Fabric 内 Endpoint Location 的 Directory/Mapping 功能。

但有一个概念上的细节

如果非常严谨地说,不要把 COOP 简单理解成“整个 Overlay 的唯一控制平面”。

ACI 实际上有多个控制机制协同工作:

IS-IS:Fabric Underlay 的路由和拓扑
COOP:Endpoint Directory / Endpoint Location
APIC:Policy 和配置的集中管理与下发
VXLAN:Overlay Data Plane

所以我个人认为最准确的说法是:

在 Cisco ACI 中,Underlay Routing Control Plane 主要使用 IS-IS;Overlay 的数据封装使用 VXLAN;Fabric 内部 Endpoint Location/Directory 的控制机制使用 COOP,而不是传统 VXLAN EVPN Fabric 所使用的 BGP EVPN。

这个说法会比较准确。

下一步可以继续深入一个非常关键的问题:COOP 到底是如何工作的?Endpoint 从 Leaf 学到之后,为什么要注册到 Spine?Spine 又如何回答其他 Leaf 的查询? 这个过程理解了以后,你对 ACI 的 Overlay Control Plane 基本就真正理解了。

先建立整体架构

假设我们有这样一个 ACI Fabric:

+-------------------+
| APIC |
| Policy / Config |
+---------+---------+
|
|
=================================
FABRIC

+---------+
| Spine 1 |
| COOP |
+---------+
/
/
+------+ +------+
| Leaf1 | | Leaf2 |
+---+---+ +---+---+
| |
Server A Server B

现在:

Server A
MAC: AA:AA:AA:AA:AA:AA
IP : 10.1.1.10

连接在 Leaf 1。

而 Server B:

MAC: BB:BB:BB:BB:BB:BB
IP : 10.1.1.20

连接在 Leaf 2。

假设 Server B 想访问 Server A。

  1. Endpoint Learning:Leaf 先学习 Endpoint

Server A 第一次发送数据包:

Server A

│ Frame

Leaf 1

Leaf 1 看到:

Source MAC = AA:AA:AA:AA:AA:AA
Source IP = 10.1.1.10

于是 Leaf 1 学习:

Endpoint AA:AA:AA:AA:AA:AA
Location = Leaf 1

Leaf 1 的 Endpoint Table 可以理解为:

MAC Location

AA:AA:AA:AA:AA:AA Local

这一步叫:

Endpoint Learning

  1. Leaf 把 Endpoint 注册到 COOP

接下来非常重要。

Leaf 1 不只是自己知道:

“这个 MAC 在我这里。”

它还会向 Fabric 注册:

AA:AA:AA:AA:AA:AA

│ Registration

COOP Directory

ACI 的 Spine 上运行 COOP Directory。

逻辑上变成:

COOP Database

Endpoint:
AA:AA:AA:AA:AA:AA

Location:
Leaf 1

所以:

Leaf 负责学习 Endpoint,Spine 负责维护 Endpoint Directory。

你可以把它理解成:

Leaf = 学习 Endpoint
Spine = Endpoint Directory
4. 为什么需要 COOP?

现在 Server B 想发送数据给 Server A。

Server B


Leaf 2

Leaf 2 收到:

Destination MAC:
AA:AA:AA:AA:AA:AA

但是 Leaf 2 不知道这个 MAC 在哪里。

传统二层网络可能会:

Unknown MAC


Flood

也就是说:

Leaf 2

├──── Flood ──── Leaf 1
├──── Flood ──── Leaf 3
├──── Flood ──── Leaf 4

但是 ACI 不希望大量依赖这种 Flooding。

所以 Leaf 2 会:

询问 COOP Directory:这个 Endpoint 在哪里?

Leaf 2

│ COOP Query

Spine

│ COOP Database Lookup

Endpoint Location = Leaf 1

然后 Spine 返回:

AA:AA:AA:AA:AA:AA


Located at Leaf 1
5. Leaf 2 得到答案之后怎么办?

Leaf 2 现在知道:

Destination MAC


Located at Leaf 1

于是 Leaf 2 将数据封装进 VXLAN:

+-----------------------------------+
| Outer IP Header |
| |
| Source = Leaf 2 TEP |
| Destination = Leaf 1 TEP |
+-----------------------------------+
| UDP |
+-----------------------------------+
| VXLAN |
| |
| VNI |
+-----------------------------------+
| Original Ethernet Frame |
| |
| Src MAC = Server B |
| Dst MAC = Server A |
+-----------------------------------+

然后:

Server B

Leaf 2

│ VXLAN Encapsulation


Spine

│ IP Underlay Forwarding


Leaf 1


Server A

注意:

Spine 在这个数据流中通常只负责 Underlay IP 转发。

Spine 不需要:

解封 VXLAN
学习所有 Endpoint 的 Data Plane 转发表
像传统二层交换机一样转发 MAC

它根据 Outer IP Header 转发:

Destination = Leaf 1 TEP

这也是 Spine 可以实现高性能转发的一个重要原因。

  1. 整个流程总结
    Phase 1:Endpoint Learning
    Server A


    Leaf 1

Learn:
MAC = AA
IP = 10.1.1.10
Phase 2:COOP Registration
Leaf 1

│ Register Endpoint

COOP Spine

AA → Leaf 1
Phase 3:COOP Query
Server B


Leaf 2

"Where is MAC AA?"


COOP
Phase 4:COOP Reply
COOP

"MAC AA is at Leaf 1"
Phase 5:VXLAN Forwarding
Leaf 2

│ VXLAN

Underlay IP Fabric


Leaf 1


Server A
7. 你现在可以这样理解 ACI

我建议你在脑子里建立这个模型:

┌─────────────────────────────────────┐
│ APIC │
│ │
│ Policy & Configuration │
└──────────────────┬──────────────────┘

┌─────────────────────────────────────┐
│ CONTROL │
│ │
│ Underlay: IS-IS │
│ Endpoint Directory: COOP │
└─────────────────────────────────────┘

┌─────────────────────────────────────┐
│ DATA │
│ │
│ VXLAN Encapsulation │
│ IP Fabric + ECMP │
└─────────────────────────────────────┘
一句话版本

IS-IS 负责“网络设备之间怎么到达”;COOP 负责“Endpoint 在哪里”;VXLAN 负责“数据怎么封装和传过去”;APIC 负责“策略是什么”。

这四句话基本就是理解 Cisco ACI 架构的核心。


我这里有一个问题,coop负责 endpoint在哪里,那它需要记录 endpoint在哪个Leaf的那个接口吗?就是具体在 Leaf的哪个接口上需要体现吗?

我理解你想问的是:COOP 是否需要精确记录 Endpoint 在哪个 Leaf,以及具体连接在哪个 Leaf 的哪个接口(port)?

答案是:要区分两层信息。

简短答案
COOP 主要记录的是:

这个 Endpoint 所在的 Leaf/VTEP(TEP)在哪里。

例如:

Endpoint:
MAC = AA:AA:AA:AA:AA:AA
IP = 10.1.1.10

Location:
Leaf 101
VTEP = 10.0.0.101

COOP Directory 的核心任务是让其他 Leaf 知道:

「我要发送给这个 Endpoint,应该把 VXLAN Tunnel 封装到哪个 Leaf/VTEP?」

那么具体在哪个接口呢?

例如:

Server A

│ Ethernet

Leaf 101
Ethernet1/10

Leaf 101 自己本地会知道:

MAC AA


Local Port = Ethernet1/10

因此逻辑上可以理解成:

COOP Directory:
MAC AA → Leaf 101 / TEP

Leaf 101 Local Table:
MAC AA → Ethernet1/10

也就是说:

远端 Leaf 只需要知道:
MAC AA → Leaf 101

然后建立 VXLAN:

Source VTEP Destination VTEP
Leaf 102 ─────► Leaf 101
到达 Leaf 101 后:

Leaf 101 才使用自己的本地 Endpoint 信息:

MAC AA → Ethernet1/10

最终发送给 Server A。

整个逻辑可以画成这样
Server B


Leaf 102

│ COOP 查询
│ "MAC AA 在哪里?"

COOP Directory

│ Reply:
│ "在 Leaf 101"

Leaf 102

│ VXLAN Tunnel
│ Destination = Leaf 101 TEP

Leaf 101

│ Local Endpoint Lookup
│ MAC AA → Ethernet1/10

Ethernet1/10


Server A
所以一个非常重要的理解是

你可以把 Endpoint Location 分成两层:

第一层:Fabric-Level Location
Endpoint → 哪个 Leaf?

这个是 COOP 特别关心的。

例如:

MAC AA → Leaf 101 / TEP
第二层:Local Leaf-Level Location
Endpoint → Leaf 上哪个 Port?

例如:

MAC AA → Ethernet1/10

这是 Leaf 自己本地 Endpoint Table / Forwarding Table 所关心的。

所以你可以记住这句话:

COOP 解决“Endpoint 在哪台 Leaf”;目标 Leaf 自己解决“Endpoint 在哪个具体接口”。

这个理解非常接近 Cisco ACI Endpoint Learning 和 Forwarding 的核心逻辑


这时如果一个endpoint从leaf1的一个E1/10挪到了E1/20口,这时候会发生什么?

这种同一台Leaf上的端口变更,一般只更新本地的 endpoint table,不需要更新 COOP,因为在 Fabric 看来,这个 MAC 仍然在 Leaf1上。只有当这个 endpoint 跨 Leaf 移动,比如从 Leaf1 移到 Leaf2,才需要更新 COOP 目录,把映射改成指向 Leaf2。因为 COOP关心的是“在哪台 Leaf”,而不是“Leaf 上的哪个物理端口”。Leaf 内部再用本地表决定从哪个端口发出去。这个分层让 Fabric既高效又不会被物理端口的细节撑爆。这样解释清楚吗?


刚才说到那个coop会存储这些信息,endpoint的上线之后会告诉coop directory,也就是SPINE会有这些信息。假设现在有个EP: 10.1.1.1从leaf A上来,它告诉了coop(SPINE),那spine主动告诉那个leaf B吗 ?

是个非常关键的问题,也是 COOP 和 EVPN 最大的区别之一。答案是 COOP 不会主动通知所有的 Leaf,而是更像一个被动的目录查询服务。比如 Server A 在 Leaf A 上,Leaf A 把这个 endpoint 注册到 COOP 目录里,这时不会推送给其他 Leaf。只有当 Leaf B 真正要找1.1.1.1 的时候,才向 COOP 发起查询,然后 COOP 回答说:“这个 endpoint 在 Leaf A。”这种按需查询的方式可以让控制平面消息量保持可控。也正因为如此,ACI 的 COOP 更像是一个目录服务,而不是传统意义上会广播变化的路由协议。你问得很到位,这正是很多人一开始容易混淆的地方。


COOP 为什么部署在 Spine,而不是 Leaf?以及多台 Spine 如何共同组成分布式 COOP Directory?

这个问题非常关键。我们把它分成两部分讲。

  1. 为什么 COOP 放在 Spine,而不是 Leaf?

核心原因是:Spine 在 ACI Fabric 里天然适合做“集中目录服务”,而 Leaf 负责接入和 Endpoint Learning。

可以这样分工:

Leaf:

  • 连接 Server / VM / Endpoint
  • 学习 Endpoint
  • 维护本地 Endpoint 信息
  • VXLAN 封装/解封

Spine:

  • 维护 COOP Directory
  • 回答 Endpoint Location 查询
  • Underlay IP 转发

假设有 200 台 Leaf。

如果每个 Leaf 都要维护全 Fabric 的所有 Endpoint:

Leaf 1 ← 所有 Endpoint
Leaf 2 ← 所有 Endpoint
Leaf 3 ← 所有 Endpoint
...
Leaf 200 ← 所有 Endpoint

那每一台 Leaf 都需要保存大量 Endpoint 信息,而且每次 Endpoint 上线、下线、迁移,都可能需要大规模同步。

ACI 不采用这种方式。

而是:

COOP Directory
Spine Layer
┌───────┬───────┐
│ │ │
Spine1 Spine2 Spine3
│ │ │
───────┴───────┴───────┴──────
Leaf1 Leaf2 Leaf3

Leaf 只需要知道:

我本地的 Endpoint 在哪里。

如果要找远端 Endpoint,就去查 COOP。

  1. 为什么 Spine 特别适合做 Directory?

ACI 的 Spine 是 Fabric 的中心层。

从任何 Leaf 到任何 Spine,都只有一跳:

Leaf A

├──── Spine 1
├──── Spine 2
└──── Spine 3

因此:

Leaf 很容易访问 COOP
查询路径非常短
可以使用多台 Spine 提供冗余
不需要 Leaf-to-Leaf 控制平面全互联

所以逻辑上:

Leaf 是“数据来源”,Spine 是“目录中心”。

  1. 多台 Spine 怎么组成分布式 COOP Directory?

这里就进入 COOP 最有意思的地方:不是每一台 Spine 都保存所有 Endpoint。

假设有三台 Spine:

COOP Directory

Spine 1 Spine 2 Spine 3
? ? ?

ACI 会通过一种分布式的机制,把 Endpoint 信息分布到不同的 Spine 上。

可以概念化理解成:

Endpoint MAC/IP


Hash Calculation

├────► Spine 1
├────► Spine 2
└────► Spine 3

例如:

MAC AA → Hash → Spine 1
MAC BB → Hash → Spine 2
MAC CC → Hash → Spine 3

所以不同 Endpoint 会分布到不同 Spine 上。

  1. Leaf A 注册 Endpoint 时发生什么?

假设:

Endpoint A
IP = 1.1.1.1
MAC = AA:AA:AA:AA:AA:AA

Located at:
Leaf A

Endpoint A 接入 Leaf A 后:

Endpoint A


Leaf A

Leaf A 学到 Endpoint,然后计算:

Hash(Endpoint A)


Which COOP Spine owns this Endpoint?


Spine 2

然后注册:

Leaf A

│ COOP Registration

Spine 2


Endpoint A → Leaf A

当然,实际机制还会涉及冗余副本,不只是简单的“一条信息只放在一台 Spine”。

  1. Leaf B 查询时怎么办?

假设 Leaf B 要找:

1.1.1.1

它同样可以根据 Endpoint 信息计算:

Hash(1.1.1.1 / MAC)


COOP Spine 2

然后:

Leaf B

│ COOP Query:
│ Where is 1.1.1.1?

Spine 2

│ Lookup

1.1.1.1 → Leaf A

Spine 2 回复:

"Endpoint 1.1.1.1
is located behind Leaf A"

然后 Leaf B 才进行 VXLAN 封装:

Outer Source IP = Leaf B TEP
Outer Dest IP = Leaf A TEP

最终:

Leaf B

│ VXLAN

IP Underlay


Leaf A


Endpoint A
6. 一个很重要的概念:COOP 是 Directory,不是传统路由表

你可以把它和 DNS 类比——只是帮助理解,不代表协议完全相同。

DNS:
www.example.com

IP Address

COOP:
Endpoint MAC/IP

Leaf / VTEP Location

所以 COOP 的主要工作不是:

“我把所有 Endpoint 信息广播给所有 Leaf。”

而是:

“Endpoint 信息注册到 Directory,需要的时候进行查询。”

最终你可以记住这个完整流程
Endpoint 上线


Leaf 学习 Endpoint


COOP Registration


Distributed Spine COOP Directory

│ (按 Hash 分布)

──────────────────────────────

│ 其他 Leaf 需要通信

COOP Query


找到对应 Endpoint Directory


Reply:
Endpoint → Destination Leaf / TEP


VXLAN Tunnel

一句话总结:

Leaf 负责发现 Endpoint,COOP Spine 负责保存和查询 Endpoint 的 Fabric 级位置,而多台 Spine 通过分布式 Hash/Directory 机制共同承担整个 Endpoint Database。

顺便纠正一下我前面一个说法:我之前用“COOP 不会主动通知所有 Leaf”来帮助你和 EVPN 对比,这个方向是对的,但更严谨地说,ACI 还有缓存、注册/更新和 Endpoint Mobility 等机制,不能简单理解成“永远只有查询、绝对没有任何更新通知”。核心模型仍然是 directory-based,而不是把所有 Endpoint 路由信息全量分发给每个 Leaf。


按以上说法,如果Leaf A把 host A信息通过hash算法计算后选择告诉了spine 1 , 那Leaf B下的host B要访问 host A时,要找spine 1查询 ,假设以有4台spine, 那leaf B咋知道找哪台spine问?它咋会知道找spine 1查询?

你这个问题问到了 COOP 最核心的机制。你的逻辑是完全正确的:

如果 Leaf A 把 Host A 注册到了某个特定的 Spine,例如 Spine 1,那么 Leaf B 怎么知道应该去问 Spine 1,而不是随机问四台 Spine?

关键就在于:Leaf B 并不是靠“记住 Host A 在 Spine 1”来查询的,而是所有 Leaf 使用相同的 COOP 哈希算法。

举个完整例子

假设 Fabric 有 4 台 Spine:

┌─────────┐
│ Spine 1 │
└─────────┘

COOP Entry

┌────┴────┐
│ Host A │
│1.1.1.1 │
└─────────┘

Spine 1 Spine 2 Spine 3 Spine 4

Host A:

IP = 1.1.1.1
MAC = AA:AA:AA:AA:AA:AA
第一步:Leaf A 学习 Host A
Host A


Leaf A

Leaf A 学到:

MAC = AA:AA:AA:AA:AA:AA
IP = 1.1.1.1

然后 Leaf A 使用 Fabric 统一的 COOP Hash 算法:

Hash(MAC AA)


Hash Result = 1


COOP Spine 1

所以:

Leaf A

│ COOP Registration

Spine 1

Spine 1 记录:

Host A → Leaf A / VTEP A
第二步:Host B 要访问 Host A

Host B:

Host B


Leaf B

Leaf B 收到一个去往 Host A 的数据包:

Destination IP = 1.1.1.1
Destination MAC = AA:AA:AA:AA:AA:AA

Leaf B 本地没有这个 Endpoint。

所以它需要查询 COOP。

Leaf B 怎么知道问哪台 Spine?

Leaf B 也运行完全相同的 Hash 算法。

Leaf B 知道:

Fabric COOP Group
+
Available Spine COOP Members
+
Endpoint Key

然后它计算:

Hash(Host A)


Hash Result = 1


Spine 1

因此:

Leaf B

│ COOP Query

Spine 1

这就是答案。

一个简单的类比

假设公司有 4 个档案柜:

Cabinet 1
Cabinet 2
Cabinet 3
Cabinet 4

所有员工都知道同一个规则:

员工编号 % 4

那么:

Employee ID = 101

101 % 4 = 1

于是:

员工 101 的资料永远应该放在 Cabinet 1。

任何人想找 101,都可以自己算:

101 % 4 = 1

然后直接去 Cabinet 1。

不需要事先问:“101 在哪个柜子?”

COOP 的思路类似这个概念。

那如果 Spine 1 挂了怎么办?

这个问题又非常重要。

COOP 不能这样设计:

Host A


Only Spine 1

因为:

Spine 1 Down


Host A Information Lost

所以实际的 COOP Directory 会考虑冗余和多个 Directory 节点。

概念上可以理解:

Hash(Host A)


Primary Directory
Spine 1

└── Backup / Replica
Spine 3

因此:

Leaf B

├── Primary → Spine 1

└── Failure → Alternate/Replica
但这里我想纠正我上一条回答的一个地方

我上一条回答用了这个非常简化的模型:

Leaf 根据 Hash(Endpoint),直接算出“这个 Endpoint 属于 Spine 2”。

这个模型用来帮助理解 Distributed Directory 是可以的,但对于真实 Cisco ACI 的 COOP 实现来说,这个说法过于简化了。

实际 COOP 涉及:

COOP Group
Directory 的 分区/分布机制
一致性哈希思想
Directory 节点成员变化
Replica / redundancy
Anycast 等机制

所以你现在提出的:

Leaf B 怎么知道找 Spine 1?

恰恰是 COOP 设计里最关键的问题之一。

概念上,答案是:

Leaf A 和 Leaf B 都拥有关于 COOP Directory 集群成员和映射规则的共同认知,因此可以根据相同的规则定位负责某个 Endpoint 的 Directory 节点,而不是靠 Leaf A 单独告诉 Leaf B。

用一句话回答你的问题

Leaf A 和 Leaf B 不需要互相告诉对方“Host A 在 Spine 1”。它们依据 Fabric 共享的 COOP Directory 成员信息和一致的映射/哈希规则,对同一个 Endpoint 得出相同的 Directory 位置,因此 Leaf B 可以知道该向哪个 COOP Directory 节点查询。


我们下一步可以继续画一个4 台 Spine + 2 台 Leaf 的完整时序图,从:

Host A 上线 → Leaf A 学习 → COOP Registration → Host B 发包 → Leaf B 查询 → COOP Reply → VXLAN 转发

完整走一遍。这个过程画出来之后,COOP 的整个工作机制会非常直观。

场景:4 台 Spine,2 台 Leaf
SPINE LAYER
┌──────────┬──────────┬──────────┬──────────┐
│ Spine 1 │ Spine 2 │ Spine 3 │ Spine 4 │
│ COOP │ COOP │ COOP │ COOP │
└────▲─────┴──────────┴──────────┴──────────┘

Host A Directory Entry

┌────────────┴─────────────────────────────┐
│ │
Leaf A Leaf B
│ │
Host A Host B
1.1.1.1 1.1.1.2
Phase 1:Host A 上线

Host A 连接到 Leaf A:

Host A
IP = 1.1.1.1
MAC = AA:AA:AA:AA:AA:AA

Host A 发出数据:

Host A


Leaf A

Leaf A 学习到:

Endpoint:
IP = 1.1.1.1
MAC = AA:AA:AA:AA:AA:AA

Location:
Leaf A

Leaf A 的本地信息可以理解为:

Endpoint A

├── MAC = AA
├── IP = 1.1.1.1
└── Local Interface = Eth1/10
Phase 2:Leaf A 向 COOP 注册

现在 Leaf A 不只是自己保存。

它需要告诉 Fabric:

“1.1.1.1 / MAC AA 在我这里。”

概念上:

Leaf A

│ COOP Registration

COOP Directory

我们用一个简化的 Hash 模型:

Endpoint Key


Hash / Directory Mapping


Spine 1

于是:

Leaf A

│ Register:
│ 1.1.1.1 → Leaf A

Spine 1

Spine 1 的 Directory 中有:

1.1.1.1


Leaf A

更准确一点:

Endpoint A


Destination VTEP = Leaf A TEP
Phase 3:Host B 要访问 Host A

现在 Host B:

Host B
IP = 1.1.1.2

发送数据:

Destination = 1.1.1.1

数据进入:

Host B


Leaf B

Leaf B 查自己的本地 Endpoint Table:

Do I know 1.1.1.1?

No.

于是 Leaf B 需要进行 Endpoint Resolution。

Phase 4:Leaf B 怎么知道找哪台 Spine?

这里就是你刚才问的核心。

Leaf B 根据:

Endpoint = 1.1.1.1

以及 Fabric 的:

COOP Directory Mapping Rules
+
COOP Group Information

进行 Directory 定位。

概念上:

1.1.1.1


Hash / Mapping


Spine 1

所以 Leaf B 不需要问:

“Host A 到底在哪个 Spine?”

它可以根据相同的规则直接定位:

Leaf B

│ COOP Query
│ "Where is 1.1.1.1?"

Spine 1
Phase 5:Spine 1 查询 Directory

Spine 1 收到:

Where is 1.1.1.1?

然后查:

COOP Directory

1.1.1.1


Leaf A TEP

于是回复 Leaf B:

1.1.1.1 is reachable through:

Leaf A
TEP = x.x.x.x

逻辑上:

Leaf B

│ Query

Spine 1

│ Reply:
│ Endpoint → Leaf A

Leaf B
Phase 6:Leaf B 建立 VXLAN 转发信息

现在 Leaf B 知道:

Destination Endpoint:
1.1.1.1

Remote Location:
Leaf A

Destination VTEP:
Leaf A TEP

于是 Leaf B 封装:

┌───────────────────────────────┐
│ Outer IP Header │
│ │
│ Src = Leaf B TEP │
│ Dst = Leaf A TEP │
├───────────────────────────────┤
│ UDP │
├───────────────────────────────┤
│ VXLAN │
│ VNI │
├───────────────────────────────┤
│ Original Packet │
│ │
│ Host B → Host A │
└───────────────────────────────┘
Phase 7:Underlay 转发

VXLAN 包进入 Underlay:

Leaf B

│ Outer Destination:
│ Leaf A TEP

Spine

│ IS-IS Routing / ECMP

Leaf A

这里非常重要:

Spine 负责 Underlay IP 转发,但它不需要在 Data Plane 中查“Host A 在哪里”。

它只看:

Outer IP Destination


Leaf A TEP
Phase 8:Leaf A 最后转发到具体端口

VXLAN 包到达 Leaf A:

Leaf A

Leaf A 解封装:

VXLAN Decapsulation


Destination MAC = AA

Leaf A 的本地 Endpoint Table:

MAC AA


Eth1/10

于是:

Leaf A


Eth1/10


Host A
整个过程串起来
① Host A 上线

Host A


Leaf A learns:
Host A → Eth1/10

② COOP Registration

Leaf A


COOP Directory
Host A → Leaf A TEP

③ Host B 发包

Host B


Leaf B

"I don't know Host A"

④ COOP Query

Leaf B

│ Where is Host A?

COOP Directory

⑤ COOP Reply

COOP

│ Host A → Leaf A TEP

Leaf B

⑥ VXLAN

Leaf B

│ VXLAN

IP Underlay


Leaf A

⑦ Local Forwarding

Leaf A


Eth1/10


Host A
最重要的三层记忆
Endpoint → 哪个 Leaf?

COOP

Leaf → 怎么找到具体 Endpoint?

Local Endpoint Table

Leaf A → Leaf B 怎么传数据?

VXLAN + IS-IS Underlay

所以整个 ACI 的逻辑可以浓缩成一句:

COOP 负责找到 Endpoint 所在的 Fabric 位置,VXLAN 负责把流量送到目标 Leaf,目标 Leaf 再根据本地 Endpoint 表把流量送到具体物理接口。


上面的处理过程中没有涉及到广播的处理,
主机A要访问主机B时,一开始是没有arp表象的, 所以主机A必定会发arp request ,那这种arp 广播又会如何处理?

我们刚才的流程直接从“Leaf B 要找 Host A”开始,其实跳过了 ARP/广播这一层。真实网络里通常首先发生的是 Endpoint Resolution。

我们把场景改得更真实一点。

场景
Host A
IP = 1.1.1.1
MAC = AA:AA:AA:AA:AA:AA

Leaf A

Host B
IP = 1.1.1.2
MAC = BB:BB:BB:BB:BB:BB

Leaf B

假设 Host A 要访问:

1.1.1.2

但是 Host A 的 ARP Table 里面没有 Host B:

Host A ARP Table

1.1.1.2 → ???

那么第一步一定是 ARP。

Phase 1:Host A 发送 ARP Request

Host A 会发送:

ARP Request

Who has 1.1.1.2?
Tell 1.1.1.1

它的 Ethernet Header 是:

Source MAC = AA:AA:AA:AA:AA:AA
Destination MAC = FF:FF:FF:FF:FF:FF

也就是说:

ARP Request 是二层广播。

Host A

│ ARP Broadcast

Leaf A
Phase 2:Leaf A 学习 Host A

Leaf A 收到 Host A 的 ARP Request 时,首先会看到:

Source MAC = AA
Source IP = 1.1.1.1

因此 Leaf A 可以学习:

Endpoint A

IP = 1.1.1.1
MAC = AA
Port = Eth1/10

然后:

Leaf A

│ Endpoint Registration

COOP Directory

因此 COOP 知道:

1.1.1.1 / AA


Leaf A
Phase 3:ARP Broadcast 怎么到达其他 Leaf?

这是你问题里最关键的部分。

ARP Request 是 Broadcast:

Destination MAC = FF:FF:FF:FF:FF:FF

但是在 VXLAN Overlay 里,不能简单理解成:

Leaf A 对所有其他 Leaf 做普通广播。

ACI 会根据 Bridge Domain (BD) 的 Flooding / Endpoint Resolution 机制处理这种 BUM 流量。

概念上:

Host A

│ ARP Request

Leaf A

│ VXLAN Encapsulation

├────────► Leaf B

├────────► Leaf C

└────────► 其他属于同一 BD 的 Leaf

这就是:

BUM Traffic

Broadcast
Unknown Unicast
Multicast

但是这里出现一个很有意思的问题

假设 Leaf A 不知道:

Host B 到底在哪台 Leaf?

那么传统二层网络通常:

Broadcast → Flood Everywhere

而 ACI 的设计目标之一就是:

尽可能减少不必要的 Flooding。

因此 ACI 可以结合 Endpoint Directory、ARP 处理机制等进行优化。

Phase 4:Host B 收到 ARP Request

假设 ARP Broadcast 最终到达 Leaf B:

Leaf A

│ VXLAN BUM Traffic

Leaf B


Host B

Host B 发现:

Who has 1.1.1.2?

这正好是自己的 IP。

于是 Host B 回复:

ARP Reply

1.1.1.2 is BB:BB:BB:BB:BB:BB

ARP Reply 通常是:

Unicast

Host B:

Source MAC = BB
Source IP = 1.1.1.2

Leaf B 因此学习:

Endpoint B

IP = 1.1.1.2
MAC = BB
Port = Eth1/20

然后注册:

Leaf B

│ COOP Registration

COOP Directory

1.1.1.2 → Leaf B
Phase 5:ARP Reply 返回 Host A

现在 Leaf B 要把 ARP Reply 发给 Host A。

它知道:

Destination MAC = AA

如果 Leaf B 本地没有 Endpoint A 的具体位置,它可以进行 Endpoint Resolution:

Leaf B

│ Where is MAC AA?

COOP Directory

│ Reply:
│ AA → Leaf A

Leaf B

然后:

Leaf B

│ VXLAN Unicast
│ Destination VTEP = Leaf A

Leaf A


Host A
Phase 6:Host A 获得 ARP 信息

Host A 收到:

ARP Reply:

1.1.1.2
MAC = BB

于是 Host A 的 ARP Table:

1.1.1.2 → BB:BB:BB:BB:BB:BB

现在 Host A 就可以真正发送业务数据:

Host A

│ Destination MAC = BB

Leaf A

Leaf A 查询本地 Endpoint 信息或者通过 COOP 获得:

MAC BB → Leaf B

然后:

Leaf A

│ VXLAN Unicast

Leaf B


Host B
所以完整过程其实是
① Host A 没有 ARP

Host A


ARP Request
"Who has 1.1.1.2?"

② Leaf A 学习 Host A

Host A → Leaf A

③ ARP/Broadcast 处理

Leaf A

├── VXLAN BUM
└──→ Leaf B

④ Host B 收到 ARP

Host B


ARP Reply

⑤ Leaf B 学习 Host B

Host B → Leaf B

⑥ 必要时查询 COOP

MAC AA → Leaf A

⑦ ARP Reply 回到 Host A

⑧ Host A 获得 MAC BB

⑨ 正常业务流量

Host A

│ VXLAN Unicast

Leaf B


Host B
一个特别重要的点

ACI 里面我们后面还要讨论 ARP Gleaning / ARP Flooding / ARP Proxy(或者更准确地说 Endpoint Resolution 的优化机制)。

因为实际 ACI 并不总是简单地:

ARP Request → Flood 到所有 Leaf

不同的 Bridge Domain 设置 会影响:

ARP Flooding
Unknown Unicast Flooding
GARP
Endpoint Learning
COOP Resolution

所以你现在提出“先考虑 ARP 广播”,实际上正好是理解 ACI Forwarding 的下一层关键问题。


ACI中关于bum流量的处理详细说下

可以。ACI 里的 BUM(Broadcast、Unknown Unicast、Multicast) 是理解 VXLAN Overlay 非常关键的一块,而且它和我们刚才讲的 COOP 是连在一起的。

先给你一个总框架:

ACI Fabric

┌─────────────┐
│ Spine │
│ IS-IS │
└──────┬──────┘

VXLAN │ VXLAN

┌──────────┴──────────┐
│ │
Leaf A Leaf B
│ │
Host A Host B

ACI 的核心思想是:

Unicast 尽量走 Endpoint-to-Endpoint 的 VXLAN,而 BUM 流量则通过专门的 VXLAN BUM/Flooding 机制在属于同一个 BD 的 Leaf 之间传播。

  1. 什么叫 BUM?

BUM 是三个东西:

B = Broadcast
U = Unknown Unicast
M = Multicast

例如:

Broadcast

ARP Request:

Who has 10.1.1.2?

Dst MAC:
FF:FF:FF:FF:FF:FF
Unknown Unicast

Leaf 收到:

Dst MAC = AA:AA:AA:AA:AA:AA

但是 Leaf 不知道这个 MAC 在哪里。

于是:

Unknown Unicast

Flood
Multicast

例如:

Host A

│ 224.1.1.1

Multicast

这种也属于 BUM。

  1. 为什么 VXLAN Fabric 需要专门处理 BUM?

因为 ACI 是一个 Overlay。

假设:

Host A

Leaf A

Host A 发一个 Broadcast:

FF:FF:FF:FF:FF:FF

但是 Host B 在:

Leaf B

Host C 在:

Leaf C

那么这个 Broadcast 必须跨越:

Leaf A

Spine

Leaf B / Leaf C

所以需要一种机制把:

一个 Leaf 上的 BUM 流量复制到其他相关 Leaf。

  1. ACI 的关键:BD 决定 BUM Flooding Domain

这里非常重要。

ACI 不是整个 Fabric 都 Flood。

而是根据 Bridge Domain(BD) 来确定 Flooding Domain。

比如:

BD-Web

├── Leaf A
├── Leaf B
└── Leaf C

那么 BD-Web 里的 BUM 流量,只需要传播到:

承载这个 BD 的相关 Leaf。

不会因为 Host A 发了一个 ARP,就让整个 Fabric 所有 Leaf 都收到。

  1. BD 和 VLAN 不完全是一回事

传统网络你可能习惯:

VLAN 10

Broadcast Domain

ACI 里更重要的是:

Bridge Domain

Subnet

Flooding / Forwarding Domain

例如:

Tenant
└── VRF
└── BD-10
└── Subnet 10.1.1.0/24

BD 定义了一个二层转发域。

  1. Broadcast 到底怎么走?

我们用你刚才的 ARP 场景。

Host A
10.1.1.1


Leaf A

Host A:

ARP Request

Who has 10.1.1.2?

Destination MAC:

FF:FF:FF:FF:FF:FF

Leaf A 判断:

这是 Broadcast。

于是需要把它发送到这个 BD 的其他相关 Leaf。

  1. Leaf A 怎么把 Broadcast 送到其他 Leaf?

这里就是 VXLAN 的作用。

ACI 会把 BUM 流量进行 VXLAN 封装。

概念上:

Original Ethernet Frame


VXLAN Encapsulation


ACI Fabric

变成:

Outer IP
Source = Leaf A TEP
Destination = BUM / Multicast mechanism


UDP 4789


VXLAN


Original ARP Frame
7. 这里要注意:ACI 的 BUM 不是简单地“Spine 广播”

这是很多人容易误解的地方。

Spine 本身不是传统二层交换机。

它的主要工作仍然是:

IP Underlay Forwarding

Leaf A 把 BUM 封装以后,Spine 根据 Underlay 进行转发。

也就是说:

Leaf A

│ VXLAN BUM

Spine

│ IP Forwarding

Leaf B
Leaf C

Spine 不需要学习:

Host A → Eth1/10
Host B → Eth1/20

这种 Endpoint 细节。

  1. ACI 怎么知道哪些 Leaf 属于这个 BD?

这和 COOP 以及 ACI Fabric 的配置/控制信息有关。

APIC 配置:

Tenant

VRF

BD

EPG

Leaf

Fabric 知道:

BD-10
├── Leaf A
├── Leaf B
└── Leaf C

所以当 Leaf A 有 BD-10 的 Broadcast:

BD-10 Broadcast

├── Leaf B
└── Leaf C
9. Unknown Unicast 怎么处理?

这个比 Broadcast 更有意思。

假设:

Host A

Leaf A

发送:

Dst MAC = BB:BB:BB:BB:BB:BB

但 Leaf A 不知道 BB 在哪里。

那么就出现:

Unknown Unicast

ACI 根据 BD 的相关配置决定怎么处理。

其中一个非常重要的配置就是:

Unknown Unicast Flooding

如果开启:

Unknown Unicast

Flood

BD 内相关 Leaf

如果没有开启,则可以采取更受控的处理方式,而不是像传统二层交换网络一样无条件 Flood。

所以 ACI 可以通过 BD 的策略控制 BUM 行为。

  1. Multicast 怎么处理?

Multicast 更复杂。

例如:

Host A

│ 224.1.1.1

Leaf A

假设:

Host B → Leaf B
Host C → Leaf C

都加入了:

224.1.1.1

那么 ACI 不应该简单地:

Leaf A
├── Leaf B
├── Leaf C
├── Leaf D
├── Leaf E
└── Leaf F

因为只有 B/C 真正需要这个 Multicast。

所以 Multicast 会涉及:

IGMP
Multicast group
BD
VXLAN
Fabric multicast tree
11. ACI 中一个很重要的概念:Multicast Tree

可以把它理解成:

Spine
/ |
/ |
Leaf A Leaf B Leaf C
│ │
Host B Host C

如果 B/C 加入 Multicast Group:

224.1.1.1

那么 Fabric 可以构造相应的树:

Source
Leaf A


Spine
/
▼ ▼
Leaf B Leaf C
│ │
Host B Host C

这样 Multicast 流量不会无意义地到处复制。

  1. ARP 是 BUM 里面最重要的一个实际例子

回到我们刚才的问题。

Host A:

10.1.1.1

要找:

10.1.1.2

没有 ARP:

ARP Table

10.1.1.2 → ???

于是:

Host A

│ Broadcast ARP

Leaf A

接下来 ACI 根据 BD 的配置和 Endpoint Resolution 机制处理这个 ARP。

可能涉及:

ARP Flooding
+
Endpoint Learning
+
COOP
+
ARP Gleaning / Proxy 等优化机制

所以不能简单地说“ACI 的 ARP 一定 Flood”。

这点非常重要。

  1. 为什么 ACI 要做这些优化?

因为如果完全按照传统二层网络:

Host A ARP


所有 Leaf


所有 Host

规模一大,问题非常严重。

假设:

500 Leaf
100,000 Endpoints

大量 ARP:

ARP

Flood

500 Leaf

100,000 Hosts

会造成非常严重的 BUM 压力。

ACI 的设计目标就是:

尽量把 Endpoint 信息变成已知状态,然后让后续流量尽量走 Unicast VXLAN。

  1. 这就把 COOP 和 BUM 联系起来了

你现在可以把它们放在一起看:

Endpoint Learning


COOP


Endpoint Location


Unicast VXLAN

而另外一条路径:

BUM Traffic


BD Flooding Domain


VXLAN BUM Forwarding

┌──────┼──────┐
▼ ▼ ▼
Leaf B Leaf C Leaf D

所以:

COOP 主要解决“已知 Endpoint 在哪里”。

BUM 机制解决“本来就需要复制给多个接收者的流量怎么跨 Fabric 传播”。

  1. 最后给你一个非常重要的判断方法

以后看到一个 ACI 数据包,你可以先问:

这是 Unicast 还是 BUM?

如果是:

Known Unicast

通常:

COOP / Endpoint Information

Destination Leaf

VXLAN Unicast

而如果是:

Broadcast
Unknown Unicast
Multicast

就进入:

BUM Processing

BD / Flooding Domain

VXLAN BUM

相关 Leaf
一句话把整个 ACI Forwarding 串起来:

Endpoint Learning + COOP 让 ACI 尽量把通信变成 Known Unicast;对于 ARP、Broadcast、Unknown Unicast 和 Multicast 这些无法直接按单一 Endpoint 转发的流量,则由 BD 所定义的 BUM/Flooding 机制通过 VXLAN 在 Fabric 中传播。


还有一个值得我们下一步专门掰开的点:ACI 到底有没有“VXLAN Multicast Group”,Spine 到底是不是在做真正的 IP Multicast,以及 PIM 在这里到底扮演什么角色。 这部分一旦搞清楚,你就会真正明白 ACI 的 BUM 是怎么穿过 Spine 的。

ACI 的 BUM 并不是简单地“Leaf 把广播丢给 Spine,然后 Spine 再广播给所有 Leaf”。
它背后实际上有 VXLAN、Multicast Tree、Underlay Multicast,以及 PIM 等机制参与。

  1. 先看最重要的一张图

假设:

Spine 1 Spine 2
/ \ /
/ \ /
Leaf A Leaf B Leaf C Leaf D
│ │ │
Host A Host B Host C

Host A 发一个 ARP Broadcast:

Host A

│ Broadcast

Leaf A

ACI 要解决的问题是:

这个 Broadcast 应该送到哪些 Leaf?

比如 Host B、C 属于同一个 BD,而 Host D 不属于:

BD-Web

Leaf A ─ Host A
Leaf B ─ Host B
Leaf C ─ Host C

Leaf D ─ 不属于 BD-Web

那么:

Host A


Leaf A

│ BUM

Fabric
├────► Leaf B
└────► Leaf C

✕ Leaf D

这就是 Flooding Domain 的概念。

  1. 那 Spine 是怎么把这个 BUM 流量送出去的?

这里需要引入:

Underlay Multicast

ACI Fabric 的 Underlay 不只是单纯的 Unicast IP Routing。

对于需要 Multicast/BUM 的场景,Fabric 可以建立相应的 Multicast Distribution Tree。

概念上:

Spine

┌─────┴─────┐
│ │
Leaf B Leaf C

Leaf A 发出的 BUM 流量进入这个 Tree。

所以你可以理解:

Spine 是 Fabric 的核心转发节点,Multicast Tree 让 BUM 流量能够高效地复制到需要它的 Leaf。

  1. PIM 在这里干什么?

这就是你刚才问的重点。

PIM(Protocol Independent Multicast) 是 Underlay Multicast 的控制协议之一。

它的作用不是:

“告诉我 Host A 在哪个 Leaf。”

那是 COOP/Endpoint Learning 负责的。

PIM 解决的是:

“这个 Multicast 流量的树应该怎么建立?”

所以要把两个问题严格分开:

COOP

└── Endpoint 在哪里?

PIM / Multicast

└── Multicast/BUM 流量怎么沿着 Tree 传播?

这是两个完全不同的问题。

  1. 一个非常直观的类比

假设:

COOP 是“通讯录”
张三 → 101办公室
李四 → 205办公室

你问:

张三在哪里?

通讯录告诉你:

101办公室。

Multicast Tree 是“道路系统”

如果你要把一份文件同时送给:

办公室 101
办公室 205
办公室 308

你需要的是:

怎么走一条路,把东西送到这些地方。

所以:

COOP
= Endpoint Location Directory

Multicast Tree
= BUM Traffic Distribution Path
5. VXLAN 在这里又是什么?

VXLAN 是数据平面封装。

Host A 发出的原始 ARP:

┌──────────────────────┐
│ Ethernet │
│ Destination = FF:FF │
│ ARP Request │
└──────────────────────┘

Leaf A 把它封装成 VXLAN:

┌───────────────────────────┐
│ Outer IP │
│ │
│ Source = Leaf A TEP │
│ Destination = Multicast │
├───────────────────────────┤
│ UDP 4789 │
├───────────────────────────┤
│ VXLAN │
│ VNI │
├───────────────────────────┤
│ Original Ethernet │
│ ARP Broadcast │
└───────────────────────────┘

所以:

VXLAN 是“怎么装”;Multicast Tree 是“怎么送”。

  1. 为什么不能直接用普通 IP Broadcast?

因为 Leaf A 和 Leaf B 中间是一个 Layer-3 IP Fabric:

Leaf A


Spine


Leaf B

二层 Broadcast 本身不能直接穿过普通的 L3 Router。

所以需要:

L2 Broadcast

VXLAN Encapsulation

L3 Multicast / BUM Transport

VXLAN Decapsulation

L2 Broadcast

这就是 Overlay/Underlay 的经典配合。

  1. 完整走一次 ARP

现在我们把所有东西串起来。

Host A:

10.1.1.1

要找:

10.1.1.2

没有 ARP:

ARP Table:

10.1.1.2 → ?

于是:

① Host A 发 Broadcast
Host A

│ ARP Request

Leaf A
② Leaf A 识别为 BUM
Destination MAC
FF:FF:FF:FF:FF:FF

Broadcast

BUM Processing
③ Leaf A 做 VXLAN 封装
Leaf A

│ VXLAN

│ VNI = BD 对应的 VNI

Underlay
④ Underlay Multicast Tree

流量进入相应的 Multicast Tree:

Spine
/
/
Leaf B Leaf C
⑤ Leaf B / Leaf C 解封装
Leaf B


VXLAN Decapsulation


Original ARP Broadcast


Host B

如果 Host B 是:

10.1.1.2

它回复:

ARP Reply

10.1.1.2 is
BB:BB:BB:BB:BB:BB

然后后续就开始进入 Known Unicast。

  1. 这里 COOP 又回来了

Host B 回复的时候:

Host B


Leaf B

Leaf B 学习:

10.1.1.2
MAC BB
Port Eth1/20

然后 Endpoint 信息进入 Fabric 的 Endpoint Directory。

于是以后:

Host A → Host B

就不需要每次都 Broadcast。

可以变成:

Host A


Leaf A

│ COOP / Endpoint information


Leaf B


Host B

数据直接:

VXLAN Unicast
9. 所以 ACI 的设计目标非常漂亮

第一次不知道:

Host A


ARP Broadcast


BUM


找到 Host B

然后学习:

Host B

COOP / Endpoint information

以后:

Host A


Known Unicast


VXLAN


Host B

也就是:

第一次可能需要 BUM,学习完成后尽量变成 Unicast。

  1. 但是还有一个非常重要的 ACI 特性

你后面学习 ACI 的时候,一定会遇到:

ARP Flooding

和:

ARP Gleaning

以及:

Endpoint Data Plane Learning

这些机制。

因为现代 ACI 并不是简单粗暴地:

每一个 ARP

整个 BD

Flood

它可以通过 Endpoint 信息和 ARP 相关机制减少不必要的 Flooding。

所以实际生产环境里,你可能会看到:

ARP Request

├── 已知 Endpoint
│ ↓
│ 可以优化处理

└── 未知 Endpoint

Flood / Glean

这也是为什么单纯说:

“ACI 的 ARP 就是 VXLAN + Multicast Flooding”

是不够准确的。

  1. 最后把四个协议/机制放在一起

你现在应该形成这个框架:

Cisco ACI

APIC

│ Policy

┌──────────────┐
│ Leaf │
└──────────────┘
│ │
Endpoint │ │ BUM
Learning │ │
▼ ▼
COOP VXLAN BUM
│ │
│ ▼
│ Multicast Tree
│ │
│ ▼
│ Spine


Endpoint Location

Underlay


IS-IS


IP Reachability

一句话记忆:

IS-IS 解决“Leaf/Spine 怎么互相到达”;COOP 解决“Endpoint 在哪台 Leaf”;VXLAN 负责 Overlay 封装;而 BUM 流量则通过 ACI 的 Flooding/Multicast 机制跨越这个 VXLAN Fabric。


还有一个特别值得下一步搞清楚的地方:ACI 里面的 Multicast 到底是“真正的 IP Multicast”,还是有时候使用 ingress replication?不同版本/不同配置下有什么区别。 这个会直接影响你在抓包时看到的 Outer IP、Multicast Group 和 VXLAN VNI。

这里我们把 ACI 里的 Multicast、VXLAN BUM、PIM、Ingress Replication 这几个东西彻底分开。这个地方很容易和普通 VXLAN EVPN 混淆。

先给你结论:

ACI 的 BUM 流量并不是简单等于“VXLAN + 一个固定的 IP Multicast Group”。ACI 会根据 Fabric/BD/Multicast 相关配置和流量类型,使用相应的 BUM 转发机制。

而且有一个很重要的认知:

不要把“COOP 查 Endpoint”和“Multicast Tree 转发 BUM”混成一个控制平面。

一、先把三种东西分开

假设:

Host A

Leaf A


Spine


Leaf B

Host B

我们现在有三个问题。

问题 1:Host B 在哪里?
COOP


Host B → Leaf B

这是 Endpoint Location。

问题 2:ARP Broadcast 怎么从 Leaf A 到 Leaf B?
BUM Forwarding


VXLAN BUM Transport

这是 BUM 数据平面。

问题 3:Fabric 的 Underlay 怎么把 VXLAN 包送过去?
IS-IS


IP Reachability

这是 Underlay Routing。

所以:

COOP

Endpoint Location

BUM mechanism

BUM Distribution

IS-IS

Underlay Reachability

VXLAN

Overlay Encapsulation

这四个东西职责不同。

二、什么叫 Ingress Replication?

这个概念非常重要。

假设:

Leaf A

│ BUM

需要发送给:
Leaf B
Leaf C
Leaf D

如果使用 Ingress Replication:

Leaf A 收到一次 Broadcast:

Broadcast


Leaf A

然后 Leaf A 自己复制:

Leaf A
/ |
/ |
▼ ▼ ▼
VXLAN VXLAN VXLAN
│ │ │
▼ ▼ ▼
Leaf B Leaf C Leaf D

也就是说:

复制动作发生在入口 Leaf。

这就是:

Ingress Replication

三、如果使用 Multicast Tree 呢?

那就不一样。

Leaf A 只需要把一个 VXLAN BUM 流量送入 Multicast Tree:

Leaf A

│ 1 copy

Spine
/
▼ ▼
Leaf B Leaf C

网络中的 Multicast forwarding 会负责复制。

所以:

Ingress Replication
Leaf A
├── Copy 1 → Leaf B
├── Copy 2 → Leaf C
└── Copy 3 → Leaf D
Multicast Tree
Leaf A


Multicast Tree
/ |
▼ ▼ ▼
B C D

复制发生的位置不同。

四、为什么 VXLAN 需要 Multicast?

因为 VXLAN 本身只是封装:

Original Frame


VXLAN Header


Outer IP / UDP

它自己并不解决:

“我要把这个 Broadcast 送给哪 20 台 Leaf?”

所以需要 BUM transport。

传统 VXLAN 网络非常常见的设计是:

VXLAN
+
Underlay IP Multicast
+
PIM

例如:

Leaf A

│ VXLAN BUM

IP Multicast


PIM Tree

├──── Leaf B
├──── Leaf C
└──── Leaf D
五、PIM 到底做什么?

PIM 是:

Protocol Independent Multicast

它不是 VXLAN。

它也不是 COOP。

它属于 Underlay Multicast Control Plane。

可以理解成:

PIM 帮助 Underlay 建立 Multicast forwarding tree。

例如:

Multicast Source


Spine
/
▼ ▼
Leaf B Leaf C

PIM 负责建立/维护这样的 multicast forwarding state。

六、这里特别容易产生一个错误

千万不要理解成:

COOP 告诉 PIM Host B 在 Leaf B。

不是。

COOP:

Host B

Leaf B

PIM:

Multicast Group

Multicast Tree

完全是两个维度。

七、把 ARP 例子完整走一遍

现在:

Host A
10.1.1.1

Leaf A

Host B:

10.1.1.2

Leaf B

Host A 没有 Host B 的 ARP:

10.1.1.2 → ???
Step 1:Host A 发 ARP Broadcast
Host A

│ FF:FF:FF:FF:FF:FF

Leaf A
Step 2:Leaf A 判断这是 BUM
Broadcast

BUM Processing
Step 3:ACI 对 BUM 做 VXLAN 封装
Original ARP

VXLAN

Outer IP
Step 4:BUM Transport

这里根据具体机制:

Option A:

Ingress Replication

或者:

Option B:

Multicast-based forwarding
Step 5:到达 Leaf B
Leaf B


VXLAN Decapsulation


ARP Request


Host B
Step 6:Host B 回复
ARP Reply

10.1.1.2

BB:BB:BB:BB:BB:BB

这个回复通常是:

Unicast

然后 Leaf B 学习 Endpoint。

八、然后就进入 Known Unicast

之后 Host A 再访问 Host B:

Host A


Leaf A

│ Destination = Host B

│ VXLAN Unicast

Leaf B


Host B

这时候:

不需要每次再做 BUM Flood。

这就是 ACI 为什么要维护 Endpoint information。

九、你现在应该把 ACI 数据流分成两种
Known Unicast
Endpoint 已知

Host A

Leaf A

│ VXLAN Unicast

Leaf B

Host B

主要依赖:

Endpoint Information / COOP

BUM
Endpoint 不需要知道具体一个目的地
或者本身就是多目的地

Broadcast
Unknown Unicast
Multicast


BUM Processing


VXLAN BUM Transport


相关 Leaf
十、最后给你一张“脑图”

这个你可以直接记住:

ACI


┌───────┴────────┐
│ │
Unicast BUM
│ │
│ ┌─────┼─────┐
│ │ │ │
│ B U M
│ │ │ │
│ └─────┼─────┘
│ │
▼ ▼
Endpoint Flooding /
Resolution Multicast
│ │
▼ ▼
COOP VXLAN BUM
│ │
▼ ▼
Destination Multiple
Leaf Leafs
│ │
└───────┬────────┘

VXLAN


Underlay


IS-IS
最关键的一句话:

COOP 解决的是“一个 Endpoint 在哪里”;BUM 机制解决的是“一份流量需要送给多个潜在接收者”;VXLAN 负责把 Overlay 流量封装起来;IS-IS/PIM 等 Underlay 机制负责提供底层传输能力。


Cisco ACI中的数据平面与控制平面

如果是标准 VXLAN EVPN Fabric:(注意不是ACI)

Underlay 使用 IS-IS(或者 OSPF/BGP)建立 IP Fabric,实现各个 VTEP/Loopback 地址之间的可达性;Overlay 使用 VXLAN 封装数据,而 BGP EVPN 负责分发 MAC/IP/VNI 等 Overlay Endpoint 信息,构成 Overlay Control Plane。

这个说法是非常准确的。

但是如果是 Cisco ACI:

Underlay 使用 IS-IS 建立 Fabric IP Reachability;Overlay 数据平面使用 VXLAN;ACI 内部的 Endpoint 信息控制主要依赖 COOP 和 ACI Fabric Control Plane,而不能简单地等同于传统标准 VXLAN EVPN 的 BGP EVPN Control Plane。


我们讨论的是经典的 Cisco ACI Fabric,那么:Overlay 的 Endpoint Control Plane 核心是 COOP,而不是传统 VXLAN EVPN 架构中的 BGP EVPN。

可以把 ACI 简化成:


                 Cisco ACI Fabric

┌─────────────────────────────────────┐
│              APIC                   │
│        Policy / Management          │
└─────────────────────────────────────┘

                OVERLAY
┌─────────────────────────────────────┐
│          VXLAN Data Plane           │
│                                     │
│     Endpoint Control Plane:         │
│               COOP                  │
└─────────────────────────────────────┘

                UNDERLAY
┌─────────────────────────────────────┐
│              IS-IS                  │
│                                     │
│        IP Fabric / ECMP             │
│        TEP Reachability             │
└─────────────────────────────────────┘

可以这样记

Underlay


IS-IS

负责:

Leaf / Spine Fabric 的路由可达性
TEP(Tunnel Endpoint)地址的可达性
ECMP 路径
Fabric Topology

也就是说:

IS-IS = 让整个 ACI Fabric 的网络设备能够互相进行 IP 通信。

Overlay

VXLAN + COOP

VXLAN:负责数据封装和转发
COOP:负责 Endpoint 信息的控制平面

例如某台服务器:

MAC: AA:AA:AA:AA:AA:AA
IP : 10.1.1.10

连接在:

Leaf 101

Leaf 101 会把这个 Endpoint 的位置注册到 Fabric 的 COOP Directory 中。其他 Leaf 如果需要找到这个 Endpoint,可以查询相应的信息。

所以可以理解为:

Server

Leaf 101

│ Endpoint Registration

Spine COOP Directory

│ Endpoint Location

Leaf 102
与传统 VXLAN EVPN 最大的区别
普通 VXLAN EVPN Fabric
Underlay

IS-IS / OSPF / BGP


IP Fabric


VXLAN Overlay

BGP EVPN

其中:

BGP EVPN 负责 MAC/IP Endpoint 的分发。

Cisco ACI
Underlay

IS-IS


IP Fabric


VXLAN Overlay

COOP

其中:

COOP 负责 Fabric 内 Endpoint Location 的 Directory/Mapping 功能。

但有一个概念上的细节

如果非常严谨地说,不要把 COOP 简单理解成“整个 Overlay 的唯一控制平面”。

ACI 实际上有多个控制机制协同工作:

IS-IS:Fabric Underlay 的路由和拓扑
COOP:Endpoint Directory / Endpoint Location
APIC:Policy 和配置的集中管理与下发
VXLAN:Overlay Data Plane

所以我个人认为最准确的说法是:

在 Cisco ACI 中,Underlay Routing Control Plane 主要使用 IS-IS;Overlay 的数据封装使用 VXLAN;Fabric 内部 Endpoint Location/Directory 的控制机制使用 COOP,而不是传统 VXLAN EVPN Fabric 所使用的 BGP EVPN。

这个说法会比较准确。

下一步可以继续深入一个非常关键的问题:COOP 到底是如何工作的?Endpoint 从 Leaf 学到之后,为什么要注册到 Spine?Spine 又如何回答其他 Leaf 的查询? 这个过程理解了以后,你对 ACI 的 Overlay Control Plane 基本就真正理解了。

先建立整体架构

假设我们有这样一个 ACI Fabric:

+-------------------+
| APIC |
| Policy / Config |
+---------+---------+
|
|
=================================
FABRIC

+---------+
| Spine 1 |
| COOP |
+---------+
/
/
+------+ +------+
| Leaf1 | | Leaf2 |
+---+---+ +---+---+
| |
Server A Server B

现在:

Server A
MAC: AA:AA:AA:AA:AA:AA
IP : 10.1.1.10

连接在 Leaf 1。

而 Server B:

MAC: BB:BB:BB:BB:BB:BB
IP : 10.1.1.20

连接在 Leaf 2。

假设 Server B 想访问 Server A。

  1. Endpoint Learning:Leaf 先学习 Endpoint

Server A 第一次发送数据包:

Server A

│ Frame

Leaf 1

Leaf 1 看到:

Source MAC = AA:AA:AA:AA:AA:AA
Source IP = 10.1.1.10

于是 Leaf 1 学习:

Endpoint AA:AA:AA:AA:AA:AA
Location = Leaf 1

Leaf 1 的 Endpoint Table 可以理解为:

MAC Location

AA:AA:AA:AA:AA:AA Local

这一步叫:

Endpoint Learning

  1. Leaf 把 Endpoint 注册到 COOP

接下来非常重要。

Leaf 1 不只是自己知道:

“这个 MAC 在我这里。”

它还会向 Fabric 注册:

AA:AA:AA:AA:AA:AA

│ Registration

COOP Directory

ACI 的 Spine 上运行 COOP Directory。

逻辑上变成:

COOP Database

Endpoint:
AA:AA:AA:AA:AA:AA

Location:
Leaf 1

所以:

Leaf 负责学习 Endpoint,Spine 负责维护 Endpoint Directory。

你可以把它理解成:

Leaf = 学习 Endpoint
Spine = Endpoint Directory
4. 为什么需要 COOP?

现在 Server B 想发送数据给 Server A。

Server B


Leaf 2

Leaf 2 收到:

Destination MAC:
AA:AA:AA:AA:AA:AA

但是 Leaf 2 不知道这个 MAC 在哪里。

传统二层网络可能会:

Unknown MAC


Flood

也就是说:

Leaf 2

├──── Flood ──── Leaf 1
├──── Flood ──── Leaf 3
├──── Flood ──── Leaf 4

但是 ACI 不希望大量依赖这种 Flooding。

所以 Leaf 2 会:

询问 COOP Directory:这个 Endpoint 在哪里?

Leaf 2

│ COOP Query

Spine

│ COOP Database Lookup

Endpoint Location = Leaf 1

然后 Spine 返回:

AA:AA:AA:AA:AA:AA


Located at Leaf 1
5. Leaf 2 得到答案之后怎么办?

Leaf 2 现在知道:

Destination MAC


Located at Leaf 1

于是 Leaf 2 将数据封装进 VXLAN:

+-----------------------------------+
| Outer IP Header |
| |
| Source = Leaf 2 TEP |
| Destination = Leaf 1 TEP |
+-----------------------------------+
| UDP |
+-----------------------------------+
| VXLAN |
| |
| VNI |
+-----------------------------------+
| Original Ethernet Frame |
| |
| Src MAC = Server B |
| Dst MAC = Server A |
+-----------------------------------+

然后:

Server B

Leaf 2

│ VXLAN Encapsulation


Spine

│ IP Underlay Forwarding


Leaf 1


Server A

注意:

Spine 在这个数据流中通常只负责 Underlay IP 转发。

Spine 不需要:

解封 VXLAN
学习所有 Endpoint 的 Data Plane 转发表
像传统二层交换机一样转发 MAC

它根据 Outer IP Header 转发:

Destination = Leaf 1 TEP

这也是 Spine 可以实现高性能转发的一个重要原因。

  1. 整个流程总结
    Phase 1:Endpoint Learning
    Server A


    Leaf 1

Learn:
MAC = AA
IP = 10.1.1.10
Phase 2:COOP Registration
Leaf 1

│ Register Endpoint

COOP Spine

AA → Leaf 1
Phase 3:COOP Query
Server B


Leaf 2

"Where is MAC AA?"


COOP
Phase 4:COOP Reply
COOP

"MAC AA is at Leaf 1"
Phase 5:VXLAN Forwarding
Leaf 2

│ VXLAN

Underlay IP Fabric


Leaf 1


Server A
7. 你现在可以这样理解 ACI

我建议你在脑子里建立这个模型:

┌─────────────────────────────────────┐
│ APIC │
│ │
│ Policy & Configuration │
└──────────────────┬──────────────────┘

┌─────────────────────────────────────┐
│ CONTROL │
│ │
│ Underlay: IS-IS │
│ Endpoint Directory: COOP │
└─────────────────────────────────────┘

┌─────────────────────────────────────┐
│ DATA │
│ │
│ VXLAN Encapsulation │
│ IP Fabric + ECMP │
└─────────────────────────────────────┘
一句话版本

IS-IS 负责“网络设备之间怎么到达”;COOP 负责“Endpoint 在哪里”;VXLAN 负责“数据怎么封装和传过去”;APIC 负责“策略是什么”。

这四句话基本就是理解 Cisco ACI 架构的核心。


我这里有一个问题,coop负责 endpoint在哪里,那它需要记录 endpoint在哪个Leaf的那个接口吗?就是具体在 Leaf的哪个接口上需要体现吗?

我理解你想问的是:COOP 是否需要精确记录 Endpoint 在哪个 Leaf,以及具体连接在哪个 Leaf 的哪个接口(port)?

答案是:要区分两层信息。

简短答案
COOP 主要记录的是:

这个 Endpoint 所在的 Leaf/VTEP(TEP)在哪里。

例如:

Endpoint:
MAC = AA:AA:AA:AA:AA:AA
IP = 10.1.1.10

Location:
Leaf 101
VTEP = 10.0.0.101

COOP Directory 的核心任务是让其他 Leaf 知道:

「我要发送给这个 Endpoint,应该把 VXLAN Tunnel 封装到哪个 Leaf/VTEP?」

那么具体在哪个接口呢?

例如:

Server A

│ Ethernet

Leaf 101
Ethernet1/10

Leaf 101 自己本地会知道:

MAC AA


Local Port = Ethernet1/10

因此逻辑上可以理解成:

COOP Directory:
MAC AA → Leaf 101 / TEP

Leaf 101 Local Table:
MAC AA → Ethernet1/10

也就是说:

远端 Leaf 只需要知道:
MAC AA → Leaf 101

然后建立 VXLAN:

Source VTEP Destination VTEP
Leaf 102 ─────► Leaf 101
到达 Leaf 101 后:

Leaf 101 才使用自己的本地 Endpoint 信息:

MAC AA → Ethernet1/10

最终发送给 Server A。

整个逻辑可以画成这样
Server B


Leaf 102

│ COOP 查询
│ "MAC AA 在哪里?"

COOP Directory

│ Reply:
│ "在 Leaf 101"

Leaf 102

│ VXLAN Tunnel
│ Destination = Leaf 101 TEP

Leaf 101

│ Local Endpoint Lookup
│ MAC AA → Ethernet1/10

Ethernet1/10


Server A
所以一个非常重要的理解是

你可以把 Endpoint Location 分成两层:

第一层:Fabric-Level Location
Endpoint → 哪个 Leaf?

这个是 COOP 特别关心的。

例如:

MAC AA → Leaf 101 / TEP
第二层:Local Leaf-Level Location
Endpoint → Leaf 上哪个 Port?

例如:

MAC AA → Ethernet1/10

这是 Leaf 自己本地 Endpoint Table / Forwarding Table 所关心的。

所以你可以记住这句话:

COOP 解决“Endpoint 在哪台 Leaf”;目标 Leaf 自己解决“Endpoint 在哪个具体接口”。

这个理解非常接近 Cisco ACI Endpoint Learning 和 Forwarding 的核心逻辑


这时如果一个endpoint从leaf1的一个E1/10挪到了E1/20口,这时候会发生什么?

这种同一台Leaf上的端口变更,一般只更新本地的 endpoint table,不需要更新 COOP,因为在 Fabric 看来,这个 MAC 仍然在 Leaf1上。只有当这个 endpoint 跨 Leaf 移动,比如从 Leaf1 移到 Leaf2,才需要更新 COOP 目录,把映射改成指向 Leaf2。因为 COOP关心的是“在哪台 Leaf”,而不是“Leaf 上的哪个物理端口”。Leaf 内部再用本地表决定从哪个端口发出去。这个分层让 Fabric既高效又不会被物理端口的细节撑爆。这样解释清楚吗?


刚才说到那个coop会存储这些信息,endpoint的上线之后会告诉coop directory,也就是SPINE会有这些信息。假设现在有个EP: 10.1.1.1从leaf A上来,它告诉了coop(SPINE),那spine主动告诉那个leaf B吗 ?

是个非常关键的问题,也是 COOP 和 EVPN 最大的区别之一。答案是 COOP 不会主动通知所有的 Leaf,而是更像一个被动的目录查询服务。比如 Server A 在 Leaf A 上,Leaf A 把这个 endpoint 注册到 COOP 目录里,这时不会推送给其他 Leaf。只有当 Leaf B 真正要找1.1.1.1 的时候,才向 COOP 发起查询,然后 COOP 回答说:“这个 endpoint 在 Leaf A。”这种按需查询的方式可以让控制平面消息量保持可控。也正因为如此,ACI 的 COOP 更像是一个目录服务,而不是传统意义上会广播变化的路由协议。你问得很到位,这正是很多人一开始容易混淆的地方。


COOP 为什么部署在 Spine,而不是 Leaf?以及多台 Spine 如何共同组成分布式 COOP Directory?

这个问题非常关键。我们把它分成两部分讲。

  1. 为什么 COOP 放在 Spine,而不是 Leaf?

核心原因是:Spine 在 ACI Fabric 里天然适合做“集中目录服务”,而 Leaf 负责接入和 Endpoint Learning。

可以这样分工:

Leaf:

  • 连接 Server / VM / Endpoint
  • 学习 Endpoint
  • 维护本地 Endpoint 信息
  • VXLAN 封装/解封

Spine:

  • 维护 COOP Directory
  • 回答 Endpoint Location 查询
  • Underlay IP 转发

假设有 200 台 Leaf。

如果每个 Leaf 都要维护全 Fabric 的所有 Endpoint:

Leaf 1 ← 所有 Endpoint
Leaf 2 ← 所有 Endpoint
Leaf 3 ← 所有 Endpoint
...
Leaf 200 ← 所有 Endpoint

那每一台 Leaf 都需要保存大量 Endpoint 信息,而且每次 Endpoint 上线、下线、迁移,都可能需要大规模同步。

ACI 不采用这种方式。

而是:

COOP Directory
Spine Layer
┌───────┬───────┐
│ │ │
Spine1 Spine2 Spine3
│ │ │
───────┴───────┴───────┴──────
Leaf1 Leaf2 Leaf3

Leaf 只需要知道:

我本地的 Endpoint 在哪里。

如果要找远端 Endpoint,就去查 COOP。

  1. 为什么 Spine 特别适合做 Directory?

ACI 的 Spine 是 Fabric 的中心层。

从任何 Leaf 到任何 Spine,都只有一跳:

Leaf A

├──── Spine 1
├──── Spine 2
└──── Spine 3

因此:

Leaf 很容易访问 COOP
查询路径非常短
可以使用多台 Spine 提供冗余
不需要 Leaf-to-Leaf 控制平面全互联

所以逻辑上:

Leaf 是“数据来源”,Spine 是“目录中心”。

  1. 多台 Spine 怎么组成分布式 COOP Directory?

这里就进入 COOP 最有意思的地方:不是每一台 Spine 都保存所有 Endpoint。

假设有三台 Spine:

COOP Directory

Spine 1 Spine 2 Spine 3
? ? ?

ACI 会通过一种分布式的机制,把 Endpoint 信息分布到不同的 Spine 上。

可以概念化理解成:

Endpoint MAC/IP


Hash Calculation

├────► Spine 1
├────► Spine 2
└────► Spine 3

例如:

MAC AA → Hash → Spine 1
MAC BB → Hash → Spine 2
MAC CC → Hash → Spine 3

所以不同 Endpoint 会分布到不同 Spine 上。

  1. Leaf A 注册 Endpoint 时发生什么?

假设:

Endpoint A
IP = 1.1.1.1
MAC = AA:AA:AA:AA:AA:AA

Located at:
Leaf A

Endpoint A 接入 Leaf A 后:

Endpoint A


Leaf A

Leaf A 学到 Endpoint,然后计算:

Hash(Endpoint A)


Which COOP Spine owns this Endpoint?


Spine 2

然后注册:

Leaf A

│ COOP Registration

Spine 2


Endpoint A → Leaf A

当然,实际机制还会涉及冗余副本,不只是简单的“一条信息只放在一台 Spine”。

  1. Leaf B 查询时怎么办?

假设 Leaf B 要找:

1.1.1.1

它同样可以根据 Endpoint 信息计算:

Hash(1.1.1.1 / MAC)


COOP Spine 2

然后:

Leaf B

│ COOP Query:
│ Where is 1.1.1.1?

Spine 2

│ Lookup

1.1.1.1 → Leaf A

Spine 2 回复:

"Endpoint 1.1.1.1
is located behind Leaf A"

然后 Leaf B 才进行 VXLAN 封装:

Outer Source IP = Leaf B TEP
Outer Dest IP = Leaf A TEP

最终:

Leaf B

│ VXLAN

IP Underlay


Leaf A


Endpoint A
6. 一个很重要的概念:COOP 是 Directory,不是传统路由表

你可以把它和 DNS 类比——只是帮助理解,不代表协议完全相同。

DNS:
www.example.com

IP Address

COOP:
Endpoint MAC/IP

Leaf / VTEP Location

所以 COOP 的主要工作不是:

“我把所有 Endpoint 信息广播给所有 Leaf。”

而是:

“Endpoint 信息注册到 Directory,需要的时候进行查询。”

最终你可以记住这个完整流程
Endpoint 上线


Leaf 学习 Endpoint


COOP Registration


Distributed Spine COOP Directory

│ (按 Hash 分布)

──────────────────────────────

│ 其他 Leaf 需要通信

COOP Query


找到对应 Endpoint Directory


Reply:
Endpoint → Destination Leaf / TEP


VXLAN Tunnel

一句话总结:

Leaf 负责发现 Endpoint,COOP Spine 负责保存和查询 Endpoint 的 Fabric 级位置,而多台 Spine 通过分布式 Hash/Directory 机制共同承担整个 Endpoint Database。

顺便纠正一下我前面一个说法:我之前用“COOP 不会主动通知所有 Leaf”来帮助你和 EVPN 对比,这个方向是对的,但更严谨地说,ACI 还有缓存、注册/更新和 Endpoint Mobility 等机制,不能简单理解成“永远只有查询、绝对没有任何更新通知”。核心模型仍然是 directory-based,而不是把所有 Endpoint 路由信息全量分发给每个 Leaf。


按以上说法,如果Leaf A把 host A信息通过hash算法计算后选择告诉了spine 1 , 那Leaf B下的host B要访问 host A时,要找spine 1查询 ,假设以有4台spine, 那leaf B咋知道找哪台spine问?它咋会知道找spine 1查询?

你这个问题问到了 COOP 最核心的机制。你的逻辑是完全正确的:

如果 Leaf A 把 Host A 注册到了某个特定的 Spine,例如 Spine 1,那么 Leaf B 怎么知道应该去问 Spine 1,而不是随机问四台 Spine?

关键就在于:Leaf B 并不是靠“记住 Host A 在 Spine 1”来查询的,而是所有 Leaf 使用相同的 COOP 哈希算法。

举个完整例子

假设 Fabric 有 4 台 Spine:

┌─────────┐
│ Spine 1 │
└─────────┘

COOP Entry

┌────┴────┐
│ Host A │
│1.1.1.1 │
└─────────┘

Spine 1 Spine 2 Spine 3 Spine 4

Host A:

IP = 1.1.1.1
MAC = AA:AA:AA:AA:AA:AA
第一步:Leaf A 学习 Host A
Host A


Leaf A

Leaf A 学到:

MAC = AA:AA:AA:AA:AA:AA
IP = 1.1.1.1

然后 Leaf A 使用 Fabric 统一的 COOP Hash 算法:

Hash(MAC AA)


Hash Result = 1


COOP Spine 1

所以:

Leaf A

│ COOP Registration

Spine 1

Spine 1 记录:

Host A → Leaf A / VTEP A
第二步:Host B 要访问 Host A

Host B:

Host B


Leaf B

Leaf B 收到一个去往 Host A 的数据包:

Destination IP = 1.1.1.1
Destination MAC = AA:AA:AA:AA:AA:AA

Leaf B 本地没有这个 Endpoint。

所以它需要查询 COOP。

Leaf B 怎么知道问哪台 Spine?

Leaf B 也运行完全相同的 Hash 算法。

Leaf B 知道:

Fabric COOP Group
+
Available Spine COOP Members
+
Endpoint Key

然后它计算:

Hash(Host A)


Hash Result = 1


Spine 1

因此:

Leaf B

│ COOP Query

Spine 1

这就是答案。

一个简单的类比

假设公司有 4 个档案柜:

Cabinet 1
Cabinet 2
Cabinet 3
Cabinet 4

所有员工都知道同一个规则:

员工编号 % 4

那么:

Employee ID = 101

101 % 4 = 1

于是:

员工 101 的资料永远应该放在 Cabinet 1。

任何人想找 101,都可以自己算:

101 % 4 = 1

然后直接去 Cabinet 1。

不需要事先问:“101 在哪个柜子?”

COOP 的思路类似这个概念。

那如果 Spine 1 挂了怎么办?

这个问题又非常重要。

COOP 不能这样设计:

Host A


Only Spine 1

因为:

Spine 1 Down


Host A Information Lost

所以实际的 COOP Directory 会考虑冗余和多个 Directory 节点。

概念上可以理解:

Hash(Host A)


Primary Directory
Spine 1

└── Backup / Replica
Spine 3

因此:

Leaf B

├── Primary → Spine 1

└── Failure → Alternate/Replica
但这里我想纠正我上一条回答的一个地方

我上一条回答用了这个非常简化的模型:

Leaf 根据 Hash(Endpoint),直接算出“这个 Endpoint 属于 Spine 2”。

这个模型用来帮助理解 Distributed Directory 是可以的,但对于真实 Cisco ACI 的 COOP 实现来说,这个说法过于简化了。

实际 COOP 涉及:

COOP Group
Directory 的 分区/分布机制
一致性哈希思想
Directory 节点成员变化
Replica / redundancy
Anycast 等机制

所以你现在提出的:

Leaf B 怎么知道找 Spine 1?

恰恰是 COOP 设计里最关键的问题之一。

概念上,答案是:

Leaf A 和 Leaf B 都拥有关于 COOP Directory 集群成员和映射规则的共同认知,因此可以根据相同的规则定位负责某个 Endpoint 的 Directory 节点,而不是靠 Leaf A 单独告诉 Leaf B。

用一句话回答你的问题

Leaf A 和 Leaf B 不需要互相告诉对方“Host A 在 Spine 1”。它们依据 Fabric 共享的 COOP Directory 成员信息和一致的映射/哈希规则,对同一个 Endpoint 得出相同的 Directory 位置,因此 Leaf B 可以知道该向哪个 COOP Directory 节点查询。


我们下一步可以继续画一个4 台 Spine + 2 台 Leaf 的完整时序图,从:

Host A 上线 → Leaf A 学习 → COOP Registration → Host B 发包 → Leaf B 查询 → COOP Reply → VXLAN 转发

完整走一遍。这个过程画出来之后,COOP 的整个工作机制会非常直观。

场景:4 台 Spine,2 台 Leaf
SPINE LAYER
┌──────────┬──────────┬──────────┬──────────┐
│ Spine 1 │ Spine 2 │ Spine 3 │ Spine 4 │
│ COOP │ COOP │ COOP │ COOP │
└────▲─────┴──────────┴──────────┴──────────┘

Host A Directory Entry

┌────────────┴─────────────────────────────┐
│ │
Leaf A Leaf B
│ │
Host A Host B
1.1.1.1 1.1.1.2
Phase 1:Host A 上线

Host A 连接到 Leaf A:

Host A
IP = 1.1.1.1
MAC = AA:AA:AA:AA:AA:AA

Host A 发出数据:

Host A


Leaf A

Leaf A 学习到:

Endpoint:
IP = 1.1.1.1
MAC = AA:AA:AA:AA:AA:AA

Location:
Leaf A

Leaf A 的本地信息可以理解为:

Endpoint A

├── MAC = AA
├── IP = 1.1.1.1
└── Local Interface = Eth1/10
Phase 2:Leaf A 向 COOP 注册

现在 Leaf A 不只是自己保存。

它需要告诉 Fabric:

“1.1.1.1 / MAC AA 在我这里。”

概念上:

Leaf A

│ COOP Registration

COOP Directory

我们用一个简化的 Hash 模型:

Endpoint Key


Hash / Directory Mapping


Spine 1

于是:

Leaf A

│ Register:
│ 1.1.1.1 → Leaf A

Spine 1

Spine 1 的 Directory 中有:

1.1.1.1


Leaf A

更准确一点:

Endpoint A


Destination VTEP = Leaf A TEP
Phase 3:Host B 要访问 Host A

现在 Host B:

Host B
IP = 1.1.1.2

发送数据:

Destination = 1.1.1.1

数据进入:

Host B


Leaf B

Leaf B 查自己的本地 Endpoint Table:

Do I know 1.1.1.1?

No.

于是 Leaf B 需要进行 Endpoint Resolution。

Phase 4:Leaf B 怎么知道找哪台 Spine?

这里就是你刚才问的核心。

Leaf B 根据:

Endpoint = 1.1.1.1

以及 Fabric 的:

COOP Directory Mapping Rules
+
COOP Group Information

进行 Directory 定位。

概念上:

1.1.1.1


Hash / Mapping


Spine 1

所以 Leaf B 不需要问:

“Host A 到底在哪个 Spine?”

它可以根据相同的规则直接定位:

Leaf B

│ COOP Query
│ "Where is 1.1.1.1?"

Spine 1
Phase 5:Spine 1 查询 Directory

Spine 1 收到:

Where is 1.1.1.1?

然后查:

COOP Directory

1.1.1.1


Leaf A TEP

于是回复 Leaf B:

1.1.1.1 is reachable through:

Leaf A
TEP = x.x.x.x

逻辑上:

Leaf B

│ Query

Spine 1

│ Reply:
│ Endpoint → Leaf A

Leaf B
Phase 6:Leaf B 建立 VXLAN 转发信息

现在 Leaf B 知道:

Destination Endpoint:
1.1.1.1

Remote Location:
Leaf A

Destination VTEP:
Leaf A TEP

于是 Leaf B 封装:

┌───────────────────────────────┐
│ Outer IP Header │
│ │
│ Src = Leaf B TEP │
│ Dst = Leaf A TEP │
├───────────────────────────────┤
│ UDP │
├───────────────────────────────┤
│ VXLAN │
│ VNI │
├───────────────────────────────┤
│ Original Packet │
│ │
│ Host B → Host A │
└───────────────────────────────┘
Phase 7:Underlay 转发

VXLAN 包进入 Underlay:

Leaf B

│ Outer Destination:
│ Leaf A TEP

Spine

│ IS-IS Routing / ECMP

Leaf A

这里非常重要:

Spine 负责 Underlay IP 转发,但它不需要在 Data Plane 中查“Host A 在哪里”。

它只看:

Outer IP Destination


Leaf A TEP
Phase 8:Leaf A 最后转发到具体端口

VXLAN 包到达 Leaf A:

Leaf A

Leaf A 解封装:

VXLAN Decapsulation


Destination MAC = AA

Leaf A 的本地 Endpoint Table:

MAC AA


Eth1/10

于是:

Leaf A


Eth1/10


Host A
整个过程串起来
① Host A 上线

Host A


Leaf A learns:
Host A → Eth1/10

② COOP Registration

Leaf A


COOP Directory
Host A → Leaf A TEP

③ Host B 发包

Host B


Leaf B

"I don't know Host A"

④ COOP Query

Leaf B

│ Where is Host A?

COOP Directory

⑤ COOP Reply

COOP

│ Host A → Leaf A TEP

Leaf B

⑥ VXLAN

Leaf B

│ VXLAN

IP Underlay


Leaf A

⑦ Local Forwarding

Leaf A


Eth1/10


Host A
最重要的三层记忆
Endpoint → 哪个 Leaf?

COOP

Leaf → 怎么找到具体 Endpoint?

Local Endpoint Table

Leaf A → Leaf B 怎么传数据?

VXLAN + IS-IS Underlay

所以整个 ACI 的逻辑可以浓缩成一句:

COOP 负责找到 Endpoint 所在的 Fabric 位置,VXLAN 负责把流量送到目标 Leaf,目标 Leaf 再根据本地 Endpoint 表把流量送到具体物理接口。


上面的处理过程中没有涉及到广播的处理,
主机A要访问主机B时,一开始是没有arp表象的, 所以主机A必定会发arp request ,那这种arp 广播又会如何处理?

我们刚才的流程直接从“Leaf B 要找 Host A”开始,其实跳过了 ARP/广播这一层。真实网络里通常首先发生的是 Endpoint Resolution。

我们把场景改得更真实一点。

场景
Host A
IP = 1.1.1.1
MAC = AA:AA:AA:AA:AA:AA

Leaf A

Host B
IP = 1.1.1.2
MAC = BB:BB:BB:BB:BB:BB

Leaf B

假设 Host A 要访问:

1.1.1.2

但是 Host A 的 ARP Table 里面没有 Host B:

Host A ARP Table

1.1.1.2 → ???

那么第一步一定是 ARP。

Phase 1:Host A 发送 ARP Request

Host A 会发送:

ARP Request

Who has 1.1.1.2?
Tell 1.1.1.1

它的 Ethernet Header 是:

Source MAC = AA:AA:AA:AA:AA:AA
Destination MAC = FF:FF:FF:FF:FF:FF

也就是说:

ARP Request 是二层广播。

Host A

│ ARP Broadcast

Leaf A
Phase 2:Leaf A 学习 Host A

Leaf A 收到 Host A 的 ARP Request 时,首先会看到:

Source MAC = AA
Source IP = 1.1.1.1

因此 Leaf A 可以学习:

Endpoint A

IP = 1.1.1.1
MAC = AA
Port = Eth1/10

然后:

Leaf A

│ Endpoint Registration

COOP Directory

因此 COOP 知道:

1.1.1.1 / AA


Leaf A
Phase 3:ARP Broadcast 怎么到达其他 Leaf?

这是你问题里最关键的部分。

ARP Request 是 Broadcast:

Destination MAC = FF:FF:FF:FF:FF:FF

但是在 VXLAN Overlay 里,不能简单理解成:

Leaf A 对所有其他 Leaf 做普通广播。

ACI 会根据 Bridge Domain (BD) 的 Flooding / Endpoint Resolution 机制处理这种 BUM 流量。

概念上:

Host A

│ ARP Request

Leaf A

│ VXLAN Encapsulation

├────────► Leaf B

├────────► Leaf C

└────────► 其他属于同一 BD 的 Leaf

这就是:

BUM Traffic

Broadcast
Unknown Unicast
Multicast

但是这里出现一个很有意思的问题

假设 Leaf A 不知道:

Host B 到底在哪台 Leaf?

那么传统二层网络通常:

Broadcast → Flood Everywhere

而 ACI 的设计目标之一就是:

尽可能减少不必要的 Flooding。

因此 ACI 可以结合 Endpoint Directory、ARP 处理机制等进行优化。

Phase 4:Host B 收到 ARP Request

假设 ARP Broadcast 最终到达 Leaf B:

Leaf A

│ VXLAN BUM Traffic

Leaf B


Host B

Host B 发现:

Who has 1.1.1.2?

这正好是自己的 IP。

于是 Host B 回复:

ARP Reply

1.1.1.2 is BB:BB:BB:BB:BB:BB

ARP Reply 通常是:

Unicast

Host B:

Source MAC = BB
Source IP = 1.1.1.2

Leaf B 因此学习:

Endpoint B

IP = 1.1.1.2
MAC = BB
Port = Eth1/20

然后注册:

Leaf B

│ COOP Registration

COOP Directory

1.1.1.2 → Leaf B
Phase 5:ARP Reply 返回 Host A

现在 Leaf B 要把 ARP Reply 发给 Host A。

它知道:

Destination MAC = AA

如果 Leaf B 本地没有 Endpoint A 的具体位置,它可以进行 Endpoint Resolution:

Leaf B

│ Where is MAC AA?

COOP Directory

│ Reply:
│ AA → Leaf A

Leaf B

然后:

Leaf B

│ VXLAN Unicast
│ Destination VTEP = Leaf A

Leaf A


Host A
Phase 6:Host A 获得 ARP 信息

Host A 收到:

ARP Reply:

1.1.1.2
MAC = BB

于是 Host A 的 ARP Table:

1.1.1.2 → BB:BB:BB:BB:BB:BB

现在 Host A 就可以真正发送业务数据:

Host A

│ Destination MAC = BB

Leaf A

Leaf A 查询本地 Endpoint 信息或者通过 COOP 获得:

MAC BB → Leaf B

然后:

Leaf A

│ VXLAN Unicast

Leaf B


Host B
所以完整过程其实是
① Host A 没有 ARP

Host A


ARP Request
"Who has 1.1.1.2?"

② Leaf A 学习 Host A

Host A → Leaf A

③ ARP/Broadcast 处理

Leaf A

├── VXLAN BUM
└──→ Leaf B

④ Host B 收到 ARP

Host B


ARP Reply

⑤ Leaf B 学习 Host B

Host B → Leaf B

⑥ 必要时查询 COOP

MAC AA → Leaf A

⑦ ARP Reply 回到 Host A

⑧ Host A 获得 MAC BB

⑨ 正常业务流量

Host A

│ VXLAN Unicast

Leaf B


Host B
一个特别重要的点

ACI 里面我们后面还要讨论 ARP Gleaning / ARP Flooding / ARP Proxy(或者更准确地说 Endpoint Resolution 的优化机制)。

因为实际 ACI 并不总是简单地:

ARP Request → Flood 到所有 Leaf

不同的 Bridge Domain 设置 会影响:

ARP Flooding
Unknown Unicast Flooding
GARP
Endpoint Learning
COOP Resolution

所以你现在提出“先考虑 ARP 广播”,实际上正好是理解 ACI Forwarding 的下一层关键问题。


ACI中关于bum流量的处理详细说下

可以。ACI 里的 BUM(Broadcast、Unknown Unicast、Multicast) 是理解 VXLAN Overlay 非常关键的一块,而且它和我们刚才讲的 COOP 是连在一起的。

先给你一个总框架:

ACI Fabric

┌─────────────┐
│ Spine │
│ IS-IS │
└──────┬──────┘

VXLAN │ VXLAN

┌──────────┴──────────┐
│ │
Leaf A Leaf B
│ │
Host A Host B

ACI 的核心思想是:

Unicast 尽量走 Endpoint-to-Endpoint 的 VXLAN,而 BUM 流量则通过专门的 VXLAN BUM/Flooding 机制在属于同一个 BD 的 Leaf 之间传播。

  1. 什么叫 BUM?

BUM 是三个东西:

B = Broadcast
U = Unknown Unicast
M = Multicast

例如:

Broadcast

ARP Request:

Who has 10.1.1.2?

Dst MAC:
FF:FF:FF:FF:FF:FF
Unknown Unicast

Leaf 收到:

Dst MAC = AA:AA:AA:AA:AA:AA

但是 Leaf 不知道这个 MAC 在哪里。

于是:

Unknown Unicast

Flood
Multicast

例如:

Host A

│ 224.1.1.1

Multicast

这种也属于 BUM。

  1. 为什么 VXLAN Fabric 需要专门处理 BUM?

因为 ACI 是一个 Overlay。

假设:

Host A

Leaf A

Host A 发一个 Broadcast:

FF:FF:FF:FF:FF:FF

但是 Host B 在:

Leaf B

Host C 在:

Leaf C

那么这个 Broadcast 必须跨越:

Leaf A

Spine

Leaf B / Leaf C

所以需要一种机制把:

一个 Leaf 上的 BUM 流量复制到其他相关 Leaf。

  1. ACI 的关键:BD 决定 BUM Flooding Domain

这里非常重要。

ACI 不是整个 Fabric 都 Flood。

而是根据 Bridge Domain(BD) 来确定 Flooding Domain。

比如:

BD-Web

├── Leaf A
├── Leaf B
└── Leaf C

那么 BD-Web 里的 BUM 流量,只需要传播到:

承载这个 BD 的相关 Leaf。

不会因为 Host A 发了一个 ARP,就让整个 Fabric 所有 Leaf 都收到。

  1. BD 和 VLAN 不完全是一回事

传统网络你可能习惯:

VLAN 10

Broadcast Domain

ACI 里更重要的是:

Bridge Domain

Subnet

Flooding / Forwarding Domain

例如:

Tenant
└── VRF
└── BD-10
└── Subnet 10.1.1.0/24

BD 定义了一个二层转发域。

  1. Broadcast 到底怎么走?

我们用你刚才的 ARP 场景。

Host A
10.1.1.1


Leaf A

Host A:

ARP Request

Who has 10.1.1.2?

Destination MAC:

FF:FF:FF:FF:FF:FF

Leaf A 判断:

这是 Broadcast。

于是需要把它发送到这个 BD 的其他相关 Leaf。

  1. Leaf A 怎么把 Broadcast 送到其他 Leaf?

这里就是 VXLAN 的作用。

ACI 会把 BUM 流量进行 VXLAN 封装。

概念上:

Original Ethernet Frame


VXLAN Encapsulation


ACI Fabric

变成:

Outer IP
Source = Leaf A TEP
Destination = BUM / Multicast mechanism


UDP 4789


VXLAN


Original ARP Frame
7. 这里要注意:ACI 的 BUM 不是简单地“Spine 广播”

这是很多人容易误解的地方。

Spine 本身不是传统二层交换机。

它的主要工作仍然是:

IP Underlay Forwarding

Leaf A 把 BUM 封装以后,Spine 根据 Underlay 进行转发。

也就是说:

Leaf A

│ VXLAN BUM

Spine

│ IP Forwarding

Leaf B
Leaf C

Spine 不需要学习:

Host A → Eth1/10
Host B → Eth1/20

这种 Endpoint 细节。

  1. ACI 怎么知道哪些 Leaf 属于这个 BD?

这和 COOP 以及 ACI Fabric 的配置/控制信息有关。

APIC 配置:

Tenant

VRF

BD

EPG

Leaf

Fabric 知道:

BD-10
├── Leaf A
├── Leaf B
└── Leaf C

所以当 Leaf A 有 BD-10 的 Broadcast:

BD-10 Broadcast

├── Leaf B
└── Leaf C
9. Unknown Unicast 怎么处理?

这个比 Broadcast 更有意思。

假设:

Host A

Leaf A

发送:

Dst MAC = BB:BB:BB:BB:BB:BB

但 Leaf A 不知道 BB 在哪里。

那么就出现:

Unknown Unicast

ACI 根据 BD 的相关配置决定怎么处理。

其中一个非常重要的配置就是:

Unknown Unicast Flooding

如果开启:

Unknown Unicast

Flood

BD 内相关 Leaf

如果没有开启,则可以采取更受控的处理方式,而不是像传统二层交换网络一样无条件 Flood。

所以 ACI 可以通过 BD 的策略控制 BUM 行为。

  1. Multicast 怎么处理?

Multicast 更复杂。

例如:

Host A

│ 224.1.1.1

Leaf A

假设:

Host B → Leaf B
Host C → Leaf C

都加入了:

224.1.1.1

那么 ACI 不应该简单地:

Leaf A
├── Leaf B
├── Leaf C
├── Leaf D
├── Leaf E
└── Leaf F

因为只有 B/C 真正需要这个 Multicast。

所以 Multicast 会涉及:

IGMP
Multicast group
BD
VXLAN
Fabric multicast tree
11. ACI 中一个很重要的概念:Multicast Tree

可以把它理解成:

Spine
/ |
/ |
Leaf A Leaf B Leaf C
│ │
Host B Host C

如果 B/C 加入 Multicast Group:

224.1.1.1

那么 Fabric 可以构造相应的树:

Source
Leaf A


Spine
/
▼ ▼
Leaf B Leaf C
│ │
Host B Host C

这样 Multicast 流量不会无意义地到处复制。

  1. ARP 是 BUM 里面最重要的一个实际例子

回到我们刚才的问题。

Host A:

10.1.1.1

要找:

10.1.1.2

没有 ARP:

ARP Table

10.1.1.2 → ???

于是:

Host A

│ Broadcast ARP

Leaf A

接下来 ACI 根据 BD 的配置和 Endpoint Resolution 机制处理这个 ARP。

可能涉及:

ARP Flooding
+
Endpoint Learning
+
COOP
+
ARP Gleaning / Proxy 等优化机制

所以不能简单地说“ACI 的 ARP 一定 Flood”。

这点非常重要。

  1. 为什么 ACI 要做这些优化?

因为如果完全按照传统二层网络:

Host A ARP


所有 Leaf


所有 Host

规模一大,问题非常严重。

假设:

500 Leaf
100,000 Endpoints

大量 ARP:

ARP

Flood

500 Leaf

100,000 Hosts

会造成非常严重的 BUM 压力。

ACI 的设计目标就是:

尽量把 Endpoint 信息变成已知状态,然后让后续流量尽量走 Unicast VXLAN。

  1. 这就把 COOP 和 BUM 联系起来了

你现在可以把它们放在一起看:

Endpoint Learning


COOP


Endpoint Location


Unicast VXLAN

而另外一条路径:

BUM Traffic


BD Flooding Domain


VXLAN BUM Forwarding

┌──────┼──────┐
▼ ▼ ▼
Leaf B Leaf C Leaf D

所以:

COOP 主要解决“已知 Endpoint 在哪里”。

BUM 机制解决“本来就需要复制给多个接收者的流量怎么跨 Fabric 传播”。

  1. 最后给你一个非常重要的判断方法

以后看到一个 ACI 数据包,你可以先问:

这是 Unicast 还是 BUM?

如果是:

Known Unicast

通常:

COOP / Endpoint Information

Destination Leaf

VXLAN Unicast

而如果是:

Broadcast
Unknown Unicast
Multicast

就进入:

BUM Processing

BD / Flooding Domain

VXLAN BUM

相关 Leaf
一句话把整个 ACI Forwarding 串起来:

Endpoint Learning + COOP 让 ACI 尽量把通信变成 Known Unicast;对于 ARP、Broadcast、Unknown Unicast 和 Multicast 这些无法直接按单一 Endpoint 转发的流量,则由 BD 所定义的 BUM/Flooding 机制通过 VXLAN 在 Fabric 中传播。


还有一个值得我们下一步专门掰开的点:ACI 到底有没有“VXLAN Multicast Group”,Spine 到底是不是在做真正的 IP Multicast,以及 PIM 在这里到底扮演什么角色。 这部分一旦搞清楚,你就会真正明白 ACI 的 BUM 是怎么穿过 Spine 的。

ACI 的 BUM 并不是简单地“Leaf 把广播丢给 Spine,然后 Spine 再广播给所有 Leaf”。
它背后实际上有 VXLAN、Multicast Tree、Underlay Multicast,以及 PIM 等机制参与。

  1. 先看最重要的一张图

假设:

Spine 1 Spine 2
/ \ /
/ \ /
Leaf A Leaf B Leaf C Leaf D
│ │ │
Host A Host B Host C

Host A 发一个 ARP Broadcast:

Host A

│ Broadcast

Leaf A

ACI 要解决的问题是:

这个 Broadcast 应该送到哪些 Leaf?

比如 Host B、C 属于同一个 BD,而 Host D 不属于:

BD-Web

Leaf A ─ Host A
Leaf B ─ Host B
Leaf C ─ Host C

Leaf D ─ 不属于 BD-Web

那么:

Host A


Leaf A

│ BUM

Fabric
├────► Leaf B
└────► Leaf C

✕ Leaf D

这就是 Flooding Domain 的概念。

  1. 那 Spine 是怎么把这个 BUM 流量送出去的?

这里需要引入:

Underlay Multicast

ACI Fabric 的 Underlay 不只是单纯的 Unicast IP Routing。

对于需要 Multicast/BUM 的场景,Fabric 可以建立相应的 Multicast Distribution Tree。

概念上:

Spine

┌─────┴─────┐
│ │
Leaf B Leaf C

Leaf A 发出的 BUM 流量进入这个 Tree。

所以你可以理解:

Spine 是 Fabric 的核心转发节点,Multicast Tree 让 BUM 流量能够高效地复制到需要它的 Leaf。

  1. PIM 在这里干什么?

这就是你刚才问的重点。

PIM(Protocol Independent Multicast) 是 Underlay Multicast 的控制协议之一。

它的作用不是:

“告诉我 Host A 在哪个 Leaf。”

那是 COOP/Endpoint Learning 负责的。

PIM 解决的是:

“这个 Multicast 流量的树应该怎么建立?”

所以要把两个问题严格分开:

COOP

└── Endpoint 在哪里?

PIM / Multicast

└── Multicast/BUM 流量怎么沿着 Tree 传播?

这是两个完全不同的问题。

  1. 一个非常直观的类比

假设:

COOP 是“通讯录”
张三 → 101办公室
李四 → 205办公室

你问:

张三在哪里?

通讯录告诉你:

101办公室。

Multicast Tree 是“道路系统”

如果你要把一份文件同时送给:

办公室 101
办公室 205
办公室 308

你需要的是:

怎么走一条路,把东西送到这些地方。

所以:

COOP
= Endpoint Location Directory

Multicast Tree
= BUM Traffic Distribution Path
5. VXLAN 在这里又是什么?

VXLAN 是数据平面封装。

Host A 发出的原始 ARP:

┌──────────────────────┐
│ Ethernet │
│ Destination = FF:FF │
│ ARP Request │
└──────────────────────┘

Leaf A 把它封装成 VXLAN:

┌───────────────────────────┐
│ Outer IP │
│ │
│ Source = Leaf A TEP │
│ Destination = Multicast │
├───────────────────────────┤
│ UDP 4789 │
├───────────────────────────┤
│ VXLAN │
│ VNI │
├───────────────────────────┤
│ Original Ethernet │
│ ARP Broadcast │
└───────────────────────────┘

所以:

VXLAN 是“怎么装”;Multicast Tree 是“怎么送”。

  1. 为什么不能直接用普通 IP Broadcast?

因为 Leaf A 和 Leaf B 中间是一个 Layer-3 IP Fabric:

Leaf A


Spine


Leaf B

二层 Broadcast 本身不能直接穿过普通的 L3 Router。

所以需要:

L2 Broadcast

VXLAN Encapsulation

L3 Multicast / BUM Transport

VXLAN Decapsulation

L2 Broadcast

这就是 Overlay/Underlay 的经典配合。

  1. 完整走一次 ARP

现在我们把所有东西串起来。

Host A:

10.1.1.1

要找:

10.1.1.2

没有 ARP:

ARP Table:

10.1.1.2 → ?

于是:

① Host A 发 Broadcast
Host A

│ ARP Request

Leaf A
② Leaf A 识别为 BUM
Destination MAC
FF:FF:FF:FF:FF:FF

Broadcast

BUM Processing
③ Leaf A 做 VXLAN 封装
Leaf A

│ VXLAN

│ VNI = BD 对应的 VNI

Underlay
④ Underlay Multicast Tree

流量进入相应的 Multicast Tree:

Spine
/
/
Leaf B Leaf C
⑤ Leaf B / Leaf C 解封装
Leaf B


VXLAN Decapsulation


Original ARP Broadcast


Host B

如果 Host B 是:

10.1.1.2

它回复:

ARP Reply

10.1.1.2 is
BB:BB:BB:BB:BB:BB

然后后续就开始进入 Known Unicast。

  1. 这里 COOP 又回来了

Host B 回复的时候:

Host B


Leaf B

Leaf B 学习:

10.1.1.2
MAC BB
Port Eth1/20

然后 Endpoint 信息进入 Fabric 的 Endpoint Directory。

于是以后:

Host A → Host B

就不需要每次都 Broadcast。

可以变成:

Host A


Leaf A

│ COOP / Endpoint information


Leaf B


Host B

数据直接:

VXLAN Unicast
9. 所以 ACI 的设计目标非常漂亮

第一次不知道:

Host A


ARP Broadcast


BUM


找到 Host B

然后学习:

Host B

COOP / Endpoint information

以后:

Host A


Known Unicast


VXLAN


Host B

也就是:

第一次可能需要 BUM,学习完成后尽量变成 Unicast。

  1. 但是还有一个非常重要的 ACI 特性

你后面学习 ACI 的时候,一定会遇到:

ARP Flooding

和:

ARP Gleaning

以及:

Endpoint Data Plane Learning

这些机制。

因为现代 ACI 并不是简单粗暴地:

每一个 ARP

整个 BD

Flood

它可以通过 Endpoint 信息和 ARP 相关机制减少不必要的 Flooding。

所以实际生产环境里,你可能会看到:

ARP Request

├── 已知 Endpoint
│ ↓
│ 可以优化处理

└── 未知 Endpoint

Flood / Glean

这也是为什么单纯说:

“ACI 的 ARP 就是 VXLAN + Multicast Flooding”

是不够准确的。

  1. 最后把四个协议/机制放在一起

你现在应该形成这个框架:

Cisco ACI

APIC

│ Policy

┌──────────────┐
│ Leaf │
└──────────────┘
│ │
Endpoint │ │ BUM
Learning │ │
▼ ▼
COOP VXLAN BUM
│ │
│ ▼
│ Multicast Tree
│ │
│ ▼
│ Spine


Endpoint Location

Underlay


IS-IS


IP Reachability

一句话记忆:

IS-IS 解决“Leaf/Spine 怎么互相到达”;COOP 解决“Endpoint 在哪台 Leaf”;VXLAN 负责 Overlay 封装;而 BUM 流量则通过 ACI 的 Flooding/Multicast 机制跨越这个 VXLAN Fabric。


还有一个特别值得下一步搞清楚的地方:ACI 里面的 Multicast 到底是“真正的 IP Multicast”,还是有时候使用 ingress replication?不同版本/不同配置下有什么区别。 这个会直接影响你在抓包时看到的 Outer IP、Multicast Group 和 VXLAN VNI。

这里我们把 ACI 里的 Multicast、VXLAN BUM、PIM、Ingress Replication 这几个东西彻底分开。这个地方很容易和普通 VXLAN EVPN 混淆。

先给你结论:

ACI 的 BUM 流量并不是简单等于“VXLAN + 一个固定的 IP Multicast Group”。ACI 会根据 Fabric/BD/Multicast 相关配置和流量类型,使用相应的 BUM 转发机制。

而且有一个很重要的认知:

不要把“COOP 查 Endpoint”和“Multicast Tree 转发 BUM”混成一个控制平面。

一、先把三种东西分开

假设:

Host A

Leaf A


Spine


Leaf B

Host B

我们现在有三个问题。

问题 1:Host B 在哪里?
COOP


Host B → Leaf B

这是 Endpoint Location。

问题 2:ARP Broadcast 怎么从 Leaf A 到 Leaf B?
BUM Forwarding


VXLAN BUM Transport

这是 BUM 数据平面。

问题 3:Fabric 的 Underlay 怎么把 VXLAN 包送过去?
IS-IS


IP Reachability

这是 Underlay Routing。

所以:

COOP

Endpoint Location

BUM mechanism

BUM Distribution

IS-IS

Underlay Reachability

VXLAN

Overlay Encapsulation

这四个东西职责不同。

二、什么叫 Ingress Replication?

这个概念非常重要。

假设:

Leaf A

│ BUM

需要发送给:
Leaf B
Leaf C
Leaf D

如果使用 Ingress Replication:

Leaf A 收到一次 Broadcast:

Broadcast


Leaf A

然后 Leaf A 自己复制:

Leaf A
/ |
/ |
▼ ▼ ▼
VXLAN VXLAN VXLAN
│ │ │
▼ ▼ ▼
Leaf B Leaf C Leaf D

也就是说:

复制动作发生在入口 Leaf。

这就是:

Ingress Replication

三、如果使用 Multicast Tree 呢?

那就不一样。

Leaf A 只需要把一个 VXLAN BUM 流量送入 Multicast Tree:

Leaf A

│ 1 copy

Spine
/
▼ ▼
Leaf B Leaf C

网络中的 Multicast forwarding 会负责复制。

所以:

Ingress Replication
Leaf A
├── Copy 1 → Leaf B
├── Copy 2 → Leaf C
└── Copy 3 → Leaf D
Multicast Tree
Leaf A


Multicast Tree
/ |
▼ ▼ ▼
B C D

复制发生的位置不同。

四、为什么 VXLAN 需要 Multicast?

因为 VXLAN 本身只是封装:

Original Frame


VXLAN Header


Outer IP / UDP

它自己并不解决:

“我要把这个 Broadcast 送给哪 20 台 Leaf?”

所以需要 BUM transport。

传统 VXLAN 网络非常常见的设计是:

VXLAN
+
Underlay IP Multicast
+
PIM

例如:

Leaf A

│ VXLAN BUM

IP Multicast


PIM Tree

├──── Leaf B
├──── Leaf C
└──── Leaf D
五、PIM 到底做什么?

PIM 是:

Protocol Independent Multicast

它不是 VXLAN。

它也不是 COOP。

它属于 Underlay Multicast Control Plane。

可以理解成:

PIM 帮助 Underlay 建立 Multicast forwarding tree。

例如:

Multicast Source


Spine
/
▼ ▼
Leaf B Leaf C

PIM 负责建立/维护这样的 multicast forwarding state。

六、这里特别容易产生一个错误

千万不要理解成:

COOP 告诉 PIM Host B 在 Leaf B。

不是。

COOP:

Host B

Leaf B

PIM:

Multicast Group

Multicast Tree

完全是两个维度。

七、把 ARP 例子完整走一遍

现在:

Host A
10.1.1.1

Leaf A

Host B:

10.1.1.2

Leaf B

Host A 没有 Host B 的 ARP:

10.1.1.2 → ???
Step 1:Host A 发 ARP Broadcast
Host A

│ FF:FF:FF:FF:FF:FF

Leaf A
Step 2:Leaf A 判断这是 BUM
Broadcast

BUM Processing
Step 3:ACI 对 BUM 做 VXLAN 封装
Original ARP

VXLAN

Outer IP
Step 4:BUM Transport

这里根据具体机制:

Option A:

Ingress Replication

或者:

Option B:

Multicast-based forwarding
Step 5:到达 Leaf B
Leaf B


VXLAN Decapsulation


ARP Request


Host B
Step 6:Host B 回复
ARP Reply

10.1.1.2

BB:BB:BB:BB:BB:BB

这个回复通常是:

Unicast

然后 Leaf B 学习 Endpoint。

八、然后就进入 Known Unicast

之后 Host A 再访问 Host B:

Host A


Leaf A

│ Destination = Host B

│ VXLAN Unicast

Leaf B


Host B

这时候:

不需要每次再做 BUM Flood。

这就是 ACI 为什么要维护 Endpoint information。

九、你现在应该把 ACI 数据流分成两种
Known Unicast
Endpoint 已知

Host A

Leaf A

│ VXLAN Unicast

Leaf B

Host B

主要依赖:

Endpoint Information / COOP

BUM
Endpoint 不需要知道具体一个目的地
或者本身就是多目的地

Broadcast
Unknown Unicast
Multicast


BUM Processing


VXLAN BUM Transport


相关 Leaf
十、最后给你一张“脑图”

这个你可以直接记住:

ACI


┌───────┴────────┐
│ │
Unicast BUM
│ │
│ ┌─────┼─────┐
│ │ │ │
│ B U M
│ │ │ │
│ └─────┼─────┘
│ │
▼ ▼
Endpoint Flooding /
Resolution Multicast
│ │
▼ ▼
COOP VXLAN BUM
│ │
▼ ▼
Destination Multiple
Leaf Leafs
│ │
└───────┬────────┘

VXLAN


Underlay


IS-IS
最关键的一句话:

COOP 解决的是“一个 Endpoint 在哪里”;BUM 机制解决的是“一份流量需要送给多个潜在接收者”;VXLAN 负责把 Overlay 流量封装起来;IS-IS/PIM 等 Underlay 机制负责提供底层传输能力。


aci中有stp的说法吗?
或者说leaf如果收到stp bpdu,会如何处理

有,但要区分“ACI Fabric 内部”与“ACI 接入的外部二层网络”。

先给结论

ACI Fabric 内部不运行 STP 来解决 Leaf/Spine 的二层环路。
ACI Fabric 是基于 Leaf-Spine + VXLAN + L3 Underlay 的架构,Fabric 内部不存在传统交换网络那种 STP 设计。

但是:

Leaf 的接入口完全可能收到外部设备发来的 STP BPDU。
这时候 ACI Leaf 会根据端口/EPG 的相关配置来处理这个 BPDU,而不是把它当成普通业务流量在 Fabric 中传播。

  1. 为什么 ACI Fabric 不需要 STP?

传统网络:

SW1
/
/
SW2-----SW3

这是 Layer 2 loop:

SW1

SW2

SW3

SW1

所以需要:

STP

Block one path

ACI Fabric 不一样:

Spine
/
Leaf A Leaf B

Leaf-Spine 之间主要是:

Layer 3

而不是:

Layer 2

所以:

Leaf A

│ L3

Spine

│ L3

Leaf B

Underlay 用 IS-IS 建立 IP reachability。

因此 Fabric 内部不需要:

STP

来阻止二层环路。

  1. 那 Leaf 收到 BPDU 怎么办?

这里要分情况。

假设你的 ACI Leaf:

Leaf A

│ Eth1/10

External Switch

外部交换机发:

STP BPDU
Destination MAC = 01:80:C2:00:00:00

Leaf A 收到以后,不会把 BPDU 当成普通 Endpoint 流量,通过 VXLAN 传播到其他 Leaf。

这是一个非常重要的理解:

External Switch

│ BPDU

Leaf A

X

X─── 不会作为普通 BUM
│ Flood 到整个 ACI Fabric

因为 BPDU 属于 STP 控制协议帧。

  1. ACI 的 Border/Access 连接是重点

比如:

Traditional Network

SW1

│ STP

Leaf A

ACI Fabric

这里就出现了一个问题:

外面的传统网络可能运行 STP,而 ACI Fabric 内部不运行 STP。

因此 ACI 必须在边界处对 STP/BPDU 做处理。

这就是为什么你在 ACI 接入传统二层网络的时候,会遇到:

STP
BPDU
BPDU Filter
BPDU Guard
Loop Guard
L2Out
External EPG

这些概念。

  1. 一个非常典型的例子

假设:

Traditional Network

SW1
/
/
/
Leaf A Leaf B
│ │
└────ACI───┘

传统网络可能认为:

SW1
├── Leaf A
└── Leaf B

是两个二层路径。

于是 SW1 可能发送:

STP BPDU

但是:

ACI Leaf A 和 Leaf B 并不是靠 STP 来决定谁 Block。

ACI Fabric 自己的转发模型已经不同。

  1. 特别重要:ACI 不等于“完全不支持 STP”

这是很多人学习 ACI 时容易产生的误解。

正确说法应该是:

ACI Fabric 内部不依赖 STP,但 ACI 可以与外部运行 STP 的网络互操作。

所以你可以看到:

External Network

STP


ACI Leaf



ACI Fabric

STP 的边界通常是在:

External Network ↔ ACI Leaf

而不是:

Leaf ↔ Spine

  1. 那 BPDU 会不会进入 VXLAN?

通常你可以建立这样一个思维模型:

普通业务流量:

Host

Leaf

VXLAN

Fabric

Leaf

Host

而 STP BPDU:

External Switch

Leaf

STP/BPDU processing

按照端口/接口配置处理

不要把 BPDU 当成普通 Broadcast。

虽然从广义的 Ethernet frame 分类上它是一个特殊的 L2 control frame,但 ACI 对这类 reserved multicast MAC/control frames 有专门处理。

  1. 那 BPDU Guard 是干什么?

这个你可能会马上想到。

假设:

ACI Leaf

│ Access Port

普通终端

你本来认为:

这个接口后面应该是一台 Host。

结果 Host 接了一台 Switch:

Leaf

└── Switch

└── 发 BPDU

如果接口配置了:

BPDU Guard

那么收到 BPDU 时:

BPDU

BPDU Guard

Port Protection / Error-disable

目的就是:

防止有人把交换机偷偷接到本应该是 Host 的端口上。

  1. BPDU Filter 又是什么?

BPDU Filter 和 Guard 不一样。

简单理解:

BPDU Guard
收到 BPDU

认为有问题

保护接口
BPDU Filter
不希望这个接口参与 BPDU 发送/接收处理

所以:

Guard = 收到 BPDU → 惩罚/保护

Filter = 过滤 BPDU

具体行为还取决于 Cisco ACI 的接口策略和端口类型,不能简单把传统 IOS/NX-OS 的所有 STP 行为一比一套进 ACI。

  1. 还有一个非常关键的概念:ACI 的 EPG

ACI 里面你不能只看:

Port

你还必须看:

Port

EPG

BD

Contract

例如:

Host

Eth1/10

│ Static Path

EPG-Web


BD-Web

当外部二层流量进入 ACI 时,Leaf 首先需要根据这些配置决定:

这个 Ethernet frame 属于哪个 EPG/BD?

BPDU 则属于特殊的控制协议流量,不应该简单按照普通 Host frame 的方式处理。

  1. 你可以记住一个非常实用的判断
    ACI Fabric 内部:
    Leaf ─── Spine ─── Leaf
    L3 Underlay

    IS-IS

    ❌ STP
    ACI 接入传统二层网络:
    Traditional Switch

    │ STP/BPDU

    ACI Leaf



    ACI Fabric

External side:
STP ✔

ACI Fabric:
STP ❌
最后一句话

ACI 不是“不认识 STP”,而是“不用 STP 构建 Fabric”。
Leaf 接入传统二层网络时,仍然可能收到 BPDU;ACI 会在接入边界根据接口、EPG、BPDU Guard/Filter 等策略对这些控制帧进行处理,而不会把它们当普通业务 Broadcast 在 VXLAN Fabric 内泛洪。


如果你接下来想继续往深处走,最值得讲的是“外部交换机发 BPDU → ACI Leaf 收到 → BPDU 到底在 Leaf 的哪个阶段被处理/丢弃,以及 L2Out + External EPG 场景下 STP 是怎么工作的”。这个会把 ACI 和传统二层网络真正接起来。

好。这个问题我们就沿着一条真实的数据路径来讲:

外部交换机 → ACI Leaf → L2Out → ACI Fabric

并重点回答你问的:BPDU 到底在哪里、什么时候被处理,以及它和普通 BUM 流量有什么区别。

  1. 先建立一个真实拓扑

假设:

External L2 Network

┌─────────┐
│ Switch │
│ SW1 │
└────┬────┘

│ 802.1Q

Eth1/10

┌────▼────┐
│ Leaf A │
└────┬─────┘

ACI Fabric

┌────────┴────────┐
│ │
Spine Spine
│ │
Leaf B Leaf C

假设外部网络使用:

VLAN 100

ACI 里对应:

Tenant
└── L2Out
└── External EPG

└── VLAN 100
2. SW1 发出的普通业务流量

例如 SW1 后面有:

Host X
10.1.1.10

它发送:

Dst MAC = Host Y

进入:

SW1

Leaf A Eth1/10

Leaf A 根据:

Interface

VLAN

L2Out

External EPG

确定:

这个 frame 属于哪个外部 EPG。

然后如果目标在另一个 Leaf:

Leaf A

│ VXLAN

Spine


Leaf B


External Network

这就是普通业务流量。

  1. 但是 BPDU 完全不一样

SW1 可能周期性发送:

STP BPDU

目标 MAC 通常是:

01:80:C2:00:00:00

这是一个 IEEE 802.1D STP Reserved MAC。

它不是普通的:

FF:FF:FF:FF:FF:FF

所以不要把它简单理解为普通 Broadcast。

  1. Leaf 收到 BPDU 后首先发生什么?

从最底层理解:

SW1

│ Ethernet Frame


Leaf A


Ingress Interface

Leaf A 首先收到 Ethernet frame。

然后识别:

Destination MAC =
01:80:C2:00:00:00

这属于:

Link-local / Reserved Multicast MAC

也就是说,这类 frame 有特殊的处理规则。

它不会像普通业务 Ethernet frame 一样被正常学习成一个 Endpoint,然后通过 COOP/VXLAN 转发。

  1. 这一点非常重要

你前面已经理解了:

COOP

Endpoint Location

那么这里:

BPDU

不是 Endpoint

不会注册到 COOP

也就是说你不会看到:

COOP:

01:80:C2:00:00:00

Leaf A

这是完全不同的东西。

  1. 为什么?

因为 COOP 管的是:

Endpoint

例如:

Host A
MAC = AA
IP = 10.1.1.1

Leaf A

而 BPDU 是:

Control Protocol Frame

它的目的不是找一个 Endpoint。

它是在说:

“我是 STP,我正在和相邻交换设备交换拓扑控制信息。”

所以它应该停留在相应的 Layer-2 control boundary,而不是进入 ACI Endpoint database。

  1. 那 BPDU 会不会被 VXLAN 到其他 Leaf?

这里要非常小心地理解。

一般不能把 BPDU 理解成普通 Broadcast,因此不会因为它是一个 L2 control frame,就被 ACI 当成普通 BUM 流量在 Fabric 中泛洪。

也就是说:

SW1

│ BPDU

Leaf A

X

X─── 不会简单变成:

├── VXLAN → Leaf B
└── VXLAN → Leaf C

否则 ACI Fabric 就会变成一个 STP domain。

而这恰恰不是 ACI Fabric 的设计目标。

  1. 这时候你应该想到一个问题

如果:

SW1

│ BPDU

Leaf A

然后 Leaf A 不把 BPDU 泛洪到 Leaf B。

那么:

外部 STP 到底怎么工作?

答案是:

要看你怎么把 ACI 和外部二层网络连接起来,以及你的设计目标是什么。

这也是为什么 ACI 里面有:

L2Out
External EPG
STP-related interface policies
BPDU Guard
BPDU Filter
Port Type
VLAN encapsulation

这些配置。

  1. 一个非常重要的设计思想

ACI Fabric 本身:

Leaf ─ Spine ─ Leaf

不需要:

STP

但是外部网络可能需要:

STP

所以实际上存在两个不同的 Layer-2 世界:

External L2 Domain
──────────────────
STP



┌──────────────┐
│ ACI Border │
│ Leaf │
└──────────────┘


ACI Fabric Domain
───────────────────
VXLAN / COOP
IS-IS Underlay
No STP Fabric
10. BPDU Guard 的意义现在就非常清楚了

假设:

ACI Leaf

│ Eth1/10

Server

这是一个普通 Host 接口。

正常情况下:

Server
❌ 不应该发送 BPDU

如果有人把一个 Switch 插上去:

ACI Leaf


Switch

└── BPDU

Leaf 收到:

BPDU

BPDU Guard

保护接口

这样可以防止:

外部交换设备意外参与到这个 ACI 接入端口的二层控制环境中。

  1. BPDU Filter 则是另一种思路

BPDU Filter 更像:

BPDU

Filter

不要让它参与正常 BPDU 处理

所以:

BPDU Guard
= “你不应该发 BPDU,发了我就保护接口”

BPDU Filter
= “我不希望这个接口处理/发送 BPDU”

这两个概念千万不要混。

  1. 再回到 L2Out

L2Out 是 ACI 与外部 Layer-2 network 连接的重要方式。

概念:

ACI

Tenant

└── L2Out

└── External EPG

└── VLAN 100


Leaf A



SW1

这里的关键是:

L2Out 让 ACI 能够把外部二层网络接入 Fabric 的 forwarding domain。

但是这并不意味着:

“ACI Fabric 从此变成一个巨大的 STP domain。”

  1. 现在把 BPDU、ARP、Unknown Unicast 放一起比较

这个非常重要。

ARP
Destination:
FF:FF:FF:FF:FF:FF

性质:
L2 Broadcast

ACI:
可以进入 BUM processing
Unknown Unicast
Destination:
BB:BB:BB:BB:BB:BB

但是:
Location unknown

ACI:
根据 BD 的 flooding 配置处理
BPDU
Destination:
01:80:C2:00:00:00

性质:
STP control frame

ACI:
特殊 control-frame handling

所以:

ARP

BUM

Unknown Unicast

BUM

BPDU

Control Protocol

虽然都可能被粗略归为“二层特殊流量”,但是处理逻辑完全不同。

  1. 最后一个很重要的坑

你刚才一直在问:

“Leaf 收到 BPDU 会发生什么?”

不能只回答:

“Leaf 丢掉。”

这太粗糙。

更准确的思考方式应该是:

Ethernet Frame


Ingress Leaf

Destination MAC

┌─────────────────┼─────────────────┐
│ │ │
Normal BUM Control
Unicast │ Frame
│ │ │
▼ ▼ ▼
Endpoint ARP/UU/Mcast BPDU
Processing Processing Policy
│ │ │
▼ ▼ ▼
COOP/VXLAN VXLAN BUM Special
Unicast Handling Handling

这才是正确的思维模型。

🔥 最后浓缩成 4 句话

① ACI Fabric 内部不用 STP。

Leaf ↔ Spine ↔ Leaf
L3
IS-IS

② 外部交换网络仍然可以运行 STP。

External Switch

STP

ACI Leaf

③ BPDU 不是普通 Endpoint,也不是普通 ARP Broadcast,不会进入 COOP。

④ Leaf 对 BPDU 的具体动作取决于接口和 ACI 的相关 STP/BPDU 策略;因此看到 BPDU 时,应该先判断这个 Leaf 接口是什么角色,以及是否配置了 BPDU Guard/Filter,而不是简单认为“ACI 收到 BPDU 就 Flood”。

posted @ 2026-08-28 10:08  JacobJacob  阅读(4)  评论(0)    收藏  举报