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。
- 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
- 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 可以实现高性能转发的一个重要原因。
- 整个流程总结
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?
这个问题非常关键。我们把它分成两部分讲。
- 为什么 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。
- 为什么 Spine 特别适合做 Directory?
ACI 的 Spine 是 Fabric 的中心层。
从任何 Leaf 到任何 Spine,都只有一跳:
Leaf A
│
├──── Spine 1
├──── Spine 2
└──── Spine 3
因此:
Leaf 很容易访问 COOP
查询路径非常短
可以使用多台 Spine 提供冗余
不需要 Leaf-to-Leaf 控制平面全互联
所以逻辑上:
Leaf 是“数据来源”,Spine 是“目录中心”。
- 多台 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 上。
- 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”。
- 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 之间传播。
- 什么叫 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。
- 为什么 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。
- 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 都收到。
- BD 和 VLAN 不完全是一回事
传统网络你可能习惯:
VLAN 10
↓
Broadcast Domain
ACI 里更重要的是:
Bridge Domain
↓
Subnet
↓
Flooding / Forwarding Domain
例如:
Tenant
└── VRF
└── BD-10
└── Subnet 10.1.1.0/24
BD 定义了一个二层转发域。
- 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。
- 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 细节。
- 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 行为。
- 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 流量不会无意义地到处复制。
- 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”。
这点非常重要。
- 为什么 ACI 要做这些优化?
因为如果完全按照传统二层网络:
Host A ARP
│
▼
所有 Leaf
│
▼
所有 Host
规模一大,问题非常严重。
假设:
500 Leaf
100,000 Endpoints
大量 ARP:
ARP
↓
Flood
↓
500 Leaf
↓
100,000 Hosts
会造成非常严重的 BUM 压力。
ACI 的设计目标就是:
尽量把 Endpoint 信息变成已知状态,然后让后续流量尽量走 Unicast VXLAN。
- 这就把 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 传播”。
- 最后给你一个非常重要的判断方法
以后看到一个 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 等机制参与。
- 先看最重要的一张图
假设:
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 的概念。
- 那 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。
- PIM 在这里干什么?
这就是你刚才问的重点。
PIM(Protocol Independent Multicast) 是 Underlay Multicast 的控制协议之一。
它的作用不是:
“告诉我 Host A 在哪个 Leaf。”
那是 COOP/Endpoint Learning 负责的。
PIM 解决的是:
“这个 Multicast 流量的树应该怎么建立?”
所以要把两个问题严格分开:
COOP
│
└── Endpoint 在哪里?
PIM / Multicast
│
└── Multicast/BUM 流量怎么沿着 Tree 传播?
这是两个完全不同的问题。
- 一个非常直观的类比
假设:
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 是“怎么送”。
- 为什么不能直接用普通 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 的经典配合。
- 完整走一次 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。
- 这里 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。
- 但是还有一个非常重要的 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”
是不够准确的。
- 最后把四个协议/机制放在一起
你现在应该形成这个框架:
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。
- 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
- 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 可以实现高性能转发的一个重要原因。
- 整个流程总结
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?
这个问题非常关键。我们把它分成两部分讲。
- 为什么 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。
- 为什么 Spine 特别适合做 Directory?
ACI 的 Spine 是 Fabric 的中心层。
从任何 Leaf 到任何 Spine,都只有一跳:
Leaf A
│
├──── Spine 1
├──── Spine 2
└──── Spine 3
因此:
Leaf 很容易访问 COOP
查询路径非常短
可以使用多台 Spine 提供冗余
不需要 Leaf-to-Leaf 控制平面全互联
所以逻辑上:
Leaf 是“数据来源”,Spine 是“目录中心”。
- 多台 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 上。
- 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”。
- 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 之间传播。
- 什么叫 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。
- 为什么 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。
- 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 都收到。
- BD 和 VLAN 不完全是一回事
传统网络你可能习惯:
VLAN 10
↓
Broadcast Domain
ACI 里更重要的是:
Bridge Domain
↓
Subnet
↓
Flooding / Forwarding Domain
例如:
Tenant
└── VRF
└── BD-10
└── Subnet 10.1.1.0/24
BD 定义了一个二层转发域。
- 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。
- 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 细节。
- 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 行为。
- 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 流量不会无意义地到处复制。
- 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”。
这点非常重要。
- 为什么 ACI 要做这些优化?
因为如果完全按照传统二层网络:
Host A ARP
│
▼
所有 Leaf
│
▼
所有 Host
规模一大,问题非常严重。
假设:
500 Leaf
100,000 Endpoints
大量 ARP:
ARP
↓
Flood
↓
500 Leaf
↓
100,000 Hosts
会造成非常严重的 BUM 压力。
ACI 的设计目标就是:
尽量把 Endpoint 信息变成已知状态,然后让后续流量尽量走 Unicast VXLAN。
- 这就把 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 传播”。
- 最后给你一个非常重要的判断方法
以后看到一个 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 等机制参与。
- 先看最重要的一张图
假设:
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 的概念。
- 那 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。
- PIM 在这里干什么?
这就是你刚才问的重点。
PIM(Protocol Independent Multicast) 是 Underlay Multicast 的控制协议之一。
它的作用不是:
“告诉我 Host A 在哪个 Leaf。”
那是 COOP/Endpoint Learning 负责的。
PIM 解决的是:
“这个 Multicast 流量的树应该怎么建立?”
所以要把两个问题严格分开:
COOP
│
└── Endpoint 在哪里?
PIM / Multicast
│
└── Multicast/BUM 流量怎么沿着 Tree 传播?
这是两个完全不同的问题。
- 一个非常直观的类比
假设:
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 是“怎么送”。
- 为什么不能直接用普通 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 的经典配合。
- 完整走一次 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。
- 这里 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。
- 但是还有一个非常重要的 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”
是不够准确的。
- 最后把四个协议/机制放在一起
你现在应该形成这个框架:
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。
- 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
- 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 可以实现高性能转发的一个重要原因。
- 整个流程总结
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?
这个问题非常关键。我们把它分成两部分讲。
- 为什么 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。
- 为什么 Spine 特别适合做 Directory?
ACI 的 Spine 是 Fabric 的中心层。
从任何 Leaf 到任何 Spine,都只有一跳:
Leaf A
│
├──── Spine 1
├──── Spine 2
└──── Spine 3
因此:
Leaf 很容易访问 COOP
查询路径非常短
可以使用多台 Spine 提供冗余
不需要 Leaf-to-Leaf 控制平面全互联
所以逻辑上:
Leaf 是“数据来源”,Spine 是“目录中心”。
- 多台 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 上。
- 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”。
- 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 之间传播。
- 什么叫 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。
- 为什么 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。
- 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 都收到。
- BD 和 VLAN 不完全是一回事
传统网络你可能习惯:
VLAN 10
↓
Broadcast Domain
ACI 里更重要的是:
Bridge Domain
↓
Subnet
↓
Flooding / Forwarding Domain
例如:
Tenant
└── VRF
└── BD-10
└── Subnet 10.1.1.0/24
BD 定义了一个二层转发域。
- 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。
- 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 细节。
- 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 行为。
- 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 流量不会无意义地到处复制。
- 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”。
这点非常重要。
- 为什么 ACI 要做这些优化?
因为如果完全按照传统二层网络:
Host A ARP
│
▼
所有 Leaf
│
▼
所有 Host
规模一大,问题非常严重。
假设:
500 Leaf
100,000 Endpoints
大量 ARP:
ARP
↓
Flood
↓
500 Leaf
↓
100,000 Hosts
会造成非常严重的 BUM 压力。
ACI 的设计目标就是:
尽量把 Endpoint 信息变成已知状态,然后让后续流量尽量走 Unicast VXLAN。
- 这就把 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 传播”。
- 最后给你一个非常重要的判断方法
以后看到一个 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 等机制参与。
- 先看最重要的一张图
假设:
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 的概念。
- 那 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。
- PIM 在这里干什么?
这就是你刚才问的重点。
PIM(Protocol Independent Multicast) 是 Underlay Multicast 的控制协议之一。
它的作用不是:
“告诉我 Host A 在哪个 Leaf。”
那是 COOP/Endpoint Learning 负责的。
PIM 解决的是:
“这个 Multicast 流量的树应该怎么建立?”
所以要把两个问题严格分开:
COOP
│
└── Endpoint 在哪里?
PIM / Multicast
│
└── Multicast/BUM 流量怎么沿着 Tree 传播?
这是两个完全不同的问题。
- 一个非常直观的类比
假设:
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 是“怎么送”。
- 为什么不能直接用普通 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 的经典配合。
- 完整走一次 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。
- 这里 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。
- 但是还有一个非常重要的 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”
是不够准确的。
- 最后把四个协议/机制放在一起
你现在应该形成这个框架:
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 中传播。
- 为什么 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
来阻止二层环路。
- 那 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 控制协议帧。
- 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
这些概念。
- 一个非常典型的例子
假设:
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 自己的转发模型已经不同。
- 特别重要:ACI 不等于“完全不支持 STP”
这是很多人学习 ACI 时容易产生的误解。
正确说法应该是:
ACI Fabric 内部不依赖 STP,但 ACI 可以与外部运行 STP 的网络互操作。
所以你可以看到:
External Network
│
STP
│
▼
ACI Leaf
│
│
▼
ACI Fabric
STP 的边界通常是在:
External Network ↔ ACI Leaf
而不是:
Leaf ↔ Spine
- 那 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 有专门处理。
- 那 BPDU Guard 是干什么?
这个你可能会马上想到。
假设:
ACI Leaf
│
│ Access Port
▼
普通终端
你本来认为:
这个接口后面应该是一台 Host。
结果 Host 接了一台 Switch:
Leaf
│
└── Switch
│
└── 发 BPDU
如果接口配置了:
BPDU Guard
那么收到 BPDU 时:
BPDU
↓
BPDU Guard
↓
Port Protection / Error-disable
目的就是:
防止有人把交换机偷偷接到本应该是 Host 的端口上。
- BPDU Filter 又是什么?
BPDU Filter 和 Guard 不一样。
简单理解:
BPDU Guard
收到 BPDU
↓
认为有问题
↓
保护接口
BPDU Filter
不希望这个接口参与 BPDU 发送/接收处理
所以:
Guard = 收到 BPDU → 惩罚/保护
Filter = 过滤 BPDU
具体行为还取决于 Cisco ACI 的接口策略和端口类型,不能简单把传统 IOS/NX-OS 的所有 STP 行为一比一套进 ACI。
- 还有一个非常关键的概念: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 的方式处理。
-
你可以记住一个非常实用的判断
ACI Fabric 内部:
Leaf ─── Spine ─── Leaf
L3 UnderlayIS-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 流量有什么区别。
- 先建立一个真实拓扑
假设:
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
这就是普通业务流量。
- 但是 BPDU 完全不一样
SW1 可能周期性发送:
STP BPDU
目标 MAC 通常是:
01:80:C2:00:00:00
这是一个 IEEE 802.1D STP Reserved MAC。
它不是普通的:
FF:FF:FF:FF:FF:FF
所以不要把它简单理解为普通 Broadcast。
- 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 转发。
- 这一点非常重要
你前面已经理解了:
COOP
↓
Endpoint Location
那么这里:
BPDU
↓
不是 Endpoint
↓
不会注册到 COOP
也就是说你不会看到:
COOP:
01:80:C2:00:00:00
↓
Leaf A
这是完全不同的东西。
- 为什么?
因为 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。
- 那 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 的设计目标。
- 这时候你应该想到一个问题
如果:
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
这些配置。
- 一个非常重要的设计思想
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 接入端口的二层控制环境中。
- BPDU Filter 则是另一种思路
BPDU Filter 更像:
BPDU
↓
Filter
↓
不要让它参与正常 BPDU 处理
所以:
BPDU Guard
= “你不应该发 BPDU,发了我就保护接口”
BPDU Filter
= “我不希望这个接口处理/发送 BPDU”
这两个概念千万不要混。
- 再回到 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。”
- 现在把 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
虽然都可能被粗略归为“二层特殊流量”,但是处理逻辑完全不同。
- 最后一个很重要的坑
你刚才一直在问:
“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”。
浙公网安备 33010602011771号