资料总结 资料总结
首页
go
java
云原生
  • mysql
  • redis
  • MongoDB
  • 设计模式详解
  • 数据结构与算法
  • 前端
  • 项目
  • 理论基础
  • 运营
  • 分类
  • 标签
  • 归档
GitHub (opens new window)

linghui Wu

一只努力学飞的鱼
首页
go
java
云原生
  • mysql
  • redis
  • MongoDB
  • 设计模式详解
  • 数据结构与算法
  • 前端
  • 项目
  • 理论基础
  • 运营
  • 分类
  • 标签
  • 归档
GitHub (opens new window)
  • 协议

    • UDP
      • tcp
    • DDD领域驱动设计
    • 理论基础
    • 协议
    wulinghui
    2022-02-26
    目录

    UDP

    # 简介

    UDP是传输层的协议,功能即为在IP的数据报文服务之上增加了最基本的服务:复用和分用以及差错检测。

    # 特点

    • 是无连接的,用一次就断了。相比于TCP协议,UDP协议在传送数据前不需要建立连接,当然也就没有释放连接。
    • 是尽最大努力交付的。也就是说UDP协议无法保证数据能够准确的交付到目的主机。也不需要对接收到的UDP报文进行确认。
    • 是面向报文的。也就是说UDP协议将应用层传输下来的数据封装在一个UDP包中,不进行拆分或合并。因此,运输层在收到对方的UDP包后,会去掉首部后,将数据原封不动的交给应用进程。
    • 没有拥塞控制。因此UDP协议的发送速率不送网络的拥塞度影响。
    • UDP支持一对一、一对多、多对一和多对多的交互通信。
    • UDP的头部占用较小,只占用8个字节,TCP首部20字节。

    # 应用场景

    • UDP也常用于多媒体应用(如IP电话,实时视频会议,流媒体等)数据的可靠传输对他们而言并不重要,TCP的拥塞控制会使他们有较大的延迟,也是不可容忍的
    • DNS如果运行在TCP之上而不是UDP,那么DNS的速度将会慢很多

    # 总结

    • 和TCP的相比,就是以速度为主,放弃可靠性。
    • UDP常用于一次性的,传输少量数据的,容许丢失的、网络应用。
    • 或者说是网络波动特别大,tcp动不动就要重发,断线再握手,服务端也要重发发ACK,对2端都不友好。

    # 首部格式

    # 传输过程

    注意: 他们没有连接,也就是说他是单向的,谁都是客户端和服务端。

    客户端 -> 发送消息 -> 接收数剧(可选) -> 关闭套接字

    服务端 -> 接收数剧 -> 发送消息 -> 关闭套接字

    还有: 当传输层从IP层收到UDP数据报时,就根据首部中的目的端口,把UDP数据报通过相应的端口,上交给应用进程。 如果接收方UDP发现收到的报文中的目的端口号不正确(不存在对应端口号的应用进程0,),就丢弃该报文,并由ICMP发送“端口不可达”差错报文给对方。 ICMP是网络层协议,第三层的,在udp层是不知道的哟。 也就是说udp只管发,错了我也不知道,也不管。

    但是一般编程是会写客户端和服务器,来接收和响应数据的,如下图。

    # java编码

    
    class Test{
        public static void main(String[] args)throws IOException{
            //定义udp数据套接字,监听端口.
            DatagramSocket  server = new DatagramSocket(5050);
            //作为服务端,接收数据,并放到DatagramPacket,数组中存放
            server.receive(recvPacket); // 这里会阻塞,直到有消息。
            
            /*
            作为客户端,
            定义数据的发送
            */
            //通过接收到的数据包	获取发送方的端口
            int port = recvPacket.getPort();
            //通过接收到的数据包	获取发送方的ip地址
            InetAddress addr = recvPacket.getAddress();
            //封装需要发送的udp数据包
            DatagramPacket sendPacket 
                = new DatagramPacket("Recv Msg" , sendBuf.length , addr , port );
            //发送数据包
            server.send(sendPacket);  // 这里也不会阻塞..只管发
    
        }
    }
    
    
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25

    # 参考资料

    UDP传输协议 (opens new window)

    大致传输流程,和java代码

    UDP协议的详细解析 (opens new window)

    优势介绍、首部格式、UDP校验。

    常用一次性传输比较少量数据的网络应用

    UDP介绍 (opens new window)

    UDP协议介绍 UDP数据包格式 IP协议介绍 用户数据、 UDP、 IP、 MAC 四个报文的关系

    Java实现UDP通信 (opens new window)

    编辑 (opens new window)
    上次更新: 2023/01/24, 15:21:15
    tcp

    tcp→

    最近更新
    01
    架构升级踩坑之路
    02-27
    02
    总结
    02-27
    03
    语法学习
    02-27
    更多文章>
    | Copyright © 2021-2025 Wu lingui |
    • 跟随系统
    • 浅色模式
    • 深色模式
    • 阅读模式