美文网首页
一文读懂UDP协议

一文读懂UDP协议

作者: 迪捷软件 | 来源:发表于2022-01-05 16:17 被阅读0次

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目前可以运行主流的操作系统,还能适配国内自主研发的操作系统天脉。

相关文章

网友评论

      本文标题:一文读懂UDP协议

      本文链接:https://www.haomeiwen.com/subject/lhyhcrtx.html