IGMP
的工作过程如下:
一. 当主机加入一个新的
工作组
时,它发送一个igmp host membership report的报文给全部主机组,宣布此成员关系.本地多点广播路由器接受到这个报文后,向Internet上的其他
多路广播
路由器传播这个关系信息,建立必要的路由.与此同时,在主机的
网络接口
上将ip主机组
地址映射
为
mac地址
,并重新设置地址过滤器.
二. 为了处理动态的成员关系,本地多路广播路由器周期性的
轮询
本地网络上的主机,以便确定在各个主机组有哪些主机,这个轮询过程是通过发送igmp host membership query报文来实现的,这个报文发送给全部主机组,且报文的ttl域设为1,以确保报文不会传送到lan以外.受到报文的主机组成员会发送响应报文.如果所有的主机组成员同时响应的话,就可能造成
网络阻塞
.IGMP协议采用了随机延时的方法来避免这个情况.这样就保证了在同一时刻每个主机组中只有一个成员在发送响应报文。
#ifdef CONFIG_IP_MULTICAST
static const struct net_protocol igmp_protocol = {
.handler = igmp_rcv,
.netns_ok = 1,
};
#endif
static const struct net_protocol igmp_protocol = {
.handler = igmp_rcv,
.netns_ok = 1,
};
#endif
几个主要函数:
void ip_mc_dec_group(struct in_device *in_dev, __be32 addr);
void ip_mc_inc_group(struct in_device *in_dev, __be32 addr);
void ip_mc_inc_group(struct in_device *in_dev, __be32 addr);
int ip_mc_join_group(struct sock *sk, struct ip_mreqn *imr);
int ip_mc_leave_group(struct sock *sk, struct ip_mreqn *imr);
int ip_mc_leave_group(struct sock *sk, struct ip_mreqn *imr);
接受函数
int igmp_rcv(struct sk_buff *);