热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

Vxlan——原理

1.为什么需要Vxlan普通的VLAN数量只有4096个,无法满足大规模云计算IDC的需求,而IDC为何需求那么多VLAN呢,因为目前大部分IDC内部结构主要分为两种L2,L3。L

1. 为什么需要Vxlan

  普通的VLAN数量只有4096个,无法满足大规模云计算IDC的需求,而IDC为何需求那么多VLAN呢,因为目前大部分IDC内部结构主要分为两种L2,L3。L2结构里面,所有的服务器都在一个大的局域网里面,TOR透明L2,不同交换机上的服务器互通靠MAC地址,通信隔离和广播隔离靠的vlan,网关在内网核心上。而L3结构这是从TOR级别上就开始用协议进行互联,网关在TOR上,不同交换机之间的互通靠IP地址。

  在云计算IDC里,要求服务器做到虚拟化,原来这个服务器挂在TOR A上,我可以随意把它迁移到TOR B上,而不需要改变IP地址,这个有点就是L2网路的特长,因为我这个虚拟服务器和外界(网关之外)通信还靠L3,但是我网关内部互访是走L2的,这个在L3里是无法做到的。因为L3里每个IP都是唯一的,地址也是固定位置的,除非你整网段物理搬迁。因此如何在L3网络里传输L2数据呢,这就是overlay技术。

  因此VXLAN(Virtual eXtensible LAN可扩展虚拟局域网)诞生了,基于IP网络之上,采用的是MAC in UDP技术,本来OSI7层模型里就是一层叠一层的,这种和GRE/IPSEC等tunnel技术是不是很像,这种封装技术对中间网络没有特殊要求,只要你能识别IP报文即可进行传送。

好了,解释清楚了,那么现在总结为何需要Vxlan:

  1. 虚拟机规模受到网络规格的限制,大L2网络里,报文通过查询MAC地址转发,MAC表容量限制了虚拟机的数量。
  2. 网络隔离的限制,普通的vlan和VPN配置无法满足动态网络调整的需求,同时配置复杂
  3. 虚拟器搬迁受到限制,虚拟机启动后假如在业务不中断基础上将该虚拟机迁移到另外一台物理机上去,需要保持虚拟机的IP地址和MAC地址等参数保持不变,这就要求业务网络是一个二层的网络。
 

2. Vxlan报文格式

技术分享

 Outer UDP端口使用4798,但可以修改

Outer IP头封装:源IP为发送报文的虚拟机所属的VTEP的IP地址,目的IP为目的虚拟机所属的VTEP IP地址。

Outer的目的IP地址可以是单播和组播地址,单播的情况下,目的IP为VTEP(Vxlan Tunnel End Point)的IP地址,在多播的情况下引入VXLAN的管理层,利用VNI和IP多播组的映射来确定VTEP。

当目的IP为接收端的VTEP的IP时,假如不知道这个IP地址,则需要执行ARP请求来获取,步骤如下:

1.  目标IP被替换成与源虚拟机具有相同VNI的多播组IP地址;

2. 所有VTEP端都接收该多播报文,VTEP查找所在主机上的全部虚拟机来匹配源虚拟机的Inner 目的MAC。
3. 目标VTEP的虚拟机会回应该多播包,从而获得目标VTEP的IP地址。

4. 发送端VTEP添加VNI-VTEP-虚拟机MAC的映射关系到自己的VXLAN表中,以避免再次组播学习。

 

Outer 以太封装:SA为发送报文的虚拟机所属的VTEP MAC地址,DA为目的虚拟机所属的VTEP上路由表中下一跳MAC地址。


 

3. VXLAN网络结构

技术分享

 NVE(Network Virtrualization Edge网络虚拟边缘节点)是实现网络虚拟化的功能实体,VM里的报文经过NVE封装后,NVE之间就可以在基于L3的网络基础上建立起L2虚拟网络。网络设备实体以及服务器实体上的VSwitch都可以作为NVE。

