1. 程式人生 > >鏈路內和鏈路外的數據包發送:單播、組播、任播

鏈路內和鏈路外的數據包發送:單播、組播、任播

存在 sse ast 比特 inf 正常 ip組播 nan root

翻譯自:https://info.menandmice.com/blog/bid/103274/On-link-vs-Off-Link-Packet-Delivery-Unicast-Multicast-Anycast

原作者:David Beck, a Men & Mice trainer and course developer

在子網內(鏈路內)分發數據報文和在不同的子網間(鏈路外)分發數據報文是不同的。本文基於不同目的地址類型單播、組播、任播來講述這些不同點。主要目的是指明任播的不同之處和解釋鏈路內的任播。除了特別指出的一點例外,以下所有的都適用於IPv4和IPv6。不管怎樣,這是一篇講述IPv6基礎的文章。IPv6術語“link”被用來代替“subnet”,“Node”被用來代替“host”。

單播

一個單播地址唯一標識一個節點上的一個接口。它被用來發送數據包到唯一的一個接口。它是一個人聽到“IP地址”之後最先被想到的一種接口類型。發送者在發送去往一個單播地址的報文時,會先在路由表中查找這個報文的目的地址,並且選擇最長匹配優先。

這條最長匹配的表項可能會指出這個目的地址是在鏈路內的。對於鏈路內的目的地址,發送者采用數據鏈路層協議,例如以太網,來將報文發送到最終地址。或者最長匹配指出這個地址是鏈路外的。對於鏈路外地址的路由表項,包含一個靠近這個目的的鏈路內的路由器。發送者利用數據鏈路層協議將報文發送給那個路由器。路由器重復這個動作直到到達目的地。

一個互聯網絡包含兩個或者多個經由路由器加入的鏈路(網絡)。將單播地址的報文發送到鏈路外的需求催生了IP協議。如果所有的目的地址都是鏈路內的話,報文的發送靠數據鏈路層的協議和數據鏈路層的地址就可以完成了。(請註意互聯網是一個巨大的網絡,由全世界所有加入的路由器組成)

組播

組播地址指定多個接口分布在多個節點上。發送給組播地址的報文會所有指定的接口。對於iPv4和ipv6,組播地址和單播地址都是截然不同的很容易區分。IPv4組播地址是224.0.0.0/4(地址從224-239)。IPv6組播地址是ff00::/8。組播並不一開始就是IP的一部分,它是在1980年代才加進去的。

