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架構,也是目前使用最廣泛的方式。因為它的實現多樣,而且每種實現都有些許差距,這里不便來具體的例子來說明,只要明白了上面的原理,不管是什么樣的實現,都能很快上手。

 

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM