本文主要是介绍IP Multicast: IGMPv2,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
IGMP是主机和路由器之间的组管理协议,对于组播应用程序来讲这个应该是很重要的。我的理解是对于Receiver主机,组管理协议是必需的,毕竟是决定自己收不收组播数据流;但是对Source主机来讲,如果它是只发而不收任何组播数据,就不需要IGMP了。
先说一下实验拓扑:
跟上次一样http://blog.sina.com.cn/s/blog_4b5039210102e0vy.html
1.对于主机
运行IGMPv2的主机主要使用下列三种类型的消息,不过我只见过第一种和第三种(启动receiver程序并在receiver1端抓包)
(1) membership report
(2) version 1 membership report
(3) Leave group
IGMPv2 membership report的包结构:
IP层注意几个地方(1)TTL=1;(2)protocol number = 2;(3)destination 为此组播目的地址224.1.1.1
IGMPv2的报文结构很简单。
version:2
Type: 0x16 代表是version 2 Membership Report;0x17是Leave Group;0x11 Membership Query;0x12 version
Max Response Time:最大响应时间,对membership query有效。
Header Checksum:校验
Multicast Address:组播地址,此处表示想要接收224.1.1.1的组播数据包。
IGMPv2 Leave Group包结构:
python的组播程序关闭,产生离开消息。
2. 对于路由器
路由器发送的IGMPv2主要是查询消息,包括
(1) General Query 常规查询
(2) Group-Specific Query 特定组查询
General Query包结构:
General Query的作用和IGMP v1中queries的作用是一样的,当路由器发送General Query查询主机时,使用目的地址为224.0.0.1,当有主机回复时,便认为网络中存在组成员,则将组播发送到该网络,并且General Query每一分钟发送一次,主机每次都回复,如果连续三个General Query没有回复,那么路由器便认为网络中的组成员已经离开,也就停止向网络中发送组播数据了。
和Report不同的几点:
(1)目的地址是224.0.0.1 代表本子网内所有主机,即向所有主机询问是否有要加入组播组的;
(2)每隔一段时间会轮询一次,默认是60秒,路由器可配置修改此时间;
Group-Specific Query 的包结构:
在IGMP v2中,当网络中的组成员离开之后,会向路由器发送Leave Group来通告自己的离开,而只有向路由器发送过Membership Report的组成员离开时才需要发送Leave Group,其它组员离开时,也是没有任何动作的,因此当网络中的组成员离开后,路由器并不知道网络中是否还有其它组员,因为其它组员没有通告过自己的存在。所以如果路由器马上停止向子网转发组播的话,可能会造成某些还存在的组员无法接收组播。最终当路由器收到组成员离开时发来的Leave Group后,并不能马上停止组播的转发,还要向网络中发送Group-Specific Query,目的地址为组的地址,用来查询网络中是否还有别的组员存在,如果有组员回复了,那么组播流就不会中断。为了防止包丢失而误认为没有组员,路由器每1秒分别发两个Group-Specific Query。
组成员机制就先写这么多。
这篇关于IP Multicast: IGMPv2的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!