《TCP IP 詳解卷1:協議》閱讀筆記 - 第九章
閱讀須知:筆記為閱讀《TCP IP 詳解卷1:協議》後摘抄的一些知識點,其間也有加入一些根據英文原版的自己翻譯和結合網上知識後的理解,所以有些段落之間並不能夠串聯上或者知識點與書上略有差別(基本差別不大,參考的資料屬RFC官方文檔)。
第九章:廣播和本地組播(IGMP和MLD)
在之前第二章介紹IP尋址的時候有介紹到,IP地址有4種:單播、組播、廣播、任播。
單播,客戶端與服務器之間點到點連接通信;
組播,在發送者和多個接收者(如某個特定的分組)之間實現點對多點的連接通信;
廣播,在網絡(廣播地址範圍內的子網)內廣播數據包,網絡內的每一臺主機都將受到這些數據包;
任播,使得數據包可以根據路由拓樸來決定送到“最近”或“最好”的目的地。
廣播和組播為應用程序提供兩種服務:數據分組交付至多個目的地、通過客戶端請求/發現服務器。一個廣播請求會影響在廣播域範圍內的所有可達主機,而組播只影響那些可能對該請求有興趣的主機。使用者需要追求的是廣播的高開銷和簡單性與組播的高效率和復雜性之間找平衡。
在IPv4中,有兩種類型的廣播地址:受限(255.255.255.255)和定向。定向廣播地址基於網絡前綴和它的長度,通過創建一個初始位和網絡前綴相等、低序位被置1的32位地址形成。通常使用定向廣播代替受限廣播地址是更可選的。選擇哪些接口用於發送傳出的廣播流量依賴於操作系統。一個典型的例子是使用一個主接口用於有限廣播流量,使用保存在主機的轉發表中的信息來選擇傳出定向廣播和組播的接口。
組播
比如有數組[1,2,3,4,5,6,7,8,9,10],廣播的通知可以認為取了整個數組,而組播可能只是取數組中能夠被2整除的數據[2,4,6,8,10],這就是廣播和組播的區別。
需要達到網絡內部分主機接收數據,要麽是通過發送方指定接收方,要麽就是通過接收方指明對數據類型的興趣,然後網絡只負責向預期的/感興趣的接收方發送流量。
在組播中,由主機和路由器來保持組播狀態信息,以說明哪些接收方對哪類流量感興趣。在組播TCP/IP模型中,接收方通過指明組播地址和可選源列表來表明它們希望接收流量的興趣。這個信息作為主機和路由器中的軟狀態來維持,則它必須定期更新或超時刪除。
IP組播地址並不通過使用協議報文來確定,而是簡單的講一個IP組播地址直接映射到一些對應的MAC地址。IANA擁有IEEE組織唯一標識符00:00:5e。有了它,IAN就被賦予權限去使用以01:00:5e開始的組MAC地址以及以01:00:5e開始的單播地址。該前綴被用作以太網地址的高序24位,意味著此塊包括範圍00:00:5e:00:00:00到00:00:5e:ff:ff:ff的單播地址,以及範圍在00:00:5e:00:00:00到00:00:5e:ff:ff:ff的組播地址。除了IANA的其他組織也擁有地址塊,但只要IANA將其空間的一部分用於支持IP組播。IANA分配一半的組地址塊用於識別 IEEE 802 LAN 上的IPv4組播流量。
IPv4地址到他們對應的IEEE 802 形式的鏈路層地址的映射如圖所示:
除去前綴,還有32-4=28位可用於編碼空間,即2的28次方,268435456個組播地址。對於IPv4,IANA的政策是分配一半的組地址用於支持IPv4組播,那麽就是268435456個組播地址將被映射到2的23次方,8388608個唯一條目的鏈路層地址空間。因此,映射不是唯一的,多個IPv4組ID被映射到相同MAC層地址。具體計算,有2的28-23次方,即32個不同的IPv4組播地址被映射。
IPv6到IEEE 802 MAC組播地址映射使用IPv6組播地址的低序32位作為以33:33開始的MAC地址的後綴。因為只使用了112個組播地址位中的32位,所以2的80次方個組映射到相同的MAC層地址。
組播的應用過程大致如下圖:
上圖組播路由中,兩個主要的協議用於允許組播路由器了解附近的主機感興趣的組:IPv4使用的互聯網組管理協議(IGMP)和IPv6使用的組播偵聽發現協議(MLD)。
IGMP和MLD
IGMP和MLD都由支持組播的主機和路由器使用,並且協議非常相似。IGMP已發展到v3版本,而MLD發展到v2版本。IGMPv1是第一個廣泛使用的IGMP版本,v2添加了更迅速地離開組的能力,IGMPv3和MLDv2添加了選擇組播流量源的能力,並要求部署SSM。然而IGMP是IPv4使用的一個單獨的協議,而MLD是ICMPv6的真正的一部分。
下圖顯示了IPv4(IPv6)具有組播功能的路由器如何使用IGMP(MLD):
組播路由器定期向每個連接的子網發送IGMP(MLD)請求,以確定哪些組和源對連接的主機來說是感興趣的。主機使用IGMP(MLD)報告響應,說明哪些組合源是感興趣的。
IGMP和MLD的封裝如圖:
與ICMP類似,IGMP被認為是IP層的一部分,且報文也在IPv4數據報中傳輸。IGMP使用一個固定的為1的TTL值,所有數據分組僅限於本地子網。IGMP數據分組也使用IPv4路由警告選項,並使用6位值0x30的DS字段來代表網間控制。在IPv6中,MLD是ICMPv6的一部,它的封裝使用了IPv6的逐跳擴展頭部以保持路由器警告選項。
IGMP和MLD定義了兩組協議處理規則:由組成員的主機執行的、由組播路由器執行的。
組成員的工作是自發的報告對組播組和源的興趣改變,以及響應定期的查詢;組播路由器發送查詢,以確定連接鏈路上的對於任意組或是特定的組播組和源是否有興趣。
組成員的工作
IGMP和MLD組成員的部分被設計為允許主機指定它們對什麽樣的組有興趣,以及從特定源發送的流量是否應該接受或過濾掉。這是通過向一個或多個連接到同一子網的組播路由器(和參與主機)發送報告完成的。
組成員的報告信息如下格式:
IGMPv3成員資格報告包含IV組的組記錄。每個組記錄表明一個組播地址和可選源列表。每個組記錄中包含一個類型、主題組的地址,以及要包含或是排除的源地址列表,此外還包括輔助數據(IGMPv3中未使用)。
組記錄信息格式:
IGMP和MLD源列表的類型值指明過濾模式(包含/排除)以及源列表是否已改變
當收到一個查詢時,組成員沒有立即回應,它們設置一個隨機計時器來決定何時響應。在此期間,進程可能會改變它們的組/源興趣,任何這樣的變化可以在計時器到期前一起處理來觸發報告。這樣做節省了一定量的開銷。
組播路由器的工作
在IGMP和MLD中,組播路由器的工作是為每個組播組、接口和源列表確定是否至少有一個組成員目前在接收相應的流量。這是通過發送查詢,以及基於成員發送的報告,建立描述成員存在性的狀態來完成的。
路由器的信息如下格式:
IGMPv3查詢包含組播組地址和可選源列表。當組播路由器希望了解所有組播組的興趣時,組地址字段被設置為0,並被發送到所有主機組播地址224.0.0.1。S和QRV用於容錯和報告重傳,QRV值編碼發送方將使用的最大重傳次數,QQIC字段編碼定期查詢間隔。
有三種查詢報文的變體可以由組播路由器發送:一般查詢、特定組查詢、特定組和源查詢。一般查詢被組播路由器用於更新任意組播組的信息,對於這樣的查詢,組列表是空的;特定組查詢與一般查詢類似,但對於識別的組是特定的;特定組合源查詢是一個包含一組源的特定組查詢。
對於IGMPv3和MLDv2,主機除了維護它們的應用和系統軟件感興趣的組播組的過濾器狀態,還維護被排除或包含的源列表。為了了解什麽流量需要被轉發到鏈路上以便有興趣的主機收到,組播路由器維護類似的狀態。反之也是如此:一個組播路由器可以停止轉發在每個接收方的排除列表中的主機發送的組播流量。實踐經驗證明,應用程序很少需要屏蔽特定源,並且支持此功能也比較復雜。然而主機往往希望包含一個與一個組相關聯的特定源,尤其是當SSM在使用時。因此有了簡化版的(輕量級)IGMPv3和(輕量級)MLDv2。
完整版本與輕量級的對比
多個組播路由器實現的第一種類型的協調是查詢器選舉。每個組播路由器可以偵聽其他的查詢,當一個組播路由器啟動時,它認為自已是查詢器並發送一般查詢以確定在子網中哪些組是活躍的。當一個路由器收到另一個路由器的組播查詢時,它比較源IP地址和它自已的地址。如果在所接收的查詢中的源IP地址小於它自已的地址,接收路由器進入備用模式。因此,具有最小IP地址的路由器被認為是獲勝者,並成為單一的查詢器,負責向它連接的子網中發送查詢。備用的路由器設置計時器,如果它們在一個指定的時間(稱為其他查詢器出現計時器)內沒有看到更多的查詢,它們再次成為查詢器。
為了幫助防止丟失協議報文,有些報文被重傳多次(由QRV查詢器魯棒性變量決定)。QRV值在包含於查詢中的QRV字段中編碼,非查詢路由器采用查詢路由器的QRV作為自己的該字段值。如果查詢器發生改變,則這幫助保持了穩定性。重傳中保護的報文類型包括狀態改變報告和特定查詢,其他報文通常不會導致轉發狀態的變化,而是只涉及通過調整計時器刷新軟狀態,所以使用重傳無法保護它們。預計更容易出現丟失的鏈路,可能需要以生成額外的流量為代價,增加魯棒性變量以增強分組丟失的健壯性。
當處理特定查詢時,為了幫助組播路由器保持同步,查詢報文中S位字段表明路由器端(計時器)處理應被抑制。當一個特定的查詢由查詢器發送時,應該安排一個重傳次數(QRV)。在發送的第一個查詢中,S位字段被清除。基於重傳或這種查詢的接收,組播路由器會為隨後的重傳降低它的計時器到LMQT。此時,為感興趣的主機提供一個報告以指出它對一個組或源的持續的興趣。如果沒有報文丟失,該報告使每個組播路由器重置它的計時器為普通值,並保持不變。然而,預定的重傳不會被放棄。相反,特定查詢的重傳被發送時,S位字段被設置,這將導致接收路由器不會降低它們的計時器到LMQT。在收到表示有興趣的報告之後,仍保持查詢重傳的原因,是為了使跨越所有組播路由器的組的超時時間是一致的。然後,S位字段的目的是為了讓特定的查詢被(重新)發送,也為了避免降低計時器到LMQT,因為一個表示興趣的合法的報告可能已經被接受了,即使它或初始查詢被非查詢器路由器丟失了。沒有這種能力,重傳的特定查詢會導致非查詢器路由器不正確地降低它們的計時器(因為已經收到一個表明興趣的合法報告)。
IGMP和MLD的配置參數和計時器的值如下:
一些交換機支持一種稱為IGMP探聽的功能,該功能監控主機和組播路由器直接的IGMP(MLD)流量,並且能記錄哪些端口需要哪些特定的組播流動,這樣做能夠實質地影響在一個交換網絡中正在被承載的不需要的組播流量數量。在IGMPv3和MLDv2中,生成報告響應查詢。支持早期版本的IGMP和MLD的IGS交換機避免向所有的接口廣播報告,它們只向最近的組播路由器轉發報告。
IGMP(MLD)探聽避免了"交互機沿著所有交換機形成的生成樹的所有分支廣播消息來發送鏈路層流量"的情況。
由於IGMP和MLD都是信令協議,可以控制其他流量的流動,針對它們的攻擊往往會引起額外的資源消耗,可能導致拒絕服務。其他形式攻擊利用已經發現的實現漏洞,導致執行由攻擊者提供的不需要的代碼。
《TCP IP 詳解卷1:協議》閱讀筆記 - 第九章