話說(shuō)VLAN Tag 的“來(lái)龍去脈”
前言
自從上篇文章《三層交換機(jī)的工作原理》發(fā)布后,有很多的網(wǎng)絡(luò)愛好者私底下與我取得了聯(lián)系,針對(duì)當(dāng)前的TCP/IP網(wǎng)絡(luò)做了很多的探討,從這些愛好者身上我也學(xué)習(xí)到了很多,正所謂活到老,學(xué)到老;看這些愛好者對(duì)網(wǎng)絡(luò)的技術(shù)的那種熱愛與激情,也給我們寫作者增加了不少的動(dòng)力。
無(wú)論我們現(xiàn)在的技術(shù)發(fā)展到什么地步,最基本最核心的思想仍然不會(huì)發(fā)生變化;當(dāng)前我們還在使用傳統(tǒng)的路由器、交換機(jī)構(gòu)建數(shù)據(jù)中心,但當(dāng)前的網(wǎng)絡(luò)技術(shù)也在不斷的革新,另一種網(wǎng)絡(luò)時(shí)代的格局即將到來(lái),例如現(xiàn)在SDN(軟件定義網(wǎng)絡(luò))、SDS(軟件定義存儲(chǔ))、SDW(軟件定義廣域網(wǎng))、SDS(軟件定義軟件)等,從本質(zhì)上看SDN是將網(wǎng)絡(luò)轉(zhuǎn)發(fā)過(guò)程中的控制層面與數(shù)據(jù)層面分離,兩個(gè)層面獨(dú)自開發(fā)運(yùn)作,也可以說(shuō)這是將控制層面從分布式部署變成集中式部署,但無(wú)論怎樣改變其底層還是使用TCP/IP協(xié)議,這就叫千變?nèi)f變,萬(wàn)變不離其宗。但是我們也不得不承認(rèn)TCP/IP協(xié)議也存在很多的缺點(diǎn),其功能的復(fù)雜性和安全問(wèn)題層出不窮,無(wú)論你是什么網(wǎng)站只要掛載到Internet上,你都從不敢說(shuō)它很安全。本文主要來(lái)闡述TCP/IP中Vlan的基本原理—Vlan Tag的“來(lái)龍去脈”。
一、Vlan tag
無(wú)論在傳統(tǒng)物理交換機(jī)、路由器,還是在Openstack Neutron網(wǎng)絡(luò)、SDN網(wǎng)絡(luò)中其工作原理仍然不會(huì)發(fā)生變化,網(wǎng)絡(luò)上對(duì)此解釋層出不窮,追本溯源還需研究其代碼的實(shí)現(xiàn)方式;首先來(lái)回顧一下帶有Vlan tag的Ethernet Frame封裝格式:
其4字節(jié)的Tag字段有12bit是Vlan ID位,總共支持的VLAN數(shù)為2^12。
二、數(shù)據(jù)轉(zhuǎn)發(fā),Vlan標(biāo)簽如何動(dòng)作
針對(duì)于這樣的數(shù)據(jù)幀在我們傳統(tǒng)的交換機(jī),或者Vswitch里面是怎樣被轉(zhuǎn)發(fā)的呢?我們用兩個(gè)例子來(lái)解釋,如下圖:
1和A通信,標(biāo)簽如何“動(dòng)作”(本例中省略Native vlan的解釋)
1).1主機(jī)發(fā)送普通的數(shù)據(jù)幀;
2).switch1收到此幀首先需要對(duì)其解封裝,查看二層幀頭部幀目的MAC地址;
3).從CAM表中查找其目的MAC地址對(duì)應(yīng)的VLAN ID與接收該幀的接口對(duì)應(yīng)的VLAN ID 是否相同,如果相同則找到對(duì)應(yīng)的出接口,如果不同則丟棄該幀;
4).找到出接口后,打上對(duì)應(yīng)的VLAN 標(biāo)簽,封裝成802.1Q的幀,從Trunk接口發(fā)送出去;
5).到達(dá)switch2后,解封裝查看幀頭部的目的MAC地址;
6).從CAM表中查找其目的MAC地址對(duì)應(yīng)的VLAN ID與接收該幀頭部的VLAN ID是否匹配,如果匹配,則查找對(duì)應(yīng)的出接口,如果不同則丟棄該幀;
7).找到出接口后,封裝成原始的幀,從相應(yīng)端口轉(zhuǎn)發(fā)出去。
注意:vlan tag動(dòng)作打不打標(biāo)簽不是基于接口的概念,而是基于其查表,cpu計(jì)算,背板的功能,我看過(guò)太多的文章,也聽過(guò)很多人在描述交換機(jī)轉(zhuǎn)發(fā)數(shù)據(jù)包是說(shuō)的一句話“Access 口用來(lái)去標(biāo)簽,Trunk口用來(lái)打標(biāo)簽,”或是“Access口和Trunk口具有打標(biāo)簽和剝離標(biāo)簽的功能”,這樣的描述都是錯(cuò)的。如果這樣做的話,交換機(jī)太傻了,這樣的代碼實(shí)現(xiàn)也是非常低級(jí)的。例如,我們?cè)倏匆环N情況:
主機(jī)1和主機(jī)2通信,問(wèn)在交換機(jī)內(nèi)部有打標(biāo)簽和剝離標(biāo)簽的動(dòng)作嗎?1和2 在相同的vlan中,他們之間通信經(jīng)過(guò)交換機(jī)如果需要打標(biāo)簽的話,那豈不是加重交換機(jī)的計(jì)算負(fù)載嗎,所以像這樣的兩個(gè)主機(jī)在相互通信的時(shí)候,僅僅是查看CAM表,而不需要執(zhí)行打標(biāo)簽和剝離標(biāo)簽的動(dòng)作。
三、Openstack Neutron網(wǎng)絡(luò)中vlan 的工作原理
情景1——vm03 與 vm 04 通信
由于vm03 和 vm 04 分別在兩臺(tái)不同的物理服務(wù)器上,所以他們之間通信必須要經(jīng)過(guò)外界物理交換機(jī)的幫助;
a. vm03 從eth0發(fā)送常規(guī)ethernet frame經(jīng)過(guò)qbrccc到qvoccc;
b. br-int 上的qvoccc接收到該幀之后,開始解封裝其數(shù)據(jù)包,查看ethernet頭部的dest mac字段;
c. 因?yàn)槠浒l(fā)送的數(shù)據(jù)是從qvoccc接收到的,而qvoccc 接口已經(jīng)被劃分到vlan 20中,如下配置:
d. 所以在查看vcam表的時(shí)候,需要查看mac/vlan id是否一致,如果一致則將數(shù)據(jù)封裝成802.1Q的frame從int-br-eth1發(fā)送到br-eth1上,如果不一致則丟棄;
e. 當(dāng)br-eth1 從 phy-br-eth1 接收到ethernet frame 時(shí),首先就去查看local-vlan 到 global-vlan的一個(gè)映射表,配置如下:
發(fā)現(xiàn) local_vlan=20 需要將其轉(zhuǎn)換成vlan 120 ;
f. br-eth1 將會(huì)查看其vcam表,查找frame destmac address對(duì)應(yīng)的vlan id是否為120 如果是,則將其封裝成802.1Q vlan 120的frame 從對(duì)應(yīng)的接口(eth1)轉(zhuǎn)發(fā)出去;
g. 物理交換機(jī)中轉(zhuǎn)發(fā)過(guò)程此處不再熬述;
h. 此frame到達(dá)vm04所在的物理機(jī)br-eth1上時(shí),將解封裝查看幀的dest mac 字段;
i. 然后查找vcam表地址對(duì)應(yīng)的vlan tag與此幀的tag是否一致,如果一致則封裝之后從相應(yīng)的接口(phy-br-eth1)轉(zhuǎn)發(fā)出去,如果不一致則丟棄(此處與傳統(tǒng)交換機(jī)并無(wú)差異);
j. 當(dāng)vm04所在物理機(jī)的br-int的int-br-eth1接收到該幀的時(shí)候,首先解封裝查看幀的dest mac 字段;
k. 繼而查看vcam表,尋找該mac地址對(duì)應(yīng)的vlan id 與該幀的vlan tag 是否匹配,如果匹配執(zhí)行如下操作,如果不匹配丟棄;
l. 當(dāng)匹配時(shí),br-int上將會(huì)查看local_global vlan id 映射關(guān)系,配置如下:
vlan tag=120 需要轉(zhuǎn)換成 tag 20;注意:轉(zhuǎn)換是查表的一個(gè)過(guò)程中,而不是具體的一個(gè)操作,更不是在進(jìn)入接口的時(shí)候;
m. 當(dāng)查詢完成映射表之后將會(huì)再一次查找vcam表,尋找轉(zhuǎn)化后的vlan id與該表中 mac地址對(duì)應(yīng)的vlan id是否匹配,如果匹配則封裝成常規(guī)的frame,從相應(yīng)端口轉(zhuǎn)發(fā)出去,如果不匹配則丟棄。
情景2—vm01和vm02之間通信
和我們傳統(tǒng)的交換機(jī)是一樣的,在這個(gè)過(guò)程中,br-int是不做任何的打標(biāo)簽,彈標(biāo)簽的動(dòng)作,就是普通的frame之間轉(zhuǎn)發(fā)數(shù)據(jù),此處不再熬述。