vxlan 協議

vxlan 協議原理簡介

1. vxlan 簡介

VXLAN 全稱是 Virtual eXtensible Local Area Network,虛擬可擴展的局域網。它是一種 overlay 技術,經過三層的網絡來搭建虛擬的二層網絡。rfc7348 (參考資料1) 上的介紹是這樣的:php

A framework for overlaying virtualized layer 2 networks over lay 3 networks.html

每個技術出來都有它要解決的問題,VXLAN 也不例外,那麼咱們先看看 VXLAN 到底要解決哪些問題。git

  • 虛擬化(虛擬機和容器)的興起使得一個數據中心會有成千上萬的機器須要通訊,而傳統的 VLAN 技術只能支持 4096 個網絡上限,已經知足不了不斷擴展的數據中心規模
  • 愈來愈多的數據中心(尤爲是公有云服務)須要提供多租戶的功能,不一樣用戶之間須要獨立地分配 ip 和 MAC 地址,如何保證這個功能的擴展性和正確性也是一個待解決的問題
  • 雲計算業務對業務靈活性要求很高,虛擬機可能會大規模遷移,並保證網絡一直可用,也就是大二層的概念。解決這個問題同時保證二層的廣播域不會過度擴大,也是雲計算網絡的要求

傳統二層+三層的網絡在應對這些要求時變得力不從心,雖然不少改進型的技術好比堆疊、SVF、TRILL 等可以增長二層的範圍,努力改進經典網絡,可是要作到對網絡改動小同時保證靈活性高卻很是困難。github

爲了解決這些問題,有不少方案被提出來,vxlan 就是其中之一。vxlan 是 VMware、Cisco 等一衆大型企業共同推出的,目前標準文檔在 RFC7348markdown

2. VXLAN 模型

vxlan 這類隧道網絡的一個特色是對原有的網絡架構影響小,原來的網絡不須要作任何改動,在原來網絡基礎上架設一層新的網絡。網絡

vxlan 天然會引入一些新的概念,這部分就講講它們。下面這張圖 是 vxlan 的工做模型,它建立在原來的 IP 網絡(三層)上,只要是三層可達(可以經過 IP 互相通訊)的網絡就能部署 vxlan。在每一個端點上都有一個 vtep 負責 vxlan 協議報文的封包和解包,也就是在虛擬報文上封裝 vtep 通訊的報文頭部。物理網絡上能夠建立多個 vxlan 網絡,這些 vxlan 網絡能夠認爲是一個隧道,不一樣節點的虛擬機可以經過隧道直連。每一個 vxlan 網絡由惟一的 VNI 標識,不一樣的 vxlan 能夠不相互影響。架構

  • VTEP(VXLAN Tunnel Endpoints):vxlan 網絡的邊緣設備,用來進行 vxlan 報文的處理(封包和解包)。vtep 能夠是網絡設備(好比交換機),也能夠是一臺機器(好比虛擬化集羣中的宿主機)
  • VNI(VXLAN Network Identifier):VNI 是每一個 vxlan 的標識,是個 24 位整數,一共有 2^24 = 16,777,216(一千多萬),通常每一個 VNI 對應一個租戶,也就是說使用 vxlan 搭建的公有云能夠理論上能夠支撐千萬級別的租戶
  • Tunnel:隧道是一個邏輯上的概念,在 vxlan 模型中並無具體的物理實體想對應。隧道能夠看作是一種虛擬通道,vxlan 通訊雙方(圖中的虛擬機)認爲本身是在直接通訊,並不知道底層網絡的存在。從總體來講,每一個 vxlan 網絡像是爲通訊的虛擬機搭建了一個單獨的通訊通道,也就是隧道

如今來講,這些概念仍是很是晦澀難理解的,咱們會在下面具體講解 vxlan 網絡的報文和通訊流程,但願文章結束以後再回來看這些概念能明白它們的意思。運維

3. VXLAN 報文解析

前面說過,vxlan 在三層網絡上構建一個虛擬的二層網絡出來,這一點可以在 vxlan 的報文上很明顯地體現出來。分佈式

