搭建的目標網絡描述
單個源節(jié)點S,一個中間路由轉發(fā)節(jié)點M,兩個組播目的節(jié)點D1和D2。

S通過非組播組成員M的路由轉發(fā)向D1和D2發(fā)送組播消息,網絡中存在兩個虛擬局域網vlan,其中vlan1包含源節(jié)點S和中間路由器節(jié)點M,vlan2包含中間路由器節(jié)點M以及兩個組播目的節(jié)點D1和D2。
他們的IP地址配置如下所示:
| 節(jié)點編號 | Vlan1 | Vlan2 |
|---|---|---|
| S | wlan0:10.10.10.1 | |
| M | wlan2:10.10.10.2 | wlan6:192.168.3.1 |
| D1 | wlan1:192.168.3.2 | |
| D2 | wlan1:192.168.3.3 |
這里的關鍵點是中間路由轉發(fā)節(jié)點M配備有兩張網卡,這兩張網卡分別工作在vlan1和vlan2中,使得M節(jié)點能夠同時與vlan1中的源節(jié)點S以及vlan2中的接收節(jié)點D1、D2同時進行通信,進而實現(xiàn)數據轉發(fā)的任務。
所有節(jié)點都需要運行單播路由協(xié)議,使得每個節(jié)點在本地生成單播路由表,這是組播路由表生成的前提,也可以通過手動配置靜態(tài)路由的方式加以設定,這里我們采用的是自組網路由協(xié)議olsrd輔助生成靜態(tài)路由,在每一個節(jié)點上運行,包括S、M、D1和D2。
關于組播,可以為S、D1和D2上配置組播轉發(fā)路由,在中間路由器節(jié)點運行pimd,組播網絡就能開始運行。
在D1、D2節(jié)點上開啟組播數據接收程序./receiver加入組播組224.5.5.5,并且等待接收組播數據,然后在源節(jié)點S無需加入組播組,只需要啟動發(fā)送數據程序./sender即可。
網絡搭建
查看本機是否支持組播操作
廣播需要在局域網內才能實現(xiàn),另外得查看linux系統(tǒng)是否支持組播和廣播。
查看本機是否支持組播操作,有兩種可選方法:
方法A:輸入命令:ifconfig
如果出現(xiàn)
UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1
則說明本機支持組播。
方法B:查看/boot/config-x.x.xx 文件中是否有如下內容
CONFIG_IP_MULTICAST=y
CONFIG_NET_IPIP=m
CONFIG_IP_MROUTE=y
由于從linux 2.4內核開始,linux操作系統(tǒng)默認添加了對組播操作的支持,如果使用老版本的linux操作系統(tǒng)的話,可能會存在不支持的情況,此時可以選擇更新操作系統(tǒng),如果不想更新操作系統(tǒng),就需要重新編譯內核了,具體編譯步驟如下:
運行
make menuconfig
進 Networking support -> Networking options里面就有選項:
IP: multicasting
IP: tunneling
IP: multicast routing
IP: PIM-SM version 1 support
IP: PIM-SM version 2 support
選中這幾項,保存退出
make && make modules_install && make install
重啟,用新內核啟動。
啟動主機轉發(fā)功能
使得普通的linux主機也具有路由器的數據包轉發(fā)功能
echo 1 >/proc/sys/net/ipv4/ip_forward
解釋:出于安全考慮,Linux系統(tǒng)默認是禁止數據包轉發(fā)的。所謂轉發(fā)即當主機擁有多于一塊的網卡時,其中一塊收到數據包,根據數據包的目的ip地址將包發(fā)往本機另一網卡,該網卡根據路由表繼續(xù)發(fā)送數據包。這通常就是路由器所要實現(xiàn)的功能。
配置Linux系統(tǒng)的ip轉發(fā)功能,首先保證硬件連通,然后打開系統(tǒng)的轉發(fā)功能
less /proc/sys/net/ipv4/ip_forward
該文件內容為0,表示禁止數據包轉發(fā),1表示允許,將其修改為1??墒褂妹?/p>
echo "1" > /proc/sys/net/ipv4/ip_forward
修改文件內容,重啟網絡服務或主機后效果不再。若要其自動執(zhí)行,可將命令
echo "1" > /proc/sys/net/ipv4/ip_forward
寫入腳本/etc/rc.d/rc.local 或者 在/etc/sysconfig/network腳本中添加
FORWARD_IPV4="YES"
設置網關
發(fā)送多播包的主機需要設置網關,否則運行sendto()會出現(xiàn)"network is unreachable",網卡可以隨便設置,但是一定要設。
接收多播包的主機也需要設置網關,否則運行時會出現(xiàn)IP_ADD_MEMBERSHIP錯誤。
下面以為無線網卡wlan0添加靜態(tài)組播路由為例進行說明:
sudo route add -net 224.0.0.0 netmask 240.0.0.0 dev wlan0
sudo route add default gw "192.168.2.20" dev wlan0
實際上只需要配置如下路由即可,默認網關的配置可有可無.
下面進行S節(jié)點的組播靜態(tài)路由配置:
sudo route add -net 224.0.0.0 gw "10.10.10.2" netmask 240.0.0.0 dev wlan0
下面進行接收節(jié)點D1的組播靜態(tài)路由配置:
sudo route add -net 224.0.0.0 gw "192.168.3.1" netmask 240.0.0.0 dev wlan1
D2配置與D1完全相同,故而不再贅述。
另外:
sudo route del -net 224.0.0.0 netmask 240.0.0.0 wlan0 #刪除添加的組播路由
配置pimd,運行PIM協(xié)議
將下載的pimd-2.1.8.tar.bz2解壓,進入解壓目錄,并進行編譯和安裝
# tar -jxvf pimd-2.1.8.tar.bz2
# cd pimd-2.1.8
# make
# make install
組播轉發(fā)前提條件
IP組播模塊提供了創(chuàng)建和刪除轉發(fā)緩存的基本功能,但只有通過組播路由協(xié)議守護進程(通常是mrouted),依靠路由協(xié)議(如靜態(tài)路由、OSPF、RIP、PIM)來生成轉發(fā)緩存,才能真正實現(xiàn)組播功能。
因此,IP組播模塊提供用于創(chuàng)建和刪除轉發(fā)緩存和虛擬接口套接口選項,供組播路由協(xié)議守護進程來操作。創(chuàng)建轉發(fā)緩存過程通常如下:當接收到組播報文后,便根據組播報文的源和目的地址為其創(chuàng)建一個臨時的轉發(fā)緩存,然后給組播路由協(xié)議守護進程發(fā)送IGMPMSG_NOCACHE報告。當組播路由協(xié)議守護進程收到IGMPMSG_NOCACHE報告后,便在協(xié)議維護的組播路由表里選路,然后通過套接口選項創(chuàng)建新的轉發(fā)緩存,完成后組播報文便可以轉發(fā)了。
因此,如果要實現(xiàn)組播路由,必須具備的前提條件為:路由轉發(fā)緩存和組播路由協(xié)議守護進程。由于我們在本次測試中使用的是PIM-SM協(xié)議,因此其對應的守護進程為pimd。
實驗過程及現(xiàn)象
- 源節(jié)點s啟動組播發(fā)送程序
# ./sender
- 當中間路由轉發(fā)節(jié)點M未運行pimd守護進程時,
此時目的節(jié)點D1和D2啟動組播接收程序后無法接收到組播數據包(原因很簡單,此時還無路由信息,所以中間節(jié)點M不會轉發(fā)源節(jié)點s發(fā)送的組播數據包)
查看中間路由轉發(fā)節(jié)點M的組播虛擬轉發(fā)接口信息如下:
查看命令:
# more /proc/net/ip_mr_vif

