多播介绍2

概述

多播数据报只应由对它感兴趣的接口接收,
即由运行相应多播会话应用系统的主机上的接口接收.
多播即可局域网,也可用于广域网.
多播API:
9个套接字选项,
3个影响目的地址为多播地址的UDP数据报的发送
6个影响主机对多播数据报的接收

多播地址

IPv4的D类地址

IPv4的D类地址是IPv4多播地址.
D类地址的低序28位构成多播组ID,
整个32位地址则称为组地址.
IPV4多播地址到以太网地址的映射见RFC1112,
到FDDI网络地址的映射见RFC1390,
到令牌环网地址的映射见RFC1469.

以太网地址的高序24位总是01:00:5e
下一位总是0,
低序23位复制自多播组ID的低序23位.
多播组ID的高序5位在映射过程中被忽略.
意味着32个多播地址映射成单个以太网地址.
以太网地址首字节的低序2位标明该地址是一个统一管理的组地址.
统一管理意味着以太网地址高序24位由IEEE分配,
组地址属性位由接收接口识别并进行特殊处理.
特殊的IP多播地址
-224.0.0.1所有主机组
子网上所有有多播能力的节点[主机,路由器,打印机等]
需在所有有多播能力的接口上加入该组
-224.0.0.2所有路由器组
子网上所有多播路由器需在所具有多播能力的接口上加入该组
-224.0.0.0~224.0.0.255称为链路局部的多播地址
这些地址是为低级拓扑发现和维护协议保留的.
多播路由器不转发以这些地址为目的地址的数据报.

IPV6多播地址

IPv6多播地址的高序字节值为ff
112位组ID的低序32位复制到以太网地址的低序32位
以太网地址的高序2字节为33:33
IPv6多播地址到以太网地址的映射见RFC 2464
到FDDI网络地址的映射见RFC 2467
到令牌环网地址的映射见.
以太网地址首字节的低序2位标明该地址是一个局部管理的组地址.
局部管理意味着不能保证该地址对IPV6的唯一性.
可能有IPv6以外的其他协议族共享同一网络并使用同样的以太网地址高序2字节值.
	
组地址属性位由接收接口识别并特殊处理.
IPv6多播地址有两种格式.
P标志为0,
T标志区分众所周知多播组还是临时多播组
P标志为1
表示多播地址是基于某个单播前缀赋予的.
P标志为1时,T标志也需为1.
plen和prefix两字段分别设置为前缀长度和单播前缀的值.
4位标志字段的高2位被保留.
IPV6多播地址还有一个4位范围字段,
RFC3307叙述了IPV6组地址的低序32位独立于P标志的分配机制.
若干特殊的IPV6多播地址
-ff01::1和ff02::1是所有节点组
子网上所有具有多播能力的节点[主机,路由器,打印机等]
需在所有具有多播能力的接口上加入该组
-ff01::2,ff02::2,ff05::2是所有路由器组
子网上所有多播路由器必须在所有具有多播能力的接口上加入该组

多播地址的范围

IPv6多播地址存在一个4位的范围字段
用于指定多播数据报能游走的范围
IPv6分组还有一个跳限字段,
以限制分组被路由器转发的次数.
若干已经分配给范围字段的值
-接口局部的
-链路局部的
-管区局部的
-网点局部的
-组织机构局部的
-全球或全局的
其余值或不作分配,或保留.
IPv4首部的TTL字段兼用作多播范围字段
0意为接口局部
1意为链路局部
2~32意为网点局部
33~64意为地区局部
65~128意为大洲局部
129~255意为无范围限制
	
尽管把IPV4的TTL字段用作多播范围控制已被接受且是受推荐做法.
但如可能,
可管理的范围划分更可取.
这样会把IPv4介于239.0.0.0~239.255.255.255间的地址
定义为可管理地划分范围的IPv4多播空间.
它占据多播地址空间的高端.
该范围内的地址由组织机构内部分配,
不保证跨组织机构边界的唯一性.
任何组织机构需把它的边界多播路由器配置成禁止转发以这些地址为目的地址的多播数据报.
	
可管理地划分范围的IPv4多播地址空间被进一步划分为本地范围,组织机构局部范围.
前者类似IPV6的网点局部范围.

多播会话

一个多播地址和一个传输层端口的组合称为一个会话.

局域网上多播和广播的比较

加入多播组
IPv4层内部保存这些信息,
并告知合适的数据链路接收目的以太网地址为01:00:5e:00:01:01的以太网帧.
该地址是与接收应用进程刚加入的多播地址对应的以太网地址,
下一个步骤是左侧主机上的发送应用进程创建一个UDP套接字,
往IP地址224.0.1.1的123端口发一个数据报..
发送应用进程不必加入多播组,
发送主机把该IP地址转换成相应的以太网目的地址,
再发送承载该数据报的以太网帧.
帧中同时含有目的以太网地址和目的IP地址.

