什么是 VxLAN?


本文首發於我的公眾號 Linux雲計算網絡(id: cloud_dev),專注於干貨分享,號內有 10T 書籍和視頻資源,后台回復「1024」即可領取,歡迎大家關注,二維碼文末可以掃。

VLAN 和 VxLAN 是不是還傻傻分不清楚,這篇文章就來告訴你。

01 什么是 VxLAN?

VxLAN 全稱是 Visual eXtensible Local Area Network(虛擬擴展本地局域網),從名字上就知道,這是一個 VLAN 的擴展協議。

VxLAN 本質上是一種隧道封裝技術。它使用 TCP/IP 協議棧的慣用手法——封裝/解封裝技術,將 L2 的以太網幀(Ethernet frames)封裝成 L4 的 UDP 數據報(datagrams),然后在 L3 的網絡中傳輸,效果就像 L2 的以太網幀在一個廣播域中傳輸一樣,實際上是跨越了 L3 網絡,但卻感知不到 L3 網絡的存在。

如下圖所示,左右兩邊是 L2 廣播域,中間跨越一個 L3 網絡,VTEP 是 VxLAN 隧道端點(VxLAN Tunnel Point),當 L2 以太網幀到達 VTEP 的時候,通過 VxLAN 的封裝,跨越 L3 層網絡完成通信,由於 VxLAN 的封裝"屏蔽"了 L3 網絡的存在,所以整個過程就像在同一個 L2 廣播域中傳輸一樣。

VxLAN 是應網絡虛擬化技術而生的。隨着數據中心網絡不斷擴增,Cisco、VMware 和 Arista Networks 這些巨頭發現,傳統的 VLAN 隔離已經無法應對網絡虛擬化技術所帶來的成千上萬的設備增長,於是便聯合起草了這個協議,一直到 2014 年才定稿,由 RFC 7348 所定義。

02 為什么需要 VxLAN?

主要有三點考慮,使得網絡虛擬化迫切需要向 VxLAN 轉變。

1、VLAN ID 數量限制

虛擬化技術的發展,使得以前以單個物理設備組網的方式,逐步向以虛擬設備的方式過渡。

以前一台物理設備(一台服務器也好,一台網絡設備也好),能支持幾十個端口就已經很了不起了,所以使用 VLAN 是綽綽有余,但是虛擬化環境下就大不同了,一台物理主機可能虛擬出上百上千台虛擬設備,整個雲數據中心可能要划分超過成千上萬個的廣播域,而 VLAN 被限制為最多 4094 個,這就顯得捉襟見肘了。

具體我們分析下 VLAN 的包格式就知道了。802.1Q 標准定義了 VLAN 協議的以太網幀格式如下:

可以看到,VLAN 幀在以太網幀的基礎上增加了 VLAN Tag 字段,該字段包含 TPID、PCP、CFI 和 VID 4 個部分,其中 VID 即表示 VLAN ID,占 12bit,取值范圍為 0~4095,其中 0 和 4095 為保留值,不能給用戶使用,所以一個以太網最多可以划分為 4094 個 VLAN。這就是 4094 這個值的由來。

2、更好地利用多條網絡鏈路

VLAN 使用 STP 來管理多條網絡鏈路,避免數據傳輸時出現的環路。STP 根據優先級和成本,只會選擇其中一條鏈路工作,其余鏈路作為備用鏈路,也就是主備模式(active-passive)。這樣雖然既避免了環路,也增強了可用性,但沒有充分利用多條線路來提升性能,對於用戶來說,等於是花 N 倍的錢,卻只享受到了 1 倍的服務。

VxLAN 則不然,VxLAN 可以在 L3 層網絡上,透明地傳輸 L2 層數據,這讓它可以利用 ECMP (Equal-cost multi-path,等價多路徑) 等協議實現多條路徑同時工作,也就是 active-active 模式。這樣當網絡流量較大時,可以實現流量的負載均衡,提升數據傳輸性能。

