《TCP/IP详解卷2:实现》笔记--IGMP:Internet组管理协议

IGMP在本地网络上的主机和路由器之间传达组成员信息,路由器定时向所有主机组多播IGMP查询。主机多播IGMP报告报文

以响应查询。

从体系结构的观点来看,IGMP是位于IP上面的运输层协议。它有一个协议号(2),它的报文是由IP数据报承载的。与ICMP

一样,进程通常不直接访问IGMP,但进程可以通过IGMP插口发送和接受IGMP报文。这个特性使得能够把多播选路守护程序

作为用户级进程实现。

下图是Net/3中IGMP协议的整体结构:


到达的IGMP查询使igmp_input为每个in_multi结构初始化一个递减定时器,该定时器由igmp_fastimo更新,当每个定时器

超时时,igmp_fasttimo调用igmp_sendreport。

当我们创建一个新的in_multi结构时,ip_setmoptions调用igmp_joingroup。igmp_joingroup调用igmp_sendreport来发布

新的组成员信息,使组的定时器能够在短时间内安排第二次通告。igmp_sendreport完成对igmp报文的格式化,并把它传给

ip_output。


1.igmp结构

igmp报文只有8个字节长,结构如下:


igmp_type包含一个4bit的版本码和一个4bit的类型码,如下图所示:


igmp报文构造如下:


Net/3只使用版本1的报文,多播路由器发送1类报文向本地网络上所有主机请求成员关系报告。对1类IGMP报文的响应是

主机的一个2类报文,报告它们的多播成员信息。3类报文在路由器之间传输多播选路信息,主机不处理3类报文。


2.IGMP_protosw的结构

IGMP的protosw结构如下:


三种时间触发IGMP处理:

一个本地接口加入一个新的多播组。

某个IGMP定时器超时。

收到一个IGMP查询。

还有两种事件也触发本地IGMP处理,但结果不发送任何报文:

收到一个IGMP报告。

某个本地接口离开一个多播组。


3.加入一个组:igmp_joingroup函数

当一个新的in_multi结构被创建时,in_addmulti调用igmp_joingroup。然后加入同一多播组的请求只增加in_multi结构的

引用次数,不调用igmp_joingroup。

函数的大概处理如下:

如果新的组时所有主机组,或成员关系请求时环回接口的,则不需要定时器,函数返回。因为每个多播主机都是所有组播组

的成员,不需要进行报告。没必要向环回接口发送组成员报告,因为本地主机是在回路网络上的唯一系统,它已经知道它的

成员状态了。

在其他情况下,新组的报告被立即发送(通过igmp_sendreport函数),并根据组的情况为组定时器选择一个随机值。

igmp_fastimo检查这个变量,避免不必要的处理。当新组的定时器超时时,就发布第2次成员关系报告。


4.igmp_fasttimo函数

igmp_fasttimo函数循环找到各个in_multi结构,对每个结构:

如果定时器为0,什么都不做。

如果定时器不是0,则将其递减。如果到达0,则发送一个IGMP组成员关系报告。


5.igmp_sendreport函数

igmp_sendreport函数为一个多播组构造和发送IGMP报告报文。

通过创建一个mbuf,然后设定相应的值,最后构造一个ip_moptions结构,并将它与报文一起传给ip_output。

进程级的多播路由器必须监听成员关系报告,当系统被配置成多播路由器时,总是接收IGMP数据报。通过传输层程序把

报文传给IGMP的igmp_input和pr_input函数。


6.输入处理:igmp_input函数

多播路由器接收所有的IGMP报文,但是多播主机只接收那些到达接收是目的多播组成员的IGMP报文(也即,那些接收

它们的接口是组成员的查询和成员管理报告)。

标准协议分用机制把接受的报文传给igmp_input。igmp_input的大概处理如下:

1.验证IGMP报文,包IGMP检验和等方式。

2.根据igmp_type内的代码处理报文,igmp_type包含一个版本码和一个类型码,根据这两个码分别进行处理。

3.把有效的IGMP报文传给rip_input,在rip_input里被提交给所有监听IGMP报文的进程。


6.1.成员关系查询:IGMP_HOST_MEMBERSHIP_QUERY

RFC1075推荐多播路由器每120秒至少发布一次IGMP成员关系查询。把查询发给224.0.0.1组(所有主机组)。

对于该igmp_type的处理如下:

接收查询报文并不会立即引起IGMP成员报告。相反,igmp_input为与接收查询的接口相关的各个组定时器设置一个随机的值,

当某组的定时器超时,则igmp_fasttimo发送一个成员关系报告,与此同时,其他所有查询的主机也进行同一动作。一旦某个

主机上的某个特定组的随机定时器超时,就像该组多播一个报告。这个报告将取消其他主机上的定时器,保证只有一个报告在

网络上多播。路由器与其他组成员一样,接收该报告。这个情况的一个例外就是所有主机组,这个组不设定定时器,也不发送

报告。


6.2.成员关系报告:IGMP_HOST_MEMEBER_REPORT