下圖是 vxlan 協議的報文,白色的部分是虛擬機發送報文(二層幀,包含了 MAC 頭部、IP 頭部和傳輸層頭部的報文),前面加了 vxlan 頭部用來專門保存 vxlan 相關的內容,在前面是標準的 UDP 協議頭部(UDP 頭部、IP 頭部和 MAC 頭部)用來在底層網路上傳輸報文。post

從這個報文中能夠看到三個部分:

  1. 最外層的 UDP 協議報文用來在底層網絡上傳輸,也就是 vtep
    之間互相通訊的基礎
  2. 中間是 VXLAN 頭部,vtep 接受到報文以後,去除前面的 UDP 協議部分,根據這部分來處理 vxlan 的邏輯,主要是根據 VNI 發送到最終的虛擬機
  3. 最裏面是原始的報文,也就是虛擬機看到的報文內容

報文各個部分的意義以下:

  • VXLAN header:vxlan 協議相關的部分,一共 8 個字節
    • VXLAN flags:標誌位
    • Reserved:保留位
    • VNID:24 位的 VNI 字段,這也是 vxlan 能支持千萬租戶的地方
    • Reserved:保留字段
  • UDP 頭部,8 個字節
    • UDP 應用通訊雙方是 vtep 應用,其中目的端口就是接收方 vtep 使用的端口,IANA 分配的端口是 4789
  • IP 頭部:20 字節
    • 主機之間通訊的地址,多是主機的網卡 IP 地址,也多是多播 IP 地址
  • MAC 頭部:14 字節
    • 主機之間通訊的 MAC 地址,源 MAC 地址爲主機 MAC 地址,目的 MAC 地址爲下一跳設備的 MAC 地址

能夠看出 vxlan 協議比原始報文多 50 字節的內容,這會下降網絡鏈路傳輸有效數據的比例。vxlan 頭部最重要的是 VNID 字段,其餘的保留字段主要是爲了將來的擴展,目前留給不一樣的廠商用這些字段添加本身的功能。

4. vxlan 網絡通訊過程

經過上節的內容,咱們大體瞭解 vxlan 報文的發送過程。虛擬機的報文經過 vtep 添加上 vxlan 以及外部的報文層,而後發送出去,對方 vtep 收到以後拆除 vxlan 頭部而後根據 VNI 把原始報文發送到目的虛擬機。

上面的過程是雙方已經知道全部通訊信息的過程,可是在第一次通訊以前還有不少問題有解決:

  • 哪些 vtep 須要加到一個相同的 VNI 組?
  • 發送方虛擬機怎麼知道對方的 MAC 地址?
  • vtep 怎麼知道目的虛擬機在哪一臺宿主機上?

這三個問題能夠歸結爲同一個問題:vxlan 網絡怎麼感知彼此的存在並選擇正確的路徑傳輸報文?

並且第一個問題也是不用回答的,由於 vtep 造成的組是虛構的概念,只有某些 vtep 可以正確地傳遞報文,它們就是在同一個組內。也就是說,咱們只要回答後面兩個問題就行。

要回答這兩個問題,咱們仍是回到 vxlan 協議報文上,看看一個完整的 vxlan 報文須要哪些信息。

  • 內層報文:通訊的虛擬機雙方要麼直接使用 IP 地址,要麼經過 DNS 等方式已經獲取了對方的 IP 地址,所以網絡層地址已經知道。同一個網絡的虛擬機須要通訊,還須要知道對方虛擬機的 MAC 地址,vxlan 須要一個機制來實現傳統網絡 ARP 的功能
  • vxlan 頭部:只須要知道 VNI,這通常是直接配置在 vtep 上的,要麼是提早規劃寫死的,要麼是根據內部報文自動生成的,也不須要擔憂
  • UDP 頭部:最重要的是源地址和目的地址的端口,源地址端口是系統生成並管理的,目的端口也是寫死的,好比 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 網絡的 vtep 加入到同一個多播網絡,若是須要知道以上信息,就在組內發送多播來查詢;控制中心的概念是在某個集中式的地方保存了全部虛擬機的上述信息,自動化告知 vtep 它須要的信息。

針對這兩種方式,咱們下面就分別分析。

多播

