通过上次实验(iperf测试组播的命令是什么?通过HCL学习一下),我们掌握了在命令行直接测试组播的方法,同时还了解到交换机可以直接转发二层组播报文,无需额外配置。
但是配置中有和接口IP地址相关的命令,那发送或接收组播报文的接口必须有IP地址吗?我们今天来简单验证一下。
首先,我们回顾一下接收者的配置。
iperf -s -u -B 224.2.2.4%eth2 -i 1
其中%eth2表示指定使用的接口为eth2,我们也看到了如果不配置此参数,服务器端是无法接收组播报文的。那接收者的接口IP地址可以不配置吗?
我们移除掉接口的IP地址,但是接口下显示还有一个224.2.2.4/32的IP地址,这个是配置组播之后出现的。为了减少干扰,我们再部署一台Openwrt(HCL中竟然新增了Openwrt服务器,你知道怎么用吗?)。
可以看到,现在接口是没有IP地址的,然后我们开启iperf服务器测试一下。
我们可以看到,接口下没有接收任何组播报文。
然后我们再给接收者配置一个和组播源不在同一网段的IP地址,看看跨网段是否有影响。
现在看接口还是没有接收组播报文。
然后我们再给接收者配置一个和组播源同网段的IP地址。
奇怪了,竟然和组播源能够通信之后还是没有接收组播报文。
再次考虑是命令行和WEB页面的区别,我们切换到WEB页面配置组播(HCL使用Openwrt测试组播的简单操作)。
首先还是删除接口下的IP地址,再启用组播接收者。
神奇的一幕出现了,在WEB页面启用组播接收者功能,竟然直接在接口下增加了一个224.2.2.4/32的IP地址,怀疑就是这个IP地址的影响。我们尝试将这个IP地址删掉看看。
经过对比测试,我们发现当在WEB页面启用组播接收者时,会自动给接口eth2增加一个IP地址,这个地址和组播组的IP地址一致,而且在关闭组播接收者角色时不会移除配置。
接下来,我们给组播组配置一个掩码试一下。
可以看到,接口配置的IP地址确实是配置的组播组的IP地址,如果仅输入了IP地址,那系统就会将其识别为32位的主机IP地址,如果带了具体的掩码长度,则会配置相同的Ip地址和掩码。
回顾一下“组播组”的概念,“组播组”是一个用“IP组播地址”进行标识的接收者集合,主机通过加入某组播组成为该组播组的成员,从而可以接收发往该组播组的组播数据。
所以问题的关键应该是这个IP地址,然后我们再从命令行测试一下。
注意这里的显示,相比于之前的测试,过了加入组播组的提示。在组播中,通常用(*,G)来表示共享树,或者由任意组播源发往组播组G的组播报文。其中的“*”代表任意组播源,“G”代表特定组播组G,此处则对应224.2.2.4。
那如果我们不指定接收者的接口可以吗?再试一下。
结果是可以的,同时我们注意到接入组播组的提示也变了,而且这个提示和/tmp/iperf中的提示也是一致的。
那就说明上次介绍的命令存在误差,WEB页面中配置接口的目的是将配置的组播组IP地址配置到接口上,而不是使用%eth2来指定使用的接口为eth2。
再次确认一下。
又翻车了,手工添加IP地址不能接收组播报文。
保持配置不变,此时再从WEB页面重新配置启用组播接收者也不生效了,应该是检测到了有地址冲突,部分配置下发失败。
再次尝试删除IP地址之后通过WEB页面配置。
现在就可以了,同时发现了接收者加入和离开组播组时的报文交互。
当接口下不存在组播IP地址时,通过在WEB页面启用组播接收者,可以触发终端加入组播组,这个动作是手工配置组播IP地址所不能实现的,所以手工添加IP地址无效。
与此同时,如果我们在终端加入组播组之后,删除掉接口的IP地址,就会触发终端离开组播组,报文如下:
可以看到,当终端加入或离开组播组时,他的报文都是发送到224.0.0.22,这个地址的作用是报告IGMPv3的成员关系,属于静态分配的链路本地作用域范围(224.0.0.0/24)(组播的IP管理范围)。对应的状态变化为别为Change To Exclude Mode(4,加入组播组)和Change To Include Mode(3,离开组播组),具体可以参考RFC3376相关描述。
那组播源的地址可以修改吗?
我们可以看到,在组播源不绑定IP地址的情况下,会查表从默认网卡进行转发,导致组播报文无法进入指定链路;当然,IP地址配置的与网卡IP地址不匹配也无效,会直接提示地址不可达,绑定失败。
结论:
1、在组播的配置过程中,服务端需要通过WEB页面的配置加入到组播组,暂时无法通过命令行手工配置实现加入组播组;
2、组播源的IP地址必须要绑定正确的接口IP地址,如果配置错误,可能会出现绑定失败或者转发路径与期望不符;
3、组播接收者原本的IP地址并不重要,与接收组播报文无关,甚至没有都可以。
声明:文中观点不代表本站立场。本文传送门:https://eyangzhen.com/242402.html