在配置了网络虚拟化(Overlay)的网络结构中,处于Overlay网络中的虚机数据包的封装和MAC地址学习和传统物理网络(Underlay)相似又不尽相同。除了我们了解Overlay网络需要借助Underlay网络进行二次封装之外,其MAC地址学习过程也相对要曲折一些。这些MAC地址学习过程取决于多种因素:

  1. 虚机是否在同一虚拟子网?

  2. 虚机是否在同一虚机网络的不同虚拟子网?

  3. 虚机是否运行于同一台物理机?

  4. 虚机是否运行在不同的物理机?

不同的场景,虚机之间学习对方的MAC地址,以及在互相学习到对方的MAC地址后何封装数据包都不尽相同?接下来我们详细分析以下5种不同场景:

  1. 虚机在同一虚拟子网(VSID相同),运行在同一台主机;

  2. 虚机在同一虚机网络的不同虚拟子网里(RDID相同,VSID不同),运行在同一台主机;

  3. 虚机在同一虚机网络的不同虚拟子网里(RDID相同,VSID不同),运行在不同的主机;

  4. 虚机在同一虚拟子网(VSID相同),运行在不同主机,未启用动态地址学习;

  5. 虚机在同一虚拟子网(VSID相同),运行在不同主机,启用了动态地址学习;

 

在上文(http://ichbinleo.blog.51cto.com/11948851/1942694)中讨论了SDN Overlay 网络中虚机数据包的转发的三个场景1),2)和3),今天我们将继续讨论第4)和第5)个场景。有关于微软网络虚拟化HNV的相关概念,如RDID、VSID、虚机网络、虚拟子网、默认网关等,可以参考http://ichbinleo.blog.51cto.com/11948851/1902265 和http://ichbinleo.blog.51cto.com/11948851/1903866  进一步了解 。

 

本文我们接着第4)个场景,如图1所示。我们在一个虚拟子网里创建了两台虚机,分配了同一个子网(192.168.188.0/24)的IP地址:

VM1的IP地址为192.168.188.2,MAC地址为MACvm1

VM2的IP地址为192.168.188.3,MAC地址为MACvm2

wKiom1lZ9bDwUlHbAAL5W241OiA118.jpg-wh_50                            

此刻,这两台虚机VM1VM2运行在不同的物理服务器,未启用动态IP地址学习,那么VM1VM2之间如何学习对方的MAC地址以及在互相学习到对方的MAC地址后如何封装数据包呢?接下来我们详细地分析这一场景的数据包转发流。

  1. VM1要和VM2通信,需要学习到对方的MAC地址。因此,VM1发送ARP消息查询 VM2     的MAC地址。

  2. Hyper-V虚拟交换机广播ARP到:

    1. 所有在本地且VSID为11111的虚机

    2. HNVFilter

  3. HNV     Filter将ARP响应转发给VM1,VM1学习到VM2的MAC地址是MACVM2

  4. VM1封装原始数据包,目的IP是VM2的IP地址,目的MAC地址为MACvm2。

  5. 原始数据包发送到VM1所在的物理机的Hyper-V虚拟交换机,虚拟交换机获取到VM1所包含的VSID为11111。

  6. Hyper-V虚拟交换机看到MACVM2并不在本地Hyper-V虚拟交换机的记录中,于是将数据包发送给HNV Filter。

  7. HNV     Filter检索查找记录,获得目标虚机的VSID是11111,CA地址为192.168.188.3,目标MAC地址为MACVM2,以及对应的PA地址。然后将这些获取到的信息和原始数据包使用NVGRE/VXLAN进行二次封装。

  8. 二次封装的数据包通过传输网络发送到目标虚机所在的Hyper-V物理机。

  9. IP地址为10.2.41.206以及MAC地址为MACPA2的Hyper-V物理机接收到数据包,然后发送到自己虚拟交换机的HNV Filter。

  10. HNV     Filter拆开封装的包,获取到内原始数据包以及包含了VSID为11111的OOB数据。

  11. HNV     Filter将原始数据包发送到具有VSID为11111的Hyper-V虚拟交换机。

  12. Hyper-V虚拟交换机按照访问控制策略将IP数据包发送到目标虚机VM2。

 

注意:这种场景描述了NVGRE/VXLAN二次封装的过程和较为完整的HNV工作流程,我们需要强调几点:

如果没有启用动态IP地址学习,即使目标虚机不在本地Hyper-V主机上,ARP也是由HNVFilter处理而不会广播到虚拟交换机以外的网络。

在物理链路(也即传输网络)上,物理网络基于外部数据包(PA地址和物理机MAC地址)转发数据包,物理链路对内部原始数据包(CA IP地址和MAC地址)没有察觉。

数据包通过NVGRE/VXLAN进行二次封装,但是封装对于源虚机和目标虚机来说完全是透明的,意味着虚机不能感知到数据的二次封装和拆封。

 

我们接着第5)个场景,如图2所示。我们在一个虚拟子网里创建了两台虚机,分配了同一个子网(192.168.188.0/24)的IP地址:

VM1IP地址为192.168.188.2MAC地址为MACvm1

VM2IP地址为192.168.188.3MAC地址为MACvm2

wKioL1lZ9c3QLk_GAAMoIfBdGl4201.jpg-wh_50