鏈路內的IP組播的發送依賴於下層的數據鏈路層協議要支持組播,或者說至少要支持廣播。幸運的是以太網和802.11無線網絡協議都有組播功能,並且有組播MAC地址。這使得鏈路內組播分發變得很簡單。通過公式把組播IP地址轉換成組播MAC地址。對於IPv4,這個定義在RFC"Host Extensions for IP Multicasting" (http://www.rfc-editor.org/rfc/rfc1112.txt),對於IPv6,定義在RFC “Transmission of IPv6 Packets over Ethernet Networks” (http://www.rfc-editor.org/rfc/rfc2464.txt)。一個分配了組播IP的接口會配置成偵聽相應的組播MAC地址。當一個報文被發送到鏈路內的組播IP地址去的時候,會被封裝在相應的目的MAC的幀中。所有偵聽這個MAC地址的節點接收並處理這個報文。鏈路內組播容易部署並且得到廣泛的應用。

IPv4和IPv6的路由協議都依賴於鏈路內組播。路由器發送報文告知所有其他設備路由協議的信息,例如網絡拓撲的改變。(在不支持組播或者廣播的數據鏈路層之上進行鏈路內IP組播是非常有挑戰性的。幸運的是這個歌小夢魘不在本書的討論範圍之內)。

在不同的鏈路上的不同節點配置組播地址運行鏈路外組播更加具有挑戰性。必須應用特定的組播路由協議。發送者生成一個報文,組播路由器必須復制多份到不同鏈路上的節點。鏈路外組播應該並不廣泛。絕大多數的組織並不使用組播路由協議。組播路由協議也沒被用在開放互聯網上。

任播

現在來到文章的主要部分。

跟多播地址一樣,任播地址也是被分配在多個節點的多個接口上。不同之處是任播報文只發送到一個節點,發送者並不關心誰收到了這個報文,因為所有的目的地址都是對等的。

和組播一樣對於任播,鏈路內和鏈路外有很大的不同。對於組播鏈路內傳遞很簡單並且應用廣泛,鏈路外傳遞很有挑戰並且很少應用。但是任播正好相反,鏈路外任播很簡單。

鏈路外任播被用於根或者頂級的DNS server。例如F root server(f.root-server.net)的IPv4地址是192.5.5.241.這是一個任播地址(第一次聽說ipv4的任播地址)。它被分配在全世界範圍內的54臺DNS服務器上(http://www.isc.org/f-root/)。對於DNS服務來說所有這些服務器都是相同的。對發送到192.5.5.241這個地址的報文,路由器一般把它發送到唯一一個節點(單個DNS server)。因為所有的服務器都用於相同的信息,所以具體發送到哪個服務器也就無關緊要了。為了管理這些服務器,每臺服務器還有自己的單播地址,但是這些單播地址並不是用來響應DNS請求的。

鏈路外的任播地址是無法和單播地址區分的。當一個單播地址被分配到第二個節點上去的時候就自動成為一個任播地址。分配了相同任播地址的不同節點是不知道這是一個任播地址還是一個單播地址的。發送者也不會對發往任播地址的報文做特殊的處理。也沒有專門用來支持任播的協議,也的確並不需要。使用普通的單播路由來處理鏈路外任播地址。唯一的要求是配置了相同任播地址的節點要在不同的鏈路上,並且正確配置路由。RFC "Operation of Anycast Services" 就是一篇最佳實踐的文檔 (http://www.rfc-editor.org/rfc/rfc4786.txt).

鏈路外任播可以建立在IPv4和IPv6網絡中,但是鏈路內任播只能用在Ipv6網絡中。在同一鏈路上的節點共享一個地址,發往這個地址的數據包也只發送到一個接口。但是這些節點都在同一個鏈路上,IP路由無法處理這個地址的分發。不同於鏈路外任播,鏈路內任播需要一些技術規範的支持參看RFC "IP Version 6 Addressing Architecture" (http://www.rfc-editor.org/rfc/rfc4291.txt)。

根據規範,一個任播地址可以分配的多個接口。每個分配了任播地址的節點都會發送NA報文來告知這個任播地址和本地單播數據鏈路層地址的綁定關系。這些NA報文是互相競爭的。其他節點會把這個任播地址綁定到其中一個數據鏈路層的單播地址上。如果有三個節點分配了同一個任播地址,第四個節點會綁定其中一個數據鏈路層的單播地址。當有報文要發送到這個任播地址的時候,數據鏈路層會把它發送到其中一個節點。這樣就可以滿足任播報文發送到單一節點的要求。

為什麽要用數據鏈路層單播去發送鏈路內任播報文呢?因為數據鏈路層協議不支持任播。如果以太網有任播地址和任播的功能,那麽鏈路內任播可以映射到任播的MAC地址。鏈路內任播就跟鏈路內組播或者鏈路內單播那樣簡單了。因為數據鏈路層任播不存在所以鏈路內任播必須映射到數據鏈路層能提供的地址類型上去例如單播、廣播或者組播。數據鏈路層單播或者組播功能無法在這裏應用,因為他們無法滿足任播只發送給一個節點的需求。綜上鏈路內任播就只能采用數據鏈路層單播的方式。

鏈路內任播需要特殊的處理而鏈路外任播不需要。節點分配鏈路內任播地址的時候需要明確指出這個地址是任播地址。鏈路內任播地址會抑制DAD機制。當配置一個IPv6單播地址的時候,DAD機制會檢查鏈路內是否分配了相同的單播地址。如果DAD報告地址重復了,就不會再去分配這個地址。鏈路內任播地址要分配到多個接口,所以禁止DAD。另外鏈路內任播的NA報文會稍微延遲一點發送,NA message中的Override flag會被清除。

設置了Override flag後,接收者會去清除緩存的IPv6地址表項。對於單播地址Override flag是設置的,所以接收者會采用新的通告信息。這對於單播NA是有道理的,因為單播NA總是來自同一個節點,新的通告更好。但是對於鏈路內任播,每個分配了鏈路內任播地址的節點都會發送NA並帶上自己的數據鏈路層地址。Override flag清零表示接收者會采用最先收到的NA中的通告信息。

被清除置位的Override flag可以防止在收到來自不同數據鏈路層地址的相同任播地址的時候出現震蕩。另外這可以認為發送者在那段時間內可以連接到鏈路上不同的配置了這個任播地址的節點。正面的看,可以提供負載均衡。但是這裏存在不可控的因素,可能所有的發送者都將任播報文發送到鏈路上的同一個數據鏈路層地址(也就是同一個節點)。如果緩存的任播目的地址無法到達了,在超時之前是無法更新的。如果一個不幸的節點緩存了無法到達的任播地址節點,在鏈路上其他節點都可用的情況下,這個節點還是無法發送到這個地址的任播報文。

配置了鏈路內任播的節點需要對這個任播地址進行特殊的配置和特殊的處理,而鏈路外任播不需要。發送者對於鏈路內任播和鏈路外任播都不需要特殊的處理。

RFC定義了IPv6任播地址。只是定義了任播地址之間的區別,並沒有和單播地址做區分。應該最廣泛的任播地址是子網路由任播地址(SRA)。每條鏈路都有一個子網路由任播地址。在定義子網路由任播地址時所有的接口比特都置成0.例如鏈路2001:db8:cafe:fee::/64,它的子網路由任播地址就是2001:db8:cafe:fee::/128。這個子網路由任播地址在RFC4291中定義RFC "Reserved IPv6 Subnet Anycast Addresses" (http://www.rfc-editor.org/rfc/rfc2526.txt),它預留了最高的128位地址給每個鏈路的任播地址。

初看起來子網路由任播地址可以比較理想的應用在FHRP上。但是目前應用比較廣泛的FHRP,例如HSRP、VRRP、GLBP、CARP等,雖然都支持IPv6但不支持子網路由任播地址。那麽子網路由任播地址能用在什麽地方?它還沒有得到廣泛的實施,並被誇大了它目前的用途。根據反饋,或許其他的文章能深入研究挖掘它的應用。

那麽就讓這個牢騷來當做結尾:雖然IPv6支持了鏈路內任播卻沒有任何關鍵應用采用這是不正常的。

總結

鏈路內和鏈路外的數據包發送:單播、組播、任播