UDP 多播(组播)

 前言(了解分类的IP地址)

1.组播(多播)

单播地址标识单个IP接口,广播地址标识某个子网的所有IP接口,多播地址标识一组IP接口。单播和广播是寻址方案的两个极端(要么单个要么全部),多播则意在两者之间提供一种这种方案。多播数据报只应该由它感兴趣的接口接收,也就是说有运行相应多播会话的接口接收。另外,广播一般局限于局域网内使用,而多播则既可以用于局域网,也可以跨广域网使用。

  • a.组播既可以用于局域网,也可以用于广域网
  • b.客户端需要加入多播组,才能接收到多播组内发送的数据

1.1 单播

  • 单播 是指封包在计算机网络的传输中,目的地址为单一目标的一种传输方式。
  • 每次只有两个实体相互通信,发送端和接收端都是唯一确定的。
  • 它是现今网络应用最为广泛,通常所使用的网络协议或服务大多采用单播传输,例如一切基于是TCP的协议

单播的优点如下:

  • 服务器及时响应客户及的请求
  • 服务器针对每个客户不同的请求发送不同的数据,容易实现个性化服务

1.2 多播

多播 是指把信息同时传递给一组目的地址,它使用的策略是最高效的因为 消息在每条网络链路上只需传递一次,而且只有在链路分叉的时候,消息才会被复制。当以单播的形式把消息传递给多个接收方时,必须向每个接收者都发送一份数据副本。由此产生的多余副本将导致发送方效率低下,且缺乏可扩展性。

  • 多播 是指把信息同时传递给一组目的地址,它使用的策略是最高效的
  • 因为 消息在每条网络链路上只需传递一次,而且只有在链路分叉的时候,消息才会被复制
  • 当以单播的形式把消息传递给多个接收方时,必须向每个接收者都发送一份数据副本。
  • 由此产生的多余副本将导致发送方效率低下,且缺乏可扩展性

1.2.1 多播优点与缺点

>>多播 的优点如下:

  • ① 需要相同数据流的客户端加入相同的组共享一条数据流,节省了服务器的负载
  • ② 由于组播协议是根据接受者的需要对数据流进行复制转发,所以服务端的服务总带宽不受         客户接入端带宽的限制。
  • ③ IP协议允许有2亿6千多万个(268435456)组播,所以其提供的服务可以非常丰富
  • ④ 此协议和单播协议一样允许在Internet宽带网上传输

>>多播 的缺点如下:

  • ① 与单播协议相比没有纠错机制,发生丢包错包后难以弥补但可以通过一定的容错机制和         QOS加以弥补
  • ② 现行网络虽然都支持组播的传输,但在客户认证、QOS等方面还需要完善

2.组播地址

IP 多播通信必须依赖于IP多播地址,在IPv4中它的范围从224.0.0.0到239.255.255.255,并被划分为局部链接多播地址、预留多播地址和管理权限多播地址三类

2.1 多播地址

    多播地址的范围从224.0.0.0到 239.255.255.255

 3.设置组播

设置组播
int setsockopt(int sockfd, int level, int optname, const void *optval, socklen_t optlen);// ① 服务器设置多播的信息,外出接口- level : IPPROTO_IP- optname : IP_MULTICAST_IF- optval : struct in_addr// ② 客户端设置多播的信息,加入多播组- level : IPPROTO_IP- optname : IP_ADD_MEMBERSHIP- optval : struct ip_mreq
struct ip_mreq {/* IP multicast address of group */struct in_addr imr_multiaddr;/* Local IP address of interface */struct in_addr imr_interface;
}

4.组播代码

>>实验一

server.c 