我们告知一个以太网接口接收目的地址为某个特定以太网组地址的帧时,
许多当前的以太网接口卡对此地址应用某个散列函数,
计算出一个介于0到511之间的值
把该值在一个512位数位数组中对应的位置1.
有一个目的地为某个组地址的帧在线缆上经过时,
接口对其目的地址应用同样的散列函数.
计算出一个介于0到511之间的值.
如该值在同一个数组中对应的位为1,
就接收此帧.
否则,
忽略.
	
接口收到数据链路帧执行第一次过滤
数据链路帧传递给IP层按IP地址执行第二次过滤
IP数据包传递给UDP层按端口执行第三次过滤

广域网上的多播

单个局域网上的多播是简单的
一个主机发一个多播分组,
对它感兴趣的任何主机接收该分组

广域网也可从多播中受益.
多播路由器与其邻居多播路由器的通信使用某个多播路由协议.
当某个主机上的一个进程加入一个多播组时,
该主机向所有直接连接的多播路由器发送一个IGMP消息,
告知它们本主机已加入了那个多播组.
多播路由器随后用MRP交换这些信息.
这样每个多播路由器知道在收到目的地为所加入多播地址的分组时该如何处理.
	
每个多播路由器需接收所有多播分组
对分组进行复制是多播转发所特有的.
多播路由器收到多播分组,
只有在其直接相连的局域网有主机加入该多播组时,
才向直接相连的局域网转发该多播分组.

源特定多播

MRP要求每个多播路由器接收来自所有本地接收主机的多播组加入及其他请求.
并在所有多播路由器间交换这些信息.
多播路由器的转发功能要求把来自网络中任何发送主机的数据复制
并发送到网络中任何接收主机.

多播地址的分配:
IPV4没足够数量的多播地址可静态地分配给想用的任何多播应用系统使用.
要在广域范围发多播分组而不与其他多播发送进程冲突,
多播应用系统得使用唯一的地址.
全球性多播地址分配机制尚不存在.

源特定多播[SSM]
SSM把应用系统的源地址结合到组地址上,
在有限程度上如下地解决了这些问题:
-接收进程向多播路由器提供发送进程的源地址作为多播组加入操作的一部分.
可降低多播路由器就每个分组的转发聚散度.
每个接收进程需知道源地址,
发送进程无需知道任何接收进程的地址.
-把多播组的标识从多播组地址细化为单播源地址和多播目的地址之组合
发送进程可挑选任何多播地址,
源地址和目的地址的组合是唯一的.
源地址本身已使得该组合唯一了.
SSM会话由源地址,目的地址,端口三者的组合标识.

多播套接字选项

传统的多播API只需支持5个套接字选项,
SSM所需的源过滤额外要求多播API支持新增4个套接字选项
选项名						数据类型					说明
IP_MULTICAST_IF				struct in_addr			指定外出多播数据报的默认接口
IP_MULTICAST_TTL			u_char					指定外出多播数据报的TTL
IP_MULTICAST_LOOP			u_char					开启或禁止外出多播数据报的回馈

IPV6_MULTICAST_IF			u_int					指定外出多播数据报的默认接口
IPV6_MULTICAST_HOPS			int						指定外出多播数据报的跳限
IPV6_MULTICAST_LOOP			u_int					开启或禁止外出多播数据报的回馈

IP_ADD_MEMBERSHIP			struct ip_mreq			加入一个多播组
IP_DROP_MEMBERSHIP			struct ip_mreq			离开一个多播组
IP_BLOCK_SOURCE				struct ip_mreq_source	在一个已加入组上阻塞某个源
IP_UNBLOCK_SOURCE			struct ip_mreq_source	开通一个早先阻塞的源
IP_ADD_SOURCE_MEMBERSHIP	struct ip_mreq_source	加入一个源特定多播组
IP_DROP_SOURCE_MEMBERSHIP	struct ip_mreq_source	离开一个源特定多播组

IPV6_JOIN_GROUP				struct ipv6_mreq		加入一个多播组
IPV6_LEAVE_GROUP			struct ipv6_mreq		离开一个多播组

