天天看點

網工筆記(三):IP Multicast多點傳播技術

 IP多路多點傳播技術,英文為IP Multicast,  就是英文文檔裡經常說到的BUM封包裡的大M。這是一門特别的技術,它從2層到3層協定mac位址到IP位址都自成一體。很多網工同行隻在IE考試裡學習了一下,後來就不怎麼使用了,究其原因是該技術隻在某些特定領域裡使用。使用(往往是大量使用)多點傳播技術的領域有廣播行業或有IPTV業務的機構,據說央視就部署了很多多點傳播裝置。還有就是在金融行業,使用多點傳播技術來達到同時向多個伺服器下單的目的。

 簡單描述一下什麼是多點傳播,我們用微信來做個比喻:想象一下小A要同時向小B小C小D...小Z發一段語音,他會怎麼做?一,他可以向每個人發一段同樣的語音。二,他也可以拉一個群把人都放進去,然後給群裡發一段語音。後者的做法就是多點傳播技術的原理,把消息發到一個群裡也就是多點傳播位址(multicast group IP), 所有群成員都可以收到消息,這樣大大減少了資訊源的工作不需要給每個群成員單獨發消息。

 多點傳播技術的學習分兩部分,多點傳播技術2層用的是IGMP協定,在3層用的是PIM協定,尤其PIM是學習難點。下文會簡要的講解一下這兩個協定 ,關于PIM今天我們隻講PIM-SM。以下是本文的提綱。

  • 基本原理
  • 多點傳播二層協定IGMP
  • 多點傳播三層協定三層PIM
  • PIM-SM的工作流程
  • 一個簡單的實驗
  • 排錯清單

​​基本原理

 多點傳播的目的就是要讓一個終端能同時向多個終端發送資料封包。這些接收的終端都需要加入到一個IP組位址(multicast group IP)中,才能收到資訊源發送的封包。IANA規定224.0.0.0/4 這個D類網段為多點傳播的IP位址段,這個網域包含從224.0.0.0 到 239.255.255.255 的所有位址,對應二進制位址中以1110開頭的所有位址。

在這些多點傳播位址中還有預留給某些協定的專用位址。

 224.0.0.0/24  子網内控制封包
 224.0.1.0/24  不同網段的控制封包
 224.0.0.1  網段内所有的主機
 224.0.0.2  網段内所有的路由器
 224.0.0.5  所有OSPF路由器
 224.0.0.6  OSPF中的指定路由器 (Designated Routers)
 224.0.0.9  所有RIPv2路由器
 224.0.0.22  IGMPv3協定 
 224.0.0.13  所有PIM路由器
 224.0.1.1  NTP裝置

 因為群組IP位址是一個共享位址是以對應的mac位址也是共享位址,所有群成員(也就是加入群組裡的接收端)都要讓自己偵聽這個位址。

多點傳播MAC位址的前24位總是固定的以01:00:5E開頭, 并且多點傳播MAC位址中的第25位總為0,所剩下的23位就要用于比對對應的多點傳播IP位址。而前文說了多點傳播的IP位址的前4位是不變的,這樣算下來多點傳播MAC位址中可變的23位要就用來比對多點傳播IP中可變的28位,這就造成了多點傳播MAC位址到多點傳播IP位址的影射中有5位是不能一對一對應的 -- 不同的IP位址使用同一個MAC位址。是以在選擇多點傳播IP位址時應避免同時使用239.0.x.y 和239.128.x.y這兩個區間的位址 [1]。(239.128.0.0 和239.0.0.0映射到同一個MAC位址,239.128.0.1則與 239.0.0.1使用同一個MAC位址如此類推。)

多點傳播二層協定IGMP

 終端是不會使用多點傳播的MAC位址作為發送封包的源位址的,是以交換機是不能通過mac learning學到多點傳播的MAC位址,因而在這種情況下交換機隻能把發給多點傳播位址的封包向整個VLAN泛洪,這也是交換機一般的預設設定。對于要用作多點傳播的網絡,把所有多點傳播封包進行全網泛洪自然是不理想的,使用IGMP協定(RFC4541)即可以讓交換機選擇性地隻把多點傳播封包發送到加入到該多點傳播位址組的端口。IGMP協定主要包含兩個部分(1)IGMP Snooping和(2)IGMP Querier。

IGMP Snooping能把多點傳播MAC位址添加到交換機的MAC位址表中,這依賴于終端組員發送IGMP join封包來加入IGMP位址組,IGMP會把該位址加入到對應的位址表上,用指令show mac address-table multicast可檢視目前交換機上有的多點傳播MAC位址。 發送到一個多點傳播位址的封包會被複制并發送到所有加入到該位址組的端口。用指令show ip igmp snooping groups可以查詢那些端口加入到IGMP Snooping的位址組中。

SW1#sh ip igmp snooping groups