此刻,这两台虚机VM1VM2运行在不同的物理服务器,和第4个场景不同的是,在VM之间首次通信时,需要启用动态IP地址学习以补充CAPA以及MAC地址查询表,在有了该查询表以后,虚机之间的通信就和场景4)一样了。

那么,这种场景下VM1VM2之间如何学习对方的MAC地址以及在互相学习到对方的MAC地址后如何封装数据包呢?接下来我们详细地分析这一场景的数据包转发流。

  1. VM1要和VM2通信,需要学习到对方的MAC地址。因此,VM1发送ARP消息查询     VM2 的MAC地址。

  2. Hyper-V虚拟交换机广播ARP到:

    1. 所有在本地且VSID为11111的虚机

    2. HNVFilter

  3. 但是,HNV Filter在查询表里并未找到 VM2的MAC地址

  4. 于是,HNV 封装一个ARP请求数据包,然后单播到每个PA地址,数据包里包含 VSID=111111的OOB数据和相关的L2记录。

  5. HNV     Filter将ARP请求数据包通过NVGRE/VXLAN进行二次封装。

  6. 二次封装的数据包通过传输网络传输到目的Hyper-V物理机。

  7. IP地址为10.2.41.206以及MAC地址为MACPA2的Hyper-V物理机接收到数据包,然后将其发送到自己的HNV Filter。

  8. 目的物理机的HNV Filter拆开二次封装的数据包,获取到即原始数据包以及包含了VSID为11111的OOB数据。

  9. HNV     Filter将原始数据包发送到具有VSID为11111的Hyper-V虚拟交换机。

  10. Hyper-V虚拟交换机按照访问控制策略将原始数据包(也即ARP请求数据包)发送到目标虚机。

  11. 如果目的虚机网卡和ARP所请求的MAC地址匹配,那么虚拟将将ARP应答发送给Hyper-V虚拟交换机。

  12. Hyper-V虚拟交换机同时附加上VSID为11111的OOB数据    

  13. 因为该ARP响应数据包不是发送给本地虚机,所以Hyper-V虚拟交换机将ARP请求直接传递给HNV Filter。

  14. HNV     Filter看到该ARP数据包后如果发现CA的MAC/IP地址和PA的MAC/IP地址对动态IP记录不存在,便会加上这条CA-PA配对记录。接着发送一条新动态记录的通知给VMM,以便VMM将更新的记录发送给其他Hyper-V主机。

  15. HNV     Filter在查找记录里找到目标虚机VM1的MAC地址(MACVM1),然后将ARP应答数据包通过NVGRE/VXLAN进行二次封装。

  16. 二次封装的数据包通过传输网发送到源虚机所在的Hyper-V物理机。

  17. IP地址为10.2.41.204以及MAC地址为MACPA1的Hyper-V物理机接收到数据包,然后发送到HNV Filter

  18. HNV     Filter拆开二次封装的数据包,获得原始数据包(也即ARP应答数据包),然后添加CA MAC/IP和PA MAC/IP动态地址对记录。接着发送一条新动态记录的通知给VMM,以便VMM将更新的记录发给其他Hyper-V主机。Hyper-V虚拟交换机接着将ARP应答数据包发送给VM1。

  19. 至此,VM1已经学习到VM2的MAC地址为MACVM2

  20. VM1封装原始数据包,目的IP地址为VM2的IP地址,目的MAC地址为MACvm2。

  21. 该数据包发送到Hyper-V虚拟交换机,虚拟交换机获取到源虚机(VM1)网卡上的VSID(11111),并将VSID信息组织为带外(OOB)数据。

  22. Hyper-V虚拟交换机看到MACVM2 并不在本地Hyper-V虚拟交换机上,因此将数据包传递给HNV Filter。

  23. HNV     Filter检索查找记录,获得目标虚机的VSID是11111,CA地址为192.168.188.3,目标MAC地址为MACVM2,以及对应的PA地址为10.2.41.206。然后将这些获取到的信息和原始数据包使用NVGRE/VXLAN进行二次封装。

  24. 二次封装的数据包通过传输网络发送到目的虚机(VM2)所在的Hyper-V物理机。

  25. IP地址为10.2.41.206以及MAC地址为MACPA2的Hyper-V物理机接收到数据包,然后发送到HNV Filter。

  26. HNV     Filter拆开二次封装的包,获取到原始数据包,以及包含了VSID 为11111的OOB数据。

  27. HNV     Filter将原始数据包转发到具有VSID为11111的Hyper-V虚拟交换机。

  28. Hyper-V虚拟交换机按照访问控制策略将原始数据包发送到目标虚机VM2。

 

注意:以上这个场景就是虚机在从未通信时,借助启用动态IP地址学习的特性进行MAC地址学习和转发数据包,我们需要强调以下几点:

在启用了动态IP地址学习后,HNV封装ARP请求数据包,ARP请求数据包通过单播进行传输,并且也需要通过NVGRE/VXLAN进行二次封装。

目的虚机在数据包流中生成实际ARP应答。

源和目的Hyper-V主机都没有CAMAC/IP和PA MAC/IP地址对,所以在数据包流发生过程中这些地址对动态查询将被添加,并通知VMM创建了新的查找记录。