<p style="margin-left:0;text-align:center;"><strong>UDP组播使用注意事项</strong></p>
讯享网
- 单播、组播、广播区别
单播(unicast): 是指封包在计算机网络的传输中,目的地址为单一目标的一种传输方式。它是现今网络应用最为广泛,通常所使用的网络协议或服务大多采用单播传输,例如一切基于TCP的协议。
广播(broadcast):是指封包在计算机网络中传输时,目的地址为网络中所有设备的一种传输方式。实际上,这里所说的“所有设备”也是限定在一个范围之中,称为“广播域”。
组播(multicast): 也叫多播, 多点广播或群播。 指把信息同时传递给一组目的地址。它使用策略是最高效的,因为消息在每条网络链路上只需传递一次,而且只有在链路分叉的时候,消息才会被复制。
多播使用的协议是IGMP(Internet Group Management Protocol),该协议是IP协议簇的一个组成部分,可在IP首部的协议字段设置为2,标记为IGMP协议。IGMP共有三个版本:IGMPv1、IGMPv2、IGMPv3
版本
加入多播组
离开多播组
多播源过滤
IGMPv1
√
×
×
IGMPv2
√
√
×
IGMPv3
√
√
√
多播源过滤是指可设置接收多播数据的主机白名单
2)如何判断网口是否支持组播
在Linux运行ifconfig指令, 如果网卡信息中包含UP BROADCAST RUNNING MULTICAST,则支持广播和组播。

3)组播IP地址范围
组播IP地址用于标识一个IP组播组。
IANA(internet assigned number authority)把D类地址空间分配给IP组播,其范围是从224.0.0.0到239.255.255.255。
- 224.0.0.0~224.0.0.255为预留的组播地址(永久组地址),地址224.0.0.0保留不做分配,其它地址供路由协议使用;
- 224.0.1.0~224.0.1.255是公用组播地址,可以用于Internet;
- 224.0.2.0~238.255.255.255为用户可用的组播地址(临时组地址),全网范围内有效;
- 239.0.0.0~239.255.255.255为本地管理组播地址,仅在特定的本地范围内有效。
参考:组播_百度百科
永久的组播地址:
- 224.0.0.0 基准地址(保留)
- 224.0.0.1 所有主机的地址 (包括所有路由器地址)
- 224.0.0.2 所有组播路由器的地址
- 224.0.0.3 不分配
- 224.0.0.4 dvmrp路由器
- 224.0.0.5 所有ospf路由器
- 224.0.0.6 ospf DR/BDR
- 224.0.0.7 st路由器
- 224.0.0.8 st主机
- 224.0.0.9 rip-2路由器
- 224.0.0.10 Eigrp路由器
- 224.0.0.11 活动代理
- 224.0.0.12 dhcp 服务器/中继代理
- 224.0.0.13 所有pim路由器
- 224.0.0.14 rsvp封装
- 224.0.0.15 所有cbt路由器
- 224.0.0.16 指定sbm
- 224.0.0.17 所有sbms
- 224.0.0.18 vrrp
以太网传输单播ip报文的时候,目的mac地址使用的是接收者的mac地址。但是在传输组播报文时,传输目的不再是一个具体的接收者,而是一个成员不确定的组,所以使用的是组播mac地址。
组播mac地址是和组播ip地址对应的。iana(internet assigned number authority)规定,组播mac地址的高24bit为0x01005e,mac 地址的低23bit为组播ip地址的低23bit。
由于ip组播地址的后28位中只有23位被映射到mac地址,这样就会有32个ip组播地址映射到同一mac地址上。
4)组播socket创建流程

组播socket套接字创建时socket(AF_INET, SOCK_DGRAM, IPPROTO_UDP)
设置多播参数使用setsockopt函数,定义如下
int setsockopt(int socket, int level, int option_name, const void *option_value, socklen_t option_len);
参数介绍:
socket:文件描述符
level:协议层次
SOL_SOCKET 套接字层次
IPPROTO_TCP TCP层次
IPPROTO_IP IP层次
option_name:选项的名称
option_value:设置的选项的值
option_len:option_value的长度

介绍几个选项的含义:

选项IP_MULTICASE_TTL
选项IP_MULTICAST_TTL允许设置超时TTL,范围为0~255之间的任何值。默认情况下,多播报文的TTL被设置成了1,也就是说到这个报文在网络传送的时候,它只能在自己所在的网络传送,当要向外发送的时候,路由器把TTL减1以后变成了0,这个报文就已经被Discard。
选项IP_MULTICAST_IF
选项IP_MULTICAST_IF用于设置发送组播使用的本地接口,另一个网络接口会忽略此数据。默认情况下被设置成了本地接口的第一个地址
选项IP_ADD_MEMBERSHIP和IP_DROP_MEMBERSHIP
加入或者退出一个多播组,通过选项IP_ADD_MEMBERSHIP和IP_DROP_MEMBERSHIP,对一个结构struct ip_mreq类型的变量进行控制
struct ip_mreq原型如下:
struct ip_mreq
{
struct in_addr imn_multiaddr; /加入或者退出的广播组IP地址/
struct in_addr imr_interface; /加入或者退出的网络接口IP地址/
};
选项 IP_ADD_MEMBERSHIP 用于加入某个多播组,之后就可以向这个多播组发送数据或者从多播组接收数据。此选项的值为 mreq 结构,成员 imn_multiaddr 是需要加入的多播组 IP 地址,成员 imr_interface 是本机需要加入广播组的网络接口 IP 地址。例如:
struct ip_mreq ipmr;
ipmr.imr_interface.s_addr = htonl(INADDR_ANY);
ipmr.imr_multiaddr.s_addr = inet_addr(“234.5.6.7”);
setsockopt(fd, IPPROTO_IP, IP_ADDR_MEMBERSHIP, (char*)&ipmr, sizeof(ipmr));
选项IP_ADD_SOURCE_MEMBERSHIP和IP_DROP_SOURCE_MEMBERSHIP
使用ip_mreq_source 结构体添加若干个多播源IP,形成白名单,不再接收其他多播源消息。setsockopt中的选项为IP_ADD_SOURCE_MEMBERSHIP。如果要移除白名单中的多播IP,则setsockopt中的选项为IP_DROP_SOURCE_MEMBERSHIP。

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容,请联系我们,一经查实,本站将立刻删除。
如需转载请保留出处:https://51itzy.com/kjqy/171513.html