一、概述
单播地址标识单个接口,广播地址标识子网上的所有接口,多播地址标识一组接口。
单播和广播是编址方案的两个极端,多播的目的就在于提供一种折衷的方案。
二、多播地址
我们必须区分IPv4多播地址和IPv6多播地址。
IPv4
D类地址是多播地址,从244.0.0.0到239.255.255.255是多播地址。D类地址的低28位构成了多播组ID,而整个32位地址则称为组地址。
下面是几个特殊的IPv4多播地址:
- 224.0.0.1是一个所有主机组,子网上所有具有多播能力的主机必须在所有具有多播能力的接口上加入该组。
- 224.0.0.2是一个所有路由器组,所有多播路由器必须在所有具有多播能力的接口加入该组
- 介于224.0.0.0到224.0.0.255间的地址称为链路局部地址。用于保留低级拓扑发现和维护协议。
IPv6多播地址
IPv6多播地址的高序字节值为ff,组地址的低序32位拷贝到以太网地址的低序32位。以太网的高序2字节值为33:33.
以太网地址第一字节的低序2位表明该地址是一个本地管理组地址。本地管理意味着不能保证地址的唯一性,可能有除IPv6外的其他协议族共享同一网络并使用同样的以太网地址高序2字节值。
4位多播标志用于区分众所周知多播组和临时多播组。该字段的高3为保留。IPv6多播地址还包含一个4位的范围字段。
IPv6多播地址:
- ff02::1是一个所有节点组。子网上的具有多播能力的所有主机必须在具有多播能力的所有接口上加入该组。
- ff02::2是一个所有路由器组。所有子网上的多播路由器必须在具有多播能力的所有接口上加入该组。
多播地址的范围:
1:节点局部即局部于节点
2:链路局部即局部于链路
3:网点局部即局部于网点
8:组织局部即局部于组织
14:全球(global)
三、局域网上多播和广播的比较
四、广域网上的多播
五、多播套接口选项
多播的API支持仅需要5个新的套接口选项
struct ip_mreq { struct in_addr imr_multiaddr; struct in_addr imr_interface; }; struct ipv6_mreq { struct in6_addr ipv6mr_multiaddr; unsigned int ipv6mr_interface; };
六、mcast_join和相关函数
#include "unp.h" int mcast_join(int sockfd, const struct sockaddr * sa, socklen_t salen, const char *ifname, u_int ifindex); int mcast_leave(int sockfd, const struct sockaddr *sa, socklen-t salen); int mcast_set_if(int sockfd, const char *ifname, u_int ifindex); int mcast_set_loop(int sockfd, int flag); int mcast_set_ttl(int sockfd, int ttl); 返回:成功0,出错-1 int mcast_get_if(int sockfd); 返回:成功非负接口索引,出错-1 int mcast_get_loop(int sockfd); 返回:成功当前回馈标志,出错-1 int mcast_get_ttl(int sockfd); 返回:成功当前TTL或跳限,出错-1
mcast_join函数加入一个多播组
mcast_leave离开一个多播组
mcast_set_if给外出多播数据报设置缺省的接口索引
mcast_set_loop设置回馈选项为1或0