组播的编程与实现(Linux配置为组播路由器)
  YKMEHzdP8aoh 2023年11月13日 29 0

摘要:

组播;代码编译;套接字

Tip:

组播网络架构
  • 组播源到组播路由器 :组播路由器运行组播路由协议(PIM、DVMRP、MOSPF、MSDP、MVPN等)
  • 组播路由器到组播路由器 : 组播路由器运行组播路由协议(PIM、DVMRP、MOSPF、MSDP、MVPN等)
  • 组播路由器到接收端 : 组播路由器运行组播路由协议(IGMP)、组播路由器运行组播路由协议

组播的编程与实现(Linux配置为组播路由器)_IP

组播模型:两种ASM/SSM:选用ASM还是SSM模型取决于客户端的能力(看客户端是否具有指定组播源的能力)

组播的编程与实现(Linux配置为组播路由器)_组播_02

  • 根据接收者对组播源处理方式的不同,组播模型分为以下三类:
  •    1)ASM 模型:Any-Source Multicast,任意信源组播
  •    2)SFM 模型:Source-Filtered Multicast,信源过滤组播
  •    3)SSM 模型:Source-Specific Multicast,指定信源组播
  •  IGMPv3主机为接口上的每一个组播都维护一个表现信息: 格式为:(组播地址,过滤模式,源列表);  源列表包含0个或多个IP单播地址,通常用集合形式来表示。过滤模式包含INCLUDE和EXCLUDE: 
  • 1)INCLUDE模式表示只接收来自源列表中列出的源发送的组播数据包;  
  • 2)EXCLUDE模式表示只接收来自不在源列表中列出的组播源发送的组播数据包。
  • 跨子网进行广播的变相实现使用IP多播。与广播协议相比,只有组播接收方向路由器发出请求后,网络路由器才复制一份数据给接收方,从而节省接收方的带宽。而广播方式无论接收方是否需要,网络设备都将所有广播信息向所有设备发送,从而大量占据接收方的接入带宽
  • Linux 服务器可以作为路由器使用,不仅仅可以转发单播数据包,同时也可以转发组播数据包,组播路由选择不像单播路由选择可以由内核单独处理,组播守护程序种类繁多,例如mrouted和pimd,分别基于距离矢量组播路由选择协议(DVMRP:RFC 1075)和协议无关组播(PIM)。组播地址位D类地址,其无类域间路由选择前缀为224.0.0.0/4,范围为224.0.0.0~239.255.255.255。IGMP用于确定和管理组播组成员关系,是IPv4组播的有机组成部分,支持IPv4组播的节点必须实现它。(Linux中ip路由子系统剖析
  • PIM协议之前,使用的组播路由协议是DVMRP(距离矢量组播路由协议RFC 1075),MOSPF(组播OSPF协议RFC 1585)等,它们的特点都是需要依赖单播路由协议来进行工作,维护大量的拓扑数据库。PIM称为协议无关组播路由协议(与单播协议无关的组播路由协议),不维护组播拓扑数据库,不能够自己直接画出组播拓扑。因此PIM通过利用单播路由表的路由信息进行组播报文RPF检查,创建组播路由表项,转发组播报文。目前流行PIMv2。PIM两种工作模式:
  • PIM DM 密集模式(RFC 3973 多应用于组播组成员相对较多、分布相对密集的局域网络环境中
  • PIM SM 稀疏模式(RFC 2362): 多应用在接收者分布较为分散、地域较大的环境。PIM-SM(ASM):为任意源组播建立组播分发树。(pimd)PIM-SM(SSM):为指定源组播建立组播分发树
  • IGMP版本IGMP使用范围:在PC于最后一跳路由器之间,作用:最后一跳路由器获取主机想加入那个组播组。
  • IGMPv1,由 RFC1112 定义,定义了基本的组成员查询和报告过程;路由器在查询间隔的 3 倍时间内仍未收到响应报文时,才将该组播组删除。
  • IGMPv2,由 RFC2236 定义,在 IGMPv1 的基础上添加了组成员快速离开的机制。
  • IGMPv3 ,由 RFC3376 定义,增加的主要功能是,成员可以指定接收或指定不接收某些组播源的报文。实现源特定组播 SSM 技术(Source-Specific Multicast,指定信源组播:主机只会收到指定源发送该组的数据,主播地址不再要求全网唯一,只需要每个组播源上保持唯一,同一个源上不同的组播应用必须使用不同的ssm地址来区别);提供了Source-Filtered Multicast,信源过滤组播,对ASM 模型(any-source multicast,任意源组播,组播地址必须整个组播网络中唯一)进行了扩展,SFM通过上层软件对收到的组播报文的源地址进行检查,允许或禁止来自某些组播源的报文通过:包括列表(Inclusion List)或一个排除列表(Exclusion List)来表示对源地址的限制;从接收者的角度来看,只有部分组播源是有效的,组播源被经过了筛选
  • 所有版本的IGMP 都支持ASM(Any-Source Multicast,任意信源组播)模型;IGMPv3可以直接应用于SSM(Source-Specific Multicast,指定信源组播)模型,而IGMPv1 和IGMPv2则需要在IGMP SSM Mapping 技术的支持下才能应用于SSM 模型。
  • SSM的组地址缺省范围是232.0.0.0~232.255.255.255(232.0.0.0/8)。通常情况下,IGMP Proxy设备接收到组地址属于该缺省范围的报告报文时,才会为组成员提供SSM服务,否则使用ASM模式。有时候希望限制SSM组地址范围,保证组播网络安全;或者SSM组地址不够用,需要扩展SSM组地址范围。此时,可以在IGMP Proxy设备上配置SSM组播组的地址范围,但需要确保网络内所有组播设备配置的SSM组地址范围都一致。(某些情况下,用户主机只能运行IGMPv1或IGMPv2,为了使其也能够使用SSM服务,路由器上需要提供IGMP SSM Mapping功能

组播的编程与实现(Linux配置为组播路由器)_IP_03

  • 临时组播地址:组播地址可以被重复使用。即当一个地址被应用于某个应用时,当此应用关闭不再使用时,此地址就可以被回收,可以被再次应用到其它应用中
  • 本地管理地址:仅在本地管理域内有效。在不同的管理域内重复使用相同的本地管理组地址不会导致冲突。
  • IGMP Snooping是二层组播的基本功能,可以实现组播数据在数据链路层的转发和控制。当主机和上游三层设备之间传递的IGMP协议报文通过二层组播设备时,IGMP Snoopin g分析报文携带的信息,根据这些信息建立和维护二层组播转发表,从而指导组播数据在数据链路层按需转发。
  • 将将机器配置为组播路由器,必须设置内核配置选项CONFIG_IP_MROUTE(默认Red Hat / Fedora/ Cent OS内核都支持multicast。),还必须运行路由选择守护程序。(组播问题 【好】
———>查看/boot/config-x.x.xx  文件中是否有如下内容
   CONFIG_IP_MULTICAST=y     //多播路由
   CONFIG_NET_IPIP=m
   CONFIG_IP_MROUTE=y
如果系统不支持多播,需要编译内核。编译步骤:https://blog.51cto.com/gaodi2002/1618055

组播的编程与实现(Linux配置为组播路由器)_IP_04

有可能发组播数据是一个网卡,收组播数据是另外一个网卡。
setsockopt(sock, IPPROTO_IP, IP_MULTICAST_IF, &addr, sizeof(addr)) 控制的是发送组播数据的网卡
struct ip_mreq mreq;
setsockopt(sock, IPPROTO_IP, IP_ADD_MEMBERSHIP, &mreq, sizeof(mreq)) 控制的是接收组播数据的网卡
  • 实现IP组播传输,则组播源和接收者以及两者之间的下层网络都必须支持组播。这包括以下几方面: 
  • 主机的TCP/IP实现支持发送和接收IP组播; 
  • 主机的网络接口支持组播; 
  • 有一套用于加入、离开、查询的组管理协议,即IGMP(v1,v2); 
  • 有一套IP地址分配策略,并能将第三层IP组播地址映射到第二层MAC地址; 
  • 支持IP组播的应用软件; 
  • 所有介于组播源和接收者之间的路由器、集线器、交换机、TCP/IP栈、防火墙均需支持组播; 
  • 如果使用虚拟机,网卡不能设置为桥接模式,否则不转发组播包。
  • RFC1112推荐了一些支持组播的应用程序接口: 
  • 加入一个组播组; 
  • 离开一个组播组; 
  • 为调整范围对一个组播数据的IP TTL值进行设定; 
  • 为组播传输和接收设定本地的接口; 
  • 禁止输出的组播数据回送。 
  • 组播数据报的TTL的缺省值是1,这在很多情况下,显然是不适用的限制在同一个子网,导致POD宿主机转发组播出不去,IP选项IP_MULTICAST_TTL可用来修改这个TTL 值,该选项把它的参数值赋给套接字结构体的成员mc_ttl。协议栈在为待发送数据报构建IP首部时,发现该数据的目的地址是一个组播地址时,就会把 mc_ttl的值填入IP首部的ttl域。

1、组播代码编译

gcc -E mc_client.c -o  mc_client.i    //预编译( 生成 mc_client.i 文件) 
gcc -S mc_client.i -o mc_client.s     //编译(生成汇编代码 mc_client.s) 
gcc -c mc_client.s mc_client.o        //汇编(生成 mc_client.o文件)
gcc mc_client.o -o mc_client          // 链接(生成可执行程序)
gcc mc_client.c -o mc_client          //上述4步骤可以放在一起执行
  • 要发送多播数据报,请在sendto()调用中指定一个范围在224.0.0.0到239.255.255.255之间的IP多播地址作为目标地址。默认情况下,IP多播数据报的发送生存时间(TTL)为1,这可以防止它们被转发到单个子网络之外。如果有一个或多个多播路由器连接到第一跳子网,则TTL大于1的多播数据报可以被传递到多个子网。组播包想跨域子网,除了TTL大于1.还需要子网间的路由器对组播的支持。(组播问题 【好】 - bw_0927 - 博客园 (cnblogs.com)
  • 初始TTL为0的多播数据报被限制在同一主机上
  • 初始TTL为1的多播数据报被限制在同一个子网
  • 具有初始TTL32的多播数据报被限制在同一站点
  • 具有初始TTL 64的多播数据报被限制在同一区域
  • 具有初始TTL 128的多播数据报被限制在同一大陆
  • 具有初始TTL 255的多播数据报在范围上是不受限制的。
  • 路由器拒绝转发[224.0.0.0, 224.0.0.255]之间的组播报文,无论TTL是什么值。因为这些地址作为保留地址,有特殊用处。
  • 组播数据始终只能由同一个网卡发出去,即使它是个多网卡机器;
  • 如果发送组播数据的主机它同时还是一个组播路由器,只要TTL大于1,组播数据可能会从另外的网卡上forward出去。
  • 当socket被关闭,或者socket所在的进程结束,该socket将会自动离开组播组
  • ip_mreq:每一个组都必须绑定一个网卡,可以把多个网卡同时加入同一个组播组。
  • socket被加入了某个组播组,但并不代表就能从该socket上接收到组内的组播数据;组播数据能不能被socket所收到,由数据包中的目标端口来决定,就和UDP单播一样。
  • 为了能够收到被发往某个端口的组播数据报,必须把sock绑定到对应的本地端口,本地地址保留为INADDR_ANY(表示我能接收任何地址发向特定端口的数据)。
  • 一个UDP端口,如果在此之前进行了SO_REUSEADDR的设置,这种情况下,绑定在该端口上的所有socket都可以收到发往该端口的组播和广播UDP报文。(多个进程可以绑定同为了向后兼容,上述理论并不适用于incoming单播udp数据报, 单播UDP绝对不会被发往多个scoket,只能发往一个socket, 无论多少个socket绑定在了同一个目标端口上。)SO_REUSEADDR可以用在以下四种情况下。
  •    当有一个有相同本地地址和端口的socket1处于TIME_WAIT状态时,而你启动的程序的socket2要占用该地址和端口,你的程序就要用到该选项。
  •    SO_REUSEADDR允许同一port上启动同一服务器的多个实例(多个进程)。但每个实例绑定的IP地址是不能相同的。在有多块网卡或用IP Alias技术的机器可以测试这种情况。
  •    SO_REUSEADDR允许单个进程绑定相同的端口到多个socket上,但每个socket绑定的ip地址不同。这和2很相似,区别请看UNPv1。
  •    SO_REUSEADDR允许完全相同的地址和端口的重复绑定。但这只用于UDP的多播/组播,不用于TCP。
  • 组播默认的网卡的选择是由路由表控制的。如果路由表中没有组播路由表,所有的组播默认会被发往默认网关所绑定的网卡,if needed, these commands normally would be added to the /etc/rc.ip or /etc/rc.local file, to take effect every time the system is booted.
/etc/route add 224.0.0.0 192.168.31.220 0              //为所有的组播地址指定所使用的网卡

2、setsockopt的level设置为SOL_SOCKETSO_REUSEADDR允许完全重复的捆绑:当一个IP地址和端口号已绑定到某个套接字上时,如果传输协议支持,同样的IP地址和端口还可以捆绑到另一个套接字上。一般来说本特性仅支持UDP套接字。(setsockopt - TreckWiki

int setsockopt( int socket, int level, int option_name,const void *option_value, size_t option_len); 
第二个参数level是被设置的选项的级别,如果想要在套接字级别上设置选项,就必须把level设置为SOL_SOCKET
......setsockopt(s, SOL_SOCKET, SO_REUSEADDR, (char *)&reuse, sizeof(reuse))
没有设置SO_REUSEADDR时,进程启动第二次提示:
# ./mc_client234 
bind(): Address already in use
运行的两个(两次)进程必须“都”设置SO_REUSEADDR,否则第二个进程提示bind(): Address already in use
  • 有两种类型的套接字:基于文件的(AF_UNIX,(又名AF_LOCAL,在POSIX1.g标准中指定))和面向网络的(AF_INET,AF_INET6用于第6版因特网协议)
  • AF 表示ADDRESS FAMILY 地址族,PF 表示PROTOCOL FAMILY 协议族

3、将组播服务器和客户端进程部署在容器(含服务网格)中,组播不通。现象:容器里eth0加入了组播组,但是抓不到包

(01:55 tool2-6cdb5b8c4c-r9fwx:/) /home/cli234 
(01:57 tool2-6cdb5b8c4c-r9fwx:/) netstat -ang
Interface       RefCnt Group
eth0            1      234.0.0.100
(01:57 tool2-6cdb5b8c4c-r9fwx:/) tcpdump -i eth0 port 8888
  • 一个pod里既跑服务进程,也跑客户进程,可以收到组播包;另pod宿主机上对应网卡cali6b59ab62b68能抓到组播包,但是pod宿主机运行组播客户端(因为无法将网卡cali6b59ab62b68加入组播组)收不到组播数据。
  • 网卡cali6b59ab62b68,虽然抓包有组播数据包;ifconfig查看没有IP,所以该网卡不能接入组播组。
# ifconfig -a
cali6b59ab62b68: flags=4163<UP,BROADCAST,RUNNING,MULTICAST>  mtu 1480
        inet6 fe80::ecee:eeff:feee:eeee  prefixlen 64  scopeid 0x20<link>
        ether ee:ee:ee:ee:ee:ee  txqueuelen 0  (Ethernet)
        RX packets 8279601881  bytes 5517142820786 (5.0 TiB)
        RX errors 0  dropped 754346  overruns 0  frame 0
        TX packets 2023440243  bytes 1511419309757 (1.3 TiB)
        TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0
  • 由于宿主机网卡cali6b59ab62b68的组播到不了宿主机的网卡enp4s0f0,所以组播只能在自己pod里出不去。(?要进行路由,多播流的TTL必须大于1)
(130 02:03 tool2-6cdb5b8c4c-r9fwx:/) /home/mc_server234
tool2-6cdb5b8c4c-r9fwx ---> k8s-node07 
(02:12 tool2-6cdb5b8c4c-r9fwx:/) cat /sys/class/net/eth0/iflink
275
[root@k8s-node07 home]# ip a |grep 275
275: cali6b59ab62b68@if4: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1480 qdisc noqueue state UP group default
[root@k8s-node07 home]# route -n|grep "172.27.29.179"
172.27.29.179   0.0.0.0         255.255.255.255 UH    0      0        0 cali6b59ab62b68
(130 02:16 tool2-6cdb5b8c4c-r9fwx:/) tcpdump -i eth0 port 8888 -nn
tcpdump: verbose output suppressed, use -v or -vv for full protocol decode
listening on eth0, link-type EN10MB (Ethernet), capture size 262144 bytes
02:16:53.400687 IP 172.27.29.179.55657 > 234.0.0.100.8888: UDP, length 37
[root@k8s-node07 home]# tcpdump -i cali6b59ab62b68 port 8888 -nn
tcpdump: verbose output suppressed, use -v or -vv for full protocol decode
listening on cali6b59ab62b68, link-type EN10MB (Ethernet), capture size 262144 bytes
10:17:03.401381 IP 172.27.29.179.55657 > 234.0.0.100.8888: UDP, length 37
[root@k8s-node07 home]# ./cli234    //无数据
(130 02:05 tool2-6cdb5b8c4c-r9fwx:/) /home/cli234   //pod内有数据
(SO_REUSEADDR)Recv 0st message from server:BROADCAST TEST DATA 234.0.0.100:8888
  • ip_mreqn结构记录了需要加入的的多播组的网卡ip(网卡index)
使用如下函数可以将网卡名称(ifconfig查看)转换为对应的index,用于填充imr_ifindex域,也可以将imr_ifindex设置为0表示使用默认网卡
#include <net/if.h>
unsigned int if_nametoindex (const char *__ifname)
指定网络接口名称字符串作为参数;若该接口存在,则返回相应的索引,否则返回0

4、net.ipv4.conf.all.mc_forwarding = 1 #是否进行多播路由(只有内核编译有CONFIG_MROUTE并且有路由服务程序[mc_forwarding值变更为1]在运行该参数才有效)

  • linux内核中普通的路由协议是不支持组播数据包的转发,因此需要研究支持组播数据包转发的路由,例如选用pimd,mrouted和smcroute。

5、调试多播设置的工具mtool:msend和mreceive工具(troglobit/mtools: Tools for multicast testing (msend and mreceive). I do however recommend you try out mcjoin(!) or mping instead. (github.com)

msend [-g GROUP] [-p PORT] [-join] [-t TTL] [-i ADDRESS] [-P PERIOD]
      [-text "text" | -n]
msend [-v|-h]
mreceive [-g group] [-p port] [-i ip] ... [-i ip] [-n]
mreceive [-v|-h]
  • mcjoin - tiny multicast testing tool(troglobit/mcjoin: Simple multicast testing application (github.com)
  • The omping tool is a pure UDP client and server wrapped in a small binary. Perfectly suited for verifying multicast connectivity on your local network.
  • mping aspires to be an easy to use and script friendly program with support for both IPv4 and IPv6. Similar to the standard ping program, but unlike it, the response to multicast ping is sent by another mping.

组播的编程与实现(Linux配置为组播路由器)_组播_05

  • 为了检查组播网络是否正常工作,以及组播应用是否能够正确地发送和接收数据,可以使用iperf工具来进行。
1. 在组播服务端,执行接收命令:
`iperf -s -u -B 224.0.1.2 -i 1 -T 64`。这个命令的含义是:启动一个UDP服务器,绑定到组播地址224.0.1.2,每隔1秒打印一次统计信息,设置TTL为64。
2. 在组播发送端,执行发送命令:
`iperf -c 224.0.1.2 -u -b 10k -i 1 -t 100 -T 10`。这个命令的含义是:启动一个UDP客户端,向组播地址224.0.1.2发送数据,设置带宽为10k,每隔1秒打印一次统计信息,持续发送100秒,设置TTL为10。

6、静态组播路由服务程序:SMCRoute(troglobit/smcroute: Static multicast routing for UNIX (github.com)

smcroutectl can be used to freely modify the runtime state of smcrouted, but any changes made (routes/groups) are lost when the configuration is reloaded. This is by design.

  • SMCRoute is a static multicast routing daemon providing fine grained control over the multicast forwarding cache (MFC) in the UNIX kernel. Both IPv4 and IPv6 are fully supported.
  • SMCRoute can be used as an alternative to dynamic multicast routers like mroutedpimd, or pim6sd in setups where static multicast routes should be maintained and/or no proper IGMP or MLD signaling exists.
  • Multicast routes exist in the UNIX kernel as long as a multicast routing daemon runs. On Linux, multiple multicast routers can run simultaneously using different multicast routing tables.
  • The full documentation of SMCRoute is available in the manual pages, see smcrouted(8)smcroutectl(8), and smcroute.conf(5).
mroute from eth0 group 225.1.2.3 source 192.168.1.42 to eth1 eth2
  • Thismroute line is the actual layer-3 routing entry. Here we say that multicast data originating from 192.168.1.42 on eth0 to the multicast group 225.1.2.3 should be forwarded to interfaces eth1 and eth2.
  • 在某些平台上,每个套接字限制为20个组。这源于BSD UNIX中的一个限制,它也影响到Linux。控制它的设置是IP_MAX_MEMBERSHIPTS
echo 40 > /proc/sys/net/ipv4/igmp_max_memberships

6、动态组播路由(dynamic multicast routers)服务程序 mroutedpimd, or pim6sd ......

  • pimd是一个轻量级、独立的PIM-SM/SSM多播路由守护程序,PIM是独立于协议的,所以必须已经有了单播路由,pimd才能工作。可以使用ping验证多播发送器和接收器之间的连接(要进行路由,多播流的TTL必须大于1)。附带了一个有用的pimctl工具,与来自同一系列的所有PIM守护进程兼容:pimd、pimdd、pim6sd。在调试和学习PIM设置时,它是一个非常有用的小工具(pimctl.8 (troglobit.com))。
  • SSM(Source Specific Multicast) 模型需要运行PIM Sparse Mode, 并且不需要设置任何RP,该模型构建组播路由表将不再有(*, G)表项, 直接生成(S, G)表项。运行SSM 的三大条件:1, 2, 3要同时满足,SSM Range 的设定要求在所有运行SSM的路由器上都要完成,。
  • 1.sparse mode without rp:任播RP(Rendezvous Point,汇集点)作为组播的汇聚点,发送者和接收者在RP处进行汇聚。without rp:不需要泛洪---不需要注册。
  • 2.igmp version V3
  • 3.set ssm group address range
  • 距离矢量组播路由选择协议 (DVMRP:Distance Vector Multicast Routing Protocol)是一种互联网路由协议,为互联网络的主机组提供了一种面向无连接信息组播的有效机制。DVMRP 和 RIP 的主要不同之处在于:RIP 路由和转发数据包到明确的目的地。 DVMRP 的目的是为了跟踪到组播数据包出发地的返回路径。
  • mrouted不需要.conf文件(/etc/mrouted.conf需要在内核中启用IP多播路由。当它启动时,它会探测所有可用的接口interfaces,并开始与任何具有DVMRP功能的邻居进行对等。多播被转发到使用IGMPv1、IGMPv2或IGMPv3加入组的终端设备。对于LAN,主机有可能不speak IGMP,或者应该始终转发某些组,mrouted.conf中提供了静态组设置来实现。
  • 默认情况下,mrouted将自己配置为在所有支持多播的接口上充当多播路由器。因此,您不需要显式配置它,除非您需要设置隧道链接、更改默认操作参数、禁用特定物理接口上的多播路由或具有动态接口。
  • Use mgen(1)mcjoin(1), or iperf to send IGMP join packets and multicast data on the LAN to test your multicast routing setup. Use the mroutectl tool to query a running mrouted for status.
  • For the native mrouted tunnel to work in Linux based systems, you need to have the "ipip" kernel module loaded or as built-in: modprobe ipip
  • mrouted can be reconfigured at runtime like any regular UNIX daemon with SIGHUP, or mroutectl restart, to activate changes made to its configuration file. 
systemctl start mrouted   启动后,可以看到
/proc/sys/net/ipv4/ip_forward 值不变
/proc/sys/net/ipv4/conf/all/mc_forwarding 值变更为1
此时说明系统已经开启了组播转发的功能,并且组播路由的设置和ip_forward值无关,和mc_forwarding参数相关
git clone https://github.com/troglobit/mrouted.git
cd mrouted/
./autogen.sh
./configure && make
  • pim6sd( sparse mode daemon稀疏模式)是一个与IPv6协议无关Protocol Independent Multicast:PIM-SM的多播路由守护进程,它支持Any-Source和Source-Specific的多播,也称为PIM-SM和PIM-SSM。pim6sd stems from pim6dd, which was originally based on pimd, which in turn was based on mrouted.(pim6sd/pim6sd.conf.sample at master · troglobit/pim6sd (github.com))
  • pimdd(=pimd-dense) is the dense-mode cousin to pimd:PIM-DM类似于DVRMP(mrouted),它们都是洪泛和修剪多播路由协议,但与DVMRP不同,PIM实现依赖于已经建立的底层单播路由
  • FRR 是一个路由软件套件,它衍生自 Quagga,它为类 Unix 平台提供了所有主要路由协议的实现,例如 OSPF、 路由信息协议(Routing Information Protocol)(RIP)、 边界网关协议(Border Gateway Protocol)(BGP) 和 中间系统到中间系统(Intermediate system-to-intermediate system) (IS-IS)

7、SMCRoute用法(支持IPv4和IPv6,除mrdisc之外的所有功能。将来,mrdisc将集成在SMCRoute、mrouted和pimd多播路由守护进程中)

  • mrdisc 是RFC4286(多播路由器发现协议)的UNIX兼容实现。它旨在向局域网上的IGMP/MLD窥探者通知具有多播功能的路由器。
  • 组播服务模型的分类是针对接收者主机的,对组播源没有区别。组播源发出的组播数据中总是以组播源自己的IP地址为报文的源地址,组播组地址为目的地址。而接收者主机接收数据时可以对源进行选择,因此产生了ASM(Any-Source Multicast:为了提高安全性,可以在路由器上配置针对组播源的过滤策略)和SSM(Source-Specific Multicast:SSM模型中针对每一个(源,组)信息都会生成表项。这样一方面节省了组播组地址)两种服务模型。这两种服务模型使用不同的组播组地址范围。
  • 对于ASM组播业务,(,G)表项是交换机收到用户的点播请求时生成的,(S,G)表项是有组播数据报文到达交换机时生成的,它的出端口从对应的(,G)表项中继承。
172.27.29.179.55657 > 234.0.0.100.8888
# smcroutectl join cali6b59ab62b68 234.0.0.100
# smcroutectl add  cali6b59ab62b68 172.27.29.179 234.0.0.100 enp4s0f0
# smcroutectl add  cali6b59ab62b68 234.0.0.100 enp4s0f0
mroute from cali6b59ab62b68 group 234.0.0.100 source 172.27.29.179 to enp4s0f0
mroute from cali6b59ab62b68 group 225.1.2.3 to enp4s0f0
  • 从cali6b59ab62b68上的172.27.29.179到多播组234.0.0.100的多播数据应该转发到接口enp4s0f0。
  • On Linux the following kernel config is required:
CONFIG_IP_MROUTE=y
CONFIG_IP_PIMSM_V1=y
CONFIG_IP_PIMSM_V2=y
CONFIG_IP_MROUTE_MULTIPLE_TABLES=y       # For multiple routing tables
CONFIG_IPV6_MROUTE_MULTIPLE_TABLES=y     # For multiple routing tables
  • smcroute.conf:配置文件支持加入多播组,使用Layer-2信令,以便交换机和路由器打开到接口的多播流量。不支持Leave,需要mgroup SIGHUP守护进程,或者发送一个特定的leave 命令。如果可能的话,应该避免使用mgroup命令。而是在LAN上的交换机或网桥上配置“路由器端口”或类似的端口。这样可以让他们将所有多播引导到你的路由器,或者如果他们有这样的功能,可以选择组。通常存在MAC多播过滤器。
sudo smcroutectl -b <<-EOF
	join eth0 225.1.2.3
	add eth0 192.168.1.42 225.1.2.3 eth1 eth2
	rem eth1 225.3.4.5 eth3
	leave eth1 225.3.4.5
	EOF
【版权声明】本文内容来自摩杜云社区用户原创、第三方投稿、转载,内容版权归原作者所有。本网站的目的在于传递更多信息,不拥有版权,亦不承担相应法律责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@moduyun.com

  1. 分享:
最后一次编辑于 2023年11月13日 0

暂无评论

推荐阅读
  Yoru5qB4TSKM   2023年12月10日   34   0   0 服务器重启IP
  ozzp9aSSE46S   2023年11月30日   26   0   0 DNSIPPod
  48fXx4UfWSFg   2023年12月06日   52   0   0 bcIPbundle
  aYmIB3fiUdn9   2023年12月08日   49   0   0 客户端IPNATlvs