UDP协议详解

2023-10-26


UDP概述

UDP 是User Datagram Protocol的简称, 中文名是用户数据报协议,是OSI(Open System Interconnection,开放式系统互联) 参考模型中一种无连接的传输层协议,提供面向事务的简单不可靠信息传送服务,IETF RFC 768是UDP的正式规范。UDP在IP报文的协议号是17。

UDP协议全称是用户数据报协议,在网络中它与TCP协议一样用于处理数据包,是一种无连接的协议。在OSI模型中,在第四层——传输层,处于IP协议的上一层。UDP有不提供数据包分组、组装和不能对数据包进行排序的缺点,也就是说,当报文发送之后,是无法得知其是否安全完整到达的。UDP用来支持那些需要在计算机之间传输数据的网络应用。包括网络视频会议系统在内的众多的客户/服务器模式的网络应用都需要使用UDP协议。UDP协议从问世至今已经被使用了很多年,虽然其最初的光彩已经被一些类似协议所掩盖,但是即使是在今天UDP仍然不失为一项非常实用和可行的网络传输层协议。

UDP主要特点

UDP是一个无连接协议,传输数据之前源端和终端不建立连接,当它想传送时就简单地去抓取来自应用程序的数据,并尽可能快地把它扔到网络上。在发送端,UDP传送数据的速度仅仅是受应用程序生成数据的速度、计算机的能力和传输带宽的限制;在接收端,UDP把每个消息段放在队列中,应用程序每次从队列中读一个消息段。

由于传输数据不建立连接,因此也就不需要维护连接状态,包括收发状态等,因此一台服务机可同时向多个客户机传输相同的消息。

UDP信息包的标题很短,只有8个字节,相对于TCP的20个字节信息包而言UDP的额外开销很小。

吞吐量不受拥挤控制算法的调节,只受应用软件生成数据的速率、传输带宽、源端和终端主机性能的限制。

UDP是面向报文的。发送方的UDP对应用程序交下来的报文,在添加首部后就向下交付给IP层。既不拆分,也不合并,而是保留这些报文的边界,因此,应用程序需要选择合适的报文大小。

虽然UDP是一个不可靠的协议,但它是分发信息的一个理想协议。例如,在屏幕上报告股票市场、显示航空信息等等。UDP也用在路由信息协议RIP(Routing Information Protocol)中修改路由表。在这些应用场合下,如果有一个消息丢失,在几秒之后另一个新的消息就会替换它。UDP广泛用在多媒体应用中。

TCP和UDP区别

TCP 是面向连接的传输控制协议,而UDP 提供了无连接的数据报服务;

TCP 具有高可靠性,确保传输数据的正确性,不出现丢失或乱序,而UDP 在传输数据前不建立连接,不对数据报进行检查与修改,无须等待对方的应答,所以会出现分组丢失、重复、乱序,应用程序需要负责传输可靠性方面的所有工作;

UDP 具有较好的实时性,工作效率较 TCP 协议高;

UDP 段结构比 TCP 的段结构简单,因此网络开销也小;

TCP 协议可以保证接收端毫无差错地接收到发送端发出的字节流,为应用程序提供可靠的通信服务。对可靠性要求高的通信系统往往使用 TCP 传输数据。

应用

适用场合

在选择UDP作为传输协议时必须要谨慎。在网络质量令人十分不满意的环境下,UDP协议数据包丢失会比较严重。但是由于UDP的特性:它不属于连接型协议,因而具有资源消耗小,处理速度快的优点,所以通常音频、视频和普通数据在传送时使用UDP较多,因为它们即使偶尔丢失一两个数据包,也不会对接收结果产生太大影响。比如我们聊天用的ICQ和QQ就是使用的UDP协议。

实际应用

在现场测控领域,面向的是分布化的控制器、监测器等,其应用场合环境比较恶劣,这样就对待传输数据提出了不同的要求,如实时、抗干扰性、安全性等。基于此,现场通信中,若某一应用要将一组数据传送给网络中的另一个节点,可由UDP进程将数据加上报头后传送给IP进程,UDP协议省去了建立连接和拆除连接的过程,取消了重发检验机制,能够达到较高的通信速率。

代码演示

简单的一个客户端/服务端数据收发的例子

UDP客户端:

public class UdpClient {

