第13章 IGMP:Internet组管理协议

 

13.1   引言

 

12.4节概述了 IP多播给出,并介绍了 D类IP地址到以太网地址的映射方式。也简要说明了 在单个物理网络中的多播过程,但当涉及多个网络并且多播数据必须通过路由器转发时,情况会复杂得多。


本章将介绍用于支持主机和路由器进行多播的 Internet 组管理协议( IGMP)。它让一个物理网络上的所 有系统知道主机当前所在的多播组。多播路由器需要这 些信息以便知道多播数据报应该向哪些接口转发。  IGMP 在RFC 1112中定义 [Deering 1989]。

正如 I C M P 一样, I G M P 也被当作 I P 层的一部分。


IP数据报

 

IP首部               IGMP报文

 

20字节                  8字节

图13-1   IGMP报文封装在IP数据报中


IGMP报文通过 IP数据报进行传输。不像我们已经见到的其他协议, IGMP有固定的报文长度, 没有可选数据。图 13-1显示了 IGMP报文如何封装在 IP数据报中。

IGMP报文通过 IP首部中协议字段值为 2来指明。

13.2   IGMP报文

 

图13-2显示了长度为 8字节的 IGMP报文格式。

 

 


4位

IGMP

版本(1)


4位

IGMP

类型(1-2)


未用                                           检验和

 

32位组地址(D类IP地址)


 

8字节


 

 

图13-2   IGMP报文的字段格式

 

这是版本为 1的IGMP。IGMP类型为 1说明是由多播路由器发出的查询报文,为 2说明是主 机发出的报告报文。检验和的计算和 ICMP协议相同。

组地址为 D类IP地址。在查询报文中组地址设置为 0,在报告报文中组地址为要参加的组 地址。在下一节中,当介绍 IGMP如何操作时,我们将会更详细地了解它们。

13.3   IGMP 协议

 

13.3.1   加入一个多播组

 

多播的基础就是一个进程的概念(使用的术语进程是指操作系统执行的一个程序),该进 程在一个主机的给定接口上加入了一个多播组。在一个给定接口上的多播组中的成员是动态


 

的—它随时因进程加入和离开多播组而变化。

这里所指的进程必须以某种方式在给定的接口上加入某个多播组。进程也能离开先前加 入的多播组。这些是一个支持多播主机中任何 API所必需的部分。使用限定词“接口”是因为 多播组中的成员是与接口相关联的。一个进程可以在多个接口上加入同一多播组。

Stanford大学伯克利版Unix中的IP 多播详细说明了有关 socket API的变化,这些变 化在Solaris 2.x和ip(7)的文档中也提供了。

这里暗示一个主机通过组地址和接口来识别一个多播组。主机必须保留一个表,此表中 包含所有至少含有一个进程的多播组以及多播组中的进程数量。

 

13.3.2   IGMP 报告和查询

 

多播路由器使用 IGMP报文来记录与该路由器相连网络中组成员的变化情况。使用规则如

下:

1) 当第一个进程加入一个组时,主机就发送一个 IGMP报告。如果一个主机的多个进程加 入同一组,只发送一个 IGMP报告。这个报告被发送到进程加入组所在的同一接口上。

2) 进程离开一个组时,主机不发送 IGMP报告,即便是组中的最后一个进程离开。主机知 道在确定的组中已不再有组成员后,在随后收到的 IGMP查询中就不再发送报告报文。

3) 多播路由器定时发送 IGMP查询来了解是否还有任何主机包含有属于多播组的进程。多 播路由器必须向每个接口发送一个 IGMP查询。因为路由器希望主机对它加入的每个多播组均 发回一个报告,因此 IGMP查询报文中的组地址被设置为 0。

4) 主机通过发送 IGMP报告来响应一个 IGMP查询,对每个至少还包含一个进程的组均要 发回IGMP报告。

使用这些查询和报告报文,多播路由器对每个接口保持一个表,表中记录接口上至少还 包含一个主机的多播组。当路由器收到要转发的多播数据报时,它只将该数据报转发到(使用相应的多播链路层地址)还拥有属于那个组主机的接口上。

图13-3显示了两个 IGMP报文,一个是主机发送的报告,另一个是路由器发送的查询。该 路由器正在要求那个接口上的每个主机说明它加入的每个多播组。


IGMP报告,TTL=1, IGMP组地址=组地址 目的IP地址=组地址 源IP地址=主机的IP地址


IGMP查询,TTL=1, IGMP组地址=0 目的IP地址=224.0.0.1 源IP地址=路由器IP地址


 

 

 

主机

 

多播路 由器

 

图13-3   IGMP的报告和查询