VTEP为VXLAN隧道的端点,封装在NVE中,用于VXLAN报文的封装和解封装。VTEP与物理网络相连,分配的地址为物理网络IP地址。VXLAN报文中源IP地址为本节点的VTEP地址,VXLAN报文中目的IP地址为对端节点的VTEP地址,一对VTEP地址就对应着一个VXLAN隧道。

VNI(VXLAN Network Identifier):VXLAN网络标识VNI类似VLAN ID,用于区分VXLAN段,不同VXLAN段的虚拟机不能直接二层相互通信。一个VNI表示一个租户,即使多个终端用户属于同一个VNI,也表示一个租户。VNI由24比特组成,支持多达16M((2^24-1)/1024^2)的租户。

VAP(Virtual Access Point):虚拟接入点VAP统一为二层子接口,用于接入数据报文。为二层子接口配置不同的流封装,可实现不同的数据报文接入不同的二层子接口。

 

Vxlan网关

VM之间的通信模式主要有3种:同VNI下的不同VM(分布在同一实体和不同实体两种),不同VNI下的跨网访问,VXLAN和非VXLAN之间的访问。

VXLAN网关分为:

二层网关:位于同一网段的终端用户通信,L2网关收到用户报文后,根据报文中包含的目的MAC类型,报文转发流程分为:

1. MAC地址为BUM(broadcast&unknown-unicast&multicast)地址,按照 BUM报文转发流程进行处理

2. MAC地址为已知单播地址,按照已知单播报文转发流程进行处理

三层网关:用于非同一网段的终端用户通信或VXLAN和非VXLAN用户间的通信。

技术分享

VXLAN二层网关:

L2网关主要解决的就是同一VNI下的VM之间的互访。

VXLAN 三层网关:

L3网关解决的就是不同VNI以及VXLAN和非VXLAN之间的互访。L3网关分为集中式网关和分布式网关,这2者的主要区别就在于L3网关是在leaf上还是在spine上。

技术分享技术分享

 如上图所示,集中式L3 GW在spine上,而分布式则是L2,L3 GW都在leaf上。当网络规模较大时,需采用分布式网关,因集中式spine的ARP表项瓶颈,并且子网流量转发绕远。分布式网关时,VTEP在leaf上。spine节点不感知VXLAN隧道。

需要注意的是当VM1和VM2在同一子网,但是挂在不同leaf上时,他们的三层网关需要配置相同的网关IP地址和MAC地址,当租户的VM位置移动时,不需要更改网关任何配置。

BUM报文转发流程

当BUM报文进入VXLAN隧道时,接入端VTEP采用头端复制方式(接口收到BUM报文后本地VTEP通过控制平面获取同一VNI的VTEP列表,将收到的BUM报文根据VTEP列表进行复制并发送给属于同一VNI的所有VTEP))进行报文的VXLAN封装,BUM出VXLAN隧道时,出口端VTEP对报文解封装,

综述:VXLAN网络结构定义完了,这里用通俗易懂的话解释一遍:在一台实体服务器上可以虚拟出一个交换机来,这个交换机就是VSwitch,而这个VSwitch下挂的不再是实体服务器,而是一个个VM,一个VM其实就是一个租户租用的服务器,不同租户之间肯定是不能互访的,要不然租户数据的安全性如何保障,这个隔离就是靠的VNI这个ID,其实这个你可以向下VLAN是如何隔离的,目的就是为了隔离租户。我一个租户有2个VM的话,那么我这2个之间应该可以互访吧。所以说基于VNI定义的租户,而非基于VM。内部的结构说清楚了再来说上行如何访问,在一个L2交换机你要跨网访问必然要经过网关,这个网关的IP地址就是VTEP IP,在网络上有个概念叫arp-proxy,一般用途是为了保护内部私有网络,外界的所有应答都有网关来代替回答(可以理解为门卫)。在这里外界只需要你的VTEP IP即可,对端报文到达VTEP这个网关后自己在内部走L2进行转发。因此VXLAN报文中的目的IP就是对端的网关(VTEP IP),而源地址自然也是自己的网关(VTEP IP)。而对于不同leaf上的同一VNI的VM来说,他们的VTEP IP肯定要配置相同,想下同一vlan下的服务器的网关是如何配置的就明白了。

