《TCP/IP网络编程》(第十四章)多播与广播

当需要向多个用户发送多媒体信息时,如果使用TCP套接字,则需要维护与用户数量相等的套接字;如果使用之前学习的UDP,传输次数也需要和用户数量相同。
所以为了解决这些问题,可以采用多播和广播技术,这样只需要发送一次,所有用户都能接收到信息

1.多播

多播(Multicast)方式的数据传输是基于UDP完成的,使用多播组地址来标识一组感兴趣的接收者,只有加入到这个多播组的设备才会接收到发送的数据包。
多播常用于视频会议、在线直播、IPTV等场景,其中数据需要发送给多个特定的接收者而不是所有人

①多播的数据传输特点

  1. 多播服务器针对特定的多播组,只发送一次数据
  2. 即使只发送一次数据,该组内所有客户端都会接受到数据
  3. 多播组数可以在IP地址范围内任意增加
  4. 加入多播组就能收到数据
  5. 多播组时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.多播与广播对比

  1. 接收者范围: 广播发送给所有设备,而多播只发送给特定的组。
  2. 网络效率: 多播比广播更高效,因为它减少了不必要的数据传输。
  3. 地址类型: 广播使用广播地址,多播使用多播地址。
  4. 适用场景: 广播适用于需要通知所有设备的场景,而多播适用于需要向特定群体发送数据的场景。

①多播的使用场景

  1. 大规模数据分发: 股票市场信息、新闻更新或在线直播。
  2. 视频会议和在线教育
  3. IPTV和多媒体流
  4. 网络监控和安全
  5. 分布式计算
  6. 实时数据服务: 天气更新、交通信息或金融市场数据,可以多播给所有订阅服务的用户。

②广播的使用场景

  1. 局域网内通信: 如打印作业请求或网络发现协议。
  2. 设备发现: 一些设备和服务使用广播来发现网络上的其他设备。
  3. 游戏和娱乐: 在局域网游戏或多媒体应用中,广播可以用于快速发现和连接游戏服务器或媒体播放设备。
  4. 紧急通知系统: 在某些情况下,可能需要向局域网内的所有设备发送紧急通知或警报。

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

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

相关文章

Python学习打卡:day02

day2 笔记来源于:黑马程序员python教程,8天python从入门到精通,学python看这套就够了 8、字符串的三种定义方式 字符串在Python中有多种定义形式 单引号定义法: name 黑马程序员双引号定义法: name "黑马程序…

代码随想录算法训练营第四十四天 | 01背包问题理论基础、01背包问题滚动数组、416. 分割等和子集

背包问题其实有很多种,01背包是最基础也是最经典的,软工计科学生一定要掌握的。 01背包问题 代码随想录 视频讲解:带你学透0-1背包问题!| 关于背包问题,你不清楚的地方,这里都讲了!| 动态规划经…

C++11:列表初始化 初始化列表initializer_list decltype关键字

目录 前言 列表初始化 初始化列表initializer_list decltype关键字 左值和右值 move 前言 2003年C标准委员会曾经提交了一份技术勘误表(简称TC1),使得C03这个名字取代了C98成为了C11前最新的C标准名称。不过由于C03主要是对C98标准中的…

认识和使用 Vite 环境变量配置,优化定制化开发体验

Vite 官方中文文档:https://cn.vitejs.dev/ 环境变量 Vite 内置的环境变量如下: {"MODE": "development", // 应用的运行环境"BASE_URL": "/", // 部署应用时使用的 URL 前缀"PROD": false, //应用…

国外媒体软文发稿-引时代潮流-助力跨国企业蓬勃发展

大舍传媒:开疆拓土,引领传媒新潮流 随着全球经济的一体化和信息技术的高速发展,跨国企业在国际市场上的竞争越来越激烈。这也给跨国企业带来了巨大的机遇和挑战。在这个时代背景下,大舍传媒凭借其独特的优势和创新的服务模式&…

市值超越苹果,英伟达的AI崛起与天润融通的数智化转型

Agent,开启客户服务新时代。 世界商业格局又迎来一个历史性时刻。 北京时间6月6日,人工智能芯片巨头英伟达(NVDA)收涨5.16%,总市值达到3.01万亿美元,正式超越苹果公司,成为仅次于微软&#xf…

IDEA启动项目报java.lang.OutOfMemoryError: GC overhead limit exceeded

