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

相关推荐
IP管家几秒前
跨境支付风控失效?用代理 IP 构建「地域 - 设备 - 行为」三维防护网
网络·网络协议·tcp/ip·网络安全
YGGP3 小时前
应用层协议简介:以 HTTP 和 MQTT 为例
mqtt·网络协议·http·rpc
Chocolate_men3 小时前
ftp、http下载远程文件(多线程、断点续传)
python·网络协议·http
上海云盾第一敬业销售3 小时前
API面临哪些风险,如何做好API安全?
服务器·网络·安全
花菜会噎住5 小时前
Python 计算机网络TCP网络应用程序开发
网络·python·tcp/ip·计算机网络·客户端·服务端
牛马的人生5 小时前
使用亮数据代理IP+Python爬虫批量爬取招聘信息训练面试类AI智能体(手把手教学版)
爬虫·python·tcp/ip·其他
吱吱企业安全通讯软件7 小时前
保密行业工作沟通安全:吱吱软件的“四重防泄露”设计
网络·安全·信息与通信
追随远方7 小时前
Android OkHttp控制链:深入理解网络请求的流程管理
android·网络·okhttp
网安世纪8 小时前
灾备认证助力构建数据资产安全防线‌
网络·安全