IGMP协议
多播一节说到当跨越多个物理网络时,需要通过路由器转发多播数据报,IGMP协议可以让物理网络上所有系统知道主机当前所在的多播组。多播路由器需要这些信息以便知道向哪个接口转发。
类ICMP,IGMP也被当做IP层一部分,通过IP数据报进行传输。但是IGMP数据报有固定长度,没有可选数据。
这是个版本为1的IGMP报文格式。IGMP类型为1说明是由多播路由器发出的查询报文,为2说明是主机发出的报告报文。校验和的计算和ICMP一样。组地址为D类IP地址,在查询报文中组地址设置为0,在报告报文中组地址为要加入的组地址。
IGMP报告和查询
多播路由器使用IGMP报文来记录与该路由器相连网络中组成员的变化情况。规则如下:
- 当第一个进程加入一个组时,主机就发送一个IGMP报告。如果一个主机的多个进程加入同一组,只发送一个IGMP报告。这个报告被发送到进程加入组所在的同一接口上。
- 进程离开一个组时,主机不发送IGMP报告,即便是组中最后一个进程离开。主机知道在确定的组中已不再有组成员后,在随后收到的IGMP查询中就不在发送报告报文。
- 多播路由器定时发送IGMP查询报文来了解是否还有任何主机包含属于多播组的进程。多播路由器必须想每个接口发送一个IGMP查询。因为路由器希望主机对它加入的每个多播组均发回一个报告,因此IGMP查询报文中的组地址被设置为0。
- 主机通过发送IGMP报告来响应一个IGMP查询,对每个至少还包含一个进程的组均发回一个报告。
使用这些查询和报告报文,多播路由器对每个接口维护一个表,表中记录接口上至少还包含一个主机的多播组。当路由器收到要转发的多播数据报时,它只将该数据报转发到(使用相应的多播链路层地址)还拥有属于哪个组主机的接口上。
上图显示了两个IGMP报文,一个是主机发送的报告,另一个是路由器发送的查询。目的IP地址224.0.0.1是一个知名组播地址,类似知名端口号,用于一些指定服务,该地址被称为所有主机组地址。它涉及在一个物理网络中的所有具备多播能力的主机和路由器。当接口初始化时后,所有具备多播能力接口上的主机均自动加入这个多播组。这个组的成员无需发送IGMP报告。
查询和报告报文都将IP首部中的生存时间字段TTL设置为1。一个初始TTL为0的多播数据报将被限制在同一主机。在默认情况下,待传多播数据报的TTL被设置为1,这将使得多播数据报局限在同一子网内传送。更大的TTL值能被多播路由器转发。
对发往一个多播地址的数据报从不会产生ICMP差错,当TTL为0时,多播路由器也不会产生ICMP超时差错。
特殊地址空间224.0.0.0到224.0.0.255被打算用作多播范围不超过1跳的应用,不管TTL多少,路由器都不会转发发往这些多播地址的数据报。
参考
[1] TCP/IP详解卷1