Vxlan——原理


推荐阅读
  • packagecom.panchan.tsmese.utils;importjava.lang.reflect.ParameterizedType;importjava.lang. ... [详细]
  • 蒜头君的倒水问题(矩阵快速幂优化)
    蒜头君将两杯热水分别倒入两个杯子中,每杯水的初始量分别为a毫升和b毫升。为了使水冷却,蒜头君采用了一种特殊的方式,即每次将第一杯中的x%的水倒入第二杯,同时将第二杯中的y%的水倒入第一杯。这种操作会重复进行k次,最终求出两杯水中各自的水量。 ... [详细]
  • malloc 是 C 语言中的一个标准库函数,全称为 memory allocation,即动态内存分配。它用于在程序运行时申请一块指定大小的连续内存区域,并返回该区域的起始地址。当无法预先确定内存的具体位置时,可以通过 malloc 动态分配内存。 ... [详细]
  • Python多线程详解与示例
    本文介绍了Python中的多线程编程,包括僵尸进程和孤儿进程的概念,并提供了具体的代码示例。同时,详细解释了0号进程和1号进程在系统中的作用。 ... [详细]
  • NX二次开发:UFUN点收集器UF_UI_select_point_collection详解
    本文介绍了如何在NX中使用UFUN库进行点收集器的二次开发,包括必要的头文件包含、初始化和选择点集合的具体实现。 ... [详细]
  • 本文介绍了如何在 ASP.NET 中设置 Excel 单元格格式为文本,获取多个单元格区域并作为表头,以及进行单元格合并、赋值、格式设置等操作。 ... [详细]
  • LDAP服务器配置与管理
    本文介绍如何通过安装和配置SSSD服务来统一管理用户账户信息,并实现其他系统的登录调用。通过图形化交互界面配置LDAP服务器,确保用户账户信息的集中管理和安全访问。 ... [详细]
  • 如果应用程序经常播放密集、急促而又短暂的音效(如游戏音效)那么使用MediaPlayer显得有些不太适合了。因为MediaPlayer存在如下缺点:1)延时时间较长,且资源占用率高 ... [详细]
  • [c++基础]STL
    cppfig15_10.cppincludeincludeusingnamespacestd;templatevoidprintVector(constvector&integer ... [详细]
  • 经过一年的思考,我发现自己对开发的兴趣并不浓厚,而对算法研究则更加热衷。本文将探讨开发与算法之间的本质差异,并分享我的未来学习计划。 ... [详细]
  • 本文介绍了Java编程语言的基础知识,包括其历史背景、主要特性以及如何安装和配置JDK。此外,还详细讲解了如何编写和运行第一个Java程序,并简要介绍了Eclipse集成开发环境的安装和使用。 ... [详细]
  • Bootstrap 缩略图展示示例
    本文将展示如何使用 Bootstrap 实现缩略图效果,并提供详细的代码示例。 ... [详细]
  • 本文介绍了一种支付平台异步风控系统的架构模型,旨在为开发类似系统的工程师提供参考。 ... [详细]
  • 使用 Git Rebase -i 合并多个提交
    在开发过程中,频繁的小改动往往会生成多个提交记录。为了保持代码仓库的整洁,我们可以使用 git rebase -i 命令将多个提交合并成一个。 ... [详细]
  • Manacher算法详解:寻找最长回文子串
    本文将详细介绍Manacher算法,该算法用于高效地找到字符串中的最长回文子串。通过在字符间插入特殊符号,Manacher算法能够同时处理奇数和偶数长度的回文子串问题。 ... [详细]
author-avatar
少少_LV
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有