Vlan  Group            Type     Version             Port-List

--------------------------------------------------------------------------------

900   239.20.20.20     Dynamic  -                      Et1, Cpu

IGMP Snooping需要終端發送IGMP join的封包,在Linux中可以用這個指令sudo ip addr add <multicast group address>/32 dev eth1 autojoin來加入一個多點傳播位址。例如加入239.20.20.20, 用sudo ip addr add 239.20.20.20/32 dev eth1 autojoin。

但是有些終端是不具備發送IGMP report的功能,這個情況下可以配置靜态關聯。

SW1(config)#interface et5

SW1(config-if-Et4)#ip igmp static-group 239.150.150.160

用指令show ip igmp member檢視所有加入到igmp多點傳播的成員,包括用靜态關聯加入的也會顯示。

 #sh ip igmp membership

 Interface----------------Group Address----IncludeSrc----------ExcludeSrc----------

 Ethernet5                239.150.150.160      0.0.0.0

 Vlan300                  224.0.1.129              0.0.0.0

IGMP Querier會周期性地廣播發出queries封包到VLAN中,在該網段的終端通過回複querier來表達要加入的組位址。在一個網段中如果有多點傳播路由器,IGMP Querier的角色就由指定的(Designated)多點傳播路由器來擔當,如果一個網段中有多個多點傳播路由器,則通過選舉找出一個指定的路由器來擔當這個角色(一般看那一個的IP位址較小)。這裡多點傳播路由器一般是指配置了PIM的路由器。在沒有多點傳播路由器的情況下,交換機可以配置IGMP Snooping Querier來代替實作相同的功能。

找出在多點傳播中的指定路由器(Designated Router), 用指令show ip pim interfaces。

SW1#show ip pim interfaces

Address   Interface  Mode    Neighbor  Hello  DR   DR Address  PktsQed  PktsDropped

                             Count     Intvl  Pri

70.0.0.1  Ethernet3  sparse  1         30     1    70.0.0.2    0        0

90.0.0.1  Vlan900    sparse  0         30     1    90.0.0.1    0        0

在這個連接配接裡[2]可以看到IGMP的抓包。 

多點傳播三層協定PIM

PIM是多點傳播技術中使用的路由協定,讓多點傳播封包能通過路由到達多個終端,這讓多點傳播技術真正變得有價值。注意具備路由能力的交換機,當其配置了PIM的情況下,IGMP也會被自動開啟。

PIM有多個模式,其中PIM-SM模式應用最廣,本文中隻講解PIM-SM。在這裡提一下的是PIM-DM這個模式,PIM-DM與PIM-SM的差別是PIM-DM不需要RP(下文會說什麼是RP),PIM-DM假設所有網段都加入到一個多點傳播位址中,多點傳播封包會被泛洪到所有路由器,不需要多點傳播封包的終端需要發送prune消息來停止接收多點傳播封包。另外還有一種PIM的模式為PIM-SSM,這種模式下隻有一個特定的多點傳播源,不需要使用RP。因為PIM-SM在多點傳播源上沒有限制,是以也經常被叫作any source multicast, 意思就是任意多點傳播源的多點傳播協定。 

要去了解PIM-SM,首先要搞清楚的就是它的術語。向一個多點傳播位址發送封包的伺服器就為源端(source),  而使在該多點傳播位址裡的組員即為接收端。往源端方向的流為上遊(upstream), 往接收端方向為下遊(downstream)。下圖給出了在PIM-SM拓撲中幾個重要角色 -- FHR,RP,LHR--所處的位置,我做了一些簡化,假設FHR和LHR是具備路由功能的交換機,在現實中一般有多個FHR和LHR。下面來講解這些角色的功能。

網工筆記(三):IP Multicast多點傳播技術
  • Mroute (Multicast Route): 多點傳播路由表,與之對應的單點傳播路由表就是我們平時常用的路由表。多點傳播路由是為流量驅動的,在有流量的情況下才會生成路由項,沒有流量路由表就為空。在多點傳播路由表中沒有BGP,OSPF這些用來傳遞路由的協定。
  • FHR (First Hop Router): 如上圖,配置了PIM的連接配接多點傳播源的第一跳路由器。
  • LHR (Last Hop Router):如上圖,配置了PIM的連接配接接收端的第一跳的路由器。
  • DR (Designated Router): 一般FHR和LHR會被配置為DR,這種情況下作為DR的FHR負責發送PIM register封包;作為DR的LHR負責發送PIM join封包。
  • RP (Rendezvous Point): RP是PIM-SM的一個具有特殊角色的路由器,在FHR和LHR上配置的RP必須一緻。RP是共享樹(RPT)的根。
  • SPT (Shortest Path Tree): 從源端到接收端的最短路徑樹,根據單點傳播路由表用RPF(Reserver Path Forwarding)算出來的。
  • RPT(Rendezvous Point Tree): RP樹經常被稱之為共享樹(share tree),從RP到接收端的路徑。
  • (S, G):  用于标記SPT,在多點傳播路由表中用來表示SPT去往接收端的下一跳,S表示source, G表示Group。
  • (*,G):  用于标記RPT,在多點傳播路由表中用來表示RPT去往接收端的下一跳,*表示任何位址,G表示Group。

