当前位置: 首页 > ds >正文

UDP的单播组播与广播

UDP(User Datagram Protocol,用户数据报协议)是一种无连接的、基于IP的传输层协议,它提供了简单的、不可靠的数据报服务。UDP支持三种主要的通信方式:单播、组播和广播。

1. UDP 单播(Unicast)

单播是指数据从一个发送者发送到一个特定的接收者。这是最常见的网络通信方式。
特点
一对一:数据包从一个源地址发送到一个目标地址。
简单高效:UDP本身不提供可靠性机制,因此传输速度快,延迟低。
适用场景:适用于客户端与服务器之间的通信,例如网页浏览、文件传输等。
优点
低延迟:由于UDP是无连接的,没有TCP的三次握手和确认机制,因此延迟较低。
资源占用少:UDP不需要维护连接状态,因此对系统资源的占用较少。
缺点
不可靠:UDP不保证数据包的顺序、完整性或可靠性。数据包可能会丢失、重复或乱序到达。
需要应用层支持:如果需要可靠性,需要在应用层实现额外的机制,例如重传、确认等。

2. UDP 组播(Multicast)

组播是一种一对多或多对多的通信方式,允许一个发送者将数据发送到多个接收者,而无需单独发送每个数据包。
特点
一对多或多对多:数据从一个源地址发送到多个目标地址,这些目标地址属于同一个组播组。
高效利用带宽:发送者只需发送一次数据,网络设备会负责将数据复制并转发到所有组成员,大大减少了网络带宽的占用。
适用场景:适用于大规模的多点通信场景,例如视频会议、在线直播、分布式系统中的消息广播等。
优点
高效:减少了重复发送的开销,节省了网络带宽。
可扩展性:适用于大规模的多点通信,支持大量接收者。
灵活性:组播组可以动态加入或离开,灵活性高。
缺点
网络设备要求:需要网络设备(如路由器、交换机)支持组播协议(如IGMP、PIM等),否则数据无法正确转发。
不可靠性:UDP本身不保证数据的可靠性,组播数据也可能会丢失或乱序到达。
配置复杂:需要配置组播地址和组播组,管理相对复杂。

3. UDP 广播(Broadcast)

广播是一种将数据发送到网络中所有主机的方式,通常用于局域网内的通信。
特点
一对多:数据从一个源地址发送到网络中的所有主机。
范围有限:广播通常仅限于局域网内,无法跨网络边界传播。
适用场景:适用于局域网内的服务发现、设备发现或消息通知,例如DHCP客户端请求IP地址、ARP请求等。
优点
简单易用:实现起来相对简单,不需要复杂的组管理机制。
快速发现:适用于在局域网内快速发现服务或设备,例如打印机、文件服务器等。
缺点
效率较低:广播会将数据发送到网络中的所有主机,即使有些主机并不需要这些数据,可能会浪费带宽。
安全风险:广播数据对所有主机可见,容易被监听或攻击。
范围限制:广播数据无法跨网络边界传播,只能在局域网内使用。

总结

特性/方式单播组播广播
数据流向一对一一对多或多对多一对多
效率高(点对点)高(网络设备复制)低(发送到所有主机)
可靠性不可靠(UDP)不可靠(UDP)不可靠(UDP)
适用场景客户端与服务器通信视频会议、在线直播局域网内服务发现
网络要求无特殊要求需要组播支持无特殊要求
安全性较高(目标明确)需要额外安全措施较低(数据对所有主机可见)

receive.java

package Udpdemo;import java.io.IOException;
import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.SocketException;public class Receivedemo {public static void main(String[] args) throws IOException {//1.创建对象DatagramSocket ds = new DatagramSocket(10086);//2.接收数据byte[] bytes = new byte[1024];DatagramPacket dp = new DatagramPacket(bytes,bytes.length);while (true) {ds.receive(dp);//3.解析数据byte[] data = dp.getData();int len = dp.getLength();String ip = dp.getAddress().getHostAddress();String name = dp.getAddress().getHostName();//4.打印数据System.out.println("ip为:" + ip + ",主机名为:" + name + "的人,发送的数据为:" + new String(data,0,len));}}
}

** send.java**

package Udpdemo;import java.io.IOException;
import java.net.*;
import java.util.Scanner;public class Sentdemo {public static void main(String[] args) throws IOException {/* 实现程序UDP发送:数据来自键盘录入,直到输入的数据是886,发送数据结束UDP接收:接收数据,并把接收到的数据在控制台输出,死循环输入*///1.创建DatagramSocket对象DatagramSocket ds = new DatagramSocket();//2.打包数据Scanner sc = new Scanner(System.in);while (true) {System.out.println("输入想说的话:");String str = sc.nextLine();if ("886".equals(str)) {break;}byte[] bytes = str.getBytes();InetAddress address = InetAddress.getByName("127.0.0.1");int port = 10086;DatagramPacket dp = new DatagramPacket(bytes, bytes.length, address, port);//3.发送数据ds.send(dp);}//4.释放资源ds.close();}
}

输入

在这里插入图片描述

输出

在这里插入图片描述

为send创建多个实例即可实现共同聊天。

http://www.xdnf.cn/news/7008.html

相关文章:

  • 使用 Python 打造一个强大的文件系统结构创建器
  • 前脚收购 Windsurf 后,OpenAI 深夜发布 Codex。
  • 基于Yolov8+PyQT的老人摔倒识别系统源码
  • 计算机视觉与深度学习 | Python实现EMD-CNN-LSTM时间序列预测(完整源码、数据、公式)
  • 基于CentOS7制作OpenSSL 1.1的RPM包
  • Webpack DefinePlugin插件介绍(允许在编译时创建JS全局常量,常量可以在源代码中直接使用)JS环境变量
  • HarmonyOS:重构万物互联时代的操作系统范式
  • 6.1.1图的基本概念
  • 在宝塔中使用.NET环境管理部署 .NET Core项目
  • GO语言语法---if语句
  • VSCode launch.json 配置参数详解
  • 软件调试纵横谈-17-win32堆的调试支持
  • Android开发——轮播图引入
  • Redis设计与实现——Redis命令参考与高级特性
  • impala
  • 基于KAN+Transformer的专业领域建模方法论
  • 【滑动窗口】LeetCode 1658题解 | 将 x 减到 0 的最小操作数
  • day28 python 类与继承
  • EXO 可以将 Mac M4 和 Mac Air 连接起来,并通过 Ollama 运行 DeepSeek 模型
  • Ansible模块——服务管理和设置定时任务
  • 中药药效成分群的合成生物学研究进展-文献精读130
  • json schema校验json字符串(networknt/json-schema-validator)
  • PySide6 GUI 学习笔记——常用类及控件使用方法(常用类颜色QColor)
  • Java-反射(Reflection)
  • Power BI Desktop开发——矩阵相关操作
  • 智慧校园(含实验室)智能化专项汇报方案
  • 精益数据分析(64/126):移情阶段的用户触达策略——从社交平台到精准访谈
  • 在Solana上使用 Scaled UI Amount 扩展
  • 机器学习回归预测中预处理的特征工程
  • 如何根据竞价数据判断竞价强度,是否抢筹等