目录
- 前言
- 《播》的通讯方式
- 广播
- 物理层的广播
- IP协议的广播
- 多播
- 物理层的多播
- IP协议的多播
- 多播IP地址到多播以太网地址的映射
- IP协议对多播数据包的处理
- IGMP协议
- GIMP数据包格式
- IGMP协议的工作机制
- 主机加入
- 多播路由器查询
- IGMP协议的实现
前言
参照清华大学出版社-罗军周主编的《TCP/IP协议及网络编程技术》进行学习。
本篇主要参考第七章:《广播与多播》
《播》的通讯方式
-
单播
点对点的通讯方式
-
广播
向所有的主机同时通讯
-
多播(组播)
向某些主机同时通讯
-
任播
向任意一些主机中同时发起通讯、但只有离源主机最近的负责响应。可以参照负载均衡来理解、我想知道当前时间、10个服务器有资格响应、但最终只有一个离我最近的服务器完成响应
。
广播
向特定的范围内发送数据、范围内的所有接收者都应收到广播的信息。
由于一下几个原因、广播的发送者无法将所有人的地址全部放入数据包或数据帧中:
- 数据包或数据帧中只有一个目的地址字段
- 发送者往往不确定数据的确切接收者都是谁。
因此、需要一个特殊的地址。能代表网络中所有的主机。这种地址就称之为《广播地址》。需要注意这个地址在不同的协议层或不同的技术使用上都是不同的。
-
物理层的广播
大多数物理网络技术都有标识广播地址的方法。
例如在以太网中:
每个以太网地址长48位、所有位都为1的地址就表示广播地址。
以太网的网卡可以接收两种数据帧。其一是目的地址为本网卡物理地址的数据帧、另一个则是目的地址是广播地址的数据帧。
当然、物理网络中发送广播的技术也各不相同。
对于以太网这种总线式
网络、广播可以通过发送一个数据帧
实现。
对于一些点到点
的网络、则必须向网络中每个系统
单独发送一个数据帧
-
IP协议的广播
首先需要声明的是在五类IP地址
中、并没有一个称为广播地址
的类型。但相应位置设置成1
、则可以代表广播。
-
本网络广播
对于IP地址全部为1
、也就是255:255:255:255
的IP地址、IP协议将其作为广播地址使用。
路由器在接收到目的地址为广播地址的IP数据包时、会发送给本网络所有的主机、而不会向外部进行转发。
-
指定网络广播
对于主机地址全部为1
的网络地址、IP协议将其作为指定网络的广播使用。
这个地址中的网络标识部分指定了该广播数据包要向那个网络进行广播、但并不限于本机网络。
- 广播地址只能用作目的地址、不能设置在源地址。
- 广播会消耗大量的系统资源
多播
与广播的区别是、参与者自己决定是否加入多播的范围。
即继承了广播的方便性、又在最大限度上节省了系统资源。
- 我们将加入多播的所有参与者看做一个组、所以多播又叫组播。
- 多播地址与广播地址不同、不能使用一个固定的地址(因为同一时间可能有多个组播存在)。
- 多播的成员可以是跨网络的
但由于物理网络无法进行跨网络、所以需要特定的技术将IP数据包进行多播传输。
-
物理层的多播
多数物理网络技术都保留了一部分地址作为多播地址使用。各种物理网络因为地址的表示不同、所以多播地址的表示也各不相同。
用以太网为例:
最高字节的最低位为1
的地址都是多播地址。
例如:42:24:D4:54:37:01
就是一个多播地址、而广播地址(FF:FF:FF:FF:FF:FF
)则是多播的一个特例。
在以太网中、默认只接收目的地址为本网卡或者广播地址的数据帧。特定多播地址数据帧的接收可以通过简单的设置来实现。
-
IP协议的多播
在学习IP协议时、我们讲到第四类地址(D类地址
)用于多播通讯。
D类地址的范围是224.0.0.0~239.255.255.255
、其中:
224.0.0.0被保留不能赋给任何播组。
224.0.0.1则是一个所有主机组的地址、它表示参与IP多播的所有主机和路由器。
多播地址与广播地址一样、只能出现在目的地址。
-
多播IP地址到多播以太网地址的映射
IP地址为逻辑地址、最终都需要映射到具体物理地址进行传输。
如何映射呢?
只需要将IP多播地址的
后23位
填入以太网地址01:00:5E:00:00:00
的后23位
即可。
例如:IP多播地址224.0.0.1
映射到以太网地址为01:00:5E:00:00:01
不过这种映射关系并不是唯一的
因为IP地址一共为32位、D类地址指代前4位为
1110的地址
、剩余28位都是可变的
。映射时只映射了后23位
、意味着可能有2^5=32个
广播租使用同一个物理地址。但因为IP多播地址范围很大、所以碰撞的概率很小。但依旧只要有重复的可能、所以在收到多播信息的时候需要小心甄别、将不是发往本主机的数据包丢弃。
IP协议对多播数据包的处理
-
对于发送方
发送一个多播数据包很简单。IP协议软件允许应用程序将一个多播地址设定为目的地址、物理网络层也允许将一个IP多播地址映射就可以直接发送了。
-
对于接收方
首先、IP协议软件需要提供一个接口、允许用户加入一个多播组。
同一个主机
可能有多个应用程序
加入了同一个多播租
。
如果这样、IP协议
必须给每一个应用程序复制
一个该数据包的副本
。
如果所有程序都退出了多播组、那么IP协议将不再接受该多播组的数据包。
-
IP多播数据包的路由
需要多播系统中的主机和路由器合作完成、详情可以参考IGMP协议
。
IGMP协议
想要加入一个本地多播组
、主机只需要能发送和接收多播数据包即可。
但要加入一个跨网络的多播组
、主机还需要将自己加入(了哪些多播组)的信息通知给本地的多播路由器。本地路由器与其他的多播路由器联系、传递多播组成员信息并建立路由。而在传递多播组成员信息之前、它必须确定在本地网络中有主机系统加入了该多播组。
主机和其多播路由器是通过
internet组管理协议
(IGMP
)来管理多播组成员关系的。
GIMP数据包格式
总计8字节、64位。
- 版本
-
类型
1代表由多播路由器
发出的查询数据包
。
2代表是主机
发出的报告数据包
。 - 预留字段
-
校验和
与ICMP
协议计算方式相同 -
IP多播地址
D类
IP地址。如果是查询数据包地址设置为0
、报告数据包为主机想要加入的多播地址
。
和ICMP
协议一样、虽然IGMP
是封装在IP数据包内传输、但它被当做IP层的一部分。IP数据包
头部协议类型字段
用2表示IGMP
协议(1
则表示ICMP协议
)。《网络协议补完计划--IP协议》——IP数据包的格式
IGMP协议的工作机制
-
主机加入
主机
发送一个IGMP报告数据包
到网络上。
数据包的多播地址字段
设置为想要加入的多播地址
、目的地址字段
设置为所有主机的多播地址224.0.0.1
、让本地网络中所有参与多播的主机和路由器接收、所以本机不需要知道本地多播路由器的地址
。
多播路由器
接收到IGMP报告数据包
后会通过向其他多播路由器
传播组成员信息
来建立必要的路由信息。
-
多播路由器查询
由于多播的组员时刻在变化。多播路由器
需要定期查询
每个组在本地网络还有多少成员。这就需要通过发送IGMP查询数据包
来更新信息。
多播路由器
向每个端口连接的网络
中发送
一个目的地址
为224.0.0.1
的IGMP查询数据包
。网络中的每个参与多播主机
都将收到
这个数据包。
主机
收到IGMP查询数据包
后、都需要发送IGMP报告数据包
。并将多播地址字段
和目的地址字段
都设为其参与的多播地址
。每参加一个组、就要发送一个IGMP报告数据包
。
一开始读到这里其实我有一点疑问:
为什么
主机
在收到查询数据包
后发送的报告数据包
的目的地址不是本地多播地址
、而是实际的多播地址
??
但稍微思考一下就能得出结论、既然多播路由器
知道本地网络中已经有至少一个主机
之前已经加入了某个多播地址
。那么其自身一定已经能接收并转发该多播地址
的数据包、此时向该多播地址
发送报告数据包
、多播路由器
自然能够接收的到。
-
IGMP协议的实现
所有IGMP数据包都是以组播
的形式发送的、所以需要尽量减少数据包的发送次数
、以提升效率和节省资源。
- 当一个主机
第一次加入多播组
而发送IGMP报告包时、并不能保证该报告被有效接收、下一个报告将在一段时间(1~10s内随机选择)后再次发送。 - 如果多个程序
加入同一个多播组
、只会为第一个程序发送
报告包。 - 当一个主机
收到查询包
、并不立即响应、而是经过一段时间间隔后才发出、这个延迟时间是随机的。 - 在一个物理网络中
所有加入某多播组
的主机、都能收到其他主机发送的报告包
(因为报告报的目的地址是该多播组地址)。 -
多播路由器只关心需不需要对多播数据进行转发
、也就是自己的物理网络内是否有主机加入了多播组、而不关心到底是谁加入了。 - 由于上一条。如果某主机还没来得及发送报告包就
收到其他主机发送的报告包
、自己就不必发送
了。