為了防止多點傳播路由中出現環路,在多點傳播中應用了RPF檢測這個規則。不論是從(S,G)路徑或是從(*,G)路徑發送的多點傳播封包都必須通過RPF檢測才能夠往下發送[3]。RPF檢測就是在單點傳播路由表上查詢出封包源位址對應的路徑所對應的出口,即為RPF接口,如果多點傳播封包進入到多點傳播路由器時的入口與RPF接口不一緻,該封包會被丢棄。

PIM-SM的工作流程

上面講了術語,估計不太好了解,下面講一下PIM-SM的工作流程,整個架構呈現出來以後就會好了解一點,其中了解這個流程的關鍵點是搞清封包發送的方向。

  1. FHR-DR向RP注冊多點傳播源。當多點傳播源向一個組位址發送封包時,FHR會把這第一個封包封裝成PIM register封包,并把封包發送給RP去注冊這個多點傳播源。
  2. RP給多點傳播源完成注冊。當RP收到PIM register的封包後,假設在有RPT共享樹的情況下,RP會解封這個PIM register封包,并向接收端下發這個封包。同時RP會向FHR發送PIM join封包,在多點傳播路由表中生成(S,G)路由,即去往多點傳播源的路由,途徑的路由器都會生成對應的(S,G),SPT樹就建立了。(C)一旦SPT樹建立,RP會向FHR發PIM register stop封包。
  3. 多點傳播源通過RPT路徑向接收端發封包。當第二步完成後,源端就可以向接收端發送封包,但這個時候發送的封包都要經過RP,是以可能不是發送封包的最優路徑。 注意這一步的前提條件是RP的多點傳播路由表中有(*,G),也就是RPT共享樹已生成,這時Outgoing Interface List(OIL)上也會對應的接口,封包會從這些接口下發。在沒有(*,G)的情況下,RP會向FHR發PIM register stop封包,并不會向下傳輸多點傳播封包。
  4. RPT路徑轉到(switchover)SPT路徑。當LHR接收到封包後,LHR就知道了多點傳播源位址,LHR會向源端方向(即上遊)發送PIM join封包,在多點傳播路由表中生成(S,G),途徑的路由器也會生成(S,G),建立SPT樹。
  5. LHR-DR剪除RPT樹。當LHR到FHR完成SPT樹的建立,也就是說途徑的路由器都有(S,G),那麼LHR會發送PIM prune封包給RP,告知RP不用再發多點傳播封包,否則會收到重複的封包。在PIM的RFC7761中[5],這一步被表示為(S,G,RPT), LHR發(S,G,RPT)封包來通知RP不要再轉發發來自該多點傳播源的封包。

注意在上文第三步中說了RP在多點傳播路由中有(*,G)時才向下發封包。(*,G)的生成由LHR驅動,LHR在有IGMP組員的情況下會向RP發PIM join,RP和中間路由器會對應地生成(*,G)。需要說明的一點是FHR是不用發PIM join封包的,隻有LHR發PIM join封包。這裡我們假設LHR是其子網段中的DR,如果LHR不是DR,LHR則隻負責在接到IGMP report後建立IGMP組員表,由DR發送PIM join。從PIM-SM上遊到下遊,如果沒有源端發封包,或沒有接收端發IGMP join封包,PIM-SM将不會有多點傳播路由項也不會傳輸封包,是以PIM-SM被稱之為流量驅動型的協定。

一個簡單的實驗

前文講解了什麼是PIM當中的FHR,RP,LHR,在實際拓撲中這些PIM協定中的角色通常會分布在不同的路由器上,但我們也可以在同一個路由器上部署所有這些角色,換言之,這個路由器即是FHR同時也是RP和LHR。

 在這個實驗中我們隻需要兩台裝置,一台作PIM路由器,一台作打流機生成多點傳播流量。這裡的PIM會被設定成同時擔當FHR,RP和LHR;打流器我們使用Arista的vEOS中自帶的軟體ethxmit,在我前面的部落格裡介紹了如何在EVE-NG環境上導入vEOS,這是連結。下面是這個實驗的配置。

router pim sparse-mode

   ipv4

      rp address 5.5.5.5                                  <==== 使用loopback5作RP

interface Loopback5

   ip address 5.5.5.5/32

interface Ethernet1                                     <==== et1 作為PIM多點傳播源的入口, 連接配接到vEOS打流器上                            

   no switchport

   ip address 10.1.1.2/30

   pim ipv4 sparse-mode

