資源描述:
《linux網(wǎng)橋?qū)崿F(xiàn)分析-stp的實現(xiàn)分析》由會員上傳分享,免費在線閱讀,更多相關(guān)內(nèi)容在行業(yè)資料-天天文庫。
1、http://www.skynet.org.cn/viewthread.php?tid=204&fpage=1#1??Linux網(wǎng)橋?qū)崿F(xiàn)分析-第三部份,STP的實現(xiàn)分析初步Linux網(wǎng)橋?qū)崿F(xiàn)分析作者:kendo版權(quán)所有,轉(zhuǎn)載請注冊出處第三部份,STP的實現(xiàn)分析初步一、STP的框架結(jié)構(gòu)STP發(fā)送的是[wiki]BPDU[/wiki]包,該包有所有兩種類型:配置和TCN(拓樸變更通知);對于BPDU包的處理,有兩種:接收和發(fā)送(廢話),對于配置類型的BPDU包的發(fā)送,它是靠定時器來完成的,參BPDU包的幾個定時器參數(shù);對于[wiki]TCP[/wiki]類型的BPDU包
2、的發(fā)送,從名字可以看出來,它是當(dāng)發(fā)現(xiàn)拓樸結(jié)構(gòu)發(fā)生變更時發(fā)送的,如本機(jī)網(wǎng)橋配置的變化,物理接口的變動,分析其它機(jī)器變動后發(fā)出來的STP包等等。BPDU的封包采用的是IEEE802封包(本想把封包結(jié)構(gòu)的圖片貼上來,找不著在哪兒上傳圖片)。前面分析過,br_handle_frame函數(shù)中,當(dāng)網(wǎng)橋開啟了STP,且根據(jù)目的物理地址判斷出這是一個STP包,則交給br_stp_handle_bpdu函數(shù)處理。br_stp_handle_bpdu函數(shù)主要是判斷是哪種類型的BPDU包,然后調(diào)用相關(guān)的處理函數(shù),即:if(type==config){??br_received_confi
3、g_bpdu();}elseif(type==tcn){??br_received_tcn_bpdu();}這是對接收到BPDU包的處理,關(guān)于config類型的BPDU包的發(fā)送,后面再分析;TCN包的發(fā)送,有一部份是在接收包處理過程中處理的(因為分析config類型的BPDU包的時候,發(fā)現(xiàn)拓樸變更,當(dāng)然要發(fā)送TCN包了),所以這里一起來分析。二、Config類型的BPDU包的接收處理這個處理過程是在拆完BPDU包后,調(diào)用br_received_config_bpdu函數(shù)完成的。還是得先交待一些理論的東西:STP[wiki]協(xié)議[/wiki]最終是為了在網(wǎng)絡(luò)中生成一棵
4、無環(huán)狀的樹,以期消除廣播風(fēng)暴以及單播數(shù)據(jù)幀對網(wǎng)絡(luò)的影響。它始終在選舉三樣?xùn)|東:1、根網(wǎng)橋;2、根端口;3、“指定端口”和“指定網(wǎng)橋”(這三個概念非常重要,如果你還不清楚,建議查閱相關(guān)文檔先,否則下邊的代碼分析也無從談起了)然后再根據(jù)選舉出來的這三個東東,確定端口的狀態(tài):阻塞、轉(zhuǎn)發(fā)、學(xué)習(xí)、監(jiān)聽、禁用……要選舉出這三樣?xùn)|東,得有一個判斷標(biāo)志,即算法,STP的判斷標(biāo)準(zhǔn)是:1、判斷根橋ID,以最小的為優(yōu);2、判斷到根橋的最小路徑開銷;3、確定最小發(fā)送發(fā)BID(SenderBID)4、確定最小的端口ID如果前面你查閱了BPDU的封包結(jié)構(gòu),根橋ID、最小路徑開銷、發(fā)送方網(wǎng)橋的I
5、D、端口ID這幾個概念應(yīng)該沒有問題了,不過這里還是簡單交一下:1、根橋ID,我們配置了網(wǎng)橋后,用brctl命令會發(fā)現(xiàn)8000.XXXXXX這樣一串,這就是網(wǎng)橋的ID號,用一標(biāo)識每一個網(wǎng)橋,后面的XXXX一般的橋的MAC地址,這樣ID值就不會重復(fù)。根橋ID,是指網(wǎng)絡(luò)中所有網(wǎng)橋的ID值最小的那一個,對應(yīng)的具有根橋ID的橋,當(dāng)然也是網(wǎng)絡(luò)的根橋了;2、最小路徑開銷動態(tài)路由中也類似這個概念,不過這里用的不是跳數(shù)(局域網(wǎng)不比廣域網(wǎng),不一定跳數(shù)大就慢,比如跳數(shù)小,是10M鏈路,跳數(shù)大的卻是千兆鏈路),最初的開銷定義為1000M/鏈種帶寬,當(dāng)然,這種方式不適用于萬兆網(wǎng)了……所以后來
6、又有一個新的,對每一種鏈路定義一個常數(shù)值——詳請請查閱相關(guān)資料;3、發(fā)送方ID網(wǎng)橋之前要收斂出一個無環(huán)狀拓樸,就需要互相發(fā)送BPDU包,當(dāng)然需要把自己的ID告訴對方,這樣對方好拿來互相比較;4、端口ID端口ID由優(yōu)先級+端口編號組成,用于標(biāo)識某個橋的某個端口,后面比較時好用。生成樹算法就是利用上述四個參數(shù)在判斷,判斷過程總是相同的:1、確定根橋,橋ID最小的(即把包中的橋ID,同自己以前記錄的那個最小的橋ID相比,機(jī)器加電時,總是以自己的橋ID為根橋ID)的為根橋;2、確定最小路徑開銷;3、確定最小發(fā)送方ID;4、確定最小的端口ID:這四步非常地重要,后面的所以比較
7、都是這四個步驟。有了這些概念,來看看對config類型的BPDU包的處理:voidbr_received_config_bpdu(structnet_bridge_port*p,structbr_config_bpdu*bpdu){??????structnet_bridge*br;??????intwas_root;??????if(p->state==BR_STATE_[wiki]DIS[/wiki]ABLED)??????????return;??????br=p->br;??????read_lock(&br->lock);??????/*自己是根橋嗎?