Linux 網路協議棧開發基礎篇(九)—— VID與PVID
一、PVID的作用及和VID的區別
PVID和VID經常出現於二、三層交換機裡,由於PVID和VID的設定不合理,造成VLAN劃分變得混亂。
PVID是交換機上的概念,說的是進入該埠的報文如果沒有打vlan id就按PVID的值打上,VID是報文上的vlan tag的意思。
1、什麼是PVID
PVID英文解釋為Port-base VLAN ID,是基於埠的VLAN ID,一個埠可以屬於多個vlan,但是隻能有一個PVID,收到一個不帶tag頭的資料包時,會打上PVID所表示的vlan號,視同該vlan的資料包處理,所以也有人說PVID就是某個埠預設的vlan ID號。
一個物理埠只能擁有一個PVID,當一個物理埠擁有了一個PVID的時候,必定會擁有和PVID相等的VID,而且在這個VID上,這個物理埠必定是Untagged Port。
PVID的作用只是在交換機從外部接受到可以接受Untagged 資料幀的時候給資料幀新增TAG標記用的,在交換機內部轉發資料的時候PVID不起任何作用。
2、什麼是VID
VID(VLAN ID)是VLAN的標識,在交換機裡面用來劃分埠。比如一個交換機有8個埠,現在將port1,port2,port5三個埠的VID設定成1111,那麼這三個埠就能接收vlantag=1111的資料包。
擁有和資料幀TAG標記一致的VID的物理埠,不論是否在這個VID上是Untagged Port或者tagged Port,都可以接受來自交換機內部的標記了這個TAG標記的tagged 資料幀
擁有和資料幀TAG標記一致的VID的物理埠,只有在這個VID上是tagged Port,才可以接受來自交換機外部的標記了這個TAG標記的tagged 資料幀。
預設情況下,簡單的理解為:
ACCESS埠接PC,VID=PVID
TRUNK埠級聯,VID=全部,PVID=1
簡單的說,VID(VLAN ID)是VLAN的標識,定義其中的埠可以接收發自這個VLAN的包;而PVID(Port VLAN ID)定義這個untag埠可以轉發哪個VLAN的包。比如,當埠1同時屬於VLAN1、VLAN2和VLAN3時,而它的PVID為1,那麼埠1可以接收到VLAN1,2,3的資料,但發出的包只能發到VLAN1中
在網上發現一個比較好的解釋是:PVID並不是加在幀頭的標記,而是埠的屬性,用來標識埠接收到的未標記的幀。也就是說,當埠收到一個未標記的幀時,則把該幀轉發到VID和本埠PVID相等的VLAN中去。
當所有VLAN都在一個交換機裡時,確實只需要一個標識就夠了,但跨裝置的VLAN就需要另一種標識,這就是802.1Q的VLAN ID,即VID。
我們知道802.1Q的VLAN是在二層幀里加進VLAN標識,俗稱打tag,而計算機不能解析這種二層的幀,所以交換機的一個埠在分到一個VLAN時有tag和untag屬性,tag埠用來連線裝置,untag埠用來連線計算機。Tag埠出去的幀一般都打上了tag,tag中的VID有的來自PVID,有的則來自其它tag埠中本身就含有tag的幀。
裝置互連時,由tag中的VID決定了一個二層幀屬於哪個VLAN,而計算機不具備打tag的功能,所以只有給連線計算機的埠新增一個屬性,用來決定計算機發出的未標記的幀屬於哪個VLAN,這個屬性就是PVID。
我們來總結一下:在一個埠接收到一個無標記幀時,僅僅由該埠的PVID決定該幀轉發到哪個VLAN中,即轉發到VID=PVID的VLAN中。
到此我們理解了PVID的含義和作用,但似乎只有untag埠下的PVID才具有意義,而實際上tag埠也有PVID屬性,PVID對tag埠會造成什麼影響呢?
二、PVID值對TAG埠影響
我們將用到3個埠:Port 1、2、3,各埠PVID設定如下:
Port 1:PVID = nPort 2:PVID = 2
Port 3:PVID = 3
建立2個VLAN:
vlan2:VID = 2,包含Port 1 (tag)、Port 2 (untag)vlan3:VID = 3,包含Port 1 (tag)、Port 3 (untag)
將3臺主機A、B、C分別接在Port 1、2、3上,
分別用主機B、C去ping主機A,在主機A上抓包。
實際上tag埠接計算機是沒有意義的,因為計算機無法解析打了tag的二層包文,但通過抓包軟體可以抓到這種二層報文,通過這種方法可以進行分析。
實驗時主機B和C可以是同一臺計算機,只不過接到不通埠上,為了方便說明,將它們分開表示。
實驗結果如下:
當n = 1時,可以看到來自B和C的包頭前都含有802.1Q的Packet,B、C都不能ping通A(ping不通的由於主機A無法解析打了tag的二層包);當n = 2時,可以看到來自B的包頭前不含有802.1Q的Packet,而來自C的有,僅B可ping通A;;
當n = 3時,可以看到來自C的包頭前不含有802.1Q的Packet,而來自B的有,僅C可ping通A;;
通過分析,得出S3026轉發機制大致如下:
1、由主機B發出的包到介面2(由於此時B不知道A的MAC地址,會發出arp廣播包)2、根據介面2的PVID的值(PVID=2),發往VID=2的VLAN中的所有介面
3、介面1屬於VLAN 2,所以介面1能收到此包
4、此時如果VLAN 2中介面1是tag埠,則將介面1的PVID值和VID進行比較:
如果PVID=VID則從介面1出去的包不打tag
如果PVID!=VID則從介面1出去的包打tag
由此可見,以前設為tag埠的PVID不起作用的說法在S3026上並不適用,正確的說法應該是:S3026上的某個VLAN中的tag埠,在轉發在此VLAN中包時出去前,先檢查該tag埠的PVID是否等於VID(untagged埠,連線PC,需要剝離tag),若相等則發出的包不打tag,若不等則打上tag。
還是用這張圖理解:
我們來總結一下,交換機的PVID和VID給VLAN配置帶來了靈活性,同時也帶來了一些麻煩,配置的不好可能帶來問題很隱蔽。所以我們以後在配置VLAN時要注意以下幾點:
1、 對於untag埠,PVID要和所屬VLAN的VID一致;2、 對於tag埠,PVID要不同於所有所屬VLAN的VID;
3、 兩臺裝置互聯時,兩端介面的PVID保持一致時,有弊也有利;
定理總結:
1 、下面是定義的各種埠型別對各種資料幀的處理方法
2、所謂的Untagged Port和tagged Port不是講述物理埠的狀態,而是將是物理埠所擁有的某一個VID的狀態,所以一個物理埠可以在某一個VID上是Untagged Port,在另一個VID上是tagged Port;
3、一個物理埠只能擁有一個PVID,當一個物理埠擁有了一個PVID的時候,必定會擁有和PVID的TAG等同的VID,而且在這個VID上,這個物理埠必定是Untagged Port;
4、PVID的作用只是在交換機從外部接受到可以接受Untagged 資料幀的時候給資料幀新增TAG標記用的,在交換機內部轉發資料的時候PVID不起任何作用;
5 、擁有和TAG標記一致的VID的物理埠,不論是否在這個VID上是Untagged Port或者tagged Port,都可以接受來自交換機內部的標記了這個TAG標記的tagged 資料幀;
6、擁有和TAG標記一致的VID的物理埠,只有在這個VID上是tagged Port,才可以接受來自交換機外部的標記了這個TAG標記的tagged 資料幀;
下面通過一個例項來鞏固一下:
一個數據包從PC機發出經過ACCESS埠->TRUNK埠->TRunk->ACCESS->PC資料包發生了怎麼樣的變化?
我們先把上述的描述變換為IEEE802.1Q的標準描述:
一個數據包從PC機發出經過(Untagged 資料幀)
ACCESS埠(PVID定義為100,VID=100=Untagged Port)->
TRUNK埠(PVID定義為1〈出廠配置,沒有更改〉,VID=1=Untagged Port,VID=100=tagged Port)->
另一個交換機的Trunk埠(PVID定義為1〈出廠配置,沒有更改〉,VID=1=Untagged Port,VID=100=tagged Port)->
另一個交換機的ACCESS埠(PVID定義為100,VID=100=Untagged Port)->
PC資料包
發生了怎麼樣的變化?(Untagged 資料幀)
首先假設兩臺交換機剛剛開機(MAC地址表為空)從PC機發出的資料幀進入交換機的ACCESS埠以後,會按照這個埠的PVID打100的Tag標記,根據交換機的轉發原理,交換機會把這個資料幀轉發給VID=100的所有埠(除了進口以外),這個過程叫做VLAN Flood; (定理1)
由於Trunk埠擁有VID=100,所以才可接受這個標記Tag為100的tagged資料幀; (定理5)
由於Trunk埠在VID=100上為tagged Port,所以在傳送資料幀出交換機的時候,不改變Tagged資料幀的結構; (定理1)
到了另一個交換機的Trunk埠的時候,由於Trunk埠擁有VID=100,所以才可接受這個標記Tag為100的tagged資料幀; (定理6)
另一個交換機的Trunk埠,接收到標記tag為100的tagged資料幀,並不作任何的更改; (定理1)
另一個交換機收到到標記tag為100的tagged資料幀,根據交換機的轉發原理,交換機會把這個資料幀轉發給VID=100的所有埠(除了進口以外);參照交換機交換原理(受到一個未知目的MAC資料幀);
這樣另一個交換機的ACCESS埠就可以收到標記tag為100的tagged資料幀; (定理5);
另一個交換機的ACCESS埠在發出標記tag為100的tagged資料幀的時候,會去掉TAG標記,轉發untagged資料幀給PC;(定理1);這樣PC機就收到了這個資料.