MCAST_JOIN_GROUP			struct group_req		加入一个多播组
MCAST_LEAVE_GROUP			struct group_req		离开一个多播组
MCAST_BLOCK_SOURCE			struct group_source_req	在一个已加入组上阻塞某个源
MCAST_UNBLOCK_SOURCE		struct group_source_req	开通一个早先阻塞的源
MCAST_JOIN_SOURCE_GROUP		struct group_source_req	加入一个源特定多播组
MCAST_LEAVE_SOURCE_GROUP	struct group_source_req	离开一个源特定多播组
1.IP_ADD_MEMBERSHIP,IPV6_JOIN_GROUP和MCAST_JOIN_GROUP
在一个指定的本地接口上加入一个不限源的多播组.
对IPv4,本地接口用某个单播地址指定.
对IPv6和与协议无关的API,本地接口用某个接口索引指定

如本地接口指定为IPV4通配地址或IPV6值为0的索引,
就由内核选择一个本地接口.
一个主机在某个给定接口上属于一个给定多播组的前提是
该主机上当前有一个或多个进程在那个接口上属于该组.

一个给定套接字可多次加入多播组,
每次加入的需是不同的多播地址,不同接口上的同一多播地址.
仅范围有差异的IPV6多播地址代表不同的多播组,
如某个NTP实现想不论范围接收所有NTP分组,
需加入ff01::101,ff02::101,ff05::101,ff08::101和ff0e::101.
所有这些加入可在单个套接字上执行,
且可通过设置IPV6_PKINFO套接字选项让recvmsg返回每个数据报的目的地址

2.IP_DROP_MEMBERSHIP,IPV6_LEAVE_GROUP和MCAST_LEAVE_GROUP
离开指定的本地接口上不限源的多播组.
如未指定本地接口,
则抹除某个匹配的多播组成员关系.

如一个进程加入某个多播组后不显式离开该组,
则当相应套接字关闭时,
该成员关系也自动抹除.
单个主机上可能有多个套接字各自加入相同的多播组,
单个套接字上成员关系的抹除不影响该主机继续作为该多播组的成员,
直到最后一个套接字也离开该多播组.

3.IP_BLOCK_SOURCE和MCAST_BLOCK_SOURCE
对一个所指定本地接口上已存在的一个不限源的多播组,
在本套接字上阻塞接收来自某个源的多播分组.
如加入同一个多播组的所有套接字都阻塞了相同的源,
则主机系统可通知多播路由器此分组流通不再需要.

如本地接口指定为IPV4通配地址
或与协议无关的API的0值索引,
则由内核选择与首个匹配的多播组成员关系对应的本地接口.
4.IP_UNBLOCK_SOURCE或MCAST_UNBLOCK_SOURCE
开通一个先前被阻塞的源
如未指定本地接口,则开通首个匹配的被阻塞源.
5.IP_ADD_SOURCE_MEMBERSHIP和MCAST_JOIN_SOURCE_GROUP
在一个指定的本地接口上加入一个特定于源的多播组.
在这个本地接口上决不能作为不限源的多播组已经或将要使用
IP_ADD_MEMBERSHIP,IPV6_JOIN_GROUP
或MCAST_JOIN_GROUP加入此多播组.

如本地接口指定为IPV4通配地址或与协议无关的0值索引,
就由内核选择一个本地接口
6.IP_DROP_SOURCE_MEMBERSHIP和MCAST_LEAVE_SOURCE_GROUP
在一个指定的本地接口上离开一个特定于源的多播组.
如未指定本地接口,
则抹除首个匹配的特定于源的多播组成员关系.
7.IP_MULTICAST_IF和IPV6_MULTICAST_IF
指定通过本套接字发送的多播数据报的外出接口.
对IPV4版本,接口由一个in_addr结构指定.
对IPV6,接口由某个接口索引指定.
8.IP_MULTICAST_TTL和IPV6_MULTICAST_HOPS
给外出的多播数据报设置IPV4的TTL或IPV6的跳限
9.IP_MULTICAST_LOOP和IPV6_MULTICAST_LOOP
开启或禁止多播数据报的本地自环

如在发送多播数据报前没指定影响发送的多播套接字选项,
则数据报的外出接口将由内核选择,TTL或跳限将为1,并有一个副本自环回来.

为接收目的地址为某个组地址且目的端口为某个端口的多播数据报,
进程需加入该多播组,
并捆绑该端口到某个UDP套接字.

多播组的加入告知所在主机的IP层和数据链路层接收发往该组的多播数据报,
端口捆绑操作是应用进程向UDP指示它想接收发往该端口之数据报的手段.
有些应用进程除端口外还把多播地址也捆绑到某个套接字,
从而防止所在主机Ip层把为该端口收取的目的地址为其他单播,广播或多播地址的
数据报投递到该套接字.
上一篇:什么是ip地址,ipv4,ipv4是什么


下一篇:iptables规则的删除-怎么删除一条已有的iptables规则