STP

網絡中要有些冗餘拓撲可以防止單點故障導致網絡癱瘓,但冗餘拓撲會帶來一些問題:廣播風暴,多幀複製,MAC地址表抖動。

廣播風暴:比如交換機的透明橋接,交換機對收到的幀不做任何處理和修改直接原封不動地轉發。但透明橋接會出現問題。如SW1和SW2間連接多跟線,SW1從某根線轉發幀給SW2後,因爲幀沒有任何修改,SW2並不知道是SW1轉發過來的,會從其他線再轉發回給SW1,形成環路。如果是兩個路由器出現環路,雖然會導致不可達,但因爲有TTL值,每次轉發會減1,形成環路後不多久就中斷了,不會造成設備崩潰。但二層一旦出現環路會耗盡交換機所有處理能力,造成設備崩潰。

多幀複製:2層環路收到相同幀浪費帶寬。MAC地址表抖動:2層環路能從多個方向收到環外地址,那源MAC地址到底是哪個呢?

IEEE 802.1d STP(Spanning-Tree Protocol生成樹協議)就是爲了解決這些問題的:在冗餘拓撲鏈路上阻塞冗餘端口,使網絡中節點在通信時只有一條鏈路生效。當通信故障時將處於阻塞狀態的端口打開,以保證網絡正常通信。

默認都是開啓STP協議的,不需要手動啓動,一啓動交換機就會自動啓動STP,你可以關閉掉但最好別這麼做。比如你認爲你的網絡肯定不會出現環路,就是簡單的PC1->SW1->PC2,只有1臺交換機也不建議你關閉生成樹協議。因爲你不能保證不會粗心大意在交換機上將兩個端口用線連起來形成環路。

STP分類:分IEEE和Cisco兩大類。

IEEE:802.1d(STP),802.1w(Rapid-STP),802.1s(MST)。其實它們都是STP協議,只是有些細節不一樣,三者可以相互兼容。

Cisco:PVST/PVST+,Rapid-PVST,MIST/MST。分別依次對應上面IEEE的三種標準。

最先開發出來的是IEEE 802.1d(STP)標準生成樹,但它收斂時間很慢(30s-50s)。Cisco與之相對的是PVST/PVST+(PVST即ISL,PVST+即ISL加上802.1Q),收斂時間也是30s-50s。區別是:IEEE是基於交換機的,而Cisco是基於VLAN的。比如網絡裏有100個VLAN,那802.1d會無視VLAN數量,用一顆生成樹來阻塞冗餘端口。而PVST/PVST+會根據每個VLAN用生成樹阻塞冗餘端口,即100個VLAN會有100顆樹,好處是可以使網絡更合理,可以負載均衡,如50顆阻塞左邊端口,剩下50顆阻塞右邊端口,壞處是增加了開銷。

802.1d和PVST/PVST+需要30s-50s的收斂時間,在網絡飛速發展的時代,是無法忍受的。因此IEEE在802.1d基礎上改進成802.1w(Rapid-STP)快速生成樹,Cisco同樣改進成Rapid-PVST,它們的收斂時間小於1s。

上面說了IEEE是基於交換機,因此無法負載均衡。Cisco可以負載均衡,但有100個VLAN就要維護100顆樹,實在不堪重負。結合了兩者的優點,IEEE進一步改進成802.1s(MST)分組生成樹,Cisco改進成MIST/MST。這樣前50個VLAN劃到一組,後50個VLAN劃到一組,只要維護2顆樹。既能負載均衡又大大節省了開銷。

STP報文:BPDU

交換機間用BPDU(Bridge Protocol Data Unit)報文來確定哪個交換機上需要阻塞哪個接口。默認每2秒發送一次BPDU組播,組播地址爲01-80-C2-00-00-00。交換機會保存收到的高優先級的BPDU並泛洪,丟棄低優先級的BPDU。等選舉結束穩定後指定端口會發BPDU。

先看一下BPDU報文裏的內容:


Protocol ID 固定爲0。Version:0爲802.1d,1爲802.1w,2爲802.1s。Message type:0爲普通BPDU,80爲TCN。

Flags字段: 0位:TCN的ACK。1位:Agreement。2/3位:Forwarding/Learning。4/5位:00表示Unknown,01表示Alternative/BackUp,10表示Root,11表示Designated。6位:Proposal。7位:Topology Change。802.1d時只用到0位和7位,都和TCN相關,TCN的ACK報文裏0位置1,TC報文裏7位置1。802.1w裏中間6位也用到了,2/3位表狀態,4/5位表端口角色,1/6位表握手。

