一、VxLAN 将二层数据帧封装为 UDP 包


含义:

  • Outer MAC destination address (MAC address of the tunnel endpoint VTEP)
  • Outer MAC source address (MAC address of the tunnel source VTEP)
  • Outer IP destination address (IP address of the tunnel endpoint VTEP)
  • Outer IP source address (IP address of the tunnel source VTEP)
  • Outer UDP header:Src port 往往用于 load balancing,下文有提到;Dst port 即 VXLAN Port,默认值为 4789.
  • VNID:表示该帧的来源虚机所在的 VXLAN 网段的 ID

特点:

  • VNID: 24-bits,最大 16777216。每个不同的 24-bits VNI 代表一个 VXLAN 网段。只有同一个网段中的虚机才能互相通信。
  • VXLAN Port:目的 UDP 端口,默认使用 4789 端口。用户可以自己配置。
  • 两个VTEP 之间的 VXLAN tunnels 是无状态的。
  • VTEP 可以在虚拟交换机上,物理交换机或者物理服务器上通过软件或者硬件实现。
  • 使用多播来传送未知目的的、广播或者多播帧。
  • VTEP 不可以对 VXLAN 包分段。

二、VTEP 寻址

一个 VTEP 可以管理多个 VXLAN 隧道,每个隧道通向不同的目标。那 VTEP 接收到一个二层帧后,它怎么根据二层帧中的目的 MAC 地址找到对应的 VXLAN 隧道呢?VXLAN 利用了多播和 MAC 地址学习技术。如果它收到的帧是个广播帧比如 ARP 帧,也会经过同样的过程。

以下图为例,每个 VTEP 包含两个 VXLAN 隧道。VTEP-1 收到二层 ARP 帧1(A 要查找 B 的 MAC) 后,发出一个 Dst IP 地址为VTEP多播组 239.1.1.1 的 VXLAN 封装 UDP 包。该包会达到 VTEP-2 和 VTEP-3。VTEP-3 收到后,因为目的 IP 地址不在它的范围内,丢弃该包,但是学习到了一条路径:MAC-A,VNI 10,VTEP-1-IP,它知道要到达 A 需要经过 VTEP-1 了。VTEP-2 收到后,发现目的 IP 地址是机器 B,交给 B,同时添加学习到的规则 MAC-A,VNI 10,VTEP-1-IP。B 发回响应帧后,VTEP-2 直接使用 VTEP-1 的 IP 直接将它封装成三层包,通过物理网络直接到达 VTEP-1,再由它交给 A。VTEP-1 也学习到了一条规则 MAC-B,VNI 10,VTEP-2-IP。

三、VxLAN 组网

  • 逻辑 VxLAN Tunnel:建立在物理的 VxLAN 网络之上,向虚机提供虚拟的二层网络,以 VNID 做区分。
  • VTEP(VxLAN Tunnel End Point):对虚机的二层包封装和解封。

四、数据流向


发送端:

  1. 计算目的地址:Linux 内核在发送之前会检查数据帧的目的MAC地址,需要选择目的 VTEP。

    • 如果是广播或者多播地址,则使用其 VNI 对应的 VXLAN group 组播地址,该多播组内所有的 VTEP 将收到该多播包;
    • 如果是单播地址,如果 Linux 的 MAC 表中包含该 MAC 地址对应的目的 VTEP 地址,则使用它;
    • 如果是单播地址,但是 LInux 的 MAC 表中不包含该 MAC 地址对应的目的 VTEP IP,那么使用该 VNI 对应的组播地址。
  2. 添加Headers:依次添加 VXLAN header,UDP header,IP header。

接收端:

  1. UDP监听:因为 VXLAN 利用了 UDP,所以它在接收的时候势必须要有一个 UDP server 在监听某个端口,这个是在 VXLAN 初始化的时候完成的。
  2. IP包剥离:一层一层剥离出原始的数据帧,交给 TCP/IP 栈,由它交给虚机。

5、 Open vSwitch 实现的 VxLAN VTEP

