目录
9.1 引言
9.2 广播
9.2.1 使用广播地址
9.2.2 发送广播数据报
9.3 组播
9.3.1 将组播IP地址转换为组播MAC地址
9.3.2 例子
9.3.3 发送组播数据报
9.3.4 接收组播数据报
9.3.5 主机地址过滤
9.4 IGMP协议和MLD协议
9.4.1 组成员的IGMP和MLD处理
9.4.2 组播路由器的IGMP和MLD处理
9.4.3 例子
9.4.4 轻量级 IGMPv3 和 MLDv2
9.4.5 IGMP和MLD健壮性
9.4.6 IGMP和MLD计数器和变量
9.4.7 IGMP和MLD Snooping
9.5 与IGMP和MLD相关的攻击
9.6 总结
多播组成员管理协议
IPv4:IGMP:Internet Group Management Protocol,互联网组管理协议。
IPv6:MLD:Multicast Listener Discovery,组播侦听发现协议。
IP地址分类:
unicast:单播。
multicast:多播=组播。
broadcast:广播,IPv6没有广播。
anycast:任播。
任播:
路由器将目的IP是任播地址的数据包发送到多个接收者中最近一个。
使用场景:
服务发现: 如IPv6主机通过发送HTTP的任播报文。来发现局域网可用Web服务器。
负载均衡:一组相同功能的服务器共享同一个任播地址。客户端请求路由到最近服务器。
路由器冗余:多个路由器共享同一个任播地址,实现冗余和容错性。
IPv6链路本地地址:
前缀:fe80::,用于局域网内通信。
广播和组播为应用程序提供两种服务:
交付数据至多个目的地
请求/发现服务器。
一般只有UDP才利用广播和组播。
IPv4组播是可选的。
IPv6组播是强制性,因为邻居发现ND需使用。
组播MAC地址:
第一个字节的最低位二进制为0代表单播地址,为1代表组播地址。
如01:00:00:00:00:00,03:00:00:00:00:00
本地网络(有限广播)广播:255.255.255.255,用于向局域网所有设备发送数据。
子网定向广播地址:如192.168.1.255:用于向特定子网中所有设备发送通知、服务发现和配置信息等。
ping 广播IP地址+广播MAC地址作用:
触发所有接收设备回包,获得所有设备的MAC地址。无需源主机单独向每个设备发送ARP。
但是某些操作系统可能禁止ping广播IP地址。
组播地址只能作为目的IP,不能作为源IP。
socket选项:
SO_BROADCAST:设置套接字允许发送广播数据包。
ping -b会设置SO_BROADCAST
即多播,multicast。
1. 当主机希望加入一个多播组时,它向路由器发送IGMP Membership Report报文,其中包含感兴趣的组播地址,并可能包含可选的源列表。用于指定从哪些源接收组播数据。
2. 路由器收到IGMP报文后,更新其多播组成员表,并根据多播组成员表转发组播数据到感兴趣的主机。
多播组成员表和可选源列表都会定期更新或超时删除。
IGMP报文中的源列表分为:
特定源组播(SSM):明确接收或不接收特定发送方的组播流量。
任源组播(ASM):不考虑发送方身份。
组播数据应使用组播MAC地址作为目的MAC。
组播MAC地址结构:
前24位: 前24位固定为01-00-5E。
后23位: 等于IPv4组播IP地址的低23位。
IPv4组播的以太网地址范围:01:00:5E:00:00:00到01:00:5E:7F-FF-FF
组播IP地址转换为组播MAC地址:
IPv4组播地址范围:224.0.0.0到239.255.255.255,D类地址。
根据上图所示转换方法:
组播地址 224.128.64.32(十六进制为 E0.80.40.20 )和 224.0.64.32(十六进制为 E0.00.40.20 )都被映射到01:00:5E:00:40:20
所以发往组播224.128.64.32的报文应使用源MAC 01:00:5E:80:40:20来封装。
IPv6组播IP地址转换为组播MAC:
MAC前16位: 前缀固定是33-33
MAC后32位: IPv6组播地址的最后32位。
如组播地址ff02::1:2。转换为组播MAC地址:33-33-00-01-00-02。
mDNS:组播DNS。
一般工作在局域网内部。
作用:
共享DNS响应:多个主机共享DNS响应,减轻DNS服务器负担,避免太多主机DNS查询。
设备互相发现:新设备发送mDNS查询来通告自己的存在。
服务发现:通过mDNS查询来寻找局域网特定服务(打印机)。
224.0.0.251:mDNS组播组IP。
使用ICMP报文回复了ping 224.0.0.251的主机,表明加入了mDNS组。
多网口的主机须决定使用哪个IP地址和接口。
组播组的成员资格是动态的,它随进程加入或离开组而改变。
查看组播组成员方法:
ip maddr show
netstat -gn
# ip maddr show
1: lo 接口索引号和接口名称。
inet 224.0.0.1 该接口加入的IPv4组播地址。
inet6 ff02::1 该接口加入的IPv6组播地址
inet6 ff01::1
加入组播组方法:
ip maddr add 224.0.0.1 dev eth0 eth0接口加入224.0.0.1组
ip maddr add ff02::1 dev eth0
mreq.imr_multiaddr.s_addr = inet_addr("组播组地址");
mreq.imr_interface.s_addr = htonl(INADDR_ANY);
加入组播组:
setsockopt(sockfd, IPPROTO_IP, IP_ADD_MEMBERSHIP, &mreq, sizeof(mreq)) ;
离开组播组:
setsockopt(sockfd, IPPROTO_IP, IP_DROP_MEMBERSHIP, &mreq, sizeof(mreq));
组播成员管理协议:
IGMP:Internet Group Management Protocol,互联网组管理协议,IPv4使用。
MLD:Multicast Listener Discovery,组播侦听发现协议,IPv6使用。
MLD和IGMP功能几乎相同,都用于管理组播组成员。
IGMP/MLD管理方法:
主机向路由器发送组成员报告报文,路由器知道主机感兴趣组播组后,以便知道组播数据报转发到对应接口。
SSM,即源特定多播模式:
接收方只能接收来自特定源的多播流量。
目前广泛使用IGMPv3和MLDv2的支持SSM。
当主机想要接收特定源的多播流时,会发送IGMPv3/MLDv2报文,其中包含指定源地址和多播组地址。
ASM:即任意源多播模式。
接收方可以接收来自任意源的多播流量。
如上图,组成员管理的两种方式:
路由器定期IGMP/MLD查询。
主机主动IGMP/MLD报告。
IGMPv3报告发送到224.0.0.22,即IGMPv3组播路由器地址。
MLDv2报告发送到ff02::16,即MLDv2组播路由器地址。
和ICMP类似,IGMP报文也封装在IPv4。
IGMP报文的TTL固定为1,所以报文仅限于本地子网。
报文格式:
组播路由器也和广域组播协议(PIM-SM,BIDIR-PIM)交互,将流量转发给感兴趣主机,或禁止流量流向不感兴趣主机。
广域组播协议:
在广域网(WAN)中实现组播。
如:PIM,BIDIR-PIM。
PIM(Protocol Independent Multicast):即协议无关组播协议。
两种模式:
PIM-DM(Dense Mode):适用于组播组成员密集的网络
PIM-SM(Sparse Mode):适用于组播组成员分布稀疏的网络。
PIM使用场景:
大型企业内部跨子网或分支机构的组播通信。如视频会议、流媒体。
电信运营商广域网中组播通信,如电视直播、广播和IPTV等。
作用:允许主机指明自己有兴趣的组,还可以指定允许/拒绝特定源发送的流量。
方法:向同子网的组播路由器发送报告。
IGMP报告报文如下:
类型字段:
指示报文类型,可能的值有:
0x11: Membership Query(成员查询)
路由器发送成员查询消息
0x12: Membership Report(成员报告)
主机发送成员报告消息,表示主机加入多播组。
0x13: Leave Group(离开组)
主机发送,表示主机离开组播组,路由器不在转发该组播组流量给该主机。
0x22: IGMPv3 Membership Report(IGMPv3 成员报告)
IGMPv3的成员报告,用于支持源特定多播(SSM)和其他高级功能。
组记录:
其中每个组记录格式如下:
上图字段解释:
记录类型:
INCLUDE:主机对指定的源地址感兴趣。
EXCLUDE:主机对指定的源地址不感兴趣。
IPv4组播地址:
加入或离开的组播组。
源地址:主机感兴趣、不感兴趣的源地址。
组播路由器的工作内容:
发送组成员查询。
接收组成员报告,维护组播组成员。
成员刷新与老化。
组播路由器有三种查询报文:
通用查询:查询所有组播组。
特定组查询:查询特定组播组的成员。
特定组和源查询:用于组播路由器之间查询与响应。
通用查询报文目的IP:
IPv4 IGMP中为224.0.0.1,代表所有组播节点。
IPv6 MLD中为ff02::1,代表链路范围内所有组播节点。
特定组查询报文的目的IP:
为查询的该特定组的组播IP。
上图显示ICMPv6协议报文细节,其实就是MLD协议,MLD属于ICMPv6。
从上文可知,该报文是IPv6 MLD查询报文
组播目的IP地址:组播地址ff02::1 (表示所有组播节点)
组播目的MAC地址:33:33:00:00:00:01 (根据组播IP转换而来,固定前缀为33:33)
主机发送的IGMP报文TTL为1,不会通过路由器转发。
很多应用协议都通过发送报文到组播地址,或来查询服务或散播服务,实现局域网设备和服务发现。如:
mDNS
UPnP:用于智能家居设备发现。
发现局域网是否有打印机。
同一链路可运行多个组播路由器,故障备份,最小IP地址路由器被选为查询器。
查询器选举(querier election)
比较源IP地址,IP小的路由器为查询器,非查询器进入备用模式。
查询组播路由器需要定期查询组播成员。
IGMP和MLD需处理组播路由器的失效、协议报文丢失,早期协议版本的兼容性。
大多基于状态改变和计时器来启用这些功能。
IGMP ( MLD) snooping:
2层交换机查看在第3层的信息,了解它对特定的组播流量流动是否有兴趣。
如果没有IGMP snooping,交换机会广播链路层流量。
而支持IGMP(MLD)snooping的交换机通过查看主机与路由器通信的IGMP信息,记录哪些端口需要哪些特定的组播流动,从而减少流量转发。
IGMP Flooding 攻击:发送大量IGMP或MLD报文,引起带宽耗尽。
IGMP欺骗:攻击者伪造IGMP报文,导致路由器维护错误组播组成员信息,最终路由器错误转发。
伪装成组播路由器,在IGMP查询报文中使用非常小的"最大响应时间",诱导主机频繁发送组播成员报告,消耗CPU。
两种IPv4广播地址:
受限(255.255.255.255)
定向(如192.168.1.255)
IPv4组播MAC:前缀01:00:5e+组播IP地址的低23位。
IPv6组播MAC:16位前缀33:33+组播IP地址的低序32。
IGMP和MLD中鲁棒性变量:
一个时间值。
表示如果路由器在该时间内没有再收到成员报文,路由器将成员从组播组成员列表中移除。
如果没有鲁棒性变量,当网络抖动或不稳定性时。不好影响:
路由器过早认定主机已离开组播组,过早将主机从成员列表中删除,导致主机无法接收到组播流量。
过多组播成员状态变化和更新导致网络拥塞或不必要的流量。特别是大型网络中。