廣播路由演算法 我是如何優雅著把悄悄話帶給其他人的

2021-09-03 08:14:48 字數 3510 閱讀 7338

對於廣播,我相信在現實生活中我們時常都能接觸到,例如學校一言不合就響起了校歌,搞的全校的人都能夠聽到,想假裝沒聽到都不行。

假如我們把學校比作乙個區域網的話,某台主機發起了乙個廣播,意味著區域網內的其他所有主機都會收到這個廣播,那發起廣播的主機是如何選擇路徑來給其他主機傳送廣播分組的呢?考慮下面由幾個節點組成的網路:

假如節點 r1 要做乙個廣播給 r2, r3, r4發廣播分組,顯然,一種很簡單的方法就是r1給 r2, r3, r4三個節點分別發一次廣播分組,這意味著r1一共要傳送三次同樣的廣播分組。

途中不同箭頭的顏色表示r1給不同的節點發廣播分組。

是的,這種傳送方式在實現上很簡單,源節點(r1)每次帶上目的節點的位址,然後傳送給它就行了。

不過這種方式方式在效率上是極低的,例如,r1傳送的這三個廣播分組都會經過同一段鏈路(r1-r2這段鏈路),而且r2要是再連線上n個節點的話,代表著這r1需要再傳送n次廣播分組,這n個報文也會經過同一段鏈路。

為了解決這個問題,我們或許可以這樣做:就是r1把廣播分組發給他的鄰居節點r2,然後r1就不管了,r2再把報文傳送給他的所有鄰居節點r3, r4(除了從其接收該分組的那個鄰居r1)。

顯然這種方式也是挺不錯的,r1只傳送了一次廣播分組,而且r1-r2這段鏈路也不會出現同乙個廣播分組重複經過的情況。嗯,這很nice。

不過,這種給所有鄰居節點傳送廣播分組的方式夠優雅嗎?

看下面的乙個網路組成:

按照剛才的方法,r1會給r2傳送廣播分組,接著r2會給r3, r4傳送廣播分組。剛才我們說過,收到廣播分組的節點會給他的所有鄰居傳送報文(除了從其接受到該報文的那個鄰居)。

所以這個時候 r3會給r4傳送廣播分組文,而r4接收到r3的廣播分組之後,r4會給r2傳送廣播分組,r2收到r4的廣播分組之後 ,也會給r3再次傳送廣播分組.....

如果節點中形成了乙個圈,那麼就會像上面那樣,節點之間不停著傳送廣播分組,這時網路上充斥著大量重複的廣播分組,這將會嚴重影響資源的利用。

我們也把這種情況稱之為廣播風暴

因此,我們必須想出某種策略,來控制這種廣播風暴。

一種很簡單的方法,就是給這乙份廣播分組做乙個標記。例如,源節點(發起廣播的節點)可以將其位址以及廣播序號放入這個廣播分組中,然後傳送給他的所有鄰居節點,每個節點會維護它已經收到的、**的源位址和廣播分組的序號列表

當節點收到乙個廣播分組時,會檢查這個廣播分組是否之前接收過(可以通過源位址、報文序號來檢查),如果接收過,那麼就把該廣播分組丟棄,否則,把該廣播分組接收,且向所有鄰居節點**。

例如對於下面由7個節點組成是網路

如果 節點 a 要做乙個廣播,那麼 a就會給他的鄰居節點b,c發乙份廣播分組,b,c也會給他的鄰居節點傳送乙個廣播分組。意味著b會給 c,d傳送廣播分組,而 c也會給 b,e,f傳送乙份廣播分組:

當b收到c發給他的報文時,b檢測到已經有了該報文,所以b會丟棄c傳送給他的廣播分組,c也一樣會丟棄b傳送給他的廣播分組。圖中青色的箭頭代表該廣播分組會被丟棄。

從圖中不難看出,就算節點之間形成了圈,但也不會出現節點之間迴圈**的情況。

雖然該方法簡單 ,但確實有效著控制了廣播風暴,當然,這只是控制廣播風暴的方法之一,實際上還有其他方法,在此我就不說了。

雖然上面的那種方法有效著控制了廣播風暴,但也是存在著很多的冗餘廣播分組(那些被丟棄的廣播分組就是冗餘的廣播分組)。

如果可以,我想讓每個節點僅接收一次廣播分組,也不用 考慮丟棄廣播分組,所以理想的情況應該是這樣:

如果把節點當作乙個的頂點,大家觀察下左邊的圖與右邊的圖有什麼聯絡。

右邊的圖不就是左邊圖的生成樹嗎?(學了這麼多年的生成樹,終於給用到了),如果我們給每一段鏈路加上相應的費用的話,那麼我們最理想的情況就是找到一顆最小生成樹

所以,我們最理想的情況就是讓廣播報文在最小生成樹的路徑中傳送,於是 ,我們現在的問題就是找出這些節點組成的網路中的最小生成樹。

那麼,如何構造一顆生成樹呢?下面提供一種基於中心某個中心的方法來建立一顆生成樹。注意,是生成樹,不是最小生成樹

該方法是這樣的:我們先選出乙個中心節點,然後其他節點向這個中心節點傳送加入樹報文,加入樹報文經過的路徑,都會被嫁接到生成樹上。我舉個例子吧,好理解點。例如對於這個網路結構:

我們選擇 e為中心點,然後其他節點給e傳送加入樹報文:

1、f節點給e傳送加入樹報文,此時e-f鏈路成為初始的生成樹,如下圖(紅色路徑表示生成樹)

2、接著b給e傳送加入樹報文,假設b經過的路徑是b->d->e。此時路徑b-d-e也加入了生成樹。

注:d不用在不用在傳送加入樹報文了,因此他此時已經在生成樹里了。

3、接著c給e傳送加入樹報文,c-e加入生成樹。

4、接著,a給e傳送報文,假設a選擇的路徑是a->c->e。不過當a的報文到達c之後,由於原本c-e就在生成樹裡面了,所以a的報文不用經過c-e,a-c就加入到生成樹了。

5、最後g通過d加入生成樹。

到此,生成樹構建完畢,此時生成樹如下:

然後在廣播的時候,就可以沿著這條路徑來**複製廣播報文了。

如何優雅的解釋什麼是閉包

閉包,在維基百科上的定義是 在電腦科學中,閉包 closure 是詞法閉包 lexical closure 的簡稱,是引用了自由變數的函式。這個被引用的自由變數將和這個函式一同存在,即使已經離開了創造它的環境也不例外。而函式到底是怎樣引用自由變數的呢?創造變數的環境又是什麼呢?首先看一段python...

我是如何學習git

一開始學習git的時候,網上的git教程很多,看得人眼花繚亂,不知道如何下手。現在對git已經很熟悉了,回過頭來總結一下學習方法。一般官方文件是最全面,但是不一定適合快速上手。我們可以學習一些快速上手的教程,這些教程沒有官方文件那麼全面,但是可以學習到最常用的操作,適合入門。入門之後,如果還想高階,...

我是如何看seo

何乙個行業都有一些所謂的高手,而很多的時候一些seo高手都是小有名氣的,任何乙個名人都是愛名的,所以有時候我們找這些人詢自己的一些發展的問題,他們很樂於幫助我們。這裡給企業老闆的建議就是,結識至少一位seo高手他們懂很多 seo技巧,這個高手不需要對於深層次的技術懂很多,只需要對於大的方向能夠很好的...