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

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创建多个实例即可实现共同聊天。

相关文章:

  • Vue框架
  • vue2 切换主题色以及单页面好使方法
  • 【HCIA】聚合VLAN
  • QT+Visual Studio 配置开发环境教程
  • Java—异常体系
  • 如何开发专业小模型
  • windows触摸板快捷指南
  • 杭电多校10 : 1007 小塔的魔法树
  • 分糖果--思维+while判断
  • CSS- 4.2 相对定位(position: relative)
  • 前端基础之CSS
  • 【001】RenPy打包安卓apk 流程源码级别分析
  • (面试)TCP、UDP协议
  • 手写tomcat:基本功能实现(4)
  • 轻量、优雅、高扩展的事件驱动框架——Hibiscus-Signal
  • Git 版本控制系统入门指南
  • 我的世界模组开发——特征(2)
  • 使用 Vue Tour 封装一个统一的页面引导组件
  • Typescript学习教程,从入门到精通,TypeScript 函数语法知识点及案例代码(5)
  • 六、绘制图片
  • 新华每日电讯:博物馆正以可亲可近替代“高冷范儿”
  • 哈马斯与以色列在多哈举行新一轮加沙停火谈判
  • 莫高义在第四届中国新闻发言人论坛开幕式上的致辞
  • 哪条线路客流最大?哪个站点早高峰人最多?上海地铁一季度客流报告出炉
  • 一箭六星,朱雀二号改进型遥二运载火箭发射成功
  • 占地57亩的“潮汕豪宅”面临强制拆除:曾被实施没收,8年间举行5次听证会