組網(wǎng)基礎之深入解析二層組播
二層組播相關協(xié)議包括IGMP 和GMRP協(xié)議。讓我們從分析組播MAC地址開始,逐步而深入的了解二層組播。
組播MAC地址
所謂組播MAC地址,是一類邏輯的MAC地址,該MAC地址代表一個組播組,所有屬于該組的成員都接收以該組對應的組播MAC地址為目的地址的數(shù)據(jù)幀。
注意的是,組播MAC地址是一個邏輯的MAC地址,也就是說,在網(wǎng)絡上,沒有一個設備的MAC地址是一個組播MAC地址。組播MAC地址跟單播MAC地址(物理MAC地址)的區(qū)別是,組播MAC地址六個字節(jié)中,***字節(jié)(第六字節(jié))的***位為1,而單播MAC地址則為0,如下圖所示:
為了更進一步了解組播的概念,我們先從MAC層的數(shù)據(jù)幀接收過程說起。
MAC層數(shù)據(jù)幀的接收
在網(wǎng)卡的內(nèi)部保留一張接收地址列表(可以理解為一個可讀寫的隨機存儲器),其中至少有兩個MAC地址,即網(wǎng)卡的物理MAC地址和全1的廣播MAC地址。每當計算機想接收一個組播數(shù)據(jù),也就是說要加入一個組播組,那么上層軟件會給網(wǎng)絡層一個通知,網(wǎng)絡層做完自己的處理后,也會發(fā)一個通知給數(shù)據(jù)鏈路層,于是,數(shù)據(jù)鏈路層根據(jù)網(wǎng)絡層想加入的組播組的組地址(一般是一個組播的IP地址),根據(jù)一定的規(guī)則映射為一個組播的MAC地址,然后把該MAC地址加入接收地址列表。
每當數(shù)據(jù)鏈路層接收到一個數(shù)據(jù)幀的時候,就提取該數(shù)據(jù)幀的幀頭,找出目的MAC地址,跟接收地址列表中的地址項目比較,如果在列表中遇到一個地址,跟該數(shù)據(jù)幀的目的MAC地址是相同的,就停止比較,接收該數(shù)據(jù)幀,并把該數(shù)據(jù)幀放到上層協(xié)議對應的接收隊列中;如果在整個接收列表中沒有找到一個匹配的MAC地址,則丟棄該數(shù)據(jù)幀。
現(xiàn)假設接收到的數(shù)據(jù)幀是發(fā)給自己的單播數(shù)據(jù)幀,于是該數(shù)據(jù)幀的目的MAC地址就是自己的硬件地址。數(shù)據(jù)鏈路層接收到該數(shù)據(jù)幀,跟接收列表中的地址比較,***次比較就會通過,因為接收地址列表中的***個MAC地址就是自己的硬件地址。所以在任何情況下,發(fā)給自己的數(shù)據(jù)幀一定能接收下來;
假設接收到的數(shù)據(jù)幀是一個廣播數(shù)據(jù)幀,則在比較的時候,***一項是匹配的,因為接收地址列表中肯定包含一個廣播的MAC地址,這樣就保證了任何廣播數(shù)據(jù)報都會被正確接收;
假設上層軟件想接收組播組G的數(shù)據(jù),經(jīng)過一番映射到數(shù)據(jù)鏈路層之后,數(shù)據(jù)鏈路層會在自己的接收數(shù)據(jù)列表中添加一項組播組G對應的MAC地址,假設為MAC_G,當計算機接收到一個數(shù)據(jù)幀,該數(shù)據(jù)幀的目的地址為MAC_G的時候,該數(shù)據(jù)幀會被接收并傳遞到上層,因為接收列表中有一項MAC_G記錄。
組播轉(zhuǎn)發(fā)表
在前面交換機的轉(zhuǎn)發(fā)方式一節(jié)中講到,交換機在轉(zhuǎn)發(fā)組播數(shù)據(jù)包的時候,也是根據(jù)一個轉(zhuǎn)發(fā)表來進行的,但跟單播轉(zhuǎn)發(fā)表不同的是,該組播轉(zhuǎn)發(fā)表對應的出口不是一個元素/端口,而是一組元素/端口,即一個出口列表。在轉(zhuǎn)發(fā)數(shù)據(jù)的時候,交換機根據(jù)組播數(shù)據(jù)幀的目的組播地址查找組播轉(zhuǎn)發(fā)表,如果在組播轉(zhuǎn)發(fā)表中查不到相應的轉(zhuǎn)發(fā)項,則把該組播數(shù)據(jù)幀當做廣播數(shù)據(jù)幀處理,向所有端口上轉(zhuǎn)發(fā)該數(shù)據(jù)幀(如果實現(xiàn)了VLAN,則僅僅向接收端口所屬同一個VLAN的端口上轉(zhuǎn)發(fā));如果能查找到一個結果,則結果肯定是一個接口列表,于是,交換機把這個組播數(shù)據(jù)報復制成許多份,每份提交到一個出接口,從而完成數(shù)據(jù)的交換。
需要注意的是,這個組播轉(zhuǎn)發(fā)項不像單播那樣,是通過學習的方式獲得的(在處理單播數(shù)據(jù)的時候,交換機每轉(zhuǎn)發(fā)一個數(shù)據(jù)幀,會進行相應的學習過程,學習到一個單播轉(zhuǎn)發(fā)項),而是通過一些二層的組播協(xié)議獲得的,這些流行的組播協(xié)議有IGMP(Internet Group Management Protocol, 因特網(wǎng)組管理協(xié)議),GMRP(GARP Multicast Register Protocol,GARP組播注冊協(xié)議,GARP- General Attribute Registration Protocol)等。下面部分詳細解釋每一種二層組播協(xié)議。
二層組播協(xié)議
上面我們提到,用于轉(zhuǎn)發(fā)組播數(shù)據(jù)幀的組播轉(zhuǎn)發(fā)項不是通過學習獲得的,而是通過一些其他的組播協(xié)議,比如IGMP窺探,GMRP等協(xié)議獲得的。至于為什么不能通過學習獲得,是因為學習過程是分析一個數(shù)據(jù)幀的源地址,但組播地址在任何情況下不可能出現(xiàn)在源地址的位置(因為組播MAC地址是一個邏輯的MAC地址,網(wǎng)絡上沒有一個終端的MAC地址是一個組播MAC地址)。
下面我們分析二層組播協(xié)議,這些協(xié)議在構建組播網(wǎng)絡的時候,有不可替代的重要地位。尤其是將來的流媒體應用會很廣泛,在這種情況下,二層的組播將是必然的要求。
IGMP協(xié)議
在講述IGMP窺探之前,先看一下IGMP協(xié)議,理解了IGMP協(xié)議,IGMP窺探就很容易了。
一般情況下,組播數(shù)據(jù)是從路由器的上游流下來的,而組播的接收端一般位于路由器的下游,典型的情況是,路由器通過一個以太網(wǎng)口連接企業(yè)網(wǎng),另外通過一個串口連接Internet。組播數(shù)據(jù)源,比如流媒體服務器一般位于Internet上,組播數(shù)據(jù)流通過路由器到達企業(yè)網(wǎng)上的數(shù)據(jù)接收端。這種情況下,流媒體服務器是長時間工作的,也就是說,一天24小時,一周7天都在不停的發(fā)送媒體流信息,相當于電視頻道。但企業(yè)網(wǎng)絡中的數(shù)據(jù)接收端卻不是這樣,只有有限的時間接收端才接收數(shù)據(jù),其他時間都是不接收數(shù)據(jù)的。這樣,在企業(yè)網(wǎng)上沒有數(shù)據(jù)接收端的時候,如果路由器也把大量的媒體流信息發(fā)到企業(yè)網(wǎng)內(nèi)部,必然會浪費大量的資源,理想的情況是,如果企業(yè)網(wǎng)上沒有數(shù)據(jù)接收端,則路由器就不轉(zhuǎn)發(fā)媒體流,但如果只要有一個接收端,路由器就必須把媒體流引入企業(yè)網(wǎng)。這樣必須有一種機制來保證路由器對企網(wǎng)上的數(shù)據(jù)接收端有一個清楚的了解,什么時候網(wǎng)絡上有數(shù)據(jù)接收端,什么時候沒有數(shù)據(jù)接收端,這種機制就是IGMP協(xié)議。
從上面的分析中,我們可以看出IGMP協(xié)議是數(shù)據(jù)接收端和路由器之間的交互協(xié)議,數(shù)據(jù)接收端使用該協(xié)議來通知路由器,自己是否想接收組播數(shù)據(jù)流。如果想接收的話,接收哪個組播組的數(shù)據(jù)流。
一般情況下,存在兩種類型的IGMP消息:組成員報告和組成員查詢,其中組成員報告消息由計算機發(fā)出,用來告訴路由器,自己想加入某個組播組,而組成員查詢消息則由路由器發(fā)出,用來查詢網(wǎng)絡上是否存在相應組的成員。一個指導性的原則是,只要網(wǎng)絡上有組播組的數(shù)據(jù)接收端,不管該接收端的數(shù)量是多少,路由器必須把該組播組的數(shù)據(jù)轉(zhuǎn)發(fā)到網(wǎng)絡上。
IGMP消息也是通過組播地址發(fā)出的,在IGMP加入消息中,該組播地址(IGMP消息的目的地址)就是該計算機想加入的組播組的組地址。比如,計算機想加入224.0.0.2這個組播組,則該計算機發(fā)出的IGMP加入消息的目的IP地址就是224.0.0.2。這樣當路由器接收到該組播消息后,就知道網(wǎng)絡上有一個主機,該主機想接收到組播組224.0.0.2的數(shù)據(jù),于是,每當從上游接收到目的地址是該組地址的數(shù)據(jù)的時候,就把該數(shù)據(jù)包向企業(yè)網(wǎng)上轉(zhuǎn)發(fā)。
還有一類消息就是組播組成員查詢消息。在IGMP協(xié)議***版中,沒有規(guī)定主機的離開消息,即如果一個主機不想接收某一組播組的數(shù)據(jù)了,它也不會通過某種消息通知路由器,而是靜悄悄的離開該組播組。這樣如果路由器不采取某種措施來掌握網(wǎng)絡上組播組接收端的數(shù)目情況,就會產(chǎn)生問題,假設網(wǎng)絡上所有的主機都不想接收組播數(shù)據(jù)了,根據(jù)IGMP協(xié)議***版,這些主機不會通知路由器,而是不做任何處理。這樣路由器不知道這些原來接收組播數(shù)據(jù)的主機現(xiàn)在已經(jīng)不接收數(shù)據(jù)了,而且還以為網(wǎng)絡上有一大批的接收端,于是仍源源不斷的發(fā)送組播數(shù)據(jù),這樣必然浪費帶寬。而引入了組成員查詢消息后,路由器可以每隔一段時間發(fā)出該消息,用來查詢網(wǎng)絡上還有沒有主機在接收組播數(shù)據(jù)。注意的是,該查詢消息跟成員加入消息一樣,采用的目的IP地址也是查詢的組的組播IP地址。假設路由器想查詢245.2.2.1這樣一個組播組是否還有成員,發(fā)出的查詢消息的目的IP地址就是245.2.2.1。當網(wǎng)絡上接收該組播組數(shù)據(jù)的成員接收到這個查詢消息后,就發(fā)出一個響應,該響應還是一個組播組成員加入消息。這樣只要路由器接收到一個這樣的響應,它就知道網(wǎng)絡上必然還有終端在接收數(shù)據(jù),于是不能停止轉(zhuǎn)發(fā)。但路由器發(fā)出查詢消息后,一段時間內(nèi)沒有接收到任何響應,它就判斷網(wǎng)絡上沒有了數(shù)據(jù)接收端,于是停止轉(zhuǎn)發(fā)組播數(shù)據(jù)。
到此為止,IGMP協(xié)議的一些細節(jié)已經(jīng)介紹完畢,接下來介紹IGMP窺探。需要注意的是,IGMP協(xié)議是三層協(xié)議,而IGMP窺探則是二層組播協(xié)議,但它利用了IGMP的三層特性。注意,IGMP協(xié)議是運行在交換機上的一種協(xié)議,它使用該協(xié)議來形成轉(zhuǎn)發(fā)組播數(shù)據(jù)的組播轉(zhuǎn)發(fā)表。
下面是啟動了IGMP窺探的交換機工作過程:
(1) 交換機從每個端口上監(jiān)聽接收到的數(shù)據(jù)幀,如果是單播數(shù)據(jù)幀就按照通常的轉(zhuǎn)發(fā)方式進行轉(zhuǎn)發(fā),是組播數(shù)據(jù)幀則進行下一步處理;
(2) 如果接收到的數(shù)據(jù)幀是組播數(shù)據(jù)幀,則分析該組播數(shù)據(jù)幀的協(xié)議類型字段,看是否是IP協(xié)議,如果不是,則按照通常的方式轉(zhuǎn)發(fā)(這時候可能查詢組播轉(zhuǎn)發(fā)表轉(zhuǎn)發(fā),如果沒有查到結果,則向所有端口上轉(zhuǎn)發(fā));(3) 如果是IP協(xié)議數(shù)據(jù),則進一步判斷該數(shù)據(jù)是不是一個IGMP加入消息或IGMP查詢消息。如果不是,則進行通常的組播數(shù)據(jù)發(fā)送,否則轉(zhuǎn)下一步;
(4) 如果是一個IGMP加入或查詢消息,則該交換機就可以判斷,在接收到該數(shù)據(jù)幀的端口上一定連接一個組播數(shù)據(jù)接收端,該接收端想接收IGMP加入消息中目的地址所在的組播組數(shù)據(jù)。于是,交換機就檢查組播轉(zhuǎn)發(fā)項,看對應的組播MAC地址有沒有在組播轉(zhuǎn)發(fā)項中出現(xiàn)。如果出現(xiàn)了,則把接收到該數(shù)據(jù)幀的接口加入組播轉(zhuǎn)發(fā)項對應的接口集合,如果沒有出現(xiàn),說明該組播轉(zhuǎn)發(fā)項還沒有創(chuàng)建,于是創(chuàng)建一個組播轉(zhuǎn)發(fā)項,該轉(zhuǎn)發(fā)項的組播地址是IGMP消息的目的IP地址的影射MAC地址,接口列表初始化為接收到該數(shù)據(jù)幀的接口,接下來繼續(xù)按照通常的過程轉(zhuǎn)發(fā)該數(shù)據(jù)幀。
到此為止,IGMP窺探的具體工作過程已經(jīng)明了,可以看出,這種協(xié)議***的一個缺點就是效率較低,交換機需要分析每個組播數(shù)據(jù)幀,看該數(shù)據(jù)幀是否是組播數(shù)據(jù)幀,如果是,繼續(xù)看是否是IP數(shù)據(jù)幀,如果是,繼續(xù)看是否是IGMP加入消息等等。
GMRP協(xié)議
當主機不支持IGMP協(xié)議的時候就無法實現(xiàn)窺探。我們考慮能不能開發(fā)一種專門的針對組播的協(xié)議,該協(xié)議可以高效的完成其他組播協(xié)議完成的任務。
這就是GMRP協(xié)議。該協(xié)議需要計算機網(wǎng)卡和交換機一起工作,因此需要計算機網(wǎng)卡的支持。由于該協(xié)議是一個較新的協(xié)議,故大多數(shù)網(wǎng)卡都沒有支持,但作為一種標準的協(xié)議,將來的網(wǎng)絡設備都會支持。
該協(xié)議的運行過程很簡單,想接收組播數(shù)據(jù)的計算機只要告訴連接的交換機,它想接收哪個組的組播數(shù)據(jù)即可。交換機接收到通知后,就創(chuàng)建相應的組播轉(zhuǎn)發(fā)項,把接收到組播請求的端口加入組播轉(zhuǎn)發(fā)項中。當計算機不再想接收組播數(shù)據(jù)了,只簡單的告訴交換機就可以了,交換機接收到通知后,就從組播轉(zhuǎn)發(fā)項中把相應的端口刪除掉。
總結
二層組播的一些基礎概念就講解完了,在這些內(nèi)容中,組播MAC地址,組播和單播數(shù)據(jù)的接收過程以及三種組播協(xié)議是重點。這些內(nèi)容也是學習后續(xù)內(nèi)容(比如三層組播路由協(xié)議)的基礎,在實際中,這些組播概念也是應用得最多的。
【編輯推薦】


















