UDP -- 用户数据报协议

一、UDP协议:User DatagramProtocol

  一种无连接的传输层协议,提供面向事务的简单不可靠的信息传送服务

特点:

  • 非面向连接,传输不可靠,可能丢失数据;
  • 数据传输时不会进行事前连接和事后断开连接;
  • 发送方不管对方是否准备好,接收方收到也不会确认;
  • 可以广播发送;
  • 非常简单的协议,开销小;

  进程的每个输出操作都正好产生下一个UDP数据报,并组装成一份待发送的IP数据报,格式如图:
在这里插入图片描述
  应用程序必须关心 IP数据报的长度。如果它超过网络的 MTU,那么就要对 IP数据报进行分片。如果需要,源端到目的端之间的每个网络都要进行分片,并不只是发送端主机连接第一个网络才这样做。

二、UDP首部

在这里插入图片描述
  UDP检验和覆盖UDP首部和UDP数据,UDP和TCP首部都覆盖首部和数据的检验和,但UDP的检验和是可选的,而TCP的检验和是必需的;
  UDP数据报的长度可以为奇数字节,但是检验和算法是把若干个16 bit字相加。解决方法是必要时在最后增加填充字节0,这只是为了检验和的计算(也就是说,可能增加的填充字节不被传送),其次,UDP数据报和TCP段都包含一个12字节长的伪首部,它是为了计算检验和而设置的。伪首部包含IP首部一些字段。其目的是让UDP两次检查数据是否已经正确到达目的地。
  如果发送端没有计算检验和而接收端检测到检验和有差错,那么UDP数据报就要被悄悄
地丢弃。不产生任何差错报文(当IP层检测到IP首部检验和有差错时也这样做),UDP检验和是一个端到端的检验和。它由发送端计算,然后由接收端验证。其目的是为了发现UDP首部和数据在发送端到接收端之间发生的任何改动。尽管UDP检验和是可选的,但是它们应该总是在用。
  Host Requirements RFC声明,UDP检验和选项在默认条件下是打开的。它还声明,如果发送端已经计算了检验和,那么接收端必须检验接收到的检验和(如接收到检验和不为0)。但是许多系统没有遵守这一点,只是在出口检验和选项被打开时才验证接收到的检验和。

三、UDP编程练习
  • Server
public class UDPServer {
    public static void main(String[] args) throws IOException {
        System.out.println("接收方启动中...");
        //1、使用DatagramSocket 指定端口,创建接收端
        DatagramSocket socket = new DatagramSocket(9999);
        //2、准备容器 封装成DatagramPacket包裹
        byte[] bytes = new byte[1024]; //
        DatagramPacket packet = new DatagramPacket(bytes,0,bytes.length);
        //3、阻塞式接收包裹 receive(DatagramPacket p)
        socket.receive(packet);
        //4、分析数据
        byte[] datas = packet.getData();
        int length = packet.getLength();
        System.out.println(new String (datas,0,length));
        //5、释放资源
        socket.close();
    }
}
  • Client
public class UDPClient {
    public static void main(String[] args) throws IOException {
        System.out.println("发送方启动中...");
        //1、使用DatagramSocket 指定端口,创建发送端
        DatagramSocket socket = new DatagramSocket(8888);
        // 2、准备数据 转成字节数组
        String s = "daria";
        byte[] bytes = s.getBytes();
        // 3、封装成DatagramPacket包裹,需要指定目的地
        DatagramPacket packet = new DatagramPacket(bytes,0,bytes.length,
                new InetSocketAddress("localhost" ,9999));
        // 4、发送包裹 send(DatagramPacket p)
        socket.send(packet);
        // 5、释放资源
        socket.close();
    }
}
四、基于TCP和UDP协议进行Socket编程的区别
基于TCP协议的Socket编程 基于UDP协议的Socket编程
通信双方需要建立连接 通信双方不需要建立连接
连接建立时双方存在主次之分 通信双方完全平等

流式服务:数据是一条数据源,数据是没有界限的,发送次数和接收的次数没有直接关系,
     接收方将数据放在缓冲区,数据一次不能接收完,可以放在缓冲区,进行二次读取;
数据报服务:发送次数和接收次数相等,
      如果接收端一次未能读取完传输层的数据,剩余的数据直接被丢弃掉。

猜你喜欢

转载自blog.csdn.net/Daria_/article/details/90720084