对TTL字段我们将在本节的后面介绍。

 

13.3.3   实现细节

 

为改善该协议的效率,有许多实现的细节要考虑。首先,当一个主机首次发送  IGMP报告


 

(当第一个进程加入一个多播组)时,并不保证该报告被可靠接收(因为使用的是 IP交付服务)。

下一个报告将在间隔一段时间后发送。这个时间间隔由主机在 0~10秒的范围内随机选择。 其次,当一个主机收到一个从路由器发出的查询后,并不立即响应,而是经过一定的时

间间隔后才发出一些响应(采用“响应”的复数形式是因为该主机必须对它参加的每个组均发送一个响应)。既然参加同一多播组的多个主机均能发送一个报告,可将它们的发送间隔设 置为随机时延。在一个物理网络中的所有主机将收到同组其他主机发送的所有报告,因为如图13-3 所示的报告中的目的地址是那个组地址。这意味着如果一个主机在等待发送报告的过程中,却收到了发自其他主机的相同报告,则该主机的响应就可以不必发送了。因为多播路 由器并不关心有多少主机属于该组,而只关心该组是否还至少拥有一个主机。的确,一个多播路由器甚至不关心哪个主机属于一个多播组。它仅仅想知道在给定的接口上的多播组中是 否还至少有一个主机。

在没有任何多播路由器的单个物理网络中,仅有的 IGMP通信量就是在主机加入一个新的 多播组时,支持 IP多播的主机所发出的报告。

 

13.3.4   生存时间字段

 

在图 13-3中,我们注意到 IGMP报告和查询的生存时间 (TTL)均设置为 1,这涉及到 IP首部 中的 TTL字段。一个初始 TTL为0的多播数据报将被限制在同一主机。在默认情况下,待传多 播数据报的 TTL被设置为 1,这将使多播数据报仅局限在同一子网内传送。更大的  TTL值能被 多播路由器转发。

回顾 6.2节,对发往一个多播地址的数据报从不会产生 ICMP差错。当 TTL值为 0时,多播 路由器也不产生 ICMP“超时”差错。

在正常情况下,用户进程不关心传出数据报的 TTL。然而,一个例外是 Traceroute程序(第 8章),它主要依据设置 TTL值来完成。既然多播应用必须能够设置要传送数 据报的TTL值,这意味着程序设计接口必须为用户进程提供这种能力。

通过增加 TTL值的方法,一个应用程序可实现对一个特定服务器的扩展环搜索  (expanding ring search)。第一个多播数据报以TTL等于1发送。如果没有响应,就尝试将TTL设置为2,然 后3,等等。在这种方式下,该应用能找到以跳数来度量的最近的服务器。

从224.0.0.0到224.0.0.255 的特殊地址空间是打算用于多播范围不超过  1 跳的应用。不管

TTL值是多少,多播路由器均不转发目的地址为这些地址中的任何一个地址的数据报。

 

13.3.5   所有主机组

 

在图 13-3中,我们看到了路由器的IGMP查询被送到目的IP地址224.0.0.1。该地址被称为 所有主机组地址。它涉及在一个物理网络中的所有具备多播能力的主机和路由器。当接口初始化后,所有具备多播能力接口上的主机均自动加入这个多播组。这个组的成员无需发送IGMP报告。

13.4 一个例子

 

现在我们已经了解了一些IP多播的细节,再来看看所包含的信息。我们使sun主机能够支


 

持多播,并将采用一些多播软件所提供的测试程序来观察具体的过程。

首先,采用一个经过修改的 netstat命令来报告每个接口上的多播组成员情况(在 3.9节 显示了 netstat-ni命令的输出结果)。在下面的输出中,用黑体表示有关的多播组。

 

 

 

 

 

 

 

 

 

 

其中, -n参数将以数字形式显示IP地址(而不是按名字来显示它们),-i参数将显示接 口的统计结果, -a参数将显示所有配置的接口。

输出结果中的第 2行le0(以太网)显示了这个接口属于主机组224.0.0.1(“所有主机”), 和两行地址,后一行显示相应的以太网地址为: 01:00:5e:00:00:01。这正是我们期望看到的以 太网地址,和 12.4节介绍的地址映射一致。我们还看到其他两个支持多播的接口:  SLIP接口 sl0和回送接口 lo0,它们也属于所有主机组。

我们也必须显示 IP 路由表,用于多播的路由表同正常的路由表一样。黑体表项显示了所有传往224.0.0.0的数据报均被送往以太网:

如果将这个路由表与 9. 2 节中 sun路由器的路由表作比较,会发现只是多了有关多播的条目。

