一文读懂UDP协议

UDP(User Datagram Protocol) 用户数据报协议

什么是UDP

数据分发服务(DDS™)是一个简单的面向数据报的通信协议,位于OSI模型的传输层。该协议在RFC 768中被规范。典型网络上的众多使用UDP协议的关键应用在一定程度上是相似的。

使用UDP的优势

相比于TCP 协议,UDP具有更低的消耗和延迟优势,适用于不需要或在程序中执行错误检查和纠正的应用,它避免了协议栈中此类处理的开销。因为在特定场景里丢弃数据包比等待或重传导致延迟更可取。

使用UDP的劣势

由于UDP缺乏可靠性且属于无连接协议,所以应用程序通常必须容许一些丢失、错误或重复的数据包。某些应用程序(如TFTP)可能会根据需要在应用程序层中添加基本的可靠性机制。

应用场景

许多关键的互联网应用程序使用UDP,包括:

域名系统(DNS),其中查询阶段必须快速,并且只包含单个请求,后跟单个回复数据包:

1.动态主机配置协议(DHCP),用于动态分配IP地址;

2.简单网络管理协议(SNMP)

3.路由信息协议(RIP)

4.网络时间协议(NTP)

流媒体、在线游戏流量通常使用UDP传输。 实时视频流和音频流应用是可以接受偶尔的丢包,不能接受重传数据包带来的高延迟。

UDP的分组结构

UDP报头

报头包括4个字段,每个字段占用2个字节(即16个二进制位)。在IPv4中,“来源连接端口”和“校验和”是可选字段(以粉色背景标出)。在IPv6中,只有来源连接端口是可选字段。 各16bit的来源端口和目的端口用来标记发送和接受的应用进程。因为UDP不需要应答,所以来源端口是可选的,如果来源端口不用,那么置为零。在目的端口后面是长度固定的以字节为单位的长度域,用来指定UDP数据报包括数据部分的长度,长度最小值为8byte。首部剩下的16bit是用来对首部和数据部分一起做校验和(Checksum)的。这部分是可选的,但在实际应用中一般都使用这一功能。

校验和

校验和字段可以用于发现头部信息和数据中的传输错误。该字段在IPv4中是可选的,在IPv6中则是强制的。如果不使用校验和,该字段应被填充为全0。

Java使用UDP协议简单例子

发送端代码:

public class DaytimeUDPClient {    private final static int PORT = 13;        public static void main(String[] args) {        //传入0表示让操作系统分配一个端口号        try (DatagramSocket socket = new DatagramSocket(0)) {            socket.setSoTimeout(10000);            //指定包要发送的目的地            DatagramPacket request = new DatagramPacket(“127.0.0.1”, 1, host, PORT);            //为接受的数据包创建空间            DatagramPacket response = new DatagramPacket(new byte[1024], 1024);            socket.send(request);            socket.receive(response);            String result = new String(response.getData(), 0, response.getLength(), "ASCII");            System.out.println(result);        } catch (IOException e) {            e.printStackTrace();        }    }}

接收端代码:

public class DaytimeUDPServer {    private final static int PORT = 13;    public static void main(String[] args) {        try (DatagramSocket socket = new DatagramSocket(PORT)) {            while (true) {                try {                    DatagramPacket request = new DatagramPacket(new byte[1024], 1024);                    socket.receive(request);                                        String daytime = new Date().toString();                    byte[] data = daytime.getBytes("ASCII");                    DatagramPacket response = new DatagramPacket(data, data.length, request.getAddress(), request.getPort());                    socket.send(response);                    System.out.println(daytime + " " + request.getAddress());                } catch (IOException e) {                    e.printStackTrace();                }            }        } catch (IOException e) {            e.printStackTrace();        }    }}

SkyEye天目全数字实时仿真软件

在复杂嵌入式系统中通常依据数据传输距离远近、数据量大小、实时性、连接端口数量等要求,选择不同网络进行数据通讯。最常用的网络总线接口,如TCP、CAN总线等。由本公司自主研发的SkyEye全数字实时仿真软件是基于可视化建模的硬件行为级仿真平台,利用拖拽的方式快速搭建任意的虚拟硬件平台,保证虚拟嵌入式系统的可靠性和实时性 ,目前已支持 CAN总线、1553B总线等多种通信总线。开发者可以通过SkyEye在嵌入式硬件平台上模拟网络通信代码。SkyEye目前可以运行主流的操作系统,还能适配国内自主研发的操作系统天脉。

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值