从上面的基础知识部分,我们知道 VTEP 不只是实现包的封装和解包,还包括:

  1. ARP 解析:需要尽量高效的方式响应本地虚机的 ARP 请求

  2. 目的 VTEP 地址搜索:根据目的虚机的 MAC 地址,找到它所在机器的 VTEP 的 IP 地址

通常的实现方式包括:

  1. 使用 L3 多播

  2. 使用 SDN 控制器(controller)来提供集中式的 MAC/IP 对照表

    (一个基于 Linuxbrige + VxLAN + Service Node 的集中式 Controller node 解决 VNI-VTEP_IPs 映射的提议,替代L3多播和广播,来源: 20140520-dlapsley-openstack-summit-vancouver-vxlan-v0-150520174345-lva1-app6891.pptx)

  3. 在VTEP本地运行一个代理(agent),接收(MAC, IP, VTEP IP)数据,并提供给 VTEP

那 Open vSwitch 是如何实现这些功能需求的呢?

  1. 在没有启用 l2population 的情况下,配置了多播就使用多播,没的话就使用广播

  2. 在启用 l2population 的情况下,在虚机 boot 以后,通过 MQ 向用于同网络虚机的节点上的 l2population driver 发送两种数据,再将数据加入到 OVS 流表

    1. FDB (forwarding database): 目的地址-所在 VTEP IP 地址的对照表,用于查找目的虚机所在的 VTEP 的 IP 地址
    2. 虚机 IP 地址 - MAC 地址的对照表,用于响应本地虚机的 ARP 请求

6、VXLAN为什么选择SDN

VXLAN的标准协议目前只定义了转发平面流程,对于控制平面目前还没有协议规范,所以目前业界有三种定义VXLAN控制平面的方式。

  1. 方式1:组播。由物理网络的组播协议形成组播表项,通过手工将不同的VXLAN与组播组一一绑定。VXLAN的报文通过绑定的组播组在组播对应的范围内进行泛洪。简单来说,和VLAN方式的组播泛洪和MAC地址自学习基本一致。区别只是前者在三层网络中预定义的组播范围内泛洪,而后者是在二层网络中指定VLAN范围内泛洪。这种方式的优点是非常简单,不需要做协议扩展。但缺点也是显而易见的,需要大量的三层组播表项,需要复杂的组播协议控制。显然,这两者对于传统物理网络的交换机而言,都是巨大的负荷和挑战,基本很难实现。同时,这种方式还给网络带来大量的组播泛洪流量,对网络性能有很大的影响。

  2. 方式2:自定义协议。通过自定义的邻居发现协议学习Overlay网络的拓扑结构并建立隧道管理机制。通过自定义(或扩展)的路由协议透传Overlay网络的MAC地址(或IP地址)。通过这些自定义的协议可以实现VXLAN控制平面转发表项的学习机制。这种方式的优点是不依赖组播,不存在大量的组播泛洪报文,对网络性能影响很小。缺点是通过邻居发现协议和路由协议控制所有网络节点,这样网络节点的数量就受到协议的限制。换句话说,如果网络节点的数量超过一定范围,就会导致对应的协议(例如路由协议)运行出现异常。这一点在互联网行业更加明显,因为互联网行业云计算的基本特征就是大规模甚至超大规模。尤其是在vSwitch上运行VXLAN自定义路由协议,其网络节点数量可以达到几千甚至上万个,没有路由协议可以支持这种规模的网络。

  3. 方式3:SDN控制器。通过SDN控制器集中控制VXLAN的转发,经由Openflow协议下发表项是目前业界的主流方式。这种方式的优点是不依赖组播,不对网络造成负荷;另外,控制器通过集群技术可以实现动态的扩容,所以可以支持大规模甚至超大规模的VXLAN网络。当然,SDN控制器本身的性能和可靠性决定了全网的性能和可靠性,所以如何能够提高控制器的性能和可靠性就是核心要素。

原文链接:https://www.cnblogs.com/sammyliu/p/4627230.html

