当需要向多个用户发送多媒体信息时,如果使用TCP套接字,则需要维护与用户数量相等的套接字;如果使用之前学习的UDP,传输次数也需要和用户数量相同。
所以为了解决这些问题,可以采用多播和广播技术,这样只需要发送一次,所有用户都能接收到信息
1.多播
多播(Multicast)方式的数据传输是基于UDP完成的,使用多播组地址来标识一组感兴趣的接收者,只有加入到这个多播组的设备才会接收到发送的数据包。
多播常用于视频会议、在线直播、IPTV等场景,其中数据需要发送给多个特定的接收者而不是所有人。
①多播的数据传输特点
- 多播服务器针对特定的多播组,只发送一次数据
- 即使只发送一次数据,该组内所有客户端都会接受到数据
- 多播组数可以在IP地址范围内任意增加
- 加入多播组就能收到数据
- 多播组时D类IP地址(IP地址分类参考《TCP/IP网络编程》(第三章)地址族和数据序列),即224.0.0.0~239.255.255.255
②多播技术原理
多播技术基于UDP传输,所以多播数据包和UDP数据包大致相同,但向网络传输多播数据包时,路由器会复制该数据包并传递到多个主机,如下图所示
PS:有的路由器不支持多播通信,也会使用隧道通信(这里不展开)
2.多播编程
①路由(Routing)和TTL(Time to Live,生存时间)
TTL是决定“数据包传输距离”的主要因素,TTL用整数表示,每经过一个路由器就减1,变为0时就销毁。故TTL设置过大会影响流量,设置过小会无法传输到目标,过程如下图所示
②设置TTL
通过套接字选项中,IPPROTO_IP协议层中的IP_MULTICAST_TTL完成设置
int send_sock;
send_sock= socket(AF_INET,SOCK_DGRAM,0);//使用UDP传输
......
int TTL = 64; // 你希望设置的TTL值
setsockopt(send_sock, IPPROTO_IP, IP_MULTICAST_TTL, (void*)&TTL, sizeof(TTL));
③设置加入多播组
通过IPPROTO_IP协议层中的IP_ADD_MEMBERSHIP完成设置
int recv_sock;
recv_sock= socket(AF_INET,SOCK_DGRAM,0);//使用UDP传输
......
struct ip_mreq join_adr;
join_adr.imr_multiaddr.s_addr ="多播组地址信息";
join_adr.imr_interface.s_addr="加入多播组的主机地址信息";
setsockopt(recv_sock,IPPROTO_IP,IP_ADD_MEMBERSHIP,(void*)&join_adr,sizeof(join_adr));
//ip_mreq 结构体信息
typedef struct ip_mreq {
struct in_addr imr_multiaddr; // 多播组的IP地址
struct in_addr imr_interface; // 加入多播组的主机地址信息
};
3.广播
广播是向同一网络中的所有主机传输数据,也是基于UDP完成的,而多播是发送给特定的组。广播分为两种形式:直接广播和本地广播。
①直接广播: 发送者将数据包发送到特定的远程网络的广播地址。这意味着数据包将穿越多个网络,直到到达指定的远程网络。
②本地广播: 发送者将数据包发送到本网络的广播地址。这种广播不会跨越网络边界,仅限于本地网络。
4.广播编程
①设置广播选项
通过套接字选项中,SOL_SOCKET协议层中的SO_BROADCAST完成设置
int send_sock;
send_sock= socket(AF_INET,SOCK_DGRAM,0);//使用UDP传输
......
int opt = 1; // 启用广播
setsockopt(send_sock, SOL_SOCKET, SOL_SOCKET, (void*)&opt, sizeof(opt));
PS: 在Windows平台中,该技术的套接字设置没有区别,只需要修改对应的变量和头文件即可
5.多播与广播对比
- 接收者范围: 广播发送给所有设备,而多播只发送给特定的组。
- 网络效率: 多播比广播更高效,因为它减少了不必要的数据传输。
- 地址类型: 广播使用广播地址,多播使用多播地址。
- 适用场景: 广播适用于需要通知所有设备的场景,而多播适用于需要向特定群体发送数据的场景。
①多播的使用场景
- 大规模数据分发: 股票市场信息、新闻更新或在线直播。
- 视频会议和在线教育
- IPTV和多媒体流
- 网络监控和安全
- 分布式计算
- 实时数据服务: 天气更新、交通信息或金融市场数据,可以多播给所有订阅服务的用户。
②广播的使用场景
- 局域网内通信: 如打印作业请求或网络发现协议。
- 设备发现: 一些设备和服务使用广播来发现网络上的其他设备。
- 游戏和娱乐: 在局域网游戏或多媒体应用中,广播可以用于快速发现和连接游戏服务器或媒体播放设备。
- 紧急通知系统: 在某些情况下,可能需要向局域网内的所有设备发送紧急通知或警报。