Root ID / Cost of path / Bridge ID / Port ID:用於選舉。

RootID:根橋的Bridge ID。一開始都認爲自己的Bridge ID是最小的,因此第一個BPDU裏Root ID就是自己的Bridge ID,都認爲自己是網絡的根。等選出根橋後,所有BPDU裏的Root ID都是根橋的Bridge ID

Cost of path:IEEE的帶寬標準:10G是2,1G是4,100M是19,10M是100。最新將依據IEEE 802.1t標準:10M爲200萬,依次類推,100M爲20萬,1000M爲2萬,10G爲2千。另外注意這是計算入接口的開銷,比如Fast Ethernet鏈路上兩端口都是19,那交換機收到BPDU裏cost值是0+19=19,並不是38

Bridge ID是交換機的橋ID。有8個字節,前2個字節是優先級,後6個字節就是MAC地址。前2字節優先級中前4bit是優先級,總是4096的倍數,因此0000代表0,0001代表4096,0010代表8192,1111代表61440。默認是1000即8代表32768。後12bit是Extend System ID即VLAN標記以區分BPDU是爲哪個VLAN服務的。因此如果VLAN10且優先級是4096的話,總優先級是4096+10=4106。選舉時如果優先級一樣就比較後6個字節MAC地址。

Port ID是端口的物理ID號

Message age:收到BPDU就開始從0s開始計時。另外每穿過一個交換機都會加1s,如SW1->SW2->SW3,其實穿過3臺交換機時間很快,但Message age時間至少是2s

Max age:20s。Hellotime:2s。Forward delay:15s。

(上面BPDU報文字段如果不明白幹什麼用的,可以結合下面STP選舉過程綜合起來理解)

STP選舉過程:

1.選舉一個根橋(根據Bridge ID,最小的作爲根橋)

2.在每個非根橋交換機上選舉一個根端口(每個交換機都計算去往根橋最近的路徑,該端口就是根端口,每個非根橋上有且只有一個根端口)。依據的是接收到的BPDU

3.在每個網段上選舉一個指定端口(因爲現在是以太網因此等於每條鏈路都要選一個指定端口)。依據的是發送出去的BPDU

4.如果一個端口既非根端口,又非指定端口,那該端口將被阻塞掉

如下圖:網絡需要一些冗餘連接,SW1可以直接轉發給SW2,也可以通過SW3轉發給SW2。如果沒有STP協議會形成環路,有了STP後,SW2的f0/2口將被阻塞掉,如果哪天SW1和SW2間鏈路出問題了,那SW2的f0/2口將被解除阻塞,SW1可以經由SW3和SW2通信。


現在看一下STP的選舉過程:(選舉雖然分爲4步,但其實是非常快的,一瞬間就能全部完成)

第一步:三臺交換機間要選舉出一個根橋,Bridge ID最小的就是根橋。(STP默認就是開啓的,不用手動開啓,直接看STP結果即可)


如截圖所示,三臺交換機的Brideg ID的優先級都是32768(默認值),因此比較MAC地址,SW1的MAC地址最小,因此SW1將被選爲根橋。SW1被選爲根橋後,三臺交換機的Root ID都將是根橋SW1的Bridge ID

第二步:在每個非根橋交換機(即SW2,SW3)上根據接收到的BPDU,選舉根端口。選舉依據依次是:

1.根橋Root ID最小。(因爲根橋選出後,所有BPDU裏的Root ID都是根橋的Bridge ID,因此其實第一條Root ID是肯定選不出的,要用後4條來選舉)

2.去往根橋Cost of path最小(參照上面BPDU報文裏該字段的解釋)

3.發送方Bridge ID最小(如果兩個交換機間連兩根線,那這兩個端口根據前3條就選不出了,需要下面第4條)

4.發送方Port ID最小(如SW2連1根線到HUB,HUB連兩根線到SW3,那SW3上的兩個端口根據前4條就選不出了,需要下面第5條)

5.接收方Port ID最小

查看非根橋交換機SW2和SW3上端口:


根橋Root ID都是SW1的Bridge ID,選不出。比較各端口去往根橋SW1的開銷,SW2的f0/5口和SW3的f0/1口的開銷最小,因此這兩個端口被選爲根端口。拓撲圖中打圈的兩個端口爲根端口。爲何開銷是0呢?因爲參照上面BPDU報文裏該字段的解釋:從SW1上發出報文開銷是0,因此SW2的f0/5口收到的BPDU裏開銷是0。如果途徑SW3的話,SW3收到SW1發出的開銷是0的報文,SW3轉發時要加上入接口f0/1口的開銷19,因此SW3的f0/2口發出的BPDU裏開銷是0+19=19。SW2的f0/2口收到的BPDU裏開銷就是19。

