TCP/IP 笔记 - 广播和本地组播
在之前第二章介绍IP寻址的时候有介绍到,IP地址有4种:单播、组播、广播、任播。
单播,客户端与服务器之间点到点连接通信;
组播,在发送者和多个接收者(如某个特定的分组)之间实现点对多点的连接通信;
广播,在网络(广播地址范围内的子网)内广播数据包,网络内的每一台主机都将受到这些数据包;
任播,使得数据包可以根据路由拓朴来决定送到“最近”或“最好”的目的地。
广播和组播为应用程序提供两种服务:数据分组交付至多个目的地、通过客户端请求/发现服务器。一个广播请求会影响在广播域范围内的所有可达主机,而组播只影响那些可能对该请求有兴趣的主机。使用者需要追求的是广播的高开销和简单性与组播的高效率和复杂性之间找平衡。
在IPv4中,有两种类型的广播地址:受限(255.255.255.255)和定向。定向广播地址基于网络前缀和它的长度,通过创建一个初始位和网络前缀相等、低序位被置1的32位地址形成。通常使用定向广播代替受限广播地址是更可选的。选择哪些接口用于发送传出的广播流量依赖于操作系统。一个典型的例子是使用一个主接口用于有限广播流量,使用保存在主机的转发表中的信息来选择传出定向广播和组播的接口。
组播
比如有数组[1,2,3,4,5,6,7,8,9,10],广播的通知可以认为取了整个数组,而组播可能只是取数组中能够被2整除的数据[2,4,6,8,10],这就是广播和组播的区别。
需要达到网络内部分主机接收数据,要么是通过发送方指定接收方,要么就是通过接收方指明对数据类型的兴趣,然后网络只负责向预期的/感兴趣的接收方发送流量。
在组播中,由主机和路由器来保持组播状态信息,以说明哪些接收方对哪类流量感兴趣。在组播TCP/IP模型中,接收方通过指明组播地址和可选源列表来表明它们希望接收流量的兴趣。这个信息作为主机和路由器中的软状态来维持,则它必须定期更新或超时删除。
IP组播地址并不通过使用协议报文来确定,而是简单的讲一个IP组播地址直接映射到一些对应的MAC地址。IANA拥有IEEE组织唯一标识符00:00:5e。有了它,IAN就被赋予权限去使用以01:00:5e开始的组MAC地址以及以01:00:5e开始的单播地址。该前缀被用作以太网地址的高序24位,意味着此块包括范围00:00:5e:00:00:00到00:00:5e:ff:ff:ff的单播地址,以及范围在00:00:5e:00:00:00到00:00:5e:ff:ff:ff的组播地址。除了IANA的其他组织也拥有地址块,但只要IANA将其空间的一部分用于支持IP组播。IANA分配一半的组地址块用于识别 IEEE 802 LAN 上的IPv4组播流量。
IPv4地址到他们对应的IEEE 802 形式的链路层地址的映射如图所示:
除去前缀,还有32-4=28位可用于编码空间,即2的28次方,268435456个组播地址。对于IPv4,IANA的政策是分配一半的组地址用于支持IPv4组播,那么就是268435456个组播地址将被映射到2的23次方,8388608个唯一条目的链路层地址空间。因此,映射不是唯一的,多个IPv4组ID被映射到相同MAC层地址。具体计算,有2的28-23次方,即32个不同的IPv4组播地址被映射。
IPv6到IEEE 802 MAC组播地址映射使用IPv6组播地址的低序32位作为以33:33开始的MAC地址的后缀。因为只使用了112个组播地址位中的32位,所以2的80次方个组映射到相同的MAC层地址。
组播的应用过程大致如下图:
上图组播路由中,两个主要的协议用于允许组播路由器了解附近的主机感兴趣的组:IPv4使用的互联网组管理协议(IGMP)和IPv6使用的组播侦听发现协议(MLD)。
IGMP和MLD
IGMP和MLD都由支持组播的主机和路由器使用,并且协议非常相似。IGMP已发展到v3版本,而MLD发展到v2版本。IGMPv1是第一个广泛使用的IGMP版本,v2添加了更迅速地离开组的能力,IGMPv3和MLDv2添加了选择组播流量源的能力,并要求部署SSM。然而IGMP是IPv4使用的一个单独的协议,而MLD是ICMPv6的真正的一部分。
下图显示了IPv4(IPv6)具有组播功能的路由器如何使用IGMP(MLD):
组播路由器定期向每个连接的子网发送IGMP(MLD)请求,以确定哪些组和源对连接的主机来说是感兴趣的。主机使用IGMP(MLD)报告响应,说明哪些组合源是感兴趣的。
IGMP和MLD的封装如图:
与ICMP类似,IGMP被认为是IP层的一部分,且报文也在IPv4数据报中传输。IGMP使用一个固定的为1的TTL值,所有数据分组仅限于本地子网。IGMP数据分组也使用IPv4路由警告选项,并使用6位值0x30的DS字段来代表网间控制。在IPv6中,MLD是ICMPv6的一部,它的封装使用了IPv6的逐跳扩展头部以保持路由器警告选项。
IGMP和MLD定义了两组协议处理规则:由组成员的主机执行的、由组播路由器执行的。
组成员的工作是自发的报告对组播组和源的兴趣改变,以及响应定期的查询;组播路由器发送查询,以确定连接链路上的对于任意组或是特定的组播组和源是否有兴趣。
组成员的工作
IGMP和MLD组成员的部分被设计为允许主机指定它们对什么样的组有兴趣,以及从特定源发送的流量是否应该接受或过滤掉。这是通过向一个或多个连接到同一子网的组播路由器(和参与主机)发送报告完成的。
组成员的报告信息如下格式:
IGMPv3成员资格报告包含IV组的组记录。每个组记录表明一个组播地址和可选源列表。每个组记录中包含一个类型、主题组的地址,以及要包含或是排除的源地址列表,此外还包括辅助数据(IGMPv3中未使用)。
组记录信息格式:
IGMP和MLD源列表的类型值指明过滤模式(包含/排除)以及源列表是否已改变
当收到一个查询时,组成员没有立即回应,它们设置一个随机计时器来决定何时响应。在此期间,进程可能会改变它们的组/源兴趣,任何这样的变化可以在计时器到期前一起处理来触发报告。这样做节省了一定量的开销。
组播路由器的工作
在IGMP和MLD中,组播路由器的工作是为每个组播组、接口和源列表确定是否至少有一个组成员目前在接收相应的流量。这是通过发送查询,以及基于成员发送的报告,建立描述成员存在性的状态来完成的。
路由器的信息如下格式:
IGMPv3查询包含组播组地址和可选源列表。当组播路由器希望了解所有组播组的兴趣时,组地址字段被设置为0,并被发送到所有主机组播地址224.0.0.1。S和QRV用于容错和报告重传,QRV值编码发送方将使用的最大重传次数,QQIC字段编码定期查询间隔。
有三种查询报文的变体可以由组播路由器发送:一般查询、特定组查询、特定组和源查询。一般查询被组播路由器用于更新任意组播组的信息,对于这样的查询,组列表是空的;特定组查询与一般查询类似,但对于识别的组是特定的;特定组合源查询是一个包含一组源的特定组查询。
对于IGMPv3和MLDv2,主机除了维护它们的应用和系统软件感兴趣的组播组的过滤器状态,还维护被排除或包含的源列表。为了了解什么流量需要被转发到链路上以便有兴趣的主机收到,组播路由器维护类似的状态。反之也是如此:一个组播路由器可以停止转发在每个接收方的排除列表中的主机发送的组播流量。实践经验证明,应用程序很少需要屏蔽特定源,并且支持此功能也比较复杂。然而主机往往希望包含一个与一个组相关联的特定源,尤其是当SSM在使用时。因此有了简化版的(轻量级)IGMPv3和(轻量级)MLDv2。
完整版本与轻量级的对比
多个组播路由器实现的第一种类型的协调是查询器选举。每个组播路由器可以侦听其他的查询,当一个组播路由器启动时,它认为自已是查询器并发送一般查询以确定在子网中哪些组是活跃的。当一个路由器收到另一个路由器的组播查询时,它比较源IP地址和它自已的地址。如果在所接收的查询中的源IP地址小于它自已的地址,接收路由器进入备用模式。因此,具有最小IP地址的路由器被认为是获胜者,并成为单一的查询器,负责向它连接的子网中发送查询。备用的路由器设置计时器,如果它们在一个指定的时间(称为其他查询器出现计时器)内没有看到更多的查询,它们再次成为查询器。
为了帮助防止丢失协议报文,有些报文被重传多次(由QRV查询器鲁棒性变量决定)。QRV值在包含于查询中的QRV字段中编码,非查询路由器采用查询路由器的QRV作为自己的该字段值。如果查询器发生改变,则这帮助保持了稳定性。重传中保护的报文类型包括状态改变报告和特定查询,其他报文通常不会导致转发状态的变化,而是只涉及通过调整计时器刷新软状态,所以使用重传无法保护它们。预计更容易出现丢失的链路,可能需要以生成额外的流量为代价,增加鲁棒性变量以增强分组丢失的健壮性。
当处理特定查询时,为了帮助组播路由器保持同步,查询报文中S位字段表明路由器端(计时器)处理应被抑制。当一个特定的查询由查询器发送时,应该安排一个重传次数(QRV)。在发送的第一个查询中,S位字段被清除。基于重传或这种查询的接收,组播路由器会为随后的重传降低它的计时器到LMQT。此时,为感兴趣的主机提供一个报告以指出它对一个组或源的持续的兴趣。如果没有报文丢失,该报告使每个组播路由器重置它的计时器为普通值,并保持不变。然而,预定的重传不会被放弃。相反,特定查询的重传被发送时,S位字段被设置,这将导致接收路由器不会降低它们的计时器到LMQT。在收到表示有兴趣的报告之后,仍保持查询重传的原因,是为了使跨越所有组播路由器的组的超时时间是一致的。然后,S位字段的目的是为了让特定的查询被(重新)发送,也为了避免降低计时器到LMQT,因为一个表示兴趣的合法的报告可能已经被接受了,即使它或初始查询被非查询器路由器丢失了。没有这种能力,重传的特定查询会导致非查询器路由器不正确地降低它们的计时器(因为已经收到一个表明兴趣的合法报告)。
IGMP和MLD的配置参数和计时器的值如下:
一些交换机支持一种称为IGMP探听的功能,该功能监控主机和组播路由器直接的IGMP(MLD)流量,并且能记录哪些端口需要哪些特定的组播流动,这样做能够实质地影响在一个交换网络中正在被承载的不需要的组播流量数量。在IGMPv3和MLDv2中,生成报告响应查询。支持早期版本的IGMP和MLD的IGS交换机避免向所有的接口广播报告,它们只向最近的组播路由器转发报告。
IGMP(MLD)探听避免了"交互机沿着所有交换机形成的生成树的所有分支广播消息来发送链路层流量"的情况。
由于IGMP和MLD都是信令协议,可以控制其他流量的流动,针对它们的攻击往往会引起额外的资源消耗,可能导致拒绝服务。其他形式攻击利用已经发现的实现漏洞,导致执行由攻击者提供的不需要的代码。
参考:
《TCP IP 详解卷1:协议》
TCP/IP 笔记 - 广播和本地组播的更多相关文章
- 《TCP/IP 详解 卷1:协议》第 9 章:广播和本地组播(IGMP 和 MLD)
我已经懒了,卷一已经是去年年底看完的,但怎么说卷一的坑开了就要填完啊-- 广播和本地组播(IGMP 和 MLD) 引言 有 4 种 IP 地址,单播(unicast).任播(anycast).组播(m ...
- 第九章 广播和本地组播(IGMP和MLD)
距离项目开启已经过去了一段时间,这段时间内自己学习的内容也算挺多的,但是也较容易遗忘,之后应该在空余的时间内多翻翻博客,更加清楚传统计算机网络的运作. 由于51要出去玩,更要好好利用好最近的时间.完成 ...
- TCP/IP 笔记 - 域名解析和域名系统
由于IP地址的烦琐导致的记忆和使用困难,互联网支持使用主机名称来识别包括客户机和服务器在内的主机.同时为了使用一系列协议,主机名称通过称为"名称解析"的过程转换成对应IP地址. 互 ...
- Java单播、广播、多播(组播)---转
一.通信方式分类 在当前的网络通信中有三种通信模式:单播.广播和多播(组播),其中多播出现时间最晚,同时具备单播和广播的优点. 单播:单台主机与单台主机之间的通信 广播:当台主机与网络中的所有主机通信 ...
- Java单播、广播、多播(组播)
一.通信方式分类 在当前的网络通信中有三种通信模式:单播.广播和多播(组播),其中多播出现时间最晚,同时具备单播和广播的优点. 单播:单台主机与单台主机之间的通信 广播:当台主机与网络中的所有主机通信 ...
- TCP/IP 笔记 - 用户数据报协议和IP分片
关于本章中的IP分片部分,参考第五章IP分片头部知识点.需要注意的是,TCP有超时重传,UDP的超时重传则依赖上层应用程序实现. 用户数据报协议(UDP) UDP是一个简单的面向无连接.不可靠的数据报 ...
- TCP/IP 笔记 - ICMPv4和ICMPv6 : Internet控制报文协议
ICMP是一种面向无连接的协议,负责传递可能需要注意的差错和控制报文,差错指示通信网络是否存在错误(如目的主机无法到达.IP路由器无法正常传输数据包等.注意,路由器缓冲区溢出导致的丢包不包括在ICMP ...
- TCP/IP 笔记 - DHCP和自动配置
动态主机配置协议(DHCP),一个局域网的网络协议,使用UDP协议工作,用于局域网中集中管理.分配IP地址. DHCP介绍 DHCP有两个主要部分组成:地址管理和配置数据交付.地址管理用于IP地址的动 ...
- TCP/IP 笔记 - 链路层
链路层的目的是为IP模块发送和接收IP数据报. 以太网和IEEE 802局域网标准 以太网指的是一套标准,有DEC.Intel公司和Xerox公司在1980年首次发布,并在1982年加以修订.第一个常 ...
随机推荐
- Retrofit 2.0基于OKHttp更高效更快的网络框架 以及自定义转换器
时间关系,本文就 Retrofit 2.0的简单使用 做讲解 至于原理以后有空再去分析 项目全面.简单.易懂 地址: 关于Retrofit 2.0的简单使用如下: https://gitee.c ...
- 四 分析easyswoole源码(启动服务&Cache组件原理)
前文提到的在系统设置Cache组件 Cache::getInstance()的时候,会去调用processManager去创建Cache的进程,然后以管道通信的方式进行设置缓存和获取缓存. Cache ...
- python 之字符编码
一 了解字符编码的储备知识 python解释器和文件本编辑的异同 相同点:python解释器是解释执行文件内容的,因而python解释器具备读py文件的功能,这一点与文本编辑器一样 不 ...
- jexus托管.net core
https://blog.csdn.net/gongzhe2011/article/details/72757863
- 目录命令(tree)
TREE 命令: // 描述: 以图形方式显示驱动器中路径或磁盘的目录结构. // 语法: tree [<Drive>:][<Path>] [/f] [/a] // 参数: / ...
- Scrum冲刺阶段1
各个成员在 Alpha 阶段认领的任务 人员 任务 何承华 美化设计 部分后端设计 陈宇 后端设计 丁培辉 美化设计 部分后端设计 温志铭 前端设计 杨宇潇 服务器搭建 张主强 前端设计 明日各个成员 ...
- 第一次使用zxxbox弹层经历
一:首先这个插件是基于JQuery的插件,要先导入JQuery,然后再导入这个插件 二:HTML部分 <a href="http://www.jisuapi.com/static/im ...
- 机器学习面试--一句话概括传统ML算法
机器学习过程主要包括:数据的特征提取.数据预处理.训练模型.测试模型.模型评估改进等几部分 传统机器学习算法主要包括以下五类: 回归:建立一个回归方程来预测目标值,用于连续型分布预测 分类:给定大量带 ...
- maven学习pom
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/20 ...
- python3 与 Django 连接数据库报错:ImportError: No module named 'MySQLdb'
在 python2 中,使用 pip install mysql-python 进行安装连接MySQL的库,使用时 import MySQLdb 进行使用 在 python3 中,改变了连接库,改为了 ...