《TCP/IP详解 卷一》第9章 广播和组播

目录

[9.1 引言](#9.1 引言)

[9.2 广播](#9.2 广播)

[9.2.1 使用广播地址](#9.2.1 使用广播地址)

[9.2.2 发送广播数据报](#9.2.2 发送广播数据报)

[9.3 组播](#9.3 组播)

[9.3.1 将组播IP地址转换为组播MAC地址](#9.3.1 将组播IP地址转换为组播MAC地址)

[9.3.2 例子](#9.3.2 例子)

[9.3.3 发送组播数据报](#9.3.3 发送组播数据报)

[9.3.4 接收组播数据报](#9.3.4 接收组播数据报)

[9.3.5 主机地址过滤](#9.3.5 主机地址过滤)

[9.4 IGMP协议和MLD协议](#9.4 IGMP协议和MLD协议)

[9.4.1 组成员的IGMP和MLD处理](#9.4.1 组成员的IGMP和MLD处理)

[9.4.2 组播路由器的IGMP和MLD处理](#9.4.2 组播路由器的IGMP和MLD处理)

[9.4.3 例子](#9.4.3 例子)

[9.4.4 轻量级 IGMPv3 和 MLDv2](#9.4.4 轻量级 IGMPv3 和 MLDv2)

[9.4.5 IGMP和MLD健壮性](#9.4.5 IGMP和MLD健壮性)

[9.4.6 IGMP和MLD计数器和变量](#9.4.6 IGMP和MLD计数器和变量)

[9.4.7 IGMP和MLD Snooping](#9.4.7 IGMP和MLD Snooping)

[9.5 与IGMP和MLD相关的攻击](#9.5 与IGMP和MLD相关的攻击)

[9.6 总结](#9.6 总结)


多播组成员管理协议

IPv4:IGMP:Internet Group Management Protocol,互联网组管理协议。

IPv6:MLD:Multicast Listener Discovery,组播侦听发现协议。

9.1 引言

IP地址分类:

unicast:单播。

multicast:多播=组播。

broadcast:广播,IPv6没有广播。

anycast:任播。

任播:

路由器将目的IP是任播地址的数据包发送到多个接收者中最近一个。

使用场景:

服务发现: 如IPv6主机通过发送HTTP的任播报文。来发现局域网可用Web服务器。

负载均衡:一组相同功能的服务器共享同一个任播地址。客户端请求路由到最近服务器。

路由器冗余:多个路由器共享同一个任播地址,实现冗余和容错性。

IPv6链路本地地址:

前缀:fe80::,用于局域网内通信。

广播和组播为应用程序提供两种服务:

交付数据至多个目的地

请求/发现服务器。

一般只有UDP才利用广播和组播。

IPv4组播是可选的。

IPv6组播是强制性,因为邻居发现ND需使用。

9.2 广播

9.2.1 使用广播地址

组播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。

9.2.2 发送广播数据报

socket选项:

SO_BROADCAST:设置套接字允许发送广播数据包。

ping -b会设置SO_BROADCAST

9.3 组播

即多播,multicast。

  1. 当主机希望加入一个多播组时,它向路由器发送IGMP Membership Report报文,其中包含感兴趣的组播地址,并可能包含可选的源列表。用于指定从哪些源接收组播数据。

  2. 路由器收到IGMP报文后,更新其多播组成员表,并根据多播组成员表转发组播数据到感兴趣的主机。

多播组成员表和可选源列表都会定期更新或超时删除。

IGMP报文中的源列表分为:

特定源组播(SSM):明确接收或不接收特定发送方的组播流量。

任源组播(ASM):不考虑发送方身份。

9.3.1 将组播IP地址转换为组播MAC地址

组播数据应使用组播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。

9.3.2 例子

mDNS:组播DNS。

一般工作在局域网内部。

作用:

共享DNS响应:多个主机共享DNS响应,减轻DNS服务器负担,避免太多主机DNS查询。

设备互相发现:新设备发送mDNS查询来通告自己的存在。

服务发现:通过mDNS查询来寻找局域网特定服务(打印机)。

224.0.0.251:mDNS组播组IP。

使用ICMP报文回复了ping 224.0.0.251的主机,表明加入了mDNS组。

9.3.3 发送组播数据报

多网口的主机须决定使用哪个IP地址和接口。

9.3.4 接收组播数据报

组播组的成员资格是动态的,它随进程加入或离开组而改变。

查看组播组成员方法:

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

9.3.5 主机地址过滤

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));

9.4 IGMP协议和MLD协议

组播成员管理协议:

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等。

9.4.1 组成员的IGMP和MLD处理

作用:允许主机指明自己有兴趣的组,还可以指定允许/拒绝特定源发送的流量。

方法:向同子网的组播路由器发送报告。

IGMP报告报文如下:

类型字段:

指示报文类型,可能的值有:

0x11: Membership Query(成员查询)

路由器发送成员查询消息

0x12: Membership Report(成员报告)

主机发送成员报告消息,表示主机加入多播组。

0x13: Leave Group(离开组)

主机发送,表示主机离开组播组,路由器不在转发该组播组流量给该主机。

0x22: IGMPv3 Membership Report(IGMPv3 成员报告)

IGMPv3的成员报告,用于支持源特定多播(SSM)和其他高级功能。

组记录:

其中每个组记录格式如下:

上图字段解释:

记录类型:

INCLUDE:主机对指定的源地址感兴趣。

EXCLUDE:主机对指定的源地址不感兴趣。

IPv4组播地址:

加入或离开的组播组。

源地址:主机感兴趣、不感兴趣的源地址。

9.4.2 组播路由器的IGMP和MLD处理

组播路由器的工作内容:

发送组成员查询。

接收组成员报告,维护组播组成员。

成员刷新与老化。

组播路由器有三种查询报文:

通用查询:查询所有组播组。

特定组查询:查询特定组播组的成员。

特定组和源查询:用于组播路由器之间查询与响应。

通用查询报文目的IP:

IPv4 IGMP中为224.0.0.1,代表所有组播节点。

IPv6 MLD中为ff02::1,代表链路范围内所有组播节点。

特定组查询报文的目的IP:

为查询的该特定组的组播IP。

9.4.3 例子

上图显示ICMPv6协议报文细节,其实就是MLD协议,MLD属于ICMPv6。

从上文可知,该报文是IPv6 MLD查询报文

组播目的IP地址:组播地址ff02::1 (表示所有组播节点)

组播目的MAC地址:33:33:00:00:00:01 (根据组播IP转换而来,固定前缀为33:33)

主机发送的IGMP报文TTL为1,不会通过路由器转发。

很多应用协议都通过发送报文到组播地址,或来查询服务或散播服务,实现局域网设备和服务发现。如:

mDNS

UPnP:用于智能家居设备发现。

发现局域网是否有打印机。

9.4.4 轻量级 IGMPv3 和 MLDv2

9.4.5 IGMP和MLD健壮性

同一链路可运行多个组播路由器,故障备份,最小IP地址路由器被选为查询器。

查询器选举(querier election)

比较源IP地址,IP小的路由器为查询器,非查询器进入备用模式。

查询组播路由器需要定期查询组播成员。

9.4.6 IGMP和MLD计数器和变量

IGMP和MLD需处理组播路由器的失效、协议报文丢失,早期协议版本的兼容性。

大多基于状态改变和计时器来启用这些功能。

9.4.7 IGMP和MLD Snooping

IGMP ( MLD) snooping:

2层交换机查看在第3层的信息,了解它对特定的组播流量流动是否有兴趣。

如果没有IGMP snooping,交换机会广播链路层流量。

而支持IGMP(MLD)snooping的交换机通过查看主机与路由器通信的IGMP信息,记录哪些端口需要哪些特定的组播流动,从而减少流量转发。

9.5 与IGMP和MLD相关的攻击

IGMP Flooding 攻击:发送大量IGMP或MLD报文,引起带宽耗尽。

IGMP欺骗:攻击者伪造IGMP报文,导致路由器维护错误组播组成员信息,最终路由器错误转发。

伪装成组播路由器,在IGMP查询报文中使用非常小的"最大响应时间",诱导主机频繁发送组播成员报告,消耗CPU。

9.6 总结

两种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中鲁棒性变量:

一个时间值。

表示如果路由器在该时间内没有再收到成员报文,路由器将成员从组播组成员列表中移除。

如果没有鲁棒性变量,当网络抖动或不稳定性时。不好影响:

路由器过早认定主机已离开组播组,过早将主机从成员列表中删除,导致主机无法接收到组播流量。

过多组播成员状态变化和更新导致网络拥塞或不必要的流量。特别是大型网络中。

鲁棒性变量使用场景:不稳定网络。

相关推荐
程序员-珍29 分钟前
虚拟机ip突然看不了了
linux·网络·网络协议·tcp/ip·centos
4647的码农历程1 小时前
Linux网络编程 -- 网络基础
linux·运维·网络
向李神看齐1 小时前
RTSP协议讲解
网络
Death2001 小时前
使用Qt进行TCP和UDP网络编程
网络·c++·qt·tcp/ip
魏大橙2 小时前
linux RCE本地/公网测试
网络·网络协议·udp
陈逸轩*^_^*2 小时前
Java 网络编程基础
java·网络·计算机网络
l1x1n03 小时前
网络安全概述:从认知到实践
网络
鄃鳕3 小时前
HTTP【网络】
网络·网络协议·http
蜡笔小新星3 小时前
Python Kivy库学习路线
开发语言·网络·经验分享·python·学习
小白爱电脑5 小时前
WIFI网速不够是不是光猫的“路由模式”和“桥接模式”配置错了?
网络·智能路由器·桥接模式