UDP 协议基础介绍

协议头

UDP协议头相对简单,由4个字段组成,每个字段的长度都是固定的。UDP协议头一共占8个字节,具体结构如下:

  • 源端口号:占2个字节,表示发送方的端口号。

  • 目的端口号:占2个字节,表示接收方的端口号。

  • 长度:占2个字节,表示UDP数据报的总长度(包括协议头和数据部分)。

  • 校验和:占2个字节,用于校验UDP数据报在传输过程中是否出错。

通讯方式

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

由于传输数据不建立连接,因此也就不需要维护连接状态,包括收发状态等,因此一台服务机可同时向多个客户机传输相同的消息。UDP信息包的标题很短,只有8个字节,相对于TCP的20个字节信息包的额外开销很小。

Java 代码示例

以下是一个简单的UDP服务器和客户端的Java代码示例:

UDP服务器

import java.net.DatagramPacket;
import java.net.DatagramSocket;

public class UDPServer {
    public static void main(String[] args) throws Exception {
        DatagramSocket socket = new DatagramSocket(8888);
        byte[] buffer = new byte[1024];
        DatagramPacket packet = new DatagramPacket(buffer, buffer.length);
        socket.receive(packet);
        String msg = new String(packet.getData(), 0, packet.getLength());
        System.out.println("Server received: " + msg);
        socket.close();
    }
}

UDP客户端

import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.InetAddress;

public class UDPClient {
    public static void main(String[] args) throws Exception {
        DatagramSocket socket = new DatagramSocket();
        String msg = "Hello, Server!";
        InetAddress address = InetAddress.getByName("localhost");
        DatagramPacket packet = new DatagramPacket(msg.getBytes(), msg.length(), address, 8888);
        socket.send(packet);
        System.out.println("Client sent: " + msg);
        socket.close();
    }
}

在这个例子中,服务器监听8888端口,客户端向服务器的这个端口发送消息。服务器接收到消息后,打印出接收到的内容。客户端发送完消息后,也打印出已发送的内容。