TCP/IP协议详解卷一:Chapter13 笔记

Chapter 13 IGMP:Internet组管理协议

上一章概述了IP多播,给出并介绍了D类IP地址到以太网地址的映射方式。本章将介绍用于支持主机和路由器进行多播的Internet组管理协议( Internet Group Management Protocol, IGMP)。它让一个物理网络上的所有系统知道主机当前所在的多播组。多播路由器需要这些信息以便知道多播数据报应该向哪些接口转发。

正如Internet控制报文协议(ICMP)一样, IGMP也被当作IP层的一部分。IGMP报文通过IP数据报进行传输。IGMP有固定的报文长度,没有可选数据。IGMP报文通过IP首部中协议字段值为2来指明。

封装IGMP报文的IP数据报 = 20字节IP首部 + 8字节IGMP报文

13.2 IGMP报文

8字节IGMP报文 = 4位IGMP版本(=1)+ 4位IGMP类型(1~2)+ 8位未用 + 16位检验和 + 32位组地址(D类IP地址)

IGMP类型为1说明是由多播路由器发出的查询报文,为2说明是主机发出的报告报文。检验和的计算和ICMP协议相同。组地址为D类IP地址。在查询报文中组地址设置为0,在报告报文中组地址为要参加的组地址。

13.3 IGMP协议

13.3.1 加入一个多播组

多播的基础就是一个进程的概念(操作系统执行的一个程序),该进程在一个主机的给定接口上加入了一个多播组。在一个给定接口上的多播组中的成员是动态的 — 它随时因进程加入和离开多播组而变化。使用限定词“接口”是因为多播组中的成员是与接口相关联的。一个进程可以在多个接口上加入同一多播组。

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

13.3.2 IGMP报告和查询

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

  1. 当第一个进程加入一个组时,主机就发送一个IGMP报告。如果一个主机的多个进程加入同一组,只发送一个IGMP报告。这个报告被发送到进程加入组所在的同一接口上。
  2. 进程离开一个组时,主机不发送IGMP报告,即便是组中的最后一个进程离开。主机知道在确定的组中已不再有组成员后,在随后收到的IGMP查询中就不再发送报告报文。
  3. 多播路由器定时发送IGMP查询来了解是否还有任何主机包含有属于多播组的进程。多播路由器必须向每个接口发送一个IGMP查询。因为路由器希望主机对它加入的每个多播组均发回一个报告,因此IGMP查询报文中的组地址被设置为0。
  4. 主机通过发送IGMP报告来响应一个IGMP查询,对每个至少还包含一个进程的组均要发回IGMP报告。

使用这些查询和报告报文,多播路由器对每个接口保持一个表,表中记录接口上至少还包含一个主机的多播组。当路由器收到要转发的多播数据报时,它只将该数据报转发到(使用相应的多播链路层地址)还拥有属于那个组主机的接口上。
TCP/IP协议详解卷一:Chapter13 笔记
上图显示了两个IGMP报文,一个是主机发送的报告,另一个是路由器发送的查询。该路由器正在要求那个接口上的每个主机说明它加入的每个多播组。

13.3.3 实现细节

当一个主机首次发送IGMP报告(当第一个进程加入一个多播组)时,并不保证该报告被可靠接收(因为使用的是IP交付服务)。下一个报告将在间隔一段时间后发送。这个时间间隔由主机在0~10秒的范围内随机选择。

当一个主机收到一个从路由器发出的查询后,并不立即响应,而是经过一定的时间间隔后才发出一些响应(该主机必须对它参加的每个组均发送一个响应)。既然参加同一多播组的多个主机均能发送一个报告,可将它们的发送间隔设置为随机时延。

在一个物理网络中的所有主机将收到同组其他主机发送的所有报告。这意味着如果一个主机在等待发送报告的过程中,却收到了发自其他主机的相同报告,则该主机的响应就可以不必发送了。因为多播路由器并不关心有多少主机属于该组,而只关心该组是否还至少拥有一个主机

13.3.4 生存时间字段

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

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

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

从224.0.0.0到224.0.0.255的特殊地址空间是打算用于多播范围不超过1跳的应用。不管TTL值是多少,多播路由器均不转发目的地址为这些地址中的任何一个地址的数据报。

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

13.4 一个例子

采用一个经过修改的netstat命令来报告每个接口上的多播组成员情况。在下面的输出中,用黑体表示有关的多播组。-a参数将显示所有配置的接口。
TCP/IP协议详解卷一:Chapter13 笔记输出结果中的第2行le0(以太网)显示了这个接口属于主机224.0.0.1(“所有主机”),和两行地址,后一行显示相应的以太网地址为:01:00:5e:00:00:01。我们还看到其他两个支持多播的接口:SLIP接口sl0和环回接口lo0,它们也属于所有主机组。

下面的IP路由表中黑体表项显示了所有传往224.0.0.0的数据报均被送往以太网:
TCP/IP协议详解卷一:Chapter13 笔记在以太网接口( 140.252.13.33)上加入多播组224.1.2.3。执行netstat程序看到内核已加入这个组,并得到期望的以太网地址。
TCP/IP协议详解卷一:Chapter13 笔记下图显示了tcpdump对进程加入这个多播组的跟踪过程。
TCP/IP协议详解卷一:Chapter13 笔记当主机加入多播组时产生第1行的输出显示。第2行是经过时延后的IGMP报告,13.3.3节介绍过报告重发的时延是10秒内的随机时延。