    public static void main(String[] args) throws IOException {
        //建立一个socket
        DatagramSocket socket = new DatagramSocket();
        //创建一个数据包
        String msg = "你好啊,服务器~";
        InetAddress localhost = InetAddress.getByName("localhost");
        int port = 9090;
        DatagramPacket packet = new DatagramPacket(msg.getBytes(), 0, msg.getBytes().length, localhost, port);
        //发送数据包
        socket.send(packet);
        //关闭流
        socket.close();
    }
}

UDP服务端:

public class UdpServer {

    public static void main(String[] args) throws IOException {
        //开启端口
        DatagramSocket socket = new DatagramSocket(9090);
        //接收数据包
        byte[] bytes = new byte[1024];
        DatagramPacket packet = new DatagramPacket(bytes, 0, bytes.length);
        //阻塞接收
        socket.receive(packet);
        String msg = new String(packet.getData(),0,packet.getLength());
        System.out.println("接收到客户端发来的数据:" + msg);
        //关闭数据流
        socket.close();
    }
}

模拟一个学生和老师的聊天对话

//客户端
public class TalkSend implements Runnable {

    DatagramSocket socket = null;
    
    BufferedReader br = null;

    private int formPort;
    
    private String toIp;
    
    private int toPort;

    public TalkSend(int formPort, String toIp, int toPort) {
        this.formPort = formPort;
        this.toIp = toIp;
        this.toPort = toPort;
        try {
            socket = new DatagramSocket(this.formPort);
            //准备数据 控制台读取System.in
            br = new BufferedReader(new InputStreamReader(System.in));
        } catch (SocketException e) {
            e.printStackTrace();
        }
    }