節(jié)點M的虛擬轉發(fā)接口上也無任何數據。
- 在中間路由轉發(fā)節(jié)點M上運行pimd守護進程
查看組播路由協(xié)議pimd運行狀態(tài)
通過如下指令顯示的調試信息:
# pimd -d

從調試信息可以看出,pimd以密集模式啟動,并且選舉IP地址為192.168.3.1的節(jié)點為匯聚點。
通過如下指令顯示的路由信息:
# pimd -r

查看中間路由轉發(fā)節(jié)點M的單播路由表

查看中間路由轉發(fā)節(jié)點M的組播路由表

查看中間路由轉發(fā)節(jié)點M的組播虛擬轉發(fā)接口信息

從上圖可知,中間路由轉發(fā)節(jié)點wlan2接口有組播數據包的接收,然后組播數據包從M節(jié)點的wlan6節(jié)點轉發(fā),即建立了組播虛擬轉發(fā)接口。
查看組播轉發(fā)緩存表:

上圖顯示的是,組播源節(jié)點IP為10.10.10.1即s節(jié)點。組播組IP地址為224.5.5.5,組播轉發(fā)緩存已建立。
-
最后目的節(jié)點D1和D2都能正確接收到組播數據包
總結
從上面的測試結果和分析可以知道,為了實現(xiàn)組播源和組播成員之間通信,必須建立起來正確的輸入輸出通道(即組播轉發(fā)表)。即

