IGMP

本文介绍了IGMP(Internet Group Management Protocol)互联网组管理协议的基本概念及其工作过程。IGMP主要用于实现多播数据包的有效分发,当主机加入多播组时会发送成员报告,并通过周期性的查询来维护成员状态。
IGMP (Internet Group Manage Protocol): Internet组管理协议 ,提供internet网际多点传送的功能,即将一个ip包拷贝给多个host。
 
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
 
几个主要函数:
void ip_mc_dec_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 igmp_rcv(struct sk_buff *);
IGMPv3 中定义了两种报文类型:**Membership Query(成员查询)** 和 **Membership Report(成员报告)**。它们的结构相比 IGMPv2 更加复杂,支持源地址过滤功能,以适应 SSM(源特定组播)模型。 --- ### 1. **Membership Query 报文结构** ```plaintext 0 1 2 3 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | 类型(0x11) | 最大响应时间 | 校验和 | +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | 组地址 | +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ |S| QRV | 查询间隔 | 源数量(N) | +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | 源地址列表 (可变长) | | ... | +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ ``` #### 关键字段说明: - **类型(Type)**:固定为 `0x11`,表示这是查询报文。 - **最大响应时间(Max Response Time)**:主机响应的随机延迟上限(单位为 1/10 秒)。 - **校验和(Checksum)**:用于校验报文完整性。 - **组地址(Group Address)**:查询的组播地址,若为 0 则表示普遍查询。 - **S 标志(Suppress Router-Side Processing)**:用于抑制路由器处理。 - **QRV(Query Robustness Variable)**:查询鲁棒性变量,防止丢包影响。 - **查询间隔(Query Interval)**:路由器发送查询的间隔时间。 - **源数量(Number of Sources)**:表示源地址列表中的源数量。 - **源地址列表(Source Addresses)**:可选字段,列出查询感兴趣的源地址。 --- ### 2. **Membership Report 报文结构** ```plaintext 0 1 2 3 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | 类型(0x22) | 保留 | 校验和 | +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | 组记录数量 (N) | +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | 组记录 1 | | ... | +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | 组记录 N | +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ ``` 每条 **组记录(Group Record)** 的结构如下: ```plaintext +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | 记录类型 | 辅助字段 | 源数量(N) | +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | 组播地址 | +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | 源地址 1 | +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | 源地址 2 | +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | ... | +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ ``` #### 关键字段说明: - **类型(Type)**:固定为 `0x22`,表示 IGMPv3 的成员报告。 - **组记录数量(Number of Group Records)**:表示报告中包含的组记录数量。 - **记录类型(Record Type)**:定义操作类型,如 `MODE_IS_INCLUDE`、`MODE_IS_EXCLUDE`、`CHANGE_TO_INCLUDE` 等。 - **组播地址(Multicast Address)**:表示该记录涉及的组播组地址。 - **源数量(Number of Sources)**:表示该组记录中包含的源地址数量。 - **源地址列表(Source Addresses)**:表示感兴趣的源地址集合。 --- ### 结构对比可视化 | 字段名称 | Membership Query | Membership Report | |--------------------|------------------|-------------------| | 类型字段值 | 0x11 | 0x22 | | 是否包含组记录 | 否 | 是 | | 是否包含源地址列表 | 是 | 是(每组记录) | | 是否有最大响应时间 | 是 | 否 | | 是否有查询间隔字段 | 是 | 否 | ---
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值