多播的概念和工做原理不是這裏的重點,因此就不介紹了。簡單來講,每一個多播組對應一個多播 IP 地址,往這個多播 IP 地址發送的報文會發給多播組的全部主機。

爲何要使用多播?由於 vxlan 的底層網絡是三層的,廣播地址沒法穿越三層網絡,要給 vxlan 網絡全部 vtep 發送報文只能經過多播。

下圖是在多播模式下,vxlan 的報文工做流程,位於左下方的 機器 A 要經過 vxlan 網絡發送報文給右下方的機器 B。

vtep 創建的時候會經過配置加入到多播組(具體作法取決於實現),圖中的多播組 IP 地址是 239.1.1.1

  1. 機器 A 只知道對方的 IP 地址,不知道 MAC 地址,所以會發送 ARP 報文進行查詢,內部的 ARP 報文很普通,目標地址爲全 1 的廣播地址
  2. vtep 收到 ARP 報文,發現虛擬機目的 MAC 爲廣播地址,封裝上 vxlan 協議頭部以後(外層 IP 爲多播組 IP,MAC 地址爲多播組的 MAC 地址),發送給多播組 239.1.1.1,支持多播的底層網絡設備(交換機和路由器)會把報文發送給組內全部的成員
  3. vtep 接收到 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 進行解包,知道內部的 IP 和 MAC 地址,並轉發給目的虛擬機
  7. 虛擬機拿到 ARP 應答報文,就知道了到目的虛擬機的 MAC 地址

在這個過程當中,只有一次多播,由於 vtep 有自動學習的能力,後續的報文都是經過單播直接發送的。能夠看到,多播報文很是浪費,每次的多播其實只有一個報文是有效的,若是某個多播組的 vtep 數量不少,這個浪費是很是大的。可是多播組也有它的實現起來比較簡單,不須要中心化的控制,只有底層網絡支持多播,只有配置好多播組就能自動發現了。

單播報文的發送過程就是上述應答報文的邏輯,應該也很是容易理解了。還有一種通訊方式,那就是不一樣 VNI 網絡之間的通訊,這個須要用到 vxlan 網關(能夠是物理網絡設備,也能夠是軟件),它接收到一個 vxlan 網絡報文以後解壓,根據特定的邏輯添加上另一個 vxlan 頭部轉發出去。

由於並非全部的網絡設備都支持多播,再加上多播方式帶來的報文浪費,在實際生產中這種方式不多用到。

分佈式控制中心

從多播的流程能夠看出來,其實 vtep 發送報文最關鍵的就是知道對方虛擬機的 MAC 地址和虛擬機所在主機的 vtep IP 地址。若是可以事先知道這兩個信息,直接告訴 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 架構,也是目前使用最普遍的方式。由於它的實現多樣,並且每種實現都有些許差距,這裏不便來具體的例子來講明,只要明白了上面的原理,不論是什麼樣的實現,都能很快上手。

5. vxlan 網絡帶來新的問題

vxlan 協議給虛擬網絡帶來了靈活性和擴展性,讓雲計算網絡可以像計算、存儲資源那樣按需擴展,並靈活分佈。和計算機領域全部技術同樣,這也是一種 tradeoff,相對於經典網絡來講,vxlan 主要的問題是它的複雜性和額外的開銷。

額外的報文和計算

這一點可容易看出來,每一個 vxlan 報文都有額外的 50 字節開銷,若是加上 vlan 字段,開銷要到 54 字節。這對於小報文的傳輸是很是昂貴的操做,試想若是某個報文應用數據才幾個字節,原來的網絡頭部加上 vxlan 報文頭部都能有 100 字節的控制信息。

額外的報文也帶來了額外的計算量,每一個 vxlan 報文的封包和解包操做都是必須的,若是用軟件來實現這些步驟,額外的計算量也是不能夠忽略的影響。

複雜度

vxlan 另一個缺點是複雜度,雖然經典網絡在應對雲計算時捉緊見拙,可是經典網絡模型已經發展了好久,全部的部署、監控、運維都比較成熟。若是使用 vxlan 網絡,那麼全部的這些都要從新學習,時間和人力成本必然會大大提升。

6. 參考資料

相關文章
相關標籤/搜索