#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <string.h>
#include <arpa/inet.h>int main() {// 1.创建一个通信的socketint fd = socket(PF_INET, SOCK_DGRAM, 0);if(fd == -1) {perror("socket");exit(-1);}   // 2.设置多播的属性,设置外出接口struct in_addr imr_multiaddr;// 初始化多播地址inet_pton(AF_INET, "239.0.0.10", &imr_multiaddr.s_addr);setsockopt(fd, IPPROTO_IP, IP_MULTICAST_IF, &imr_multiaddr, sizeof(imr_multiaddr));// 3.初始化客户端的地址信息struct sockaddr_in cliaddr;cliaddr.sin_family = AF_INET;cliaddr.sin_port = htons(9999);inet_pton(AF_INET, "239.0.0.10", &cliaddr.sin_addr.s_addr);// 3.通信int num = 0;while(1) {char sendBuf[128];sprintf(sendBuf, "hello, client....%d\n", num++);// 发送数据sendto(fd, sendBuf, strlen(sendBuf) + 1, 0, (struct sockaddr *)&cliaddr, sizeof(cliaddr));printf("组播的数据:%s\n", sendBuf);sleep(1);}close(fd);return 0;
}

client.c

#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <string.h>
#include <arpa/inet.h>int main() {// 1.创建一个通信的socketint fd = socket(PF_INET, SOCK_DGRAM, 0);if(fd == -1) {perror("socket");exit(-1);}   struct in_addr in;// 2.客户端绑定本地的IP和端口struct sockaddr_in addr;addr.sin_family = AF_INET;addr.sin_port = htons(9999);addr.sin_addr.s_addr = INADDR_ANY;int ret = bind(fd, (struct sockaddr *)&addr, sizeof(addr));if(ret == -1) {perror("bind");exit(-1);}struct ip_mreq op;inet_pton(AF_INET, "239.0.0.10", &op.imr_multiaddr.s_addr);op.imr_interface.s_addr = INADDR_ANY;// 加入到多播组setsockopt(fd, IPPROTO_IP, IP_ADD_MEMBERSHIP, &op, sizeof(op));// 3.通信while(1) {char buf[128];// 接收数据int num = recvfrom(fd, buf, sizeof(buf), 0, NULL, NULL);printf("server say : %s\n", buf);}close(fd);return 0;
}

实验二:

server.c

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#include <sys/types.h>
#include <netinet/in.h>
#include <arpa/inet.h>/*udp 服务器发送数据给多播组
*/int main(int argc,char *argv[]) {int sockfd;struct sockaddr_in grp_cast_addr;char wbuffer[1024];if((sockfd = socket(AF_INET,SOCK_DGRAM,0)) < 0) {perror("socket");exit(EXIT_FAILURE);}int wbytes;// 填充组播地址与端口号(224.0.0.8)socklen_t len = sizeof(struct sockaddr_in);memset(&grp_cast_addr,0,sizeof(grp_cast_addr));grp_cast_addr.sin_family = AF_INET;grp_cast_addr.sin_addr.s_addr = inet_addr(argv[1]);grp_cast_addr.sin_port = htons(atoi(argv[2]));while (1) {memset(wbuffer,0,sizeof(wbuffer));fprintf(stdout,"Server > ");fflush(stdout);fgets(wbuffer,sizeof(wbuffer),stdin);wbuffer[strlen(wbuffer) - 1] = '\0';// 发送给多播组(所有客户端都可以收到消息)wbytes = sendto(sockfd,wbuffer,strlen(wbuffer) + 1,0,(const struct sockaddr *)&grp_cast_addr,len);if(wbytes < 0) {perror("sendto()");break;}}   close(sockfd);return 0;
}

