以同网段的 VM 间互通简单介绍 VXLAN 网络中的报文转发过程。
- VM1 发送目的地址为 VM2 的报文。
- VTEP1 收到该报文后进行 VXLAN 封装,封装的外层目的 IP 为 VTEP2。封装后的报文,根据外层 MAC 和 IP 信息,在 IP 网络中进行传输,直至到达对端VTEP2。
- VTEP2 收到报文后,对报文进行解封装,得到 VM1 发送的原始报文,然后将其转发至VM2。
二层 MAC 学习及 BUM 报文转发- 二层MAC学习
在 VXLAN 网络中,同子网虚拟机的互通是通过查找 MAC表进行转发。如下图所示,VM1 给 VM2 发送报文时,经过 VTEP1 转发,VTEP1 上需要学习到 VM2 的 MAC 地址。
最初的 VXLAN 标准并没有定义控制平面,VTEP 之间无法传递学习到的主机 MAC 地址。但是 VXLAN 有着与传统以太网非常相似的 MAC 学习机制,当 VTEP 接收到VXLAN 报文后,会记录源 VTEP 的 IP、虚拟机 MAC 和 VNI 到本地 MAC 表中,这样当 VTEP 接收到目的 MAC 为此虚拟机的 MAC 时,就可以进行 VXLAN 封装并转发。
以 VTEP2 学习到 VM1 的 MAC 过程为例:
- VM1 发送目的地址为 VM2 的报文。
- VTEP1 接收到报文后,进行 VXLAN 封装,并将其转发至 VTEP2。同时,VTEP1可以学习到 VM1 的 MAC 地址、VNI、入接口。
- VTEP2 接收到报文后,对报文进行解封装。同时,VTEP2 可以学习到 VM1 的MAC 地址、VNI、入接口(为 VTEP1)。
经过上述流程,VTEP1 和 VTEP2 可以学习到 VM1 的 MAC 地址。VTEP1 和 VTEP2学习到 VM2 的 MAC 地址过程与之类似。
- BUM 报文转发
前面描述的报文转发过程都是已知单播报文转发,如果 VTEP 收到一个未知地址的BUM 报文(广播、组播、未知单播)如何处理呢。与传统以太网 BUM 报文转发类似,VTEP 会通过泛洪的方式转发流量。
以上图中 VM1 想向 VM2 发送报文为例,因为 VM1 不知道VM2 的 MAC 地址,所以会发送 ARP 广播报文请求 VM2 的 MAC 地址。
- VM1 发送 ARP 广播请求,请求 VM2 的 MAC地址。
- VTEP1 收到 ARP 请求后,因为是广播报文,VTEP1 会在该 VNI 内查找所有的隧道列表,依据获取的隧道列表进行报文封装后,向所有隧道发送报文,从而将报文转发至同子网的 VTEP2 和 VTEP3。
- VTEP2 和 VTEP3 接收到报文后,进行解封装,得到 VM1 发送的原始 ARP报文,然后转发至 VM2 和 VM3。
- VM2 和 VM3 接收到 ARP 请求后,比较报文中的目的 IP 地址是否为本机的IP地址。VM3 发现目的 IP 不是本机 IP,故将报文丢弃;VM2 发现目的 IP 是本机IP,则对 ARP 请求做出应答。
由于此时 VM2 上已经学习到了 VM1 的 MAC 地址,所以 ARP 应答报文为已知单播报文,转发流程与前文描述的一致,此处不在赘述。
- VM1 收到 VM2 的 ARP 应答后,就可以学习到VM2的MAC 地址。后续的转发流程同已知单播转发流程一致。