第三步:每條鏈路中選一個指定端口,選舉依據和選舉根端口是一樣的,參照上面。

SW1所在鏈路上,因爲SW1是根橋,因此它的兩個端口的Cost of path肯定都是0,爲指定端口。(根據實際經驗:一條鏈路上如果一個端口被指定成根端口了,那另一個端口只能是指定端口。這也能推斷出根橋SW1上的兩個端口是指定端口)。SW2和SW3鏈路上,參數上面截圖,兩個f0/2的cost均爲19,比較不出。然後比較發送方的Bridge ID,SW2和SW3的Bridge ID的優先級都一樣是32768,但SW3的MAC地址小,因此SW3的f0/2口成爲指定端口。拓撲圖中正方形的端口將成爲指定端口。

第四步:將非根端口或非指定端口阻塞掉。即SW2的f0/2口阻塞掉(截圖中狀態爲BLK,其他端口爲FWD),這樣SW2和SW3間的鏈路將down掉。避免了環路。

修改優先級:

如果想讓某交換機成爲根橋,那需要修改Bridge ID中的優先級(MAC地址無法修改):


也可以用SW1(config)#spanning-tree vlan 1 root primary/secondary命令來修改優先級。該命令本質還是修改優先級的值,因此primary等價於SW1(config)#spanning-tree vlan 1 priority 8192,secondary等價於SW1(config)#spanning-tree vlan 1 priority 16384。即使你設成primary,其他改優先級比你小(比如改成0),你也成不了根橋。因此最好如截圖中那樣直接修改值吧。

STP的端口狀態

Disabled:不發送任何報文,如接口shutdown

Listening:接口一旦no shutdown,就進入該狀態。通過BPDU來選舉該端口角色(根端口/指定端口/其他)。如果該端口被選爲根端口或指定端口,等15s時延(forward delay)進入Learning狀態。否則立即進入Blocking狀態阻塞該端口。

Learning:進行MAC地址學習。Learning狀態要等15s時延(forward delay)才能進入Forwarding狀態。

Blocking:如果接口是不是根端口或指定端口,就進入阻塞狀態。該狀態下能繼續接收但不會發送BPDU

Forwarding:開始接收並轉發數據。能繼續接收併發送BPDU

所以802.1d的交換機,當PC接入交換機,交換機端口立即進入Listening狀態。因爲PC不會發送BPDU,所以交換機端口肯定會被選爲指定接口,15s後進入Learning狀態。Learning狀態下開始學習PC的MAC地址,15s後進入Frowarding狀態能接收並轉發數據。也就是說PC插到交換機上後要30s後才能上網。在以前沒問題,但現在看來30s的時間太長了。因此要用802.1w或802.1s。

TCN報文:

BPDU分普通的BPDU和TCN(網絡拓撲發生變化時的報文)兩種報文。上面介紹BPDU報文字段裏,有個Message type:0爲普通BPDU,80爲TCN。TCN(Topology Change Notification)網絡拓撲變化報文,是一種特殊的BPDU報文。當網絡拓撲發生變化時,該交換機的端口會向根橋發送特殊BPDU報文。報文裏只有最上面Protocol ID(固定爲0),Version(0爲802.1d,1爲802.1w,2爲802.1s),Message type(80)這3個字段,剩下的如Root ID,Cost of path等都是沒有的。因此TCN報文的作用非常的簡單,就是通知根橋網絡拓撲結構發生變化了。

舉個例子SW1是根橋,PC->SW3->SW2->SW1。如果PC插頭拔掉,SW3會向根橋SW1發送TCN報文,通知根橋SW1網絡發生變化了。SW3的TCN報文先發送給SW2,因爲TCN報文是可靠傳送的,因此SW2需要回復ACK(※1)。SW2將TCN報文轉發給根橋SW1,SW1同樣回覆ACK。這樣根橋SW1就知道網絡拓撲發生變化了,會向全網發送BPDU(※2),全網交換機會將MAC地址表老化時間從300s變爲15s,15s後全部老化全網重新學習。

上述過程是802.1d,在802.1w和802.1s中過程被簡化了。802.1w和802.1s就沒有TCN報文了,SW3直接發TC報文通知全網。

※1:該BPDU裏Flags字段裏的0號位Topology Change ACK置1(參照上面BPDU報文的介紹)

※2:該BPDU又稱TC報文,BPDU裏Flags字段裏的7號位Topology Change置1(參照上面BPDU報文的介紹)

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章