zoukankan      html  css  js  c++  java
  • VXLAN学习笔记

    一、VXLAN报文格式:

    可以看出经过VXLAN的封装,报文将增加(二层MAC头+IP头+UDP头+VXLAN头)(14+20+8+8=50)总共50字节的开销,这会降低网络链路传输有效数据的比例。vxlan 头部最重要的是 VNID 字段,其他的保留字段主要是为了未来的扩展,目前留给不同的厂商用这些字段添加自己的功能。以下为华为设备的字段解读:

    vxlan头部描述:

               

    flags字段(1字节标志位+1字节reserved):

    G表示GBP(Group Based Policy)扩展,当G标志位为1时,表示该字段中的值为源端服务器所属的EPG组号。

    第五个bit为1表示VNI。

    第二个字节目前为保留字段。默认为0。

    Group字段(2字节):

    保留字段,仅当G标志位为1的时候有意义。

    VNI(3字节):

    表示VNI号。

    Reserved字段(2字节):

    保留字段。

    二、VXLAN的通信过程:

    通过一中的介绍,可以看到一个VXLAN报文包括如下元素:

    (外层MAC、头外层IP头、UDP头、VXLAN头、内层MAC头、内层IP头)

    若VXLAN网络需要通信,则NVE节点需要知道上面6个头部信息才能完成报文的封装从而实现转发。

    内层IP头:

            通信的虚拟机双方要么直接使用 IP 地址,要么通过 DNS 等方式已经获取了对方的 IP 地址,因此网络层地址已经知道。

    内层MAC头:

            同一个网络的虚拟机需要通信,还需要知道对方虚拟机的 MAC 地址,VXLAN需要一个机制来实现传统网络 ARP 的功能

    VXLAN头:

            只需要知道 VNI,这一般是直接配置在 vtep 上的,要么是提前规划写死的,要么是根据内部报文自动生成的,也不需要担心。

     UDP头:

            最重要的是源地址和目的地址的端口,源地址端口是系统生成并管理的(华为为报文头部的hash),目的端口也是写死的,比如 IANA 规定的 4789 端口。

    外层IP头:

            IP 头部关心的是 vtep 双方的 IP 地址,源地址可以很简单确定,目的地址是虚拟机所在地址宿主机 vtep 的 IP 地址,这个也需要由某种方式来确定

    外层MAC头:

            如果 vtep 的 IP 地址确定了,MAC 地址可以通过经典的 ARP 方式来获取,毕竟 vtep 网络在同一个三层,经典网络架构那一套就能直接用了。

    总结一下,一个 vxlan 报文需要确定两个地址信息:目的虚拟机的 MAC 地址和目的 vtep 的 IP 地址,如果 VNI 也是动态感知的,那么 vtep 就需要一个三元组:

                     内部 MAC <--> VNI <--> VTEP IP

    根据实现的不同,一般分为两种方式:多播和控制中心。

    三、多播

    为什么要使用多播?因为 vxlan 的底层网络是三层的,广播地址无法穿越三层网络,要给 vxlan 网络所有 vtep 发送报文只能通过多播。

    下图是在多播模式下,vxlan 的报文工作流程,位于左下方的 机器 A 要通过 vxlan 网络发送报文给右下方的机器 B。

    vtep 建立的时候会通过配置加入到多播组(具体做法取决于实现),图中的多播组 IP 地址是 239.1.1.1

    1. 机器 A 只知道对方的IP地址,不知道MAC地址,因此会发送ARP报文进行查询,内部的ARP报文很普通,目标地址为全 1 的广播地址
    2. vtep-1收到 ARP 报文,发现虚拟机目的MAC为广播地址,封装上vxlan协议头部之后(外层IP为多播组IP,MAC地址为多播组的MAC地址),发送给多播组 239.1.1.1,支持多播的底层网络设备(交换机和路由器)会把报文发送给组内所有的成员
    3. vtep-2接收到 vxlan 封装的 ARP 请求,去掉 vxlan 头部,并通过报文学习到发送方 <虚拟机MAC - VNI - Vtep IP> 三元组保存起来,把原来的ARP报文广播给主机
    4. 主机接收到ARP请求报文,如果ARP报文请求的是自己的MAC地址,就返回ARP应答。
    5. vtep-2此时已经知道发送放的虚拟机和vtep信息,把ARP应答添加上vxlan头部(外部IP地址为vtep-1的IP地址,VNI是原来报文的VNI)之后通过单播发送出去
    6. vtep-1接收到报文,并学习到报文中的三元组,记录下来。然后vtep-1进行解包,知道内部的IP和MAC地址,并转发给目的虚拟机
    7. 虚拟机拿到ARP应答报文,就知道了到目的虚拟机的 MAC 地址

    在这个过程中,只有一次多播,因为vtep有自动学习的能力,后续的报文都是通过单播直接发送的。可以看到,多播报文非常浪费,每次的多播其实只有一个报文是有效的,如果某个多播组的vtep数量很多,这个浪费是非常大的。但是多播组也有它的实现起来比较简单,不需要中心化的控制,只有底层网络支持多播,只有配置好多播组就能自动发现了。

    单播报文的发送过程就是上述应答报文的逻辑,应该也非常容易理解了。还有一种通信方式,那就是不同 VNI 网络之间的通信,这个需要用到vxlan网关(可以是物理网络设备,也可以是软件),它接收到一个vxlan网络报文之后解压,根据特定的逻辑添加上另外一个 vxlan 头部转发出去。

    因为并不是所有的网络设备都支持多播,再加上多播方式带来的报文浪费,在实际生产中这种方式很少用到。

    四、控制中心

    从多播的流程可以看出来,其实vtep发送报文最关键的就是知道对方虚拟机的MAC地址和虚拟机所在主机的vtepIP地址。如果能够事先知道这两个信息,直接告诉 vtep,那么就不需要多播了。

    在虚拟机和容器的场景中,当虚拟机或者容器启动还没有进行网络通讯时,我们就可以知道它的IP和MAC(可能是用某种方式获取,也有可能是事先控制这两个地址),分布式控制中心保存了这些信息。除此之外,控制中心还保存了每个 vxlan 网络有哪些vtep,这些vtep的地址是多少。有了这些信息,vtep就能发送报文时直接查询并添加头部,不需要多播去满网络地问了。

    一般情况下,在每个vtep所在的节点都会有一个agent,它会和控制中心通信,获取vtep需要的信息以某种方式告诉vtep。具体的做法取决于具体的实现,每种实现可能会更新不同的信息给 vtep,比如HER(Head End Replication)只是把多播组替换成多个单播报文,也就是把多播组所有的VTEP IP地址告诉vtep,这样查询的时候不是发送多播,而是给组内每个vtep发送一个单播报文;有些实现只是告诉vtep目的虚拟机的MAC地址信息;有些实现告诉MAC地址对应的vtep IP地址。

    此外,什么时候告诉vtep这些信息也是有区别的。一般有两种方式:常见的是一旦知道了虚拟机的三元组信息就告诉vtep(即使某个 vtep 用不到这个信息,因为它管理的虚拟机不会和这个地址通信),一般这时候第一次通信还没有发生;另外一种方式是在第一次通信时,当vtep需要这些信息的时候以某种方式通知agent,然后agent 这时候才告诉vtep信息。

    分布式控制的vxlan是一种典型的SDN架构,也是目前使用最广泛的方式。因为它的实现多样,而且每种实现都有些许差距,这里不便来具体的例子来说明,只要明白了上面的原理,不管是什么样的实现,都能很快上手。

     

  • 相关阅读:
    IDEA中写xml配置文件的时候没有代码提示
    Spring事务中的readonly
    解决IDEA项目名称无下标蓝色小方块
    【24小时内第四更】为什么我们要坚持写博客?
    .Net架构篇:实用中小型公司支付中心设计
    .NetCore外国一些高质量博客分享
    .Net业务搭配实用技术栈
    .NetCore实践爬虫系统(一)解析网页内容
    APM实践目录
    docker环境部署
  • 原文地址:https://www.cnblogs.com/tortoise512/p/12845064.html
Copyright © 2011-2022 走看看