interface Vlan300                                      

   ip address 192.168.1.1/24

   ip igmp version 2

   ip igmp static-group 224.0.1.129             <==== 在vlan 300上配置igmp的靜态關聯,加入組位址224.0.1.129

   pim ipv4 sparse-mode

在vEOS上用指令行bash進入Linux模式,用以下指令生成多點傳播流量,用et1為接口向多點傳播224.0.1.129發流量。

# sudo ethxmit --ip-dst=224.0.1.129 --ip-src=10.1.1.1 --udp-dport=65000 --udp-sport=65000 et1

檢視PIM-SM的資料流是否建立,主要就是看(S,G)是否生成。

# sh ip mroute | beg 224.0.1.129

224.0.1.129

  0.0.0.0, 0:00:14, RP 5.5.5.5, flags: W

    Incoming interface: Register

    Outgoing interface list:

      Vlan300

  10.1.1.1, 0:00:03, flags: SLN                      <==== 這就是(S,G),S=10.1.1.1,  G=224.0.1.129

    Incoming interface: Ethernet1

    RPF route: [U] 10.1.1.0/30 [0/1]

    Outgoing interface list:

      Vlan300

排錯清單

在排查多點傳播路由時常見的問題有如下,

  • 因MTU不足造成多點傳播源到RP上的注冊失敗。上文的所述,當多點傳播源開始發送封包時,FHR會封裝第一個封包發送到RP,封裝的封包會比原封包大,是以MTU不足會造成注冊失敗。
  • FHR,LHR或任一多點傳播路由器沒有去往RP的路徑,這裡指單點傳播(unicast)的路徑。
  • TTL問題。有一些多點傳播源在發送的封包上設定TTL為1,如需經過多個中間的路由器,封包即無法到達接收端[3]。另一點是IGMP report封包的TTL也為1。
  • LHR中沒有IGMP組員導緻封包不能下發。LHR沒有IGMP組員就不會給RP發PIM join, RP就不會向其轉發多點傳播封包。造成這個的原因可能有多種,組員不具備發送IGMP report的功能,或者發送IGMP report的間隔太長。
  • Switchover沒有發送。上文說了switchover的過程,簡單來說就是封包的轉發從RPT樹的路徑換到使用SPT樹的路徑,相應地多點傳播路由表中的(*,G)會變成(S,G)。記住即使RP在最短路徑上,這個狀态的切換依然要發生,多點傳播表中最終應該顯示的是(S,G)。如果不想讓switchover發生,需要把SPT threshold這個參數上設為infinity。

在排錯多點傳播問題常用的指令有:

show ip igmp snooping group  檢視IGMP組位址群組員
show ip pim interfaces  檢視配置了PIM的接口, 檢視誰是DR
show ip pim rp  檢視RP

show ip mroute <group ip>

show ip mroute <group ip> details

檢視多點傳播路由表
show ip pim neighbor  檢視PIM鄰居和其對應接口
show ip rpf <source ip>  查多點傳播源位址對應的RPF接口
clear ip mroute * 清空目前的多點傳播路由表

用show ip mroute來檢視一個多點傳播路由器是處與RPT樹狀态還是SPT樹狀态。

以下是多點傳播路由器處于SPT樹狀态的輸出,10.0.0.10是多點傳播源位址,239.10.10.10是組位址,即為(S,G):

# show ip mroute

239.10.10.10

  10.0.0.10, 0:00:51, flags: SL

    Incoming interface: Ethernet1

    RPF route: [U] 10.0.0.0/24 [0/1]

    Outgoing interface list:

      Ethernet3

以下是多點傳播路由器處于RPT樹狀态的輸出,多點傳播源位址為0.0.0.0,表示為任何位址對應(*,G)中的’*‘, 239.10.10.10是組位址,是以為(*,G):

#show ip mroute

239.20.20.20

  0.0.0.0, 0:00:28, RP 2.2.2.2, flags: W

    Incoming interface: Register

    Outgoing interface list:

      Ethernet4

參考文獻

[1] Clusters from Scratch:https://clusterlabs.org/pacemaker/doc/en-US/Pacemaker/1.1/html/Clusters_from_Scratch/_notes_on_multicast_address_assignment.html

[2] IGMP Packets: https://packetlife.net/captures/protocol/igmp/

[3] Multicast with TTL of 1: https://forums.juniper.net/t5/Routing/Multicast-with-TTL-of-1-how-to-route-across-subnets-PIM-not/td-p/289032

[4] Cisco IP Multicast Troubleshooting Guide: https://www.cisco.com/c/en/us/support/docs/ip/ip-multicast/16450-mcastguide0.htm

[5]  Protocol Independent Multicast - Sparse Mode, RFC7761,  https://tools.ietf.org/html/rfc7761

繼續閱讀