OVS对VXLAN解封包(二)
一、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):对虚机的二层包封装和解封。
四、数据流向
发送端:
- 计算目的地址:Linux 内核在发送之前会检查数据帧的目的MAC地址,需要选择目的 VTEP。
- 如果是广播或者多播地址,则使用其 VNI 对应的 VXLAN group 组播地址,该多播组内所有的 VTEP 将收到该多播包;
- 如果是单播地址,如果 Linux 的 MAC 表中包含该 MAC 地址对应的目的 VTEP 地址,则使用它;
- 如果是单播地址,但是 LInux 的 MAC 表中不包含该 MAC 地址对应的目的 VTEP IP,那么使用该 VNI 对应的组播地址。
- 添加Headers:依次添加 VXLAN header,UDP header,IP header。
接收端:
- UDP监听:因为 VXLAN 利用了 UDP,所以它在接收的时候势必须要有一个 UDP server 在监听某个端口,这个是在 VXLAN 初始化的时候完成的。
- IP包剥离:一层一层剥离出原始的数据帧,交给 TCP/IP 栈,由它交给虚机。
5、 Open vSwitch 实现的 VxLAN VTEP
从上面的基础知识部分,我们知道 VTEP 不只是实现包的封装和解包,还包括:
ARP 解析:需要尽量高效的方式响应本地虚机的 ARP 请求
目的 VTEP 地址搜索:根据目的虚机的 MAC 地址,找到它所在机器的 VTEP 的 IP 地址
通常的实现方式包括:
使用 L3 多播
使用 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)在VTEP本地运行一个代理(agent),接收(MAC, IP, VTEP IP)数据,并提供给 VTEP
那 Open vSwitch 是如何实现这些功能需求的呢?
在没有启用 l2population 的情况下,配置了多播就使用多播,没的话就使用广播
在启用 l2population 的情况下,在虚机 boot 以后,通过 MQ 向用于同网络虚机的节点上的 l2population driver 发送两种数据,再将数据加入到 OVS 流表
- FDB (forwarding database): 目的地址-所在 VTEP IP 地址的对照表,用于查找目的虚机所在的 VTEP 的 IP 地址
- 虚机 IP 地址 - MAC 地址的对照表,用于响应本地虚机的 ARP 请求
6、VXLAN为什么选择SDN
VXLAN的标准协议目前只定义了转发平面流程,对于控制平面目前还没有协议规范,所以目前业界有三种定义VXLAN控制平面的方式。
方式1:组播。由物理网络的组播协议形成组播表项,通过手工将不同的VXLAN与组播组一一绑定。VXLAN的报文通过绑定的组播组在组播对应的范围内进行泛洪。简单来说,和VLAN方式的组播泛洪和MAC地址自学习基本一致。区别只是前者在三层网络中预定义的组播范围内泛洪,而后者是在二层网络中指定VLAN范围内泛洪。这种方式的优点是非常简单,不需要做协议扩展。但缺点也是显而易见的,需要大量的三层组播表项,需要复杂的组播协议控制。显然,这两者对于传统物理网络的交换机而言,都是巨大的负荷和挑战,基本很难实现。同时,这种方式还给网络带来大量的组播泛洪流量,对网络性能有很大的影响。
方式2:自定义协议。通过自定义的邻居发现协议学习Overlay网络的拓扑结构并建立隧道管理机制。通过自定义(或扩展)的路由协议透传Overlay网络的MAC地址(或IP地址)。通过这些自定义的协议可以实现VXLAN控制平面转发表项的学习机制。这种方式的优点是不依赖组播,不存在大量的组播泛洪报文,对网络性能影响很小。缺点是通过邻居发现协议和路由协议控制所有网络节点,这样网络节点的数量就受到协议的限制。换句话说,如果网络节点的数量超过一定范围,就会导致对应的协议(例如路由协议)运行出现异常。这一点在互联网行业更加明显,因为互联网行业云计算的基本特征就是大规模甚至超大规模。尤其是在vSwitch上运行VXLAN自定义路由协议,其网络节点数量可以达到几千甚至上万个,没有路由协议可以支持这种规模的网络。
方式3:SDN控制器。通过SDN控制器集中控制VXLAN的转发,经由Openflow协议下发表项是目前业界的主流方式。这种方式的优点是不依赖组播,不对网络造成负荷;另外,控制器通过集群技术可以实现动态的扩容,所以可以支持大规模甚至超大规模的VXLAN网络。当然,SDN控制器本身的性能和可靠性决定了全网的性能和可靠性,所以如何能够提高控制器的性能和可靠性就是核心要素。
原文链接:https://www.cnblogs.com/sammyliu/p/4627230.html
OVS对VXLAN解封包(二)相关推荐
- OVS 非VXLAN的收发包调用栈(二十二)
非VXLAN的收发包调用栈 netdev_frame_hook()netdev_port_receive()ovs_vport_receive()ovs_dp_process_packet()(在查表 ...
- javaStruct - 通讯协议的解封包第三方库--(二)官方文档二
原文链接 https://code.google.com/archive/p/javastruct/ 翻译用工具 翻译使用的是个人免费版Transmate 译文 简介 当与嵌入式设备和其他使用C语言样 ...
- OpenStack OVS GRE/VXLAN
https://www.jianshu.com/p/0b52de73a4b3 OpenStack OVS GRE/VXLAN网络 学习或者使用OpenStack普遍有这样的现象:50%的时间花费在了网 ...
- Go 函数,包(二)
#### Go 函数,包(二)***百丈峰,松如浪,地势坤,厚德载物之像*** 今天又到周五啦,你们有没有激动呢,反正我很激动,又有两天的自由了; 上一节我们学习了Go 的函数和包的一些知识 , 今天 ...
- javaStruct - 通讯协议的解封包第三方库--(二)官方文档三
原文链接 https://code.google.com/archive/p/javastruct/wikis/example_photoshop_acb_file_reader_writer.wik ...
- javaStruct - 通讯协议的解封包第三方库--(二)官方文档一
原文链接 https://code.google.com/archive/p/javastruct/ 翻译用工具 翻译使用的是个人免费版Transmate 译文 javastruct 一个将java对 ...
- OVS对VXLAN报文解封包
VXLAN的全称为Virtual eXtensible LAN,从名称看,它的目标就是扩展VLAN协议.802.1Q的VLAN TAG只占12位,只能提供4096个网络标识符.而在VXLAN中,标识符 ...
- OVS原理(四十二)
一.OVS原理 1.OVS架构 ovs的架构如上图所示,主要由内核datapath和用户空间的vswitchd.ovsdb组成. 2.主要模块职责 ovs-vswitchd 主要模块,实现vswitc ...
- 一方包,二方包,三方包的区别
一方包(也称一方库): 本工程中的各模块的相互依赖 二方包(也称二方库): 公司内部的依赖库,一般指公司内部的其他项目发布的jar包 三方包(也称三方库): 公司之外的开源库, 比如apache.ib ...
最新文章
- 伊利诺伊香槟分校计算机科学,伊利诺伊大学香槟分校计算机科学与工程世界排名2019年最新排名第24(ARWU世界排名)...
- Windows RabbitMQ 命令
- audiorecord怎么释放_Android 开发 AudioRecord音频录制
- JBoss7的启动时间
- 机械臂中的四元素转为旋转矩阵_雅克比矩阵(上)雅克比推导
- flask笔记3-模板
- orabbix监控oracle11g,zabbix利用orabbix监控oracle(详细配置图解)
- 您可能(或可能不)知道的5条便捷的Transact-SQL技巧
- java之备忘录模式,java设计模式之备忘录模式
- 远在美国的凤姐为何选择回国理財?
- 怎么用最短时间高效而踏实地学习Linux?
- 服务器Linux系统下常见的软件包有哪些
- Matlab 制作常用图片的代码
- win10右键删除多余菜单
- 千兆SFP光模块可以在万兆SFP+端口上使用吗?
- 如果把编程语言比作是一件武器……
- starUML建立模型及生成代码框架
- Linux---虚拟机安装Linux系统与联网实现
- 【Abp VNext】实战入门(四):Windows系统服务制作
- 躺赚,每天自动签到30多个应用,你也可以
热门文章
- 重庆python就业工资待遇-重庆python培训多少钱?
- python培训比较好的机构-python哪家的培训比较好?
- python详细安装教程linux-Python 环境安装步骤
- python常用知识点总结-Python常用知识点汇总
- python装饰器实例-Python装饰器原理与简单用法实例分析
- python从入门到精通视频-python从入门到精通视频(大全60集)
- python3.8.5 run-Python 3.8.5 正式发布
- python编程案例教程书籍-Python程序设计案例教程
- python语音在线编辑-Python如何实现文本转语音
- python基础知识面试题-python基础知识的重点面试题