client.c

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#include <sys/types.h>
#include <netinet/in.h>
#include <arpa/inet.h>int main(int argc,char* argv[]) {int sockfd;struct sockaddr_in local_addr; //客户端地址结构对象(自身的IP地址和端口号)struct ip_mreq mreq; //多播的地址结构体if(argc != 3) {fprintf(stderr,"Usage:%s <ip address> <port>\n",argv[0]);exit(EXIT_FAILURE);}// 1.建立 socket 文件描述符sockfd = socket(AF_INET,SOCK_DGRAM,0);if(sockfd < 0) {perror("socket()");exit(EXIT_FAILURE);}// 2.将当前主机添加到多播组memset(&mreq,0,sizeof(mreq));mreq.imr_multiaddr.s_addr = inet_addr(argv[1]);//组播的ip地址mreq.imr_interface.s_addr = htonl(INADDR_ANY); //本地ip地址,INADDR_ANY:本机上任意的IP地址// 3.修改当前的socket属性为多播属性if(setsockopt(sockfd,IPPROTO_IP,IP_ADD_MEMBERSHIP,(void*)&mreq,sizeof(mreq)) < 0){perror("setsockopt()");exit(EXIT_FAILURE);}// 4.绑定 ip 地址和端口号(自身)socklen_t len = sizeof(struct sockaddr_in);memset(&local_addr,0,sizeof(local_addr));local_addr.sin_family = AF_INET;local_addr.sin_addr.s_addr = htonl(INADDR_ANY);local_addr.sin_port = htons(atoi(argv[2]));if(bind(sockfd,(struct sockaddr*)&local_addr,len) < 0) {perror("bind()");exit(EXIT_FAILURE); }char rbuffer[1024];int rbytes;struct sockaddr_in caddr;while (1) {memset(rbuffer,0,sizeof(rbuffer));rbytes = recvfrom(sockfd,rbuffer,sizeof(rbuffer),0,(struct sockaddr*)&caddr,&len);if(rbytes < 0) {perror("recvfrom()");break;}printf("Receive from ip<%s>\n",inet_ntoa(caddr.sin_addr));printf("Receive from port<%d>\n",ntohs(caddr.sin_port));printf("Receive data: <%s>\n",rbuffer);}// 退出多播组if(setsockopt(sockfd,IPPROTO_IP,IP_DROP_MEMBERSHIP,&mreq,sizeof(mreq)) < 0) {perror("setsockopt()");exit(EXIT_FAILURE);}close(sockfd);return 0;
}

知识拓展:(来自这篇文章的总结)

IP组播基础特性介绍 - NetEngine A821 E, A821, A811 M, A811, A810 V800R021C10SPC600 特性描述 - 华为 (huawei.com)

① 单播IP地址

  • 一个单播IP地址只能标识一台用户主机,一台用户主机只能识别一个单播IP地址
  • 一份使用单播IP地址为目的地址的IP报文,只能被一台用户主机接收

② 广播IP地址

  • 一份使用单播IP地址为目的地址的IP报文,只能被一台用户主机接收
  • 一份使用广播IP地址为目的地址的IP报文,能够被该网段内的所有用户主机接收
  • IP广播报文不能跨网段传播

③ 组播IP地址

  • 一个组播IP地址能够标识网络不同位置的多个用户主机
  • 一台用户主机可以同时识别多个组播IP地址
  • 一份使用组播IP地址为目的地址的IP报文,能够被网络不同位置的多个用户主机接收

推荐文章和课程:IP组播基础特性介绍 - NetEngine A821 E, A821, A811 M, A811, A810 V800R021C10SPC600 特性描述 - 华为 (huawei.com)icon-default.png?t=N7T8https://support.huawei.com/enterprise/zh/doc/EDOC1100270069/c9f73464

网络编程扩展广播与组播_哔哩哔哩_bilibiliicon-default.png?t=N7T8https://www.bilibili.com/video/BV1Yk4y1b7Wz/?spm_id_from=333.337.search-card.all.click&vd_source=a934d7fc6f47698a29dac90a922ba5a3
课程列表_牛客网 (nowcoder.com)icon-default.png?t=N7T8https://www.nowcoder.com/study/live/504/4/34

网络编程36--组播和广播_哔哩哔哩_bilibiliicon-default.png?t=N7T8https://www.bilibili.com/video/BV1H64y1m7YA/?spm_id_from=333.337.search-card.all.click&vd_source=a934d7fc6f47698a29dac90a922ba5a3

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/60043.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

AI聊天机器人平台Poe发布更新;自然语言理解课程概要

