UDP是用户数据报协议(User Datagram protocol)的简称,其主要作用是将网络数据封装成数据报形式,提供面向服务的简单信息传送服务。
与TCP协议不同,UDP协议直接利用IP协议进行UDP数据报的传输,UDP提供的是面向无连接的、不可靠的数据报投递服务。当使用UDP协议传输信息时,用户应用程序必须负责解决数据报丢失、重复、排序,差错确认等问题。
UDP协议的特点如下。
(1)UDP传送数据前并不与对方建立连接,即UDP是无连接的。在传输数据前,发
送方和接收方相互交换信息使双方同步;
(2)UDP对接收到的数据报不发送确认信号,发送端不知道数据是否被正确接收,也
不会重发数据;
(3)UDP传送数据比TCP快速,系统开销也少:UDP比较简单,UDP头包含了源端口、目的端口、消息长度和校验和等很少的字节。由于UDP比TCP简单、灵活,常用于可靠性要求不高的数据传输,如视频、图片以及简单文件传输系统(TFTP)等。TCP则适用于可靠性要求很高但实时性要求不高的应用,如文件传输协议FTP、超文本传输协议HTTP、简单邮件传输协议SMTP等。
UDP数据报
UDP数据报格式有首部和数据两个部分,首部很简单,为8个字节。
(1)源端口:源端口号,2个字节,最大值为65535;
(2)目的端口:目的端口号,2个字节,最大值为65535;
(3)长度:2字节,UDP用户数据报总长度;
(4)检验和:2字节,用于校验UDP数据报的数字段和包含UDP数据报首部的“伪首部”。
示意图如下:
伪首部,又称伪包头:是在TCP的分段或UDP的数据报格式中,在数据报首部前面增加源IP地址、目的IP地址、IP分组的协议字段(上图为17,因为UDP在IP报文的协议号是17)、TCP或UDP数据报的总长度等。
Netty应用UDP协议示例
UDP服务端NettyUDPServerTest类:
package test.netty.udp_test;
import io.netty.bootstrap.Bootstrap;
import io.netty.channel.ChannelOption;
import io.netty.channel.EventLoopGroup;
import io.netty.channel.nio.NioEventLoopGroup;
import io.netty.channel.socket.nio.NioDatagramChannel;
public class NettyUDPServerTest {
public void run(int port) throws Exception {
EventLoopGroup group = new NioEventLoopGroup();
try {
Bootstrap b = new Bootstrap();
b.group(group).channel(NioDatagramChannel.class)
.option(ChannelOption.SO_BROADCAST, true)
.handler(new NettyUDPServerHandler());
b.bind(port).sync().channel().closeFuture().await();
} finally {
group.shutdownGracefully(