3、TOR 交換機 MAC 地址表限制

交換機的原理是根據 MAC 地址表完成數據包的二層轉發。在虛擬化技術沒出現之前,數據中心的 TOR(Top of Rack) 交換機的一個端口連接一台物理主機,並對應一個 MAC 地址,當虛擬化技術出現之后,一台物理主機虛擬出幾十甚至上百台虛擬機,TOR 交換機的一個端口雖然還是連接一台物理主機,但卻對應多個 MAC 地址(這還在不算 VLAN 划分的情況下),如下圖所示:

這無疑會造成 TOR MAC 地址表的膨脹,交換機本身 MAC 表的空間是有限的,如果溢出,就會造成交換機的不斷泛洪,增加了處理負擔。

如果使用 VxLAN 則不然,VxLAN 使用 VTEP 封裝虛擬機的二層幀,在三層網絡上傳輸,通常,一台物理機對應一個 VTEP,一個 VTEP 可以被該台物理機上的所有虛擬機共有,所以,對於 TOR 交換機的 MAC 地址表來說,一台物理機只用記錄一條 VTEP 信息即可。這樣就避免了 MAC 地址表暴增的問題。

4、靈活的虛擬機部署和遷移

采用 VLAN 的虛擬網絡環境,不存在 overlay 網絡,只有 underlay 網絡。也就是說 虛擬機的 VLAN 數據包直接在物理網絡上傳輸,和物理網絡上的 VLAN 數據包融合在一起,這樣的好處是虛擬機能直接訪問到物理網絡的設備,但壞處也很明顯,虛擬網絡無法打破物理網絡的界限,具體表現在虛擬機的部署和遷移不太靈活。

  • 部署 :如果要在 VLAN 100 上部署虛擬機,那么只能在支持 VLAN 100 的物理機上部署,如下圖所示,假設左右兩個區域分屬 VLAN 100 和 VLAN 200,現在 VLAN 100 已經部署了很多虛擬機,而 VLAN 200 卻才部署了少量的虛擬機,如果這時需要繼續往 VLAN 100 部署新的虛擬機,那么也只能選擇在左邊區域部署,這就會造成左邊區域負擔過重。
  • 遷移 :同樣,如果從左邊區域往右邊區域遷移虛擬機,因為兩邊分屬於不同的 VLAN,虛機所分配的 IP 地址不同,無法直接進行遷移,這會造成整個集群機器的負載分配不均。

使用 VxLAN 則完全不全在這些問題,通過 VxLAN 的封裝,在一個 L3 網絡上構建了 L2 網絡,或者說基於 underlay 網絡的 overlay 網絡,虛擬機的數據可以打破 L2 網絡的限制,在 L3 網絡上傳輸,虛擬機的部署和遷移也不受物理網絡的限制,可以靈活部署和遷移,使得整個數據中心保持一個平均的利用率。

03 VxLAN 的報文格式

VxLAN 是一種隧道封裝技術,那自然它的報文格式也是一種封裝的結構,如下圖很好地展現了 VxLAN 的封裝報文格式。

首先,最里面是原始的 L2 以太網幀,也就是虛擬機發出的數據幀,接着封裝上 VxLAN 的頭部,然后整個 VxLAN 幀再封裝在物理網絡中的 UDP 報文中,接着是 IP 包頭,MAC 頭。為了和內部的原始以太網幀區別,外部封裝的都加上外層 IP 頭,外層 MAC 頭。

其中,VxLAN 頭由 8Bytes 組成,分別是:

  • Flags:占 8bits,具體是 RRRRIRRR,其中 I 必須設置為 1,表示是是一個合法的 VxLAN ID,其它 7bits 的 R 作為保留字段並且設置為 0。
  • VNI(VxLAN Network Identifier):占 24bits,VxLAN 的 ID 標識,這個字段就對比於 12bits 的 VLAN ID,支持 ID 個數擴展為 2^24 = 16777216,約等於 16M 個。
  • Reserved:有兩個字段,分別占 24 bits 和 8 bits,作為保留字段並且設置為 0。