&#x1f989; AI新闻 &#x1f680; AI聊天机器人平台Poe发布更新 突破功能限制 增加企业级服务 摘要&#xff1a;知名问答网站Quora旗下的AI聊天机器人平台Poe发布了一系列更新&#xff0c;包括推出Mac应用、支持同时进行多个对话、接入Meta的Llama 2模型等功能。用户只需支…

自动化运维:Ansible之playbook基于ROLES部署LNMP平台

目录 一、理论 1.playbook剧本 2.ROLES角色 3.关系 4.Roles模块搭建LNMP架构 二、实验 1.Roles模块搭建LNMP架构 三、问题 1.剧本启动php报错语法问题 2.剧本启动mysql报错语法问题 3.剧本启动nginx开启失败 4.剧本安装php失败 5.使用yum时报错 6.rpm -Uvh https…

自动泊车的自动驾驶控制算法

1. 自动泊车系统 自动泊车系统(AutomatedParkingASSiSt,APA)利用车辆搭载的传感器感知车辆周边环境,扫描满足当前车辆停放的障碍物空间车位或线车位,并通过人机交互(HumanMachine Interface,HMI)获取驾驶员对目标车位的选择或自动确定目标车位,自动规划泊车路径,通过控制器向车…

windows环境搭建ELK

目录 资源下载&#xff08;8.9.1&#xff09; ES安装、注册、使用 Kibana安装、注册、使用 Logstash安装、注册、使用 Filebeat安装、使用&#xff08;如果只有一个数据流&#xff0c;则不需要使用filebeat&#xff0c;直接上logstash即可&#xff09; 资源下载&#xff0…

WebSocket--技术文档--架构体系--《WebSocket实现原理以及关键组件》

WebSocket产生背景 简单的说&#xff0c;WebSocket协议之前&#xff0c;双工通信是通过多个http链接来实现&#xff0c;这导致了效率低下。WebSocket解决了这个问题。下面是标准RFC6455中的产生背景概述。 长久以来, 创建实现客户端和用户端之间双工通讯的web app都会造成HTT…

配置开启Hive远程连接

配置开启Hive远程连接 Hive远程连接默认方式远程连接Hive自定义身份验证类远程连接Hive权限问题额外说明 Hive远程连接 要配置Hive远程连接&#xff0c;首先确保HiveServer2已启动并监听指定的端口 hive/bin/hiveserver2检查 HiveServer2是否正在运行 # lsof -i:10000 COMMA…

详解 ElasticSearch Kibana 配置部署

默认安装部署所在机器允许外网 SSH工具 Putty 链接&#xff1a;https://pan.baidu.com/s/1b6gumtsjL_L64rEsOdhd4A 提取码&#xff1a;lxs9 Winscp 链接&#xff1a;https://pan.baidu.com/s/1tD8_2knvv0EJ5OYvXP6VTg 提取码&#xff1a;lxs9 WinSCP安装直接下一步到完成…

elementUi中的el-table表格的内容根据后端返回的数据用不同的颜色展示

效果图如下&#xff1a; 首先 首先&#xff1a;需要在表格行加入 <template slot-scope"{ row }"> </template>标签 <el-table-column prop"usable" align"center" label"状态" width"180" ><templ…

ELK安装、部署、调试 (二) ES的安装部署

ElasticSearch是一个基于Lucene的搜索服务器。它提供了一个分布式多用户能力的全文搜索引擎&#xff0c;基于RESTful web接口操作ES&#xff0c;也可以利用Java API。Elasticsearch是用Java开发的&#xff0c;并作为Apache许可条款下的开放源码发布&#xff0c;是当前流行的企业…

Linux 桌面上的 Firefox 面临着大问题

导读毫无疑问&#xff0c;无论是在桌面、笔记本电脑还是移动设备上&#xff0c;浏览器都是任何操作系统中最重要的应用之一。 如果没有一个功能强大、快速且稳定的浏览器&#xff0c;操作系统的实用性将大幅度降低&#xff0c;以至于我相当确定&#xff0c;如果一个操作系统没有…

