搭建的目標(biāo)網(wǎng)絡(luò)描述
單個源節(jié)點S里伯,一個中間路由轉(zhuǎn)發(fā)節(jié)點M,兩個組播目的節(jié)點D1和D2贝椿。
S通過非組播組成員M的路由轉(zhuǎn)發(fā)向D1和D2發(fā)送組播消息蔑穴,網(wǎng)絡(luò)中存在兩個虛擬局域網(wǎng)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 |
這里的關(guān)鍵點是中間路由轉(zhuǎn)發(fā)節(jié)點M配備有兩張網(wǎng)卡,這兩張網(wǎng)卡分別工作在vlan1和vlan2中谋梭,使得M節(jié)點能夠同時與vlan1中的源節(jié)點S以及vlan2中的接收節(jié)點D1信峻、D2同時進(jìn)行通信,進(jìn)而實現(xiàn)數(shù)據(jù)轉(zhuǎn)發(fā)的任務(wù)瓮床。
所有節(jié)點都需要運行單播路由協(xié)議盹舞,使得每個節(jié)點在本地生成單播路由表,這是組播路由表生成的前提隘庄,也可以通過手動配置靜態(tài)路由的方式加以設(shè)定踢步,這里我們采用的是自組網(wǎng)路由協(xié)議olsrd輔助生成靜態(tài)路由,在每一個節(jié)點上運行丑掺,包括S获印、M、D1和D2街州。
關(guān)于組播兼丰,可以為S玻孟、D1和D2上配置組播轉(zhuǎn)發(fā)路由,在中間路由器節(jié)點運行pimd鳍征,組播網(wǎng)絡(luò)就能開始運行黍翎。
在D1、D2節(jié)點上開啟組播數(shù)據(jù)接收程序./receiver加入組播組224.5.5.5艳丛,并且等待接收組播數(shù)據(jù)匣掸,然后在源節(jié)點S無需加入組播組,只需要啟動發(fā)送數(shù)據(jù)程序./sender即可氮双。
網(wǎng)絡(luò)搭建
查看本機(jī)是否支持組播操作
廣播需要在局域網(wǎng)內(nèi)才能實現(xiàn)碰酝,另外得查看linux系統(tǒng)是否支持組播和廣播。
查看本機(jī)是否支持組播操作戴差,有兩種可選方法:
方法A:輸入命令:ifconfig
如果出現(xiàn)
UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1
則說明本機(jī)支持組播送爸。
方法B:查看/boot/config-x.x.xx 文件中是否有如下內(nèi)容
CONFIG_IP_MULTICAST=y
CONFIG_NET_IPIP=m
CONFIG_IP_MROUTE=y
由于從linux 2.4內(nèi)核開始,linux操作系統(tǒng)默認(rèn)添加了對組播操作的支持暖释,如果使用老版本的linux操作系統(tǒng)的話碱璃,可能會存在不支持的情況,此時可以選擇更新操作系統(tǒng)饭入,如果不想更新操作系統(tǒng),就需要重新編譯內(nèi)核了肛真,具體編譯步驟如下:
運行
make menuconfig
進(jìn) 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
重啟,用新內(nèi)核啟動蚓让。
啟動主機(jī)轉(zhuǎn)發(fā)功能
使得普通的linux主機(jī)也具有路由器的數(shù)據(jù)包轉(zhuǎn)發(fā)功能
echo 1 >/proc/sys/net/ipv4/ip_forward
解釋:出于安全考慮乾忱,Linux系統(tǒng)默認(rèn)是禁止數(shù)據(jù)包轉(zhuǎn)發(fā)的。所謂轉(zhuǎn)發(fā)即當(dāng)主機(jī)擁有多于一塊的網(wǎng)卡時历极,其中一塊收到數(shù)據(jù)包窄瘟,根據(jù)數(shù)據(jù)包的目的ip地址將包發(fā)往本機(jī)另一網(wǎng)卡,該網(wǎng)卡根據(jù)路由表繼續(xù)發(fā)送數(shù)據(jù)包趟卸。這通常就是路由器所要實現(xiàn)的功能蹄葱。
配置Linux系統(tǒng)的ip轉(zhuǎn)發(fā)功能,首先保證硬件連通锄列,然后打開系統(tǒng)的轉(zhuǎn)發(fā)功能
less /proc/sys/net/ipv4/ip_forward
該文件內(nèi)容為0图云,表示禁止數(shù)據(jù)包轉(zhuǎn)發(fā),1表示允許邻邮,將其修改為1竣况。可使用命令
echo "1" > /proc/sys/net/ipv4/ip_forward
修改文件內(nèi)容筒严,重啟網(wǎng)絡(luò)服務(wù)或主機(jī)后效果不再丹泉。若要其自動執(zhí)行情萤,可將命令
echo "1" > /proc/sys/net/ipv4/ip_forward
寫入腳本/etc/rc.d/rc.local 或者 在/etc/sysconfig/network腳本中添加
FORWARD_IPV4="YES"
設(shè)置網(wǎng)關(guān)
發(fā)送多播包的主機(jī)需要設(shè)置網(wǎng)關(guān),否則運行sendto()會出現(xiàn)"network is unreachable"摹恨,網(wǎng)卡可以隨便設(shè)置筋岛,但是一定要設(shè)。
接收多播包的主機(jī)也需要設(shè)置網(wǎng)關(guān)睬塌,否則運行時會出現(xiàn)IP_ADD_MEMBERSHIP錯誤泉蝌。
下面以為無線網(wǎng)卡wlan0添加靜態(tài)組播路由為例進(jìn)行說明:
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
實際上只需要配置如下路由即可,默認(rèn)網(wǎng)關(guān)的配置可有可無.
下面進(jìn)行S節(jié)點的組播靜態(tài)路由配置:
sudo route add -net 224.0.0.0 gw "10.10.10.2" netmask 240.0.0.0 dev wlan0
下面進(jìn)行接收節(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解壓硫兰,進(jìn)入解壓目錄诅愚,并進(jìn)行編譯和安裝
# tar -jxvf pimd-2.1.8.tar.bz2
# cd pimd-2.1.8
# make
# make install
組播轉(zhuǎn)發(fā)前提條件
IP組播模塊提供了創(chuàng)建和刪除轉(zhuǎn)發(fā)緩存的基本功能,但只有通過組播路由協(xié)議守護(hù)進(jìn)程(通常是mrouted)劫映,依靠路由協(xié)議(如靜態(tài)路由违孝、OSPF、RIP泳赋、PIM)來生成轉(zhuǎn)發(fā)緩存雌桑,才能真正實現(xiàn)組播功能。
因此祖今,IP組播模塊提供用于創(chuàng)建和刪除轉(zhuǎn)發(fā)緩存和虛擬接口套接口選項校坑,供組播路由協(xié)議守護(hù)進(jìn)程來操作。創(chuàng)建轉(zhuǎn)發(fā)緩存過程通常如下:當(dāng)接收到組播報文后千诬,便根據(jù)組播報文的源和目的地址為其創(chuàng)建一個臨時的轉(zhuǎn)發(fā)緩存耍目,然后給組播路由協(xié)議守護(hù)進(jìn)程發(fā)送IGMPMSG_NOCACHE報告。當(dāng)組播路由協(xié)議守護(hù)進(jìn)程收到IGMPMSG_NOCACHE報告后徐绑,便在協(xié)議維護(hù)的組播路由表里選路邪驮,然后通過套接口選項創(chuàng)建新的轉(zhuǎn)發(fā)緩存,完成后組播報文便可以轉(zhuǎn)發(fā)了傲茄。
因此毅访,如果要實現(xiàn)組播路由,必須具備的前提條件為:路由轉(zhuǎn)發(fā)緩存和組播路由協(xié)議守護(hù)進(jìn)程盘榨。由于我們在本次測試中使用的是PIM-SM協(xié)議俺抽,因此其對應(yīng)的守護(hù)進(jìn)程為pimd。
實驗過程及現(xiàn)象
- 源節(jié)點s啟動組播發(fā)送程序
# ./sender
- 當(dāng)中間路由轉(zhuǎn)發(fā)節(jié)點M未運行pimd守護(hù)進(jìn)程時较曼,
此時目的節(jié)點D1和D2啟動組播接收程序后無法接收到組播數(shù)據(jù)包(原因很簡單磷斧,此時還無路由信息,所以中間節(jié)點M不會轉(zhuǎn)發(fā)源節(jié)點s發(fā)送的組播數(shù)據(jù)包)
查看中間路由轉(zhuǎn)發(fā)節(jié)點M的組播虛擬轉(zhuǎn)發(fā)接口信息如下:
查看命令:
# more /proc/net/ip_mr_vif
節(jié)點M的虛擬轉(zhuǎn)發(fā)接口上也無任何數(shù)據(jù)。
- 在中間路由轉(zhuǎn)發(fā)節(jié)點M上運行pimd守護(hù)進(jìn)程
查看組播路由協(xié)議pimd運行狀態(tài)
通過如下指令顯示的調(diào)試信息:
# pimd -d
從調(diào)試信息可以看出弛饭,pimd以密集模式啟動冕末,并且選舉IP地址為192.168.3.1的節(jié)點為匯聚點。
通過如下指令顯示的路由信息:
# pimd -r
查看中間路由轉(zhuǎn)發(fā)節(jié)點M的單播路由表
查看中間路由轉(zhuǎn)發(fā)節(jié)點M的組播路由表
查看中間路由轉(zhuǎn)發(fā)節(jié)點M的組播虛擬轉(zhuǎn)發(fā)接口信息
從上圖可知侣颂,中間路由轉(zhuǎn)發(fā)節(jié)點wlan2接口有組播數(shù)據(jù)包的接收档桃,然后組播數(shù)據(jù)包從M節(jié)點的wlan6節(jié)點轉(zhuǎn)發(fā),即建立了組播虛擬轉(zhuǎn)發(fā)接口憔晒。
查看組播轉(zhuǎn)發(fā)緩存表:
上圖顯示的是藻肄,組播源節(jié)點IP為10.10.10.1即s節(jié)點。組播組IP地址為224.5.5.5拒担,組播轉(zhuǎn)發(fā)緩存已建立嘹屯。
-
最后目的節(jié)點D1和D2都能正確接收到組播數(shù)據(jù)包
總結(jié)
從上面的測試結(jié)果和分析可以知道,為了實現(xiàn)組播源和組播成員之間通信从撼,必須建立起來正確的輸入輸出通道(即組播轉(zhuǎn)發(fā)表)州弟。即
同時在linux 內(nèi)核中必須要有正確的路由表支持,linux 內(nèi)核中的路由表是不會自動建立的低零,需要借助組播路由守護(hù)進(jìn)程婆翔。如pimd。
再者掏婶,需要加入組播組的組播成員本身要支持IGMP 協(xié)議啃奴,來實現(xiàn)對自身狀態(tài)的管理和報告。
參考資料
- 使用如下命令來查看當(dāng)前網(wǎng)卡上加入的組播組
#netstat -gn
IPv4/IPv6 Group Memberships
Interface RefCnt Group
- 查看本機(jī)內(nèi)核IP路由表
route -ne
內(nèi)核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
- 查看多播轉(zhuǎn)發(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
- 查看多播虛擬轉(zhuǎn)發(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 - 網(wǎng)段中所有支持多播的主機(jī)雄妥,即任何具有多播功能的主機(jī)在接口啟動后都會自動加入該組. 因此該地址不需要設(shè)置的,只要開啟組播功能就會自動加入該組.
224.0.0.2 - 網(wǎng)段中所有支持多播的路由器纺腊,任何具有組播功能的路由器在接口啟動后都會自動加入該組.
224.0.0.4 - 網(wǎng)段中所有的DVMRP路由器
224.0.0.5 - 所有的OSPF路由器
224.0.0.6 - 所有的OSPF指派路由器
224.0.0.7 - 所有的ST路由器
224.0.0.8 - 所有的ST主機(jī)
224.0.0.9 - 所有RIPv2路由器
224.0.0.10 - 網(wǎng)段中所有支的路由器
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服務(wù)器