VXLAN是一种mac in UDP的技术。简单讲就是传统的二层帧被封装到了UDP的package中。通过UDP的IP网络发送到目的地然后再解封装。 VXLAN 跟VLAN对比,最重要的一个概念就是VNI。 VLAN中一个VLAN tag对应一个广播域, VXLAN中一个VNI对应一个广播域。

传统VLAN中一次二层通信是这样的

1. VM 发送 ARP-req 到交换机
2. 交换机在VM对应的VLAN 端口内广播ARP-req, 同时记住 src_mac: switch_interface的映射
3. dest VM 收到ARP-req,发送ARP-res
4. 交换机收到ARP-res,记住 dst_mac:switch_interface,并发送ARP-res给 src VM
5. src VM 和 dst VM接下来通过交换机记住的mac表来做交换

而VXLAN中的一次二层通信是这样的

首先看一下 拓扑

src_vm - src_vtep - ... - dst_vtep - dst_vm

1. src_VM 发送ARP-req 请求,首先到src_VTEP,
2. src_VTEP
2.1 封装其为VXLAN包
2.2 因为src_vtep 不知道 dst_vtep 的ip,所以封装后的dst_ip为一个组播地址。所有的vtep都应该加入该组播地址。(这里还有一种做法应该也合理,就是并非所有VTEP都属于同一个组播地址,而是部分VNI映射到同一个组播地址,这样ARP查询就不用发送给所有的VTEP)
3. dst_vtep
3.1 收到ARP包,解封装后,学习 src_mac : src_vtep_ip的映射
3.2 发现其VNI在自己的管理范围内,于是进一步解封装转换成普通二层包,并在该二层内广播,ARP查询。 4. dst_vm 发送ARP-res 到 dst_vtep 5. dst_vtep 封装arp response,因为之前学习过src_mac:src_vtep_ip的映射,所以此时通过unicast的形式发送给src_vtep
6. src_vtep
6.1 学习dst_mac: dst_vtep_ip
6.2 解封装发现VNI在自己管理范围内,于是交给src_vm
7. src_vm收到arp response

在overlay的网络上,也就是寻找dst_vtep的时候,是组播。但是当dst_vtep收到vxlan包,解封装继续ARP查询的过程中。首先是根据vni转换成普通的二层包,然后在该二层内做广播查询。所以可见,vni是vxlan中的二层broadcast domain.

上文提到了VTEP。 可以理解VTEP负担着两项工作

1. 封装和解封装 VXLAN包

2. 寻找目标vtep

在VTEP 外,系统是不知道VXLAN的。

上面是VXLAN在寻找目标VM的一次data flow。 下面看一下 vm to vm的unicast data flow

拓扑还是如下:

src_vm - src_vtep ... dst_vtep - dst_vm

此时,src_vm 和 dst_vm 已经完成了ARP流程

1. src_vm 发送二层帧到 src_vtep
2. src_vtep
2.1 封装成vni
2.2 查看dst_mac:dst_vtep_ip 的映射
3.3 转发给 dst_vtep
3. dst_vtep
解封装
发送给vm
4. vm收到 src 发送的二层帧

到了这里,我们已经看了vxlan的单播和组播学习过程。其实现在可以回答之前的两个问题:

为什么vxlan可以减少TOR负担

之前 TOR中记录的信息如下:

vm_mac1: interface1
vm_mac2: interface2
...

现在的TOR,要看vtep在哪里。如果 vtep在TOR上面,那么TOR还是会记录很多信息,但如果 VTEP是在机柜的每一台服务器上,那么TOR仅需要记录

vtep_mac1: interface
vtep_mac2: interface

vtep 很显然会比vm少很多。

为什么VXLAN中的vm可以跨dc

因为vxlan的下面是ip网络。ip网络当然可以跨dc

最新文章

  1. JavaMail和James的秘密花园
  2. CWMP开源代码研究2——easycwmp安装和学习
  3. Mac下设置系统PATH
  4. sort将文件的每一行作为一个单位按ASCII码值进行比较
  5. python 数据结构之单链表的实现
  6. mtk android lcm调试
  7. PSYoungGen /PSOldGen/PSPermGen区别
  8. 二叉搜索树算法详解与Java实现
  9. UILabel,文字添加下划线,中划线
  10. emacs打开乱码解决办法
  11. DynamicObject扩展--实现JSON和DynamicObject的序列化与反序列化
  12. HDU 5056
  13. 解决 'boost/iterator/iterator_adaptor.hpp' file not found’ 及控制台":CFBundleIdentifier", Does Not Exist
  14. java14周
  15. 第一个VS2015 Xaramin Android项目(终)
  16. JMeter中BeanShell的实际应用
  17. HTTP 500 Invalid bound statement错误
  18. 日常英语---十四、Dolce & Gabbana cancels China show amid 'racist' ad controversy(adj.温柔的,prep.在其中)
  19. Delphi如何在Form的标题栏绘制自定义文字
  20. Fiddler实现手机抓包——小白入门(转载csdn)

热门文章

  1. js最高效的数组去重方法
  2. systemverilog之OOP
  3. perl学习之argument
  4. Mysql 随机函数 rand()
  5. 文件的软硬链接& 文件编辑vi和vim
  6. xshell连接linux
  7. go 本地安装 grpc-go
  8. Python开发:面向对象
  9. ython——杂货铺
  10. rocketmq 问题