《TCP/IP详解 卷一》第9章 广播和组播
目录
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,组播侦听发现协议。
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中鲁棒性变量:
一个时间值。
表示如果路由器在该时间内没有再收到成员报文,路由器将成员从组播组成员列表中移除。
如果没有鲁棒性变量,当网络抖动或不稳定性时。不好影响:
路由器过早认定主机已离开组播组,过早将主机从成员列表中删除,导致主机无法接收到组播流量。
过多组播成员状态变化和更新导致网络拥塞或不必要的流量。特别是大型网络中。
鲁棒性变量使用场景:不稳定网络。
相关文章:
《TCP/IP详解 卷一》第9章 广播和组播
目录 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 组播路由…...
备战蓝桥杯---动态规划的一些思想1
话不多说,直接看题: 目录 1.双线程DP 2.正难则反多组DP 3.换个方向思考: 1.双线程DP 可能有人会说直接贪心:先选第1条的最优路径,再选第2条最优路径。 其实我们再选第1条时,我们怎么选会对第2条的路径…...
基于BERTopic模型的中文文本主题聚类及可视化
文章目录 BERTopic简介模型加载地址文本加载数据处理BERTopic模型构建模型结果展示主题可视化总结BERTopic简介 BERTopic论文地址:BERTopic: Neural topic modeling with a class-based TF-IDF procedure BERTopic是一种结合了预训练模型BERT和主题建模的强大工具。它允许我…...
MySQL:函数
提醒: 设定下面的语句是在数据库名为 db_book里执行的。 创建user_info表 注意:pwd为密码字段,这里使用了VARCHAR(128)类型,为了后面方便对比,开发项目里一般使用char(32),SQL语句里使用MD5加密函数 USE db…...
C/C++内存管理及内存泄漏详解
目录 C/C内存分布 C语言中动态内存管理方式:malloc/calloc/realloc/free C内存管理方式 new/delete操作内置类型 new和delete操作自定义类型 operator new与operator delete函数 new和delete的实现原理 内置类型 自定义类型 内存泄漏 概念 内存泄漏分类 ⭐…...
什么是系统工程(字幕)41
0 00:00:01,650 --> 00:00:01,884 好 1 00:00:01,884 --> 00:00:06,330 那这个时候我们就可以把它绑定到上面了 2 00:00:06,610 --> 00:00:07,940 那我们来看 3 00:00:11,710 --> 00:00:12,930 幻灯片上 4 00:00:15,530 --> 00:00:15,885 5 00:00:15,885 --…...
测开新手:pytest+requests+allure自动化测试接入Jenkins学习
最近在这整理知识,发现在pytest的知识文档缺少系统性,这里整理一下,方便后续回忆。 在python中,大家比较熟悉的两个框架是unittest和pytest: Unittest是Python标准库中自带的单元测试框架,Unittest有时候…...
学习网络编程No.11【传输层协议之UDP】
引言: 北京时间:2023/11/20/9:17,昨天成功更文,上周实现了更文两篇,所以这周再接再厉。当然做题任在继续,而目前做题给我的感觉以套路和技巧偏多,还是那句话很多东西不经历你就是不懂ÿ…...
向爬虫而生---Redis 基石篇6 <拓展HyperLogLog>
前言: 继续之前的 向爬虫而生---Redis 基石篇5 <拓展Zset>-CSDN博客 一些比较基础的redis类型在初中级阶段用着没有毛病,但是到了大数据时代,慢慢一些更高级的场景,就需要把这几个类型搬出来了! 正文: 概念: 当我们需要对一个大型数据集进行去重计…...
JavaScript中的this
在实际应用中,了解 this 的行为是非常重要的,特别是在编写库或框架时,或者当你需要在回调函数中访问特定的上下文时,通常推荐使用箭头函数或者其他方法来确保 this 的正确指向。 在ES6中,this 的值取决于它是如何被调用…...
宝塔php站点设置伪静态规则 访问 a.com 时候跳转到 a.com/b.html
要在宝塔 PHP 站点中设置伪静态规则,实现访问a.com时跳转到a.com/b.html,可以按照以下步骤进行操作: 打开宝塔面板并登录到你的服务器管理界面。进入网站设置页面,找到你要设置伪静态规则的 PHP 站点。在站点设置中,找…...
git介绍4.2
git(版本控制工具) 一、git 介绍 1、git是目前世界上最先进的分布式版本控制系统,可以有效,高速的处理从小到大的项目版本管理。 2、git是linux torvalds 为了帮助管理linux内核开发二开发的一个开放源码的版本控制软件。 3、git作用:更好…...
【深入了解设计模式】组合设计模式
组合设计模式 组合模式是一种结构型设计模式,它允许你将对象组合成树状结构来表现“整体-部分”关系。组合模式使得客户端可以统一对待单个对象和组合对象,从而使得代码更加灵活和易于扩展。 概述 对于这个图片肯定会非常熟悉,上图我们可…...
4.Java---方法+重载
方法 方法的调用是需要开辟内存的,方法调用结束内存就被销毁了. 下面将介绍一个经典的错误标准的0分的示意! 我们日常中写交换两个数字的代码的时候都会用如下的方法进行描述: 你是不是觉得自己写的特别对!终于可以独立写一个小小的函数了? 下面运行一下看看结果 哦莫!怎么…...
蓝桥杯Java B组历年真题(2013年-2021年)
一、2013年真题 1、世纪末的星期 使用日期类判断就行,这里使用LocalDate,也可以使用Calendar类 答案 2099 使用LocalDate import java.time.LocalDate; import java.time.format.DateTimeFormatter; // 1:无需package // 2: 类名必须Main, 不可修改p…...
C++笔记(五)--- 虚函数(virtual)
目录 虚函数介绍 虚函数、覆盖和重载区别 虚函数介绍 C的虚函数是多态性的表现 1.构造函数不能为虚函数2.子类继承时虚函数仍为虚函数3.虚函数类外实现时,不需要加virtual4.有虚函数的类,析构函数一定要写成虚函数(否则可能会造成内存泄漏&…...
编写加密程序,加密规则为:将所有字母转化为该字母后的第三个字母,即A->D、B->E
编写加密程序,加密规则为:将所有字母转化为该字母后的第三个字母,即A->D、B->E、C->F、…、Y->B、Z->C。小写字母同上,其他字符不做转化。输入任意字符串,输出加密后的结果。 例如:输入&qu…...
【笔记】:更方便的将一个List中的数据传入另一个List中,避免多重循环
这里是 simpleInfoList 集合,记为集合A(传值对象) List<CourseSimpleInfoDTO> simpleInfoList courseClient.getSimpleInfoList(courseIds);if(simpleInfoListnull){throw new BizIllegalException("当前课程不存在!");}这…...
Cisco Secure ACS 5.8.0.32 安装 + Crack 教程
Cisco Secure ACS 5.8.0.32 安装 Crack 教程 前言系统环境开始安装 开始破解导入授权文件 前言 在ESXi 6.7 上经历过无数次的安装尝试 测试了各种兼容版本都没有安装成功,记最后一次安装成功的过程. 系统环境 服务器 : Dell R720xd CPU : E5-2620 v2 系统 : ESXi 6.7…...
项目准备March
Nginx主要用来作为Http服务器,要实现Tomcat的负载均衡,就可以通过Nginx来实现。 正向代理代理的是客户端,反向代理代理的是服务端。SpringBoot采用约定优于配置的思想,简化Spring项目的配置开发。 前端请求其实并未直接发送到后…...
别再忽略#@save和assert了!Python开发中的这两个小技巧能帮你省下大把时间
Python开发中的高效利器:#save与assert实战指南 在Python开发的世界里,真正区分普通开发者与高效开发者的往往不是对复杂框架的掌握程度,而是对这些看似简单却极其强大的小工具的熟练运用。今天我们要深入探讨的两个工具——#save注释和asser…...
手机维修师傅的“内功心法”:看懂手机屏排线上的MIPI、I2C、SPI信号,快速定位不开机、花屏、触摸失灵故障
手机维修实战:通过屏排线信号诊断显示与触摸故障的黄金法则 当你面对一部摔落后屏幕全黑但能听见系统声音的iPhone,或是进水后出现彩色条纹的安卓手机时,90%的维修师傅会直接更换屏幕总成。而真正的高手,会拿起万用表和示波器&…...
使用Alpine配置WSL ssh门户狙
1. 哑铃图是什么? 哑铃图(Dumbbell Plot),有时也称为DNA图或杠铃图,是一种用于比较两个相关数据点的可视化图表。 它源于人们对更有效数据比较方式的持续探索。 在传统的时间序列比较中,我们通常使用两条折…...
什么是系统性文献检索?与普通检索的区别
很多研究者在做文献检索时,其实并没有认真区分过两件事:自己到底是在“找几篇论文来读”,还是在“系统性地获取某一研究主题的全部关键文献”。这两种目标看起来很像,操作上却不是一回事,最终得到的研究质量也往往相差…...
算法安全自评估报告怎么写?内容框架 + 难点解析 + 实战模板(直接照搬)
本文适合:算法工程师、合规专员、产品负责人、备案申报人员,全文干货无废话,可直接用于项目申报、内部评审、算法备案材料。一、前言随着《算法推荐管理规定》《生成式人工智能服务管理暂行办法》等政策落地,算法安全自评估报告已…...
Python点云实战:统计滤波算法原理剖析与代码实现
1. 统计滤波算法原理详解 第一次接触点云处理时,我被各种滤波算法搞得晕头转向。直到真正理解了统计滤波,才发现它其实就像小区物业筛选业主——通过分析住户的"社交距离"来判断谁是真正的业主,谁是可疑人员。这种算法特别适合处理…...
SITS2026平台重构全记录:从单体Java商城到LLM+RAG驱动的AI原生电商,6周完成核心链路迁移并提升GMV 42%
第一章:SITS2026案例:AI原生电商平台实践 2026奇点智能技术大会(https://ml-summit.org) SITS2026是面向下一代电商基础设施的AI原生平台原型,由阿里云与浙江大学联合实验室在2024年Q4启动构建,于2025年Q2完成全链路灰度验证。该…...
Selenium+图鉴平台实战:5分钟搞定欧模网滑动验证码自动登录(附完整代码)
Selenium与图鉴平台实战:破解滑动验证码自动登录的技术解析 滑动验证码已经成为现代网站防护爬虫的标配方案之一。作为前端工程师或自动化测试开发者,我们经常需要处理这类验证码的自动识别问题。本文将深入探讨如何利用Selenium结合第三方图鉴平台&…...
引领交互新高度:探索Tornis——您的视口状态守护者
引领交互新高度:探索Tornis——您的视口状态守护者 【免费下载链接】tornis Tornis helps you watch and respond to changes in your browsers viewport 🌲 项目地址: https://gitcode.com/gh_mirrors/to/tornis Tornis是一款轻量级JavaScript库…...
ComfyUI Qwen人脸生成图像教程:提示词分层写法,效果更稳定
ComfyUI Qwen人脸生成图像教程:提示词分层写法,效果更稳定 1. 认识Qwen人脸生成模型 1.1 模型核心能力解析 Qwen-Image-Edit-F2P模型是一款专注于从单张人脸生成完整全身图像的专业工具。它不同于普通的图像生成模型,而是专门针对人脸到全…...