对于该igmp_type的处理如下:

发送到环回接口上的报告被丢弃。

如果源地址的网络或者子网部分为0(如果主机正在启动,这是被允许的),则把源地址设成子网地址,那么进程级的多播路由

守护进程能够知道它是从哪个子网过来的。


7.离开一个组:igmp_leavegroup函数

当in_multi结构中的引用计数器跳到0时,in_delmulti调用igmp_leavegroup。该函数不采取任何动作。

  • 1
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
TCP/IP详解·2:实现》完整而详细地介绍了TCP/IP协议是如何实现的。书中给出了约500个图例,15000行实际操作的C代码,采用举例教学的方法帮助你掌握TCP/IP实现。《TCP/IP详解·2:实现》不仅说明了插口API和协议族的关系以及主机实现与路由器实现的差别。还介绍了4.4BSD-Lite版的新的特点。《TCP/IP详解·2:实现》适用于希望理解TCP/IP协议如何实现的人,包括编写网络应用程序的程序员以及利用TCP/IP维护计算机网络的系统管理员。 目录 · · · · · · 第一章 概述 1.1 引言 1.2 源代码表示 1.3 历史 1.4 应用编程接口 1.5 程序示例 1.6 系统调用和库函数 1.7 描述符 1.8 网络实现概述 1.9 mbuf与输出处理 1.10 输入处理 1.11 网络实现概述 1.12 中断级别与并发 1.13 源代码织 1.14 测试网络 1.15 小结 第二章 mduf:存储器缓存 2.1 引言 2.2 代码介绍 2.3 mduf的定义 2.4 mduf结构 2.5 简单的mduf宏和函数 2.6 m_devget和m_pullup函数 2.7 mduf宏和函数的小结 2.8 Net/3联网数据结构小结 2.9 m_copy和簇引用记数 2.10 其他选择 2.11 小结 第三章 接口层 3.1 引言 3.2 代码介绍 3.3 ifnet结构 3.4 ifaddr结构 3.5 sockaddr结构 3.6 ifnet与ifaddr的专用化 3.7 网络初始化概述 3.8 以太网初始化 3.9 SLIP初始化 3.10 环回初始化 3.11 if_attach函数 3.12 ifinit函数 3.13 小结 第四章 接口:以太网 4.1 引言 4.2 代码介绍 4.3 以太网接口 4.4 ioctl系统调用 4.5 小结 第五章 接口:SLIP和环回 5.1 引言 5.2 代码介绍 5.3 SLIP接口 5.4 环回接口 5.5 小结 第六章 IP编址 6.1 引言 6.2 代码介绍 6.3 接口和地址小结 6.4 sockaddr_in结构 6.5 in_ifaddr结构 6.6 地址指派 6.7 接口ioctl处理 6.8 internet实用函数 6.9 ifnet实用函数 6.10 小结 第七章 域和协议 7.1 引言 7.2 代码介绍 7.3 domain结构 7.4 protosw结构 7.5 IP的domain和protosw结构 7.6 pffindproto和pffindtype函数 7.7 pfctlinput函数 7.8 IP初始化 7.9 sysctl系统调用 7.10 小结 第八章 IP:网际协议 8.1 引言 8.2 代码介绍 8.3 IP 8.4 输入处理:ipintr函数 8.5 转发:ip_forward函数 8.6 输出处理:ip_output函数 8.7 Internet检验和:in_cksum函数 8.8 setsockopt和getsockopt系统调用 8.9 ip_sysctl函数 8.10 小结 第九章 IP选项处理 9.1 引言 9.2 代码介绍 9.3 选项格式 9.4 ip_dooptions函数 9.5 记录路由选项 9.6 源站和记录路由选项 9.7 时间戳选项 9.8 ip_insertoptions函数 9.9 ip_pcbopts函数 9.10 一些限制 9.11 小结 第十章 IP的分片与重装 10.1 引言 10.2 代码介绍 10.3 分片 10.4 ip_optcopy函数 10.5 重装 10.6 ip_optcopy函数 10.7 ip_slowtimo函数 10.8 小结 第十一章 ICMP:Internet控制报文协议 第十二章 IP多播 第十三章 IGMPInternet管理协议 第十四章 IP多播选路 第十五章 插口层 第十六章 插口I/O 第十七章 插口选项 第十八章 Radix树路由表 第十九章 选路请求和选路消息 第二十章 选路接口 第二十一章 ARP:地址解析协议 第二十二章 协议控制块 第二十三章 UDP:用户数据报协议 第二十四章 TCP:传输控制协议 第二十五章 TCP的定时器 第二十六章 TCP输出 第二十七章 TCP函数 第二十八章 TCP的输入 第二十九章 TCP的输入(续) 第三十章 TCP的用户需求 第三十一章 BPF:BSD分过滤程序 第三十二章 原始IP 结束语 附录A 部分习题的解答 附录B 源代码的获取 附录C RFC 1122的有关内容 参考文献

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值