现在使用一个测试程序来让我们能在一个接口上加入一个多播组(不再显示使用这个测试程序的过程)。在以太网接口(140.252.13.33)上加入多播组224.1.2.3。执行netstat程序看到内核已加入这个组,并得到期望的以太网地址。用黑体字来突出显示和前面 netstat输出的不同。

 

我们在输出中再次显示了其他两个接口:sl0和lo0,目的是为了重申加入多播组只发生在一个接口上。


 

图13-4显示了tcpdump对进程加入这个多播组的跟踪过程。

图13-4   当一个主机加入1个多播组时tcpdump 的输出结果

 

当主机加入多播组时产生第1行的输出显示。第2行是经过时延后的IGMP报告,我们介绍 过报告重发的时延是10秒内的随机时延。

在两行中显示硬件地址证实了以太网目的地址就是正确的多播地址。我们也看到了源 IP 地址为相应的 sun主机地址,而目的 IP 地址是多播组地址。同时,报告的地址和期望的多播组地址是一致的。

最后,我们注意到,正像指明的那样, TTL是1。当TTL的值为0或1时,tcpdump在打印 时用方括号将它们括起来,这是因为 TTL在正常情况下均高于这些值。然而,使用多播我们 期望看到许多TTL为1的IP数据报。

在这个输出中暗示了一个多播路由器必须接收在它所有接口上的所有多播数据报。路由器无法确定主机可能加入哪个多播组。

 

多播路由器的例子

 

继续前面的例子,但我们将在 sun主机中启动一个多播选路的守护程序。这里我们感兴趣的并不是多播选路协议,而是要研究所交换的 IGMP查询和报告。即使多播选路守护程序只运行在支持多播的主机( sun)上,所有的查询和报告都将在那个以太网上进行多播,所以我们在该以太网中的其他系统中也能观察到它们。

在启动选路守护程序之前,加入另外一个多播组 224.9.9.9,图13-5显示了输出的结果。

 

图13-5   当多播选路守护程序运行时tcpdump 的输出结果

在这个输出中没有包括以太网地址,因为已经证实了它们是正确的。也删去了  TTL等于1

的说明,同样因为它们也是我们期望的那样。

当选路守护程序启动时,输出第1行。它发出一个已经加入了组 224.0.0.4的报告。多播地 址22 4 . 0 . 0 . 4 是一个知名的地址,它被当前用于多播选路的距离向量多播选路协议    DV M R P


 

(Distance Vector MulticastRouting Protocol) 所使用(DVMRP在RFC1075 中定义 [Waitzman,

Partridge, and Deering] )。

在该守护程序启动时,它也发送一个  I G M P 查询(第 2 行)。该查询的目的  I P 地址为

224.0.0.1(所有主机组),如图 13-3所示。

第一个报告(第3行)大约在5秒后收到,报告给组 224.9.9.9。这是在下一个查询发出之 前(第4行)收到的唯一报告。当守护程序启动后,两次查询(第2行和第4行)发出的间隔很 短,这是因为守护程序要将其多播路由表尽快建立起来。

第5、6和7行正是我们期望看到的:sun主机针对它所属的每个组发出一个报告。注意组

224.0.0.4是被报告的,而其他两个组则是明确加入的,因为只要选路守护程序还在运行,它 始终要属于组224.0.0.4。

下一个查询位于第8行,大约在前一个查询的 2分钟后发出。它再次引发三个我们所期望的报告(第9、10和11行)。这些报告的时间顺序与前面不同,因为接收查询和发送报告的时 间是随机的。

最后的查询在前一个查询的大约 2分钟后发出,我们再次得到了期望的响应。

13.5    小结

 

多播是一种将报文发往多个接收者的通信方式。在许多应用中,它比广播更好,因为多播降低了不参与通信的主机的负担。简单的主机成员报告协议(IGMP)是多播的基本模块。

在一个局域网中或跨越邻近局域网的多播需要使用本章介绍的技术。广播通常局限在单个局域网中,对目前许多使用广播的应用来说,可采用多播来替代广播。

然而,多播还未解决的一个问题是在广域网内的多播。[Deering and Cheriton 1990] 提出 扩展目前的路由协议来支持多播。 9.13节中的 [Perlman 1992]讨论了广域网多播的一些问题。

[Casnerand Deering 1992] 介绍了使用多播和一个称为 MBONE(多播主干)的虚拟网络 在整个 Internet上传送IETF会议的情况。

习题

 

13.1   我们知道主机通过设置随机时延来调度IGMP的发送。一个局域网中的主机采取什么措施才能避免两台主机产生相同的随机时延?

13.2   在[Casner and Deering 1992]中,他们提到UDP缺少两个通过MBONE传送音频采样数据 的条件:分组失序检测和分组重复检测。你怎样在 UDP上增加这些功能?

