最近工作中涉及到了组播,对基本的概念,同时在linux下面对发送和接受组播的UDP程序进行验证。
主要涉及到组播数据包的路由,linux内核中普通的路由协议是不支持组播数据包的转发,因此需要研究支持组播数据包转发的路由。因此选用了pimd 2.1.8。同时研究组播时需要设计到IGMP协议,是跟组播路由器通信的协议,主要是用来报告自己加入的组播组和响应组播路由器的查询结果。其实现可以在linux内核源代码中找得到。后面会将对其进行分析。
分析总结文档在 总结文档pind
一:pimd其调试过程中的打印信息如下:
~ # ./pimd -d
debug level 0xffffffff (dvmrp_detail,dvmrp_prunes,dvmrp_routes,dvmrp_neighbors,dvmrp_timers,igmp_proto,igmp_timers,igmp_members,trace,timeout,packets,interfaces,kernel,cache,rsrr,pim_detail,pim_hello,pim_register,pim_join_prune,pim_bootstrap,pim_asserts,pim_cand_rp,pim_routes,pim_timers,pim_rpf)06:54:11.716 pimd version 2.1.8 starting
06:54:11.743 Got 262144 byte send buffer size in 0 iterations
06:54:11.747 Got 262144 byte recv buffer size in 0 iterations
06:54:11.752 Got 262144 byte send buffer size in 0 iterations
06:54:11.758 Got 262144 byte recv buffer size in 0 iterations
06:54:11.765 Getting vifs from kernel
06:54:11.767 v->uv_name:eth0
06:54:11.769 Installing eth0 (10.10.106.214 on subnet 10) as vif #0-7 - rate=0
06:54:11.776 v->uv_name:br0
06:54:11.779 Installing br0 (192.168.119.7 on subnet 192.168.119) as vif #1-9 - rate=0
06:54:11.787 Getting vifs from /etc/pimd.conf
06:54:11.792 /etc/pimd.conf cand_rp
06:54:11.794 Local Cand-RP address is 192.168.119.7
06:54:11.799 Local Cand-RP priority is 20
06:54:11.803 Local Cand-RP advertisement period is 30 sec.
06:54:11.808 /etc/pimd.conf rp_address
06:54:11.811 Added static RP: 10.10.106.214, group 224.0.0.0/8, prioriy 5
06:54:11.818 Adding prefix 224.0.0.0/4
06:54:11.821 data_rate_limit is 50000 (bits/s)
06:54:11.826 data_rate_interval is 20 (seconds)
06:54:11.830 reg_rate_limit is 50000 (bits/s)
06:54:11.834 reg_rate_interval is 20 (seconds)
06:54:11.838 Interface eth0 comes up; vif #0 now in service
06:54:11.843 join group 224.0.0.13 on interface 10.10.106.214 (ifindex 7)
06:54:11.850 join group 224.0.0.2 on interface 10.10.106.214 (ifindex 7)
06:54:11.857 SENT IGMP Membership Query from 10.10.106.214 to 224.0.0.1
06:54:11.863 SENT PIM v2 Hello from 10.10.106.214 to 224.0.0.13
06:54:11.870 Interface br0 comes up; vif #1 now in service
06:54:11.875 join group 224.0.0.13 on interface 192.168.119.7 (ifindex 9)
06:54:11.882 join group 224.0.0.2 on interface 192.168.119.7 (ifindex 9)
06:54:11.888 SENT IGMP Membership Query from 192.168.119.7 to 224.0.0.1
06:54:11.895 SENT PIM v2 Hello from 192.168.119.7 to 224.0.0.13
06:54:11.903 Interface register_vif0 comes up; vif #2 now in service
Virtual Interface Table
Vif Local-Address Subnet Thresh Flags Neighbors
0 10.10.106.214 10 1 DR NO-NBR
1 192.168.119.7 192.168.119 1 DR NO-NBR
2 10.10.106.214 register_vif0 1
Multicast Routing Table
Source Group RP-addr Flags
--------------------------(*,*,RP)--------------------------
Number of Groups: 0
Number of Cache MIRRORs: 0
06:54:12.160 Cache miss, src 10.10.106.119, dst 224.1.2.3, iif 0
06:54:12.164 create group entry, group 224.1.2.3
06:54:12.168 grp_mask_list is null................
06:54:12.173 create_grpentry................
06:54:12.177 mrtentry_ptr is null iif=0.......
06:54:12.383 create group entry, group 239.255.255.250
06:54:12.387 grp_mask_list is null................
06:54:12.391 create_grpentry................
06:54:15.594 create group entry, group 224.0.1.24
06:54:15.597 grp_mask_list is null................
06:54:15.602 create_grpentry................
06:54:15.606 create group entry, group 239.255.255.254
06:54:15.611 grp_mask_list is null................
06:54:15.616 create_grpentry................
06:54:16.394 create group entry, group 224.1.1.1
06:54:16.397 grp_mask_list is null................
06:54:16.401 create_grpentry................
Virtual Interface Table
Vif Local-Address Subnet Thresh Flags Neighbors
0 10.10.106.214 10 1 DR NO-NBR
1 192.168.119.7 192.168.119 1 DR NO-NBR
2 10.10.106.214 register_vif0 1
Multicast Routing Table
Source Group RP-addr Flags
---------------------------(S,G)----------------------------
10.10.106.119 224.1.2.3 10.10.106.214 CACHE SG
Joined oifs: ..j
Pruned oifs: ...
Leaves oifs: ...
Asserted oifs: ...
Outgoing oifs: ..o
Incoming : I..
TIMERS: Entry JP RS Assert VIFS: 0 1 2
195 5 0 0 0 0 0
--------------------------(*,*,RP)--------------------------
Number of Groups: 1
Number of Cache MIRRORs: 1
---------------------------RP-Set----------------------------
Current BSR address: 0.0.0.0
RP-address Incoming Group prefix Priority Holdtime
10.10.106.214 2 224/8 1 65535
enet1 port1 up
ATHR_GMAC: Enet Unit:1 PHY:1 is UP RGMii 100Mbps full duplex
ATHR_GMAC: done cfg2 0x7215 ifctl 0x0 miictrl
WASP ----> S27 PHY MDIO
Setting Drop CRC Errors, Pause Frames and Length Error frames
Virtual Interface Table
Vif Local-Address Subnet Thresh Flags Neighbors
0 10.10.106.214 10 1 DR NO-NBR
1 192.168.119.7 192.168.119 1 DR NO-NBR
2 10.10.106.214 register_vif0 1
Multicast Routing Table
Source Group RP-addr Flags
---------------------------(S,G)----------------------------
10.10.106.119 224.1.2.3 10.10.106.214 CACHE SG
Joined oifs: ..j
Pruned oifs: ...
Leaves oifs: ...
Asserted oifs: ...
Outgoing oifs: ..o
Incoming : I..
TIMERS: Entry JP RS Assert VIFS: 0 1 2
190 60 0 0 0 0 0
--------------------------(*,*,RP)--------------------------
Number of Groups: 1
Number of Cache MIRRORs: 1
---------------------------RP-Set----------------------------
Current BSR address: 0.0.0.0
RP-address Incoming Group prefix Priority Holdtime
10.10.106.214 2 224/8 1 65535
06:55:42.946 SENT PIM v2 Hello from 10.10.106.214 to 224.0.0.13
06:55:42.951 SENT PIM v2 Hello from 192.168.119.7 to 224.0.0.13
Virtual Interface Table
Vif Local-Address Subnet Thresh Flags Neighbors
0 10.10.106.214 10 1 DR NO-NBR
1 192.168.119.7 192.168.119 1 DR NO-NBR
2 10.10.106.214 register_vif0 1
Multicast Routing Table
Source Group RP-addr Flags
---------------------------(S,G)----------------------------
10.10.106.119 224.1.2.3 10.10.106.214 CACHE SG
Joined oifs: ..j
Pruned oifs: ...
Leaves oifs: ...
Asserted oifs: ...
Outgoing oifs: ..o
Incoming : I..
TIMERS: Entry JP RS Assert VIFS: 0 1 2
205 55 0 0 0 0 0
--------------------------(*,*,RP)--------------------------
Number of Groups: 1
Number of Cache MIRRORs: 1
---------------------------RP-Set----------------------------
Current BSR address: 0.0.0.0
RP-address Incoming Group prefix Priority Holdtime
10.10.106.214 2 224/8 1 65535
06:55:43.222 pimd version 2.1.8 exiting
06:55:43.224 SENT PIM v2 Hello from 10.10.106.214 to 224.0.0.13
06:55:43.231 SENT PIM v2 Hello from 192.168.119.7 to 224.0.0.13:
二:IGMP涉及到的数据包

上面的数据包中可以看到,IP:192.168.119.7为组播的客户端,其申请加入到了244.1.2.3这个组播组中,组播程序会周期性的报告自己的状态信息给组播服务端,
其数据包格式如下:

同时也会发送差送请求,其数据包格式如下:

本文详细介绍了组播的基本概念及其在Linux系统中的应用,包括支持组播数据包转发的路由协议pimd的调试过程、组播时涉及到的IGMP协议的实现与分析。
22

被折叠的 条评论
为什么被折叠?



