TCP/IP详解 卷1:协议 学习笔记 第十三章 IGMP:Internet组管理协议
IGMP让多播路由器知道相连网络上所有接口上的多播组,多播路由器就能知道多播数据报应向哪些接口转发。
IGMP与ICMP一样,被当作IP层的一部分,IGMP报文通过IP数据报传输,IGMP报文通过IP首部中协议字段值为2来指明。IGMP报文长度固定,没有可选数据:
以上是IGMP版本为1的格式,类型字段为1说明是由多播路由器发出的查询报文,为2说明是主机发出的报告报文。组地址字段在查询报文中设为0,报告报文中组地址为发送报告的主机加入的组地址(接口上每有一个关联的多播组就发一个报告报文)。
一个主机上的某个进程可以在给定接口上加入一个多播组。在一个给定接口上的某个多播组中的成员是动态的,它随时因进程加入和离开该多播组而变化。
主机通过组地址和接口来识别一个多播组。主机必须保留一个表,其中存放至少含有一个进程的多播组及其中的进程数量。
多播路由器使用IGMP报文来知道与该路由器相连网络中组成员的变化情况,规则如下:
1.当第一个进程加入一个组时,主机就发送一个IGMP报告,如果一个主机上多个进程加入同一组,只发送一个IGMP报告。这个报告发送到进程加入的组所关联的接口上。
2.进程离开一个组时,主机不发送报告,当主机上最后一个进程离开该组,在随后收到的IGMP查询中不再发送报告报文。
3.多播路由器定期发送IGMP查询报文来了解主机上是否有加入多播组的进程。多播路由器必须向每个接口发送一个IGMP查询。
4.主机收到IGMP查询时,对每个包含进程的多播组都发回一个IGMP报告。
多播路由器对每个接口维护一个表,表中记录该接口上至少还包含一个进程的多播组。
主机发送IGMP报告时,不保证该报告被可靠接收(因为使用的是IP协议),下一个报告间隔时间由主机在0~10秒范围内随机选择。
当主机收到一个路由器的IGMP查询后,并不立即响应,而是经过一定时间间隔再发送一些响应(主机必须对它参加的每个组发送一个响应)。一个物理网络中的所有主机都将收到同组其他主机发送的报告,因为如上图,目的地址是组地址,这意味着一个主机如果收到了其他主机的相同报告,则该主机的响应就不必发送了,因为路由器将该多播报文发送到此物理网络中时,该主机也能收到。
在没有任何多播路由器的单个网络中,仅有的IGMP通信量是在主机加入一个新的多播组时,支持IP多播的主机发送的报告。
上图中,IP首部中的TTL字段值被设为1,一个初始TTL值为0的多播数据报将被限制在同一主机,默认,待传多播数据报的TTL被设为1,这将使多播数据报仅局限在同一子网内传送,更大的TTL值能被多播路由器转发。
对一个发往多播地址的数据报不会产生ICMP差错报文(当TTL为0时,多播路由器也不产生ICMP超时差错)。
一般用户进程不关心传出数据报的TTL,但一些进程,如Traceroute需要使用TTL值,编程API要为进程提供设置TTL的能力。
通过增加TTL,应用可实现对一个特定服务器的扩展环搜索,第一个多播数据报以TTL等于1发送,如果没有响应,就尝试增加TTL,这样应用能找到以跳数度量的最近服务器。
从224.0.0.0到224.0.0.225的特殊地址是打算用于多播范围不超过1跳的应用,不管TTL的值为多少,多播路由器都不转发目的地址为这些地址中任何一个地址的数据报。
上图中,路由器的IGMP查询报文被送到的目的IP地址为224.0.0.1,该地址被称为所有主机组地址,它表示一个物理网络中的所有具备多播能力的主机和路由器,当接口初始化后,所有具备多播能力的接口上的主机均自动加入这个多播组。这个组的成员无需发送IGMP报告。
在支持多播的主机sun上采用经过修改的netstat命令报告每个接口上的多播组成员情况,黑体表示有关的多播组:
netstat命令的-n选项以数字形式显示IP地址(而不是按名字来显示它们),-i选项显示接口的统计结果,-a选项显示所有配置的接口。
上图显示,le0(以太网)接口属于主机组224.0.0.1(所有主机组地址),并且相应以太网地址为01:00:5e:00:00:01,是组地址映射的结果。SLIP接口sl0和回送接口lo0也都支持多播,且属于所有主机组。
查看sun主机上的路由表:
可见所有传往224.0.0.0的数据报均被送往以太网接口le0。
令主机sun的以太网接口140.252.13.33加入多播组224.1.2.3,再查看多播组信息:
可见该接口已加入这个组(且其他接口没有加入),并得到了期望的以太网地址。以下是加入这个多播组时的tcpdump的输出:
第一行是主机加入多播组时产生的IGMP报告报文,第二行是防止第一个报文丢失而发送的相同IGMP报告报文,两者间隔6秒多,这是主机在0~10秒内随机选择的时间间隔。
两行中的目的IP地址都是多播组地址。
先将sun主机上以太网接口le0接口加入另一个多播组224.9.9.9,然后启动sun主机上的多播选路的守护程序,观察所交换的IGMP查询和报告报文,此时运行tcpdump:
当选路守护程序启动时,输出第一行,它发出一个已经加入了组224.0.0.4的报告。多播地址224.0.0.4是一个知名地址,当前用于多播选路的距离向量多播选路协议DVMRP(Distance Vector Multicast Routing Protocol)。
在该守护程序启动时,它也在第二行发送了一个IGMP查询报文,查询的目的IP是IP地址为224.0.0.1(所有主机组)。
第一个报告(第3行)大约5秒后收到(sun上的报告,报告给本机sun上的选路守护程序),报告给组224.9.9.9,这是下一个查询发出前收到的唯一报告。当守护程序启动后,两次查询(第2行和第4行)相隔的时间很短,原因是守护程序需要将其多播路由表尽快建立起来。
第5、6、7行sun主机针对它所属的每个组发出一个报告,其中除了224.0.0.4外的两个组是主动加入的。只要选路守护程序还在运行,它就始终要属于组224.0.0.4。
下一个查询位于第8行,大约在前一个查询的2分钟后发出,它再次引发出我们期望的报告,这些报告的顺序与前面不同,因为接收到查询到发送报告的时间是随机的。
最后一个查询大约在前一个查询的2分钟后发出,我们再次得到了期望的响应。
主机收到IGMP查询报文后,到发送IGMP报告时的时间是随机的,一个局域网内的主机可使用基于IP或以太网地址的随机时间,因为每个主机的值都不同,可避免两台主机产生相同的随机时延。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧
· 园子的第一款AI主题卫衣上架——"HELLO! HOW CAN I ASSIST YOU TODAY
· 【自荐】一款简洁、开源的在线白板工具 Drawnix
2020-04-02 剑指offer 学习笔记 在排序数组中查找数字