TCP/IP详解--第十三章相关推荐

  1. TCP/IP详解--第十七章

     第17章 TCP:传输控制协议 17.1    引言   本章将介绍 TCP为应用层提供的服务,以及 TCP首部中的各个字段.随后的几章我们在了 解TCP的工作过程中将对这些字段作详细介绍. 对TC ...

  2. TCP/IP详解--第五章

    第5章 RARP:逆地址解析协议 5.1   引言   具有本地磁盘的系统引导时,一般是从磁盘上的配置文件中读取  I P地址.但是无盘机, 如X终端或无盘工作站,则需要采用其他方法来获得 IP地址. ...

  3. TCP/IP详解--第三章

    第3章 IP:网际协议 3.1    引言 IP是TCP/IP协议族中最为核心的协议.所有的 TCP.UDP.ICMP及IGMP数据都以 IP数据 报格式传输(见图 1-4).许多刚开始接触 TCP/ ...

  4. TCP/IP详解--第十一章

     第11章 UDP:用户数据报协议 11.1  引言   UDP是一个简单的面向数据报的运输层协议:进程的每个输出操作都正好产生一个  UDP .   数据报,并组装成一份待发送的  I P 数据报 ...

  5. TCP/IP详解--第七章

    第7章 Ping程序 7.1   引言   "ping"这个名字源于声纳定位操作.Ping程序由MikeMuuss 编写,目的是为了测试另一 台主机是否可达.该程序发送一份 IC ...

  6. TCP/IP详解--第四章

    第4章 ARP:地址解析协议 4.1   引言 本章我们要讨论的问题是只对 TCP/IP协议簇有意义的 IP 地址.数据链路如以太网或令牌 环网都有自己的寻址机制(常常为 48 bit 地址),这是使 ...

  7. TCP/IP详解笔记----第一章:概述

    第一章 概述 这一章主要介绍了TCP/IP的概貌.包括分层.网络地址.客户-服务器模型.常见知名应用层服务端口号等等.需要重点掌握和了解的是以下知识点. 1.TCP/IP的重要作用: 很多不同厂商生产 ...

  8. TCP/IP详解第一卷第一章重点摘要

    一.协议族 一系列相关协议的集合称为协议族 指定一个协议族中的各种协议之间的相互关系并划分需要完成的任务设计,称为协议族的体系结构或参考模型 二.TCP/IP TCP/IP是一个开放的系统,协议族定义 ...

  9. TCP/IP详解 第七章 防火墙和网络地址转换(1)

    一.引言 1.Internet和协议发展初期,仅用于大学和科研机构.处于没人攻击状态. 2.20世纪80.90年代,成功的攻击成了家常便饭.为了解决这个问题,引入了防火墙. Ø 了解防火墙 l 用一种 ...

最新文章

  1. python3图形界面简单案例(tkinter)
  2. nginx添加对web status及status的每一项含义
  3. 首个由国内发起的分布式消息领域的国际标准OpenMessaging一周年回顾
  4. 2019-1-15 课后作业
  5. 【转】Android 音量键+电源键 截屏代码小结
  6. [高效时间管理]复盘篇
  7. C语言之*和++、--连用时的结合性探究
  8. java中的垃圾收集器_Java中的垃圾收集
  9. 【3Dtiles】3Dmax模型处理为gltf和3dtiles,包含LOD效果
  10. Vue 最黑暗的一天
  11. html小游戏打砖块,打砖块.html
  12. 随笔记之lombok
  13. 短信网关测试 soap
  14. 何一凡2021年北京高考成绩查询,北京市2021年第一次高中学考成绩查询时间:分数什么时候出...
  15. B站马士兵python入门基础版详细笔记(4)
  16. 网络基础-IP、端口等
  17. # 智慧社区管理系统-核心业务管理-01车位收费
  18. linux批量重命名后缀名,Linux 批量重命名文件的方法
  19. linux安装matlab2016,ubuntu16.04 安装matlab2016b教程
  20. Qt画图之五子棋象棋围棋坐标轴等棋盘棋子程序案例解析

热门文章

  1. angularjs1-1
  2. 翻译-Salt与Ansible全方位比较
  3. linux下IO口模拟I2C的一些总结
  4. mvc UrlHelper
  5. 云安全能否给企业带来真正的安全?
  6. SVN 版本服务器搭配全过程详解(含服务端、客户端)
  7. C++在构造函数中调用构造函数
  8. salt-api https证书报错解决方法
  9. Entity Framework返回IEnumerable还是IQueryable?
  10. iOS 有用的代码片段