首先我们知道D类地址作为多播地址,对于单纯的子网内部多播,并不要求路由器进行转发,但一旦涉及到主机和路由器同时进行多播通信时,就需要用到IGMP协议,他可以让一个物理网络上的所有系统知道主机目前所在的多播组,很显然多播路由器(支持多播的路由器)需要这些信息以便知道它的多播数据包应该发往那个接口。
IGMP作为网络层的一种协议,在IP首部的字段被设置为2。报文格式如下
4位IGMP版本号 | 4位IGMP类型 | 8位未用 | 16为检验和 |
32为组播地址 |
版本号常用的为1时表示是多播路由器发出的查询报文,为2表示主机发出的报告报文。
其次,多播的基础可视为一个进程,该进程在一个主机的给定接口加入一个多播组,但这些多播组中的成员都是动态的,可以随时离开和加入进来。前提是保证组内必须只有有一个成员,否则该多播组就会被取消。
当然,由于多播路由器使用IGMP报文来记录与该路由器相连的网络组成员的变化,就存在一个相应的规则。
1)当第一个进程加入组时,主机要发送一个IGMP报告,如果主机的多个进程加入同一个组,那么只需要发送一个报告即可。
2)当进程离开一个组时,主机不发送IGMP报告,即便是最后一个进程离开也不发送,但这样只要主机再收到路由器发送来的IGMP查询报文,不再作出回应就行。
3)多播路由器要定时发送IGMP查询报文来确定组中是否还有主机,因此必须向每一个接口发送IGMP查询报文,因此其组地址未设置为0.
4)正如所说主机通过发送IGMP报告来响应一个IGMP查询,对每一个至少还包含一个进程的组均要发回IGMP报告。否则路由器就会认为改组已经不存在成员而撤销。
通过使用这些规则和报文,多播路由器对每个接口保持一个表,表中记录接口上至少还包含一个主机的多播组。
另外IGMP报告和查询同样具有TTL生存时间,比如一个TTL为0的多播数据报将被限制在同一主机,默认情况下TTL设置为1也就是只允许在同一个子网内。显然当TTL大于2时多播数据包将会有多播路由器转发。
值得注意的是,从224.0.0.0到224.0.0.255的特殊地址空间,是用于多播范围不超过一跳的应用,不管其TTL值为多少,多播路由器均不会转发。
总结,多播是一种将报文发往多个接受者的通信方式,在许多应用中他比广播更为好用,因为它降低了不参与通信主机的负担。