對於 UDP 頭部,需要注意的是,目的端口(dst port) 默認設置為 4789,這是 IANA 分配的 VxLAN 協議使用端口號。

其余字段都是我們常見的 TCP/IP 協議字段,這里就不再贅述了。

如果嫌以上圖示還比較抽象,可以參考下面這幅用 Wireshark 抓包的圖,更為直觀:

04 VxLAN 的數據傳輸

下面通過一個具體的例子來看看基於 VxLAN 的網絡結構及數據傳輸是怎樣的。

如下圖,是一個基於 VxLAN 的網絡結構圖:

圖中,VTEP 叫做 VxLAN 隧道端點(VxLAN Tunnel Endpoint),是 VxLAN 協議中將對原始數據包進行封裝和解封裝的設備,它可以由硬件設備實現,也可以由軟件實現。

假如圖中 VM1 ping VM2,會是怎樣一個通信過程:

  1. VM1 不知道 VM2 的 MAC 地址,會發出 ARP 請求。
  2. VM1 所在主機的 VTEP 封裝 ARP 請求包,並向網絡中其余 VTEP 廣播。同時在 MAC 地址表中記錄 VM1 的表項。
  3. VM2 所在主機的 VTEP 接收 ARP 請求包,解封裝之后將原始包發到 VM2,同時記錄 VM1 的 MAC 地址表項。
  4. VM2 發出 ARP 響應,經過 VTEP,再次封裝之后,由於之前學習到 VM1 的地址,所以直接單播發給 VM1 所在主機的 VTEP,同時記錄 VM2 的 MAC 地址表項。
  5. VM1 所在主機 VTEP 接收 ARP 響應包,解封裝之后發給 VM1,同時記錄 VM2 的 MAC 地址表項。
  6. VM1 拿到 VM2 的 MAC 地址之后,發出 ICMP 包,這個時候 VTEP 的 MAC 地址表中已經學習到 VM2 的地址,所以直接封裝之后,單播發給 VM2 所在主機 VTEP。
  7. VM2 所在主機 VTEP 解封裝之后,直接發給 VM2。
  8. VM2 構造 ICMP 的響應包,同樣的過程發給 VM1,至此完成整個 ping 的過程。

05 總結

VxLAN 相比 VLAN 有很多的優勢,不過在可預見的未來,還不能完全替代 VLAN,這需要根據使用場景具體分析。VxLAN 的優勢更多體現大規模環境下,如果網絡設備規模,不論是虛擬的還是物理的,只有百十台的樣子,那么直接使用 VLAN 就足夠了。另外一個 VxLAN 的封裝解封裝機制也會影響性能,所以需要綜合考慮。

VxLAN 在 Linux、OVS、容器網絡等實現中都有非常多的應用,關於這些內容,留作后面具體講解了。

原創不易,如果覺得文章不錯呢,麻煩動動小指給個在看吧,或者轉發分享一下,這將會是對我原創的最大支持!謝謝!


公眾號后台回復“加群”,帶你進入高手如雲交流群

我的公眾號 「Linux雲計算網絡」(id: cloud_dev) ,號內有 10T 書籍和視頻資源,后台回復 「1024」 即可領取,分享的內容包括但不限於 Linux、網絡、雲計算虛擬化、容器Docker、OpenStack、Kubernetes、工具、SDN、OVS、DPDK、Go、Python、C/C++編程技術等內容,歡迎大家關注。

參考:

https://tools.ietf.org/html/rfc7348

http://www.just4coding.com/blog/2017/05/21/vxlan/

https://zhuanlan.zhihu.com/p/36165475

https://www.openstack.org/assets/presentation-media/OpenStackOverVxlan.pdf


免責聲明!

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



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