    @Override
    public void run() {
        while (true) {
            try {
                String msg = br.readLine();
                byte[] bytes = msg.getBytes();
                DatagramPacket packet = new DatagramPacket(bytes, 0, bytes.length, new InetSocketAddress(this.toIp, this.toPort));
                //发送数据
                socket.send(packet);
                if (msg.equals("bye")) {
                    break;
                }
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
        socket.close();
    }
}
//服务端
public class TalkReceive implements Runnable {

    DatagramSocket socket = null;

    private int port;

    private String msgForm;

    public TalkReceive(int port, String msgForm) {
        this.port = port;
        this.msgForm = msgForm;
        try {
            socket = new DatagramSocket(port);
        } catch (SocketException e) {
            e.printStackTrace();
        }
    }


    @Override
    public void run() {
        while (true) {
            try {
                //准备接收包裹
                byte[] bytes = new byte[1024];
                DatagramPacket packet = new DatagramPacket(bytes, 0, bytes.length);
                socket.receive(packet);
                //断开连接 bye
                String msg = new String(packet.getData(), 0, packet.getLength());
                System.out.println(msgForm + ":" + msg);
                if ("bye".equals(msg)) {
                    break;
                }
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
        socket.close();
    }
}
public class TalkStudent {
    public static void main(String[] args) {
        new Thread(new TalkSend(7777,"localhost",8888)).start();
        new Thread(new TalkReceive(9999,"老师")).start();
    }
}
public class TalkTeacher {
    public static void main(String[] args) {
        new Thread(new TalkSend(5555,"localhost",9999)).start();
        new Thread(new TalkReceive(8888,"学生")).start();
    }
}

测试一下,结果如下:

image-20210420140845047.png

image-20210420140915126.png

总结

  • UDP用户数据报协议,是面向无连接的通讯协议,UDP数据包括目的端口号和源端口号信息,由于通讯不需要连接,所以可以实现广播发送。

  • UDP通讯时不需要接收方确认,属于不可靠的传输,可能会出现丢包现象,实际应用中要求程序员编程验证。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

UDP协议详解 的相关文章

  • 从 iOS 应用程序上的 UDP 服务器接收数据无法在 Linux 服务器上工作,但可以在 macbook pro 上工作 [关闭]

    这个问题不太可能对任何未来的访客有帮助 它只与一个较小的地理区域 一个特定的时间点或一个非常狭窄的情况相关 通常不适用于全世界的互联网受众 为了帮助使这个问题更广泛地适用 访问帮助中心 help reopen questions 背景 我做
  • 丢包纠错码 (UDP)

    我不知道要寻找什么 因为我从 纠错代码 中得到的只是与您不知道错误位置的情况相关的内容 因此 这些代码比我需要的要复杂得多 而且效率低下 在下文中 请注意位等于数据包 因为只有整个数据包可能会丢失 因此位类比非常适合 是否有 ECC 考虑到
  • Python-UDP客户端

    我目前正在阅读Pythonbook https www nostarch com blackhatpython并遇到了以下示例 import socket target host 127 0 0 1 target port 80 creat
  • 移动提供商无法进行 UDP 打洞

    实际上 我正在编写一个 Android 应用程序 该应用程序接收连接到 PC 的网络摄像头的图片 为了获得更多的 fps 我使用 udp 协议而不是 tcp 这个想法是 电脑将图片发送到手机的 IP 和端口 但电话提供商有不同的公共端口 所
  • 如果客户端在服务器之后启动,则 GStreamer v1.0 UDP 多播流无法正确解码

    我正在尝试使用 GStreamer 进行 UDP 多播屏幕流传输 我的投屏服务器应该在 Windows 上运行 and my 客户端应在 Linux 上运行 如果我在服务器之前启动客户端 一切都很好 问题是当我启动客户端并且服务器已经启动时
  • 为什么UDP服务器上的UDP客户端端口会改变

    我一直在关注一个简 单的 UDP 服务器 客户端教程 发现here http www binarytides com udp socket programming in winsock 我有一个关于客户端连接到服务器的端口的快速问题 仅从代
  • HTTP 是否使用 UDP?

    这可能是一个愚蠢的问题 HTTP 是否使用过用户数据报协议 例如 如果使用 HTTP 传输 MP3 或视频 它内部是否使用 UDP 进行传输 From RFC 2616 http www ietf org rfc rfc2616 txt 通
  • 接收来自 N 个客户端的响应,以回复通过 UDP 的广播请求

    我正在为特定类型的网络多媒体设备实现一种 IP 查找器 我想找出 LAN 中该类型的所有活动设备及其 IP 地址和其他详细信息 设备有自己的设备发现方式 其工作原理如下 客户端通过 UDP 通过 LAN 发送广播请求 目的端口号是固定的 作
  • C# 广播是UDP消息,监听多个回复

    我正在尝试编写一些执行 UDP 广播的代码 然后侦听来自远程服务器的答复 说明它们存在 它用于识别子网上运行服务器应用程序的计算机 因此基本上会发出 谁在那儿 并听取所有答复 我在 Java 中有这个 工作完美 它将 DatagramPac
  • iOS 14 在进行本地网络广播时给出“操作系统错误:错误的文件描述符,errno = 9”

    做一点Jeopardy 风格问答 https stackoverflow blog 2011 07 01 its ok to ask and answer your own questions here 我正在 Flutter 中开发一个应
  • 如何在QT中发送和接收UDP数据包

    我正在 QT 中编写一个小型应用程序 它通过本地网络发送广播 UDP 数据包 并等待来自网络上的一个或多个设备的 UDP 响应数据包 创建套接字并发送广播数据包 udpSocketSend new QUdpSocket this udpSo
  • 互联网上的 UDP 多播?

    我不确定如何最好地解决我的问题 我有一个在远程计算机上运行的服务 用于接收和处理 UDP 数据包 我希望该服务能够将这些数据包重新发送给任何需要它们的人 可能是任何人 通常是一台机器 但也可能更多 我认为 UDP 多播将是理想的 该服务可以
  • 我刚刚在哪个适配器上收到此 UDP 数据包?

    我正在尝试用 C 编写一个 BOOTP 服务器 我正在接收并解析来自客户端的 BOOTP 数据包 我需要回复我的服务器 IP 地址 问题是 计算机可以有多个网络适配器 客户端还没有 IP 地址 有什么方法可以查出 UDP 数据包是在哪个适配
  • 在 Perl 中如何接受多个 TCP 连接?

    我对 Linux 的 Perl 脚本有疑问 它的主要目的是成为 3 个应用程序之间的中间人 它应该做什么 它应该能够等待 UDP 文本 不带空格 udp port 当它收到 UDP 文本时 它应该将其转发到连接的 TCP 客户端 问题是我的
  • Windows 操作系统中无法访问的 IP 套接字关闭时间

    这些代码通过用户数据报协议提供发送数据 下面有两个代码 当我使用第一个代码来处理无法访问的 IP 地址时 我得到了三秒的延迟 请查看新结果标题 只需打开新的 C 控制台应用程序并将这些代码粘贴到其中 第一个代码 using System u
  • 为什么我们可以将 sockaddr 转换为 sockaddr_in

    我明白为什么强制转换很有用sockaddr to sockaddr in 但我不明白这怎么可能 据我所知 它们的大小相同sockaddr in添加了sin zero使其大小相同 我想知道编译器如何知道从哪里获取信息sockaddr in如果
  • 为什么通过UdpClient发送会导致后续接收失败?

    我正在尝试创建一个 UDP 服务器 它可以向所有向其发送消息的客户端发送消息 真实情况要复杂一些 但最简单的方法是将其想象为一个聊天服务器 之前发送过消息的每个人都会收到其他客户端发送的所有消息 所有这一切都是通过UdpClient 在单独
  • 自 2012 年以来,WinSock 注册 IO 性能是否有所下降?

    我最近使用 MS 为该 API 提供的稍微可接受的文档编写了基于 WinSock Registered IO RIO 的 UDP 接收 最终的性能非常令人失望 单套接字性能有些稳定 约为每秒 180k 数据包 使用多个 RSS 队列 即多个
  • 数据包丢失和数据包重复

    我试图找出数据包丢失和数据包重复问题之间的区别 有谁知道 数据包重复 是什么意思 和TCP检测到丢失时重传数据包一样吗 No In TCP 数据包 的传递是可靠的 我认为在这种情况下术语数据应该更好 因为它是面向流的协议 数据包丢失和重复是
  • 如何使用 Nmap 检索 TCP 和 UDP 端口? [关闭]

    Closed 这个问题是无关 help closed questions 目前不接受答案 我需要在使用 Nmap 的同一扫描中以尽可能最快的方式检索 TCP 和 UDP 端口 我会尽力解释得更好 如果我使用最常用的命令 nmap 192 1

随机推荐

  • 【华为OD统一考试B卷

    在线OJ 已购买本专栏用户 请私信博主开通账号 在线刷题 运行出现 Runtime Error 0Aborted 请忽略 华为OD统一考试A卷 B卷 新题库说明 2023年5月份 华为官方已经将的 2022 0223Q 1 2 3 4 统一
  • APP压力测试之Monkey

    文章目录 前言 第一章 概述 1 1 什么是Monkey测试 1 2 Monkey测试的内容是什么 1 3 为什么要进行monkey测试 1 4 Monkey测试的有点是什么 有什么缺点 第二章 环境的搭建 2 1 Android SDK
  • Angular路由 ng-route和ui-router的区别

    什么是路由 路由是AngularJS构建单页面应用的基础 路由 就是网络数据或者请求进行分发的一个网络组件 路由就是一个用于请求URL分发和跳转的一个应用组件 Angular中通过 routeProvider路由服务提供者进行核心的配置处理
  • 软件打包成rpm包的方法

    01 所用软件 打包rpm建议使用fpm软件 fpm软件来源自ruby的生态 安装方式如下 首先安装ruby的环境 yum install ruby devel gcc make rpm build rubygems 再安装fpm软件 ge
  • 常用的国内 PyPI 镜像

    从网上整理一些常用的国内 PyPI 镜像 阿里云 https mirrors aliyun com pypi simple 清华 https pypi tuna tsinghua edu cn simple 中国科技大学 https pyp
  • 个人笔记新解-Obsidian

    欢迎关注 攻城狮Gala 公 众 号 每天一起学习 努力成为Web3全栈 自己之前一直在使用为知笔记 体验越来越糟糕 主要有几个原因 为知笔记的编辑器很难用 尤其是对md的支持很差 最近有备份需求 但是为知笔记新版本竟然去掉导出文件夹功能
  • 安装 Realtek HD Audio Driver 失败 Error Code : 0xE0000100

    更新声卡驱动提示 安装Realtek HD Audio Driver失败 Error Code 0xE0000100 错误 尝试各种版本驱动无效 以下是解决方案 1 下载windows7声卡驱动修复压缩包 直接复制以下下载地址下载 http
  • 我是女生,想进入IT行业难吗?

    女生进入IT职业真的不难 我从事IT职业6年多 身边有许多女同事 她们工资都非常高 她们中有程序员 测验人员 有技能支持人员 有产品司理 有项目司理 有UI规划师等等 她们有的是计算机专业结业的 也有非计算机专业结业的 虽然她们起点的确不太
  • fatal: Not a valid object name: ‘master‘.

    Git创建分支错误 Administrator DESKTOP RL96PC3 MINGW64 e dd master git branch devfatal Not a valid object name master 原因 是因为我们刚
  • 模板方法模式(模板方法设计模式)与回调机制解析

    模板方法是什么 模板方法模式在一个方法中定义一个算法的骨架 将某些步骤推迟到子类中实现 模板方法模式可以让子类在不改变算法整体的结构情况下 重新定义算法中的某些步骤 public abstract class AbstractClass p
  • 图的基础定义

    连通分量 相互可达的结点称为一个连通分量 割顶 删除某个点后 使图不再联通 桥 删除某个边后 使图不再联通 双连通 任意两点之间至少存在两条 点不重复 的路径 此时内部无割顶 双连通分量 点 双连通的一个极大子图 BCC 边 双连通分量 边
  • SDMG-R模型学习笔记

    商汤出的算法 用于关键信息提取 KIE 集成在mmocr包里 需要搭配mmcv一起使用 本文将结合论文 源码对模型结构进行一个梳理 题外话 mmcv用了hook编程 调试起来还是蛮难的 以后有空再分享下mmcv的框架逻辑 模型结构 整体结构
  • jira数据迁移过程

    jira数据迁移是常见的软件开发过程中遇到的问题 在数据迁移过程中下面讲解简单的过程 1 配置好jdk 2 配置好mysql数据库 3 配置好jira 4 在mysql中创建一个数据库 必须在创建时设置好数据库的字符集 为这个数据库创建一个
  • web前端入门到实战:CSS3 filter(滤镜)属性

    css3的滤镜filter属性 可以对网页中的图片进行类似Photoshop图片处理的效果 例如背景的毛玻璃效果 老照片 黑白照片 火焰效果等 一 blur px 高斯模糊 二 brightness 亮度 三 contrast 对比度 四
  • 通过Visio软件的宏编写Java代码

    1 新建Visio文件并打开 2 在 开发工具 选项卡上 单击 录制宏 3 操作Visio 如画图 画线等 4 点击停止录制 5 点击宏 6 可以查看到VB窗口的代码 可以一步步调试 根据宏代码尝试编写Java代码 一般情况下 宏中使用的代
  • 阿里面试题:为什么Map桶中个数超过8才转为红黑树

    这是一个好友面试阿里时 被问到的一个问题 应该不少人看到这个问题都会一面懵逼 因为 大部分的文章都是分析链表是怎么转换成红黑树的 但是并没有说明为什么当链表长度为8的时候才做转换动作 第一反应也是一样 只能初略的猜测是因为时间和空间的权衡
  • CloudQuery:更好地管理你的 OceanBase 数据库

    前言 作为 OceanBase 的生态合作伙伴 CloudQuery 简称 CQ 最新发布的社区版 2 2 0 新增了 OceanBase 数据库 为企业使用 OceanBase 数据库提供全面的支持 包括连接与认证 查询与分析 数据安全与
  • 软件测试开发和软件测试有什么区别?

    软件测试 软件测试是在测试中识别软件产品和 服务的准确性和质量的过程 显然 它的诞生是为了验证产品是否满足客户的特定先决条件和需求 在一天的工作结束前 确定特定的较终目标并测试执行一个框架或应用程序 以指出其错误 或缺陷 测试的职责是找到b
  • 颜色值透明度的百分数对应十六进制表

    目录 颜色简介 1 透明度的计算 2 透明度和不透明度的转换 3 透明度对应的十六进制值 4 不透明度对应的十六进制值 颜色简介 Android中的颜色值通常遵循RGB ARGB标准 使用时通常以 字符开头 以16进制表示 常用的颜色值格式
  • UDP协议详解

    文章目录 UDP概述 UDP主要特点 TCP和UDP区别 应用 适用场合 实际应用 代码演示 总结 UDP概述 UDP 是User Datagram Protocol的简称 中文名是用户数据报协议 是OSI Open System Inte