同時在linux 內核中必須要有正確的路由表支持,linux 內核中的路由表是不會自動建立的,需要借助組播路由守護進程。如pimd。
再者,需要加入組播組的組播成員本身要支持IGMP 協(xié)議,來實現(xiàn)對自身狀態(tài)的管理和報告。
參考資料
- 使用如下命令來查看當前網卡上加入的組播組
#netstat -gn
IPv4/IPv6 Group Memberships
Interface RefCnt Group
- 查看本機內核IP路由表
route -ne
內核IP路由表
Destination Gateway Genmask Flags MSS Window irtt Iface
0.0.0.0 192.168.2.20 0.0.0.0 UG 0 0 0 wlan0
192.168.2.0 0.0.0.0 255.255.255.0 U 0 0 0 wlan0
192.168.2.60 192.168.2.60 255.255.255.255 UGH 0 0 0 wlan0
224.0.0.0 192.168.2.20 255.255.255.0 UG 0 0 0 wlan0
- 查看多播轉發(fā)緩存表
[root@linux ~]# more /proc/net/ip_mr_cache
Group Origin Iif Pkts Bytes Wrong Oifs
010101E0 010A0A0A 0 17637 18695220 0 1:1
FAFFFFEF 010A0A0A 0 30 12393 0
- 查看多播虛擬轉發(fā)接口
[root@linux ~]# more /proc/net/ip_mr_vif
Interface BytesIn PktsIn BytesOut PktsOut Flags Local Remote
0 eth0 18348036 17362 9784860 9231 00000 020A0A0A 00000000
1 eth 1 113304460 106891 18009400 16990 00000 016FA8C0 00000000
2 pimreg 0 0 0 0 00004 020A0A0A 00000000
- 列出多播路由表
[root@linux ~]# ip mroute
(10.10.10.1, 224.1.1.1) Iif: eth0 Oifs: eth1
- 重要的組播IP地址
224.0.0.0 - Base address
224.0.0.1 - 網段中所有支持多播的主機,即任何具有多播功能的主機在接口啟動后都會自動加入該組. 因此該地址不需要設置的,只要開啟組播功能就會自動加入該組.
224.0.0.2 - 網段中所有支持多播的路由器,任何具有組播功能的路由器在接口啟動后都會自動加入該組.
224.0.0.4 - 網段中所有的DVMRP路由器
224.0.0.5 - 所有的OSPF路由器
224.0.0.6 - 所有的OSPF指派路由器
224.0.0.7 - 所有的ST路由器
224.0.0.8 - 所有的ST主機
224.0.0.9 - 所有RIPv2路由器
224.0.0.10 - 網段中所有支的路由器
224.0.0.11 - Mobile-Agents
224.0.0.12 - DHCP server / relay agent.
224.0.0.13 - 所有的PIM路由器
224.0.0.22 - 所有的IGMP路由器
224.0.0.251 - 所有的支持組播的DNS服務器