OVS对VXLAN解封包(二)相关推荐

  1. OVS 非VXLAN的收发包调用栈(二十二)

    非VXLAN的收发包调用栈 netdev_frame_hook()netdev_port_receive()ovs_vport_receive()ovs_dp_process_packet()(在查表 ...

  2. javaStruct - 通讯协议的解封包第三方库--(二)官方文档二

    原文链接 https://code.google.com/archive/p/javastruct/ 翻译用工具 翻译使用的是个人免费版Transmate 译文 简介 当与嵌入式设备和其他使用C语言样 ...

  3. OpenStack OVS GRE/VXLAN

    https://www.jianshu.com/p/0b52de73a4b3 OpenStack OVS GRE/VXLAN网络 学习或者使用OpenStack普遍有这样的现象:50%的时间花费在了网 ...

  4. Go 函数,包(二)

    #### Go 函数,包(二)***百丈峰,松如浪,地势坤,厚德载物之像*** 今天又到周五啦,你们有没有激动呢,反正我很激动,又有两天的自由了; 上一节我们学习了Go 的函数和包的一些知识 , 今天 ...

  5. javaStruct - 通讯协议的解封包第三方库--(二)官方文档三

    原文链接 https://code.google.com/archive/p/javastruct/wikis/example_photoshop_acb_file_reader_writer.wik ...

  6. javaStruct - 通讯协议的解封包第三方库--(二)官方文档一

    原文链接 https://code.google.com/archive/p/javastruct/ 翻译用工具 翻译使用的是个人免费版Transmate 译文 javastruct 一个将java对 ...

  7. OVS对VXLAN报文解封包

    VXLAN的全称为Virtual eXtensible LAN,从名称看,它的目标就是扩展VLAN协议.802.1Q的VLAN TAG只占12位,只能提供4096个网络标识符.而在VXLAN中,标识符 ...

  8. OVS原理(四十二)

    一.OVS原理 1.OVS架构 ovs的架构如上图所示,主要由内核datapath和用户空间的vswitchd.ovsdb组成. 2.主要模块职责 ovs-vswitchd 主要模块,实现vswitc ...

  9. 一方包,二方包,三方包的区别

    一方包(也称一方库): 本工程中的各模块的相互依赖 二方包(也称二方库): 公司内部的依赖库,一般指公司内部的其他项目发布的jar包 三方包(也称三方库): 公司之外的开源库, 比如apache.ib ...

最新文章

  1. 伊利诺伊香槟分校计算机科学,伊利诺伊大学香槟分校计算机科学与工程世界排名2019年最新排名第24(ARWU世界排名)...
  2. Windows RabbitMQ 命令
  3. audiorecord怎么释放_Android 开发 AudioRecord音频录制
  4. JBoss7的启动时间
  5. 机械臂中的四元素转为旋转矩阵_雅克比矩阵(上)雅克比推导
  6. flask笔记3-模板
  7. orabbix监控oracle11g,zabbix利用orabbix监控oracle(详细配置图解)
  8. 您可能(或可能不)知道的5条便捷的Transact-SQL技巧
  9. java之备忘录模式,java设计模式之备忘录模式
  10. 远在美国的凤姐为何选择回国理財?
  11. 怎么用最短时间高效而踏实地学习Linux?
  12. 服务器Linux系统下常见的软件包有哪些
  13. Matlab 制作常用图片的代码
  14. win10右键删除多余菜单
  15. 千兆SFP光模块可以在万兆SFP+端口上使用吗?
  16. 如果把编程语言比作是一件武器……
  17. starUML建立模型及生成代码框架
  18. Linux---虚拟机安装Linux系统与联网实现
  19. 【Abp VNext】实战入门(四):Windows系统服务制作
  20. 躺赚,每天自动签到30多个应用,你也可以

热门文章

  1. 重庆python就业工资待遇-重庆python培训多少钱?
  2. python培训比较好的机构-python哪家的培训比较好?
  3. python详细安装教程linux-Python 环境安装步骤
  4. python常用知识点总结-Python常用知识点汇总
  5. python装饰器实例-Python装饰器原理与简单用法实例分析
  6. python从入门到精通视频-python从入门到精通视频(大全60集)
  7. python3.8.5 run-Python 3.8.5 正式发布
  8. python编程案例教程书籍-Python程序设计案例教程
  9. python语音在线编辑-Python如何实现文本转语音
  10. python基础知识面试题-python基础知识的重点面试题