Mysql的page,索引,Explain Type等基本常识

Mysql的基本问题 Mysql 为什么建议使用自增id&#xff1f; 因为id&#xff08;主键&#xff09;是自增的话&#xff0c;那么在有序的保存用户数据到页中的时候&#xff0c;可以天然的保存&#xff0c;并且是在聚集索引&#xff08;id&#xff09;中的叶子节点可以很好的减少插…

WebGL非矩阵变换

目录 平移 示例代码&#xff1a; 齐次坐标矢量的最后一个分量w 旋转 p的坐标&#xff0c;可得等式 R1&#xff1a; 使用r、α、β来表示点p的坐标&#xff0c;可得等式 R2&#xff1a; 利用三角函数两角和公式&#xff0c;可得等式 R3&#xff1a; 最后&#xff0c;将…

下岗吧,Excel

ChatGPT的诞生使Excel公式变得过时。通过使用 ChatGPT 的代码解释器你可以做到&#xff1a; 分析数据创建图表 这就像用自然语言与电子表格交谈一样。我将向大家展示如何使用 ChatGPT 执行此操作并将结果导出为Excel格式&#xff1a; 作为示例&#xff0c;我将分析并创建美国…

阿里云效和阿里在线idea使用

阿里云效 https://flow.aliyun.com/all?page1 阿里在线idea&#xff1a;https://ide.aliyun.com/ 在云效中创建的项目可以在在线idea 打开 运行中的项目 设置ssh 设置以后可以使用云效率的代码构建来构建代码 设置 添加自有云或者体验5h

元素居中的方法总结

目录 垂直居中 行内元素垂直居中 单行文本垂直居中 1.line-height: 200px; 多行文本垂直居中 1.tablevertical-align:middle 块级元素垂直居中 1.display: flex;align-items: center; 2.使用position top margin-top 水平居中 行内元素水平居中 1.text-align:cente…

如何让你的jupyter notebook 排版得像Word(Markdown和网页文件写法)

案例背景 很多时候我们在jupyter notebook里面的写代码&#xff0c;画图&#xff0c;但是文字分析什么的写在里面纯文本不好看&#xff0c;需要进行排版&#xff0c;那么就得用markdown的写法&#xff0c;如何还想居中或者更花里胡哨的字体&#xff0c;那就得要网页文件的一些…

阿里云将关停代销业务

我是卢松松&#xff0c;点点上面的头像&#xff0c;欢迎关注我哦&#xff01; 阿里云自从逐渐分拆独立之后&#xff0c;做了很多调整。最近它又做了一个大动作&#xff1a;据DoNews消息&#xff0c;阿里云将会在今年9月30日之前&#xff0c;全面关停代销业务。 这件事实际上…

mysql profiling profiles profile

要想优化一条 Query&#xff0c;我们就需要清楚的知道这条 Query 的性能瓶颈到底在哪里&#xff0c;是消耗的 CPU计算太多&#xff0c;还是需要的的 IO 操作太多&#xff1f;要想能够清楚的了解这些信息&#xff0c;在 MySQL 5.0 和 MySQL 5.1正式版中已经可以非常容易做到了&a…

剑走偏锋:非传统问题在面试中的应对策略

&#x1f337;&#x1f341; 博主猫头虎 带您 Go to New World.✨&#x1f341; &#x1f984; 博客首页——猫头虎的博客&#x1f390; &#x1f433;《面试题大全专栏》 文章图文并茂&#x1f995;生动形象&#x1f996;简单易学&#xff01;欢迎大家来踩踩~&#x1f33a; &a…

滑动窗口系列4-Leetcode322题零钱兑换-限制张数-暴力递归到动态规划再到滑动窗口

这个题目是Leecode322的变种&#xff0c;322原题如下&#xff1a; 我们这里的变化是把硬币变成可以重复的&#xff0c;并且只有coins数组中给出的这么多的金币&#xff0c;也就是说有数量限制&#xff1a; package dataStructure.leecode.practice;import java.util.Arrays; i…