IGMP报文长度8byte,附带之前的IP头20byte总共是个8字节长.
一台主机上只要还有包含至少一个进程的多播组,就需要对多播路由器下发的查询报文发送报告报文.
如果一台主机上已经没有了多播组,则下次多播路由器下发查询报文的时候就不发报告报文就可以了.
多播路由器搜集了所有接口上的所有主机发送过来的报告报文,就知道自己下辖的主机们当前还在加入着哪些多播组,这样多播路由器便可以向它的上级进行报告了.
主机在报告的时候对每一个至少还含有一个进程的多播组都要发送一个报告,报告报文中IGMP后四个Byte正是这个多播组的地址, 但对于查询报文,这里是全零,也就是32个零.
重要)
主机的报告报文中的IP头部,源IP地址就是主机地址,目的IP地址是所报告的组地址,在多播路由器下发的查询报文的IP头部中,源IP地址是多播路由地址,目的地址是个224.0.0.1这个地址是保留多播地址,意思是发往子网内所有的系统组. (224.0.0.2)是发往所有的多播路由器
规则)
当第一个进程加入一个多播组的时候,主机要发送一个报告,这个报告并不能保证一定会被多播路由器收到,所以为了保险期间,过一定时间之后主机会重新发送一个报告,这个时间一般在0-10秒之间.
当多播路由器发起一个查询的时候,因为子网内可能有很多主机都加入同一个多播组,这个时候主机收到了查询报文之后并不急于发送报告报文,而是会后延一个时延,当子网中有一个主机发送应查询的要求发送了一个报告报文之后,因为目的地址是这个要报告的多播组的组地址,那么这个报告报文便可以被子网内所有同在这个多播组的其他主机收到,其他主机看到有人已经报告了这个多播组的存在,便可以不再发送关于这个多播组的报告报文了. 这样便减少了不要要的开销
在一个没有多播路由器的子网中,因为没有人发起查询,自然就不会有应查询而发出的报告报文,但是子网中的主机因为支持多播,所以当有进程在主机上加入了一个新的多播组的时候,主机还是会发出报告报文的,而这便是在没有多播路由器的子网中唯一的IGMP报文流量.
特别的多播组)
224.0.0.1是所有子网内支持多播的主机和路由都要自动加入的一个组,当接口初始化之后便自动加入这个组,这就是为什么抓包能够看到有些设备在启动的时候会自动加入到224.0.0.1这个组的原因,加入的方式是发送一个报告报文,宣称自己加入了这个组,所有在子网内的其他设备支持多播的设备都能收到这个报文,因为这个报文的目的地址是大家都加入的组224.0.0.1
TTL 一般多播报文的TTL 设定为1,这样可以控制多播报文在子网内传递,而不能被多播路由器转发.
有一个特别需要注意的地方就是对于特殊地址范围 224.0.0.0-224.0.0.255 被设定用于TTL 不大于1的应用,所以任何情况下多播路由器不会转发多播地址在这个范围内的多播报文.
没有评论:
发表评论