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

        一个时间值。

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

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

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

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

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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/712008.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

可用于智能客服的完全开源免费商用的知识库项目

介绍 FastWiki项目是一个高性能、基于最新技术栈的知识库系统,专为大规模信息检索和智能搜索设计。利用微软Semantic Kernel进行深度学习和自然语言处理,结合.NET 8和MasaBlazor前端框架,后台采用.NET 8MasaFrameworkSemanticKernel&#xff…

【InternLM 实战营笔记】基于 InternLM 和 LangChain 搭建MindSpore知识库

InternLM 模型部署 准备环境 拷贝环境 /root/share/install_conda_env_internlm_base.sh InternLM激活环境 conda activate InternLM安装依赖 # 升级pip python -m pip install --upgrade pippip install modelscope1.9.5 pip install transformers4.35.2 pip install str…

【大厂AI课学习笔记NO.53】2.3深度学习开发任务实例(6)数据采集

这个系列写了53期了,很多朋友收藏,看来还是觉得有用。 后续我会把相关的内容,再次整理,做成一个人工智能专辑。 今天学习到了数据采集的环节。 这里有个问题,数据准备包括什么,还记得吗? 数…

接口测试实战--mock测试、日志模块

一、mock测试 在前后端分离项目中,当后端工程师还没有完成接口开发的时候,前端开发工程师利用Mock技术,自己用mock技术先调用一个虚拟的接口,模拟接口返回的数据,来完成前端页面的开发。 接口测试和前端开发有一个共同点,就是都需要用到后端工程师提供的接口。所以,当…

书生·浦语大模型图文对话Demo搭建

前言 本节我们先来搭建几个Demo来感受一下书生浦语大模型 InternLM-Chat-7B 智能对话 Demo 我们将使用 InternStudio 中的 A100(1/4) 机器和 InternLM-Chat-7B 模型部署一个智能对话 Demo 环境准备 在 InternStudio 平台中选择 A100(1/4) 的配置,如下图所示镜像…

Spring常见面试题知识点总结(三)

7. Spring MVC: MVC架构的概念。 MVC(Model-View-Controller)是一种软件设计模式,旨在将应用程序分为三个主要组成部分,以实现更好的代码组织、可维护性和可扩展性。每个组件有着不同的职责,相互之间解耦…

YOLO算法

YOLO介绍 YOLO,全称为You Only Look Once: Unified, Real-Time Object Detection,是一种实时目标检测算法。目标检测是计算机视觉领域的一个重要任务,它不仅需要识别图像中的物体类别,还需要确定它们的位置。与分类任务只关注对…

【矩阵】【方向】【素数】3044 出现频率最高的素数

作者推荐 动态规划的时间复杂度优化 本文涉及知识点 素数 矩阵 方向 LeetCode 3044 出现频率最高的素数 给你一个大小为 m x n 、下标从 0 开始的二维矩阵 mat 。在每个单元格,你可以按以下方式生成数字: 最多有 8 条路径可以选择:东&am…

安装 Ubuntu 22.04.3 和 docker

文章目录 一、安装 Ubuntu 22.04.31. 简介2. 下载地址3. 系统安装4. 系统配置 二、安装 Docker1. 安装 docker2. 安装 docker compose3. 配置 docker 一、安装 Ubuntu 22.04.3 1. 简介 Ubuntu 22.04.3 是Linux操作系统的一个版本。LTS 版本支持周期到2032年。 系统要求双核 C…

代码随想录 二叉树第二周

目录 101.对称二叉树 100.相同的树 572.另一棵树的子树 104.二叉树的最大深度 559.N叉树的最大深度 111.二叉树的最小深度 222.完全二叉树的节点个数 110.平衡二叉树 257.二叉树的所有路径 101.对称二叉树 101. 对称二叉树 已解答 简单 相关标签 相关企业 给你一…

《求生之路2》服务器如何选择合适的内存和CPU核心数,以避免丢包和延迟高?

根据求生之路2服务器的实际案例分析选择合适的内存和CPU核心数以避免丢包和延迟高的问题,首先需要考虑游戏的类型和对服务器配置的具体要求。《求生之路2》作为一款多人在线射击游戏,其服务器和网络优化对于玩家体验至关重要。 首先,考虑到游…

Java应用程序注册成Linux系统服务后,关闭Java应用程序打印系统日志

Java应用程序有自己的日志框架,有指定位置的日志文件,不需要在系统日志里记录,占用磁盘空间。 1.Linux系统文件目录 /etc/systemd/system/ 找到要修改的Java应用程序服务配置 比如bis-wz-80.service 2.设置不打印日志 StandardOutputnull S…

centos7 搭建 harbor 私有仓库

一、下载安装 1.1、harbor 可以直接从 github 上下载:Releases goharbor/harbor GitHub 这里选择 v2.10.0 的版本 wget https://github.com/goharbor/harbor/releases/download/v2.10.0/harbor-offline-installer-v2.10.0.tgz 1.2、解压 tar zxvf harbor-offlin…

L2 网络 Mint Blockchain 正式对外发布测试网

Mint Blockchain 是由 NFTScan Labs 发起的聚焦在 NFT 生态的 L2 网络,致力于促进 NFT 资产协议标准的创新和 NFT 在现实商业应用场景中的大规模采用。 Mint Blockchain 于 2024 年 2 月 28 号正式对外发布测试网,开始全面进入生态开发者测试开发阶段。 …

Springboot项目集成短信验证码(超简单)

操作流程 注册验证码平台创建验证码模版开始集成(无需引入第三方库) 注册并登陆中昱维信验证码平台 获取AppID和AppKey。 创建验证码模版 创建验证码模版,获取验证码模版id 开始集成 创建controller import org.springframework.web.bi…

MATLAB环境下基于随机游走拉普拉斯算子的快速谱聚类方法

古人有云,物以类聚,在面临信息爆炸问题的今天,对信息类别划分的价值日益显现,并逐步成为学者们的研究热点。分类和聚类是数据挖掘的重要工具,是实现事物类别划分的左右手,聚类又是分类一种特殊的方式。所谓…

CodeWhisperer安装教导--一步到位!以及本人使用Whisperer的初体验。

CodeWhisperer是亚马逊出品的一款基于机器学习的通用代码生成器,可实时提供代码建议。类似 Cursor 和Github AWS CodeWhisperer 亚马逊科技的CodeWhisperer是Amazon于2021年12月推出的一款代码补全工具,与GitHub Copilot类似。主要的功能有:代码补全注释…

猫毛过敏养猫人士的必备养猫好物-宠物空气净化器品牌分享

许多猫奴在与猫相处一段时间后突然对猫毛过敏,这真是令人难受。一些人认为对猫咪过敏是因为它们在空气中飘浮的毛发引起的,但实际上大部分人之所以过敏是因为对猫身上一种微小的蛋白质过敏。这种导致过敏的蛋白质附着在猫咪的一些皮屑上。我们都知道猫咪…

Linux 下安装Jupyter

pip3 install jupyter pip3 install ipython -------------------------------------------- pip3 install jupyterlab jupyter lab pip3 list | grep jupyterlab 启动: python3 -m jupyter lab 2.安装朱皮特 pip3 install -i https://pypi.douban.com/simpl…

高性能的key-value数据库Redis 介绍

Redis 是一个高性能的key-value数据库。 Redis是一个开源的键值存储系统,通常用于缓存和消息传递。它支持多种类型的数据结构,如字符串、列表、集合、散列表和有序集合等。Redis的特点是提供了高性能、灵活性和可伸缩性。 Redis的主要特点包括&#xff…