idea编译项目时报j ava.lang.OutOfMemoryError: GC overhead limit exceeded错误,教你两步搞定! 第一步:打开help -> Edit Custom VM Options ,修改xms和xmx的大小,如下图: 第二步:File -> Settings…

python tushare股票量化数据处理:笔记

1、安装python和tushare及相关库 matplotlib pyplot pandas pandas_datareader >>> import matplotlib.pyplot as plt >>> import pandas as pd >>> import datetime as dt >>> import pandas_datareader.data as web 失败的尝试yf…

C++入门 string(1)

目录 string类简介 string类的常用接口说明 string类对象的常见构造 string类对象的访问及遍历操作 operator[ ] begin end rbegin rend string类简介 string是表示字符串的字符串类该类的接口与常规容器的接口基本相同,再添加了一些专门用来操作string的…

打造你的博客帝国:DjangoBlog带你飞向国际舞台!

你的网站加载速度还在慢如蜗牛吗?将为你揭开网站速度提升的神秘面纱。从缓存策略到数据库优化,再到高效的代码实践,我们深入探讨了如何让DjangoBlog飞速运行。不仅如此,我们还提供了实用的监控和日志管理技巧,确保你的…

Nginx高级配置及重写功能

文章目录 一、高级配置网页的状态页Nginx第三方模块变量访问日志Nginx压缩功能https功能自定义小图标 二、重写功能(rewrite)if指令return指令set指令break指令rewrite指令防盗链 一、高级配置 网页的状态页 状态页显示的是整个服务器的状态而非虚拟主…

怎么取消Intellij IDEA中的项目和Git仓库的关联

这篇文章分享一种最简单的方法,取消已经开启代码控制的项目与git代码仓库的关联。 打开项目的位置,然后点击文件管理器上方的查看选项卡,勾选【隐藏的项目】。 删除.git文件夹 然后可以看到项目的文件夹下显示了一个隐藏的.git文件夹&#x…

【Python教程】3-控制流、循环结构与简单字符串操作

在整理自己的笔记的时候发现了当年学习python时候整理的笔记,稍微整理一下,分享出来,方便记录和查看吧。个人觉得如果想简单了解一名语言或者技术,最简单的方式就是通过菜鸟教程去学习一下。今后会从python开始重新更新&#xff0…

武忠祥17堂课没必要全听,这几个才是精华!

作者:Captain 链接:https://www.zhihu.com/question/381665751/answer/3197724055 来源:知乎 著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。 17堂课类似于习题课,是专题训练 17堂课省略了…

SpringMVC[从零开始]

SpringMVC SpringMVC简介 1.1什么是MVC MVC是一种软件架构的思想,将软件按照模型、视图、控制器来划分 M:Model,模型层,指工程中的JavaBean,作用是处理数据 JavaBean分为两类: 一类称为实体类Bean:专…

李廉洋:6.10黄金原油非农之后,今日行情走势分析策略。

黄金消息面分析:即美联储不会在短期内以降息的方式出手纾困。该报告确实将首次降息的可能性推迟到了12月,但股市的反应不像多数交易商预期的那样。股市非但没有崩盘,反而随着交易员逢低买入而大幅反弹。很明显,市场完全专注于盈利…

Java(十七)---ArrayList的使用

文章目录 前言1.ArrayList的简介2. ArrayList使用2.1.ArrayList的构造2.2.ArrayList的扩容机制(JDK17) 3.ArrayList的常见操作4. ArrayList的具体使用4.1.[杨辉三角](https://leetcode.cn/problems/pascals-triangle/description/)4.2.简单的洗牌游戏 5.ArrayList的问题及思考 …

【数据结构】AVL树(平衡二叉树)

目录 一、AVL树的概念二、AVL树的节点三、AVL树的插入四、AVL树的旋转1.插入在较高左子树的左侧,使用右单旋2.插入在较高右子树的右侧,使用左单旋3.插入较高左子树的右侧,先左单旋再右单旋4.插入较高右子树的左侧,先右单旋再左单旋…

【Python核心数据结构探秘】:元组与字典的完美协奏曲

文章目录 🚀一、元组⭐1. 元组查询的相关方法❤️2. 坑点🎬3. 修改元组 🌈二、集合⭐1. 集合踩坑❤️2. 集合特点💥无序性💥唯一性 ☔3. 集合(交,并,补)🎬4. …