106-多播地址

1. 多播地址

多播地址,类似“QQ群号”,它是 D 类 IP 地址(224.0.0.0~239.255.255.255)。

D 类 IP 地址的首 4 位总是 2 进制 1110 开头,因此,可用的范围就只剩下后 28 位。这 28 位称为 group id——多播组 ID,完整的 32 位称为 group address——组地址

2. 多播地址转换成 mac 地址

2.1 思考

在单播中,我们知道可以使用 arp 协议将查找 ip 地址(A、B、C类 ip 地址)对应的接口 mac 地址(物理网卡地址)。只有目标 mac 地址与自己匹配的单播帧,主机才会接收。

在广播中,因为数据帧要发给链路中的所有主机,约定目标 mac 地址为 ff:ff:ff:ff:ff:ff,链路上的所有主机,都应无条件的接收该广播帧。

那么问题来了,多播介于单播和广播之间,目标 mac 地址该如何约定?看起来似乎是一个挺困难的问题。在这里,你应该稍微停下几分钟的时间思考一下,交给你来办,要怎么做呢?

我们借鉴 QQ 群的思路,它本身就是一种多播手段,只有加入 QQ 群的同学才会收到群消息,没加入 QQ 群的,是收不到消息的。如果某个网卡想接收某个组的消息,也应该加入该组。下面我们加入 230.2.2.2 这个组为例:

网卡显然是不认 IP 地址的,只认 mac 地址。RFC1112 制定了一套规则,将多播 IP 地址按照固定算法计算出一个 mac 地址(这是算出来的,实际上并没有任何网卡的 mac 地址能匹配上)

比如说,多播地址 230.2.2.2,通过固定算法计算出的 mac 地址为 01:00:5e:02:02:02,这样一来,如果网卡已经加入了 230.2.2.2 这个组,一旦遇到到目标 mac 地址为 01:00:5e:02:02:02 的帧后,就直接接收。如果没有加入该组,遇到该帧,直接丢弃。

2.2 多播地址转 mac 地址的算法

计算公式:

// 括号中的计算含义表示取 ip 地址的低 23 位。
macaddr = 01:00:5e:00:00:00 + (ipaddr & 00.7f.ff.ff)
  • 例 1:

多播 ip 地址为 224.128.64.32,先转换为 16 进制,为 e0.80.40.20,然后取低 23 位:

e0.80.40.20 & 00.7f.ff.ff = 00.00.40.20

所以有:

macaddr = 01:00:5e:00:00:00 + 00.00.40.20 = 01:00:5e:00:40:20

  • 例 2:

多播 ip 地址为 224.0.64.32,经过上面的公式计算后,得到的 mac 地址为 01:00:5e:00:40:20,结果和例 1 中的一样。

上面的例子可能会引起一个问题,主机只想接收 224.0.64.32 这个组的消息,但是网卡却收了 224.80.64.32 的帧,怎么办?

对于组播 mac 地址来说,有些网卡使用 hash 算法,计算出 hash 码,如果 hash 码相同,则认为匹配上了。即使不同的 mac 地址,也可能计算出相同的 hash 码。这种问题被称为不完备过滤(imperfect filtering)。还有一些网卡,根本不支持多播过滤,只要有多播帧来了,统统接收,这被称为 多播混杂模式(multicast promiscuous)

如果网卡能完全匹配组播 mac 地址(即 mac 地址和 hash 码是一一对应的关系),则称为完备过滤(perfect filtering)

上面的例子中我们知道,即使网卡实现了完备过滤,仍然需要在 ip 层加入过滤,看是否真的加入了 224.80.64.32 这个组,如果没有,仍然会丢弃该数据报,我们将此称为完备过滤(perfect filtering)

尽管多播 ip 地址与 mac 地址之间的映射存在着这种不足,但是多播仍然比广播好。

  • 例 3:

最后,再来看一个现实中的例子:


这里写图片描述
图1 抓取的多播数据包,观察其目标 mac 地址

3. 特殊的多播 ip 地址

224.0.0.0 ~ 224.0.0.255 之间的地址,称为链路局部的(link local)多播地址。多播路由器从不转发以这些地址为目的地址的数据报。

这些地址中,还有一些是有特殊用途的。例如:

  • 224.0.0.0 基地址(保留)
  • 224.0.0.1 本子网内的所有主机(all-hosts)组。子网上所有具有多播能力的设备(主机、路由器、打印机等)必须在所有具备多播能力的接口上加入该组。
  • 224.0.0.2 本子网内的所有路由器(all-routers)组。
  • 224.0.0.3 未指派
  • ……

  • 224.0.1.0 ~ 238.255.255.255 是全球范围都可使用的多播地址
  • 239.0.0.0 ~ 239.255.255.255 限制在一个组织的范围

4. 总结

  • 掌握多播地址转换为 mac 地址的方法
  • 不完备过滤与完备过滤的含义
  • 2
    点赞
  • 14
    收藏
    觉得还不错? 一键收藏
  • 3
    评论
对于UDP组播的一些认识<br><br> 利用UDP组播能在intarnet,internet上也数据报的形式进行数据的组播(在internet上进行组播,要求路由器支持IGMP(internet网关管理协议,这个协议是在IP出现以后,为了支持组播而出现的)).相对于极度消耗网络带宽的广播来说(广播只能在intranet内广播),UDP组播有了很大的优化,只有终端加入到了一个广播组,UDP组播的数据才能被他接受到.<br> UDP组播是采用的无连接,数据报的连接方式,所以是不可靠的.也就是数据能不能到达接受端和数据到达的顺序都是不能保证的.但是由于UDP不用保证数据的可靠性,所有数据的传送速度是很快的.<br><br>1. 组播的“根”<br> 组播从概念上来讲分为两部分:控制部分和数据部分。控制部分决定着组播的对象的组织方式。而数据部分决定了数据的传输方式。<br> 控制层有“有根”,“无根”两种情况。对于有根的控制层,存在着一个root和若干个leaf. root负责管理这个组播组,只有他能邀请一个leaf加入一个组播组(ATM就是有根控制的一个典型的例子)。对于无根的控制层,没有root,只有若干的leaf. 每一个leaf都能自己加入一个组播组(IP就是无根控制的典型例子)<br> 数据层也有“有根”,“无根”两种情况。对于有根数据层,从root发出的数据能到达每一个leaf,而从leaf发出的数据只能到达root.对于无根数据层,每一个leaf发出的数据能到达组播组中的每一个leaf(甚至包括他自己)。每一个leaf也能接受组播组里的任何数据包。<br><br><br>二.IP组播地址<br> IP组播通信需要一个特殊的组播地址.IP组播地址是一组D类IP地址,范围从224.0.0.0 到 239.255.255.255。其中还有很多地址是为特殊的目的保留的。224.0.0.0到224.0.0.255的地址最好不要用,因为他们大多是为了特殊的目的保持的(比如IGMP协议)<br><br>三.IGMP协议<br> IGMP(internet网关管理协议)是IP组播的基础.在IP协议出现以后,为了加入对组播的支持,IGMP产生了。IGMP所做的实际上就是告诉路由器,在这个路由器所在的子网内有人对发送到某一个组播组的数据感兴趣,这样当这个组播组的数据到达后面,路由器就不会抛弃它,而是把他转送给所有感兴趣的客户。假如不同子网内的A,B要进行组播通信,那么,位与A,B之间的所有路由器必须都要支持IGMP协议,否则A,B之间不能进行通信。<br> 当一个应用加入一个组播组后,就会向这个子网的所有路由器发送一个IGMP加入命令,告诉他子网内有人对发送到某一个组播组的数据感兴趣.路由器也会定时向子网内的所有终端发送一条查询消息,用于询问是否还有人对某个组播组的数据感兴趣。如果有的话,终端就会回应一条IGMP消息,路由器则继续转发这个组播组的数据。如果没有人回应这条消息,那么路由器就认为已经没有终端对这个组播组的数据感兴趣,就不会在转发关于这个组播组的数据了。在IGMP第二版中,一个终端推出组播组以后,会向路由器发送一个推出消息,路由器也会通过这个消息来判断是否还要继续转发关于这个组播组的数据了(IGMP第一版中没有这个功能)[这些事情都是底层的系统做的,你只要坐享其成就好了]<br><br> <br><br>四. winsock 1组播<br> winsock 1的组播主要有以下几个步骤:<br>1. 建立支持数据报的scoket<br>2. 把socket和本地的一个端口绑定(以后会通过这个端口进行数据的收发)<br>3. 通过setsockopt IP_ADD_MEMBERSHIP加入一个组播组<br>4. 然后就能通过sendto / recvfrom进行数据的收法<br>5. 通过 setsockopt IP_DROP_MEMBERSHIP离开一个组播组<br>6. 关闭socket<br><br>如果你仅仅是想向一个组播组发送数据,而不要接受数据,那么可不用加入组播组,而直接通过sendto向组播组发送数据<br><br><br>五.winsock 2组播<br> winsock 2组播主要是通过WSAJoinLeaf来实现的(WSAJoinLeaf的行为,返回值根据socket的模式,组播的实现构架有很大的关系)<br> winsock 2组播的主要有以下几个步骤<br>1. 建立支持数据报的socket(用WSASocket建立socket,同2. 时设置组播的一些属性)<br>3. 把socket和本地的一个端口绑定(以后会通过这个端口进行数据的收发)<br>4. 通过WSAJoinLeaf加入一个组播组<br>5. 通过sendto / recvfrom进行数据的收发<br>6. 直接关闭socket,<br><br>7. 退出组播组<br>
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值