【JavaEE】网络原理 UDP协议

news2024/11/15 15:27:49

  🔥个人主页: 中草药

🔥专栏:【Java】登神长阶 史诗般的Java成神之路


🎃一.运输层

        运输层(Transport Layer)是OSI七层模型中的第四层,也是TCP/IP四层模型中的第三层。它的主要职责是在网络层的基础上为应用层提供端到端的数据传输服务。运输层负责管理和控制数据在网络中的传输,确保数据能够可靠地从源主机传输到目的主机。

主要功能

  1. 端到端通信:运输层为应用进程之间提供端到端的通信服务,它关注的是源主机与目的主机之间的通信,而不是具体的网络节点之间的通信。
  2. 可靠传输:提供可靠的传输服务,确保数据包按序、无误地传输。
  3. 流量控制:管理数据传输速率,防止发送方过快发送数据导致接收方无法处理。
  4. 拥塞控制:监控网络的拥堵情况,避免过多的数据包同时传输导致网络拥塞。
  5. 差错控制:检测并纠正数据传输中的错误。
  6. 多路复用与分解:将多个应用的数据合并成一个数据流进行传输,然后在接收端再将数据流分解为各个应用的数据。
  7. 地址映射:使用端口号来标识主机上的特定应用进程。

主要的运输层协议

  1. TCP (Transmission Control Protocol):面向连接的协议,提供可靠的、有序的、无数据丢失的服务。TCP 使用三次握手建立连接,并使用四次挥手终止连接。

    • 可靠性:通过确认应答、重传机制和校验和来保证数据的可靠性。
    • 流量控制:使用滑动窗口机制来控制发送速率。
    • 拥塞控制:通过慢启动、拥塞避免、快速重传和快速恢复等机制来避免网络拥塞。
  2. UDP (User Datagram Protocol):无连接的协议,不保证数据的可靠传输,适用于对实时性要求高但对数据丢失不敏感的应用。

    • 简单性:UDP 头部简单,仅有源端口、目的端口、长度和校验和四个字段。
    • 广播和多播:支持广播和多播,适用于实时音频/视频传输等应用场景。

本文,我们详细探讨这两个协议

关键概念

  • 端口号:用于标识主机上的特定应用进程,分为熟知端口(0-1023)、注册端口(1024-49151)和动态端口(49152-65535)。
  • 套接字:组合了IP地址和端口号,用于唯一标识网络中的一个进程。
  • 多路复用:运输层将多个应用的数据流合并为单一的数据流进行传输。
  • 多路分解:运输层在接收端将单一的数据流分解为多个应用的数据流。

运输层与应用层的关系

运输层位于应用层之下,为应用层提供服务。应用层定义了应用程序如何使用运输层协议来发送和接收数据。例如,HTTP 协议使用 TCP 协议来传输数据,而 DNS 查询通常使用 UDP 协议。

🎄二.UDP协议

UDP (User Datagram Protocol) 是一种无连接的传输层协议,用于在网络上传输数据包。与TCP (Transmission Control Protocol) 不同,UDP 提供了一种轻量级的数据传输方式,适用于那些对速度要求较高但对数据丢失不太敏感的应用场景。

  • 16位UDP长度,表示整个数据报(UDP首部+UDP数据)的最大长度(最大为64kb)
  • 如果校验和出错,会直接丢弃 

特点

  1. 无连接:UDP 在发送数据之前不需要建立连接,知道对端的IP和端口号就直接进行传输,因此减少了通信延迟。
  2. 不可靠:UDP 不保证数据包的可靠传输,也不保证数据包的顺序到达。这意味着数据包可能会丢失、重复或乱序。
  3. 面向数据报:不能够灵活的控制读写数据的次数和数量。例:
    如果发送端调用一次sendto, 发送100个字节, 那么接收端也必须调用对应的一次recvfrom, 接收100 个字节; 而不能循环调用10次recvfrom, 每次接收10个字节
  4. 低开销:UDP 的头部开销较小,仅为8字节,这使得它比TCP更适合实时应用,如视频流媒体和在线游戏。
  5. 广播和多播支持:UDP 支持向多个目的地发送数据包,这对于需要广播或多播的应用非常有用。

工作原理

  • 发送数据:发送方将数据封装成UDP数据报(datagram),并添加源端口、目的端口、长度和校验和等字段。
  • 接收数据:接收方接收到UDP数据报后,根据目的端口将数据传递给相应的应用程序。
  • 校验和:UDP 包含一个可选的校验和字段,用于检测数据包在传输过程中的错误。

基于UDP的应用层协议

  • NFS:网络文件系统
  • TFTP:简单文件传输协议
  • DHCP:动态主机配置协议
  • BOOTP:启动协议(用于无盘设备启动)
  • DNS:域名解析协议

应用场景

  • 实时音频/视频传输:由于UDP具有较低的延迟,适合实时通信应用。
  • 在线游戏:对于需要快速响应的游戏,UDP的低延迟特性使其成为理想的选择。
  • DNS查询:域名系统(DNS)通常使用UDP进行查询,因为大多数DNS查询都是短小且不需要确认的。
  • 多播应用:多播(Multicast)允许一个数据包同时发送给多个接收者,非常适合多媒体流等应用。

优势和劣势

优势

  • 低延迟:无需建立连接,减少了握手的时间。
  • 低开销:头部简单,处理速度快。
  • 广播和多播支持:非常适合需要向多个目标发送数据的情况。

劣势

  • 数据包丢失:没有重传机制,数据包可能会丢失而不被发现。
  • 无序接收:数据包可能不会按照发送顺序到达。
  • 无流量控制:发送方不能控制接收方的接收能力,可能导致数据包丢失。

示例代码

UDP客户端

import java.io.IOException;
import java.net.*;
import java.util.Scanner;

public class UdpEchoClient {
    private DatagramSocket socket=null;
    private String serverIP;
    private int serverPort;

    public UdpEchoClient(String serverIP,int serverPort) throws SocketException {
        socket=new DatagramSocket();
        this.serverIP=serverIP;
        this.serverPort=serverPort;
    }

    public void start() throws IOException {
        System.out.println("启动客户端");
        Scanner sc=new Scanner(System.in);

        while(true){
            // 1. 从控制台读取到用户的输入.
            System.out.print("->");
            String request=sc.next();
            // 2. 构造出一个 UDP 请求, 发送给服务器.
            DatagramPacket requestPacket=new DatagramPacket(request.getBytes(), request.getBytes().length,
                    InetAddress.getByName(this.serverIP),this.serverPort);
            socket.send(requestPacket);
            // 3. 从服务器读取到响应
            DatagramPacket responsePacket=new DatagramPacket(new byte[4096],4096);
            socket.receive(responsePacket);
            String response=new String(responsePacket.getData(),0,responsePacket.getLength());
            // 4. 把响应打印到控制台上.
            System.out.println(response);
        }
    }

    public static void main(String[] args) throws IOException{
        UdpEchoClient client=new UdpEchoClient("127.0.0.1",9090);
        client.start();
    }
}

UDP服务器

import java.io.IOException;
import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.nio.charset.StandardCharsets;

/**
 * Udp 无连接 不可靠传输 面向数据报 全双工
 */
public class UdpEchoServer {
    private DatagramSocket socket=null;

    public UdpEchoServer(int port) throws IOException{
        socket=new DatagramSocket(port);
    }

    //通过start启动服务器的核心流程
    public void start() throws IOException {
        System.out.println("服务器启动");
        while(true){
            //此处通过死循环不断处理 客户端 的请求
            //1.读取客户端的请求并解析
            DatagramPacket requestPacket=new DatagramPacket(new byte[4096],4096);
            socket.receive(requestPacket);

            // 上述收到的数据, 是二进制 byte[] 的形式体现的. 后续代码如果要进行打印之类的处理操作
            // 需要转成字符串才好处理.
            String request=new String(requestPacket.getData(),0,requestPacket.getLength());

            // 2. 根据请求计算响应, 由于此处是回显服务器. 响应就是请求.
            String response=process(request);

            // 3. 把响应写回到客户端
            DatagramPacket responsePacket=new DatagramPacket(response.getBytes(),
                    response.getBytes().length,requestPacket.getSocketAddress());
            socket.send(responsePacket);

            // 4. 把日志打印一下.
            System.out.printf("[%s:%d] req=%s, resp=%s\n", requestPacket.getAddress(),
                    requestPacket.getPort(), request, response);
        }
    }

    public String process(String request){
        return request;
    }

    public static void main(String[] args) throws IOException {
        UdpEchoServer server=new UdpEchoServer(9090);
        server.start();
    }
}

🧨三.总结与反思 

书的真正目的在于诱导头脑自己去思考。——莫利

        通过学习UDP,我了解到这是一种轻量级、无连接的传输层协议,适用于对实时性要求较高的应用。尽管UDP存在数据包丢失和顺序问题,但在很多应用场景中,它的低延迟和低开销特性使其成为一个非常合适的选择。在实际开发中,我们需要根据具体需求选择合适的传输协议,并在应用层实现必要的容错机制,以弥补UDP本身的不足之处。通过理论学习与实践相结合,我对UDP有了更深入的理解,并能够在未来的项目中更好地应用这一协议。

  1. 理解协议的本质

    • 在学习UDP的过程中,理解其设计哲学是非常重要的。
    • UDP的设计初衷是为了提供一种轻量级的数据传输方式,适用于那些对延迟敏感但对数据完整性和顺序性要求不高的应用场景。
  2. 实际应用中的考量

    • 在实际应用中,需要综合考虑UDP的优势和劣势。
    • 对于那些对延迟要求极高的应用,UDP是一个非常好的选择;但对于需要高可靠性的应用,则需要考虑使用TCP或其他可靠性更高的协议。
  3. 动手实践的重要性

    • 通过编写UDP的客户端和服务器端程序,可以更好地理解和掌握UDP的工作原理。
    • 实践中遇到的问题可以帮助加深对协议的理解,同时也能够锻炼解决问题的能力。

🍀🍀🍀🍀🍀🍀🍀🍀🍀🍀🍀🍀🍀🍀🍀🍀🍀🍀🍀🍀🍀🍀🍀🍀🍀🍀🍀🍀

以上,就是本期的全部内容啦,若有错误疏忽希望各位大佬及时指出💐

  制作不易,希望能对各位提供微小的帮助,可否留下你免费的赞呢🌸

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2089807.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

在3D Slicer中使用 Monai Bundle 和 Model Zoo 标注医学影像数据-全身CT器官分割

在3D Slicer中使用 Monai Bundle 和 Model Zoo 标注医学影像数据-全身CT器官分割 文章持续更新,可以关注微公【医学图像人工智能实战营】获取最新动态。人手有限,文中涉及的链接前往微公对应文章查看。关注Tina姐,一起学习进步~ 导读 本系列…

云计算基础之Docker

云计算是什么 云计算的本质是计算资源的虚拟化。 与磁盘逻辑卷的分配类似,云计算是在负载波动时动态调整服务器计算资源,避免资源浪费的做法,生产环境中,厂商一般将服务器组成一个池,实现逻辑管理计算资源&#xff0…

实时图像编辑大革新!Adobe发布TurboEdit:可以通过文本来编辑图像,编辑时间<0.5秒!

今天给大家介绍Adobe研究院新的研究TurboEdit&#xff0c;可以通过文本来编辑图像&#xff0c;通过一句话就能改变图像中的头发颜色、衣服、帽子、围巾等等。而且编辑飞快&#xff0c;<0.5秒。简直是图像编辑的利器。 相关链接 项目&#xff1a;betterze.github.io/TurboE…

闪存刷新机制文献的解读

闪存刷新机制文献的解读 一、文献信息1、标题&#xff1a;Flash Correct-and-Refresh: Retention-Aware Error Management for Increased Flash Memory Lifetime2、作者来源&#xff1a;卡耐基梅隆大学 二、Motivation三、Technique ( Flash Correct-and-Refresh, FCR )1、Repr…

如何使用Svg矢量图封装引用到vue3项目中

前言 在现代前端开发中&#xff0c;SVG&#xff08;可缩放矢量图形&#xff09;因其高质量和灵活性成为了图标和图形设计的热门选择。对于 Vue 3 项目而言&#xff0c;将 SVG 图标封装和引用到项目中不仅能提升性能&#xff0c;还能带来更高的可维护性和一致性。SVG 图标本质上…

LED的使用寿命评估

一&#xff0e;前言 LED光源随着时间的推移&#xff0c;输出光功率会逐渐衰减。在某一时间点&#xff0c;当LED发出的光衰减到一定水平&#xff0c;就无法满足应用要求。因此&#xff0c;常遇见客户会索取产品中LED光源的使用寿命数据。那么怎样确认LED的使用寿命呢&#xff1…

视觉Mamba综述——Visual Mamba: A Survey and New Outlooks论文总结

Visual Mamba: A Survey and New Outlooks &#xff08;31页&#xff0c;视觉Mamba综述&#xff09; 香港科技大学计算机科学与工程系 https://github.com/Ruixxxx/Awesome-Vision-Mamba-Models. 任务背景 0.摘要 Mamba是最近提出的一种选择性结构化状态空间模型&#xff…

公共DNS大测评,哪个解析性能最好?

日前阿里云方面发布公告称&#xff0c;由于产品升级&#xff0c;将于2024年9月30日24时起对公共DNS中免费的解析请求采取智能流量管控措施。据其透露&#xff0c;“公共DNS仍会致力于为广大免费用户提供高质量的基础递归解析服务&#xff0c;但在高并发解析场景&#xff0c;将对…

建模杂谈系列249 增量数据的正态分布拟合

说明 从分布开始&#xff0c;分布又要从正态开始 假设有一批数据&#xff0c;只有通过在线的方式增量获得。 内容 1 生成 先通过numpy生成一堆随机数据&#xff0c;从3个正态分布生成&#xff0c;然后拼接起来。 import numpy as np import matplotlib.pyplot as plt from …

【智能算法改进】路径规划问题的多策略改进樽海鞘群算法研究

目录 1.算法原理2.改进点3.结果展示4.参考文献5.代码获取 1.算法原理 【智能算法】樽海鞘群算法&#xff08;SSA)原理及实现 2.改进点 无标度网络策略 复杂网络在图论中可以用边和节点表示&#xff0c; Barabasi 等于1999年通过分析大量的数据提出了无标度网络模型. 该网络…

框架 +【Mybatis】概述 以及 基础环境搭建

目录 什么是框架&#xff1f; java后端框架包括 Mybatis概述 1、背景介绍 2、mybatis介绍 Mybatis环境搭建 1.创建一个maven项目 2.导入mysql数据库驱动包 导入mybatis依赖的jar包 3.创建一个全局的mybatis配置文件 4.创建数据库,创建表,准备数据 5.创建一个访问接口…

单图生成 2D 和 3D 人物,高质量图像处理模型 CharacterGen来啦!

CharacterGen引入了一个简化的生成流程和一个图像条件的多视图扩散模型。该模型有效地将输入姿态校准到规范形式&#xff0c;同时保留输入图像的关键属性&#xff0c;从而解决了多样化姿态带来的挑战。 CharacterGen的另一个核心组成部分是基于Transformer的、可泛化的稀疏视图…

httpx:一个神奇的 Python HTTP客户端

文章目录 httpx&#xff1a;一个神奇的 Python HTTP客户端1. 背景&#xff1a;为什么选择 httpx&#xff1f;2. httpx 是什么&#xff1f;3. 如何安装 httpx&#xff1f;4. 简单的库函数使用方法5. 场景应用6. 常见问题及解决方案7. 总结 httpx&#xff1a;一个神奇的 Python H…

第 8 章 数据的家——MySQL的数据目录

8.1 数据库和文件系统的关系 数据库把表存储在文件系统上。当我们读取数据时&#xff0c;存储引擎会从文件系统中把数据读出来返回给我们&#xff1b;当我们写入数据时&#xff0c;存储引擎会把这些数据写回文件系统。 8.2 MySQL数据目录 8.2.1 数据目录和安装目录的区别 数…

C++从入门到起飞之——list模拟实现 全方位剖析!

​ ​ ​ &#x1f308;个人主页&#xff1a;秋风起&#xff0c;再归来~&#x1f525;系列专栏&#xff1a;C从入门到起飞 &#x1f516;克心守己&#xff0c;律己则安 目录 ​ ​1、list的整体框架 2、list迭代器 >整体分析 >整体框架 >成员函数 >运…

操作系统:实验六文件操作实验

一、实验目的 1、了解文件系统功能及实现原理。 2、掌握LINUX下文件操作的有关系统调用。 3、熟悉main函数带参数运行的有关操作过程。 4、通过模拟程序实现简单的一级文件系统或二级文件系统。 二、实验内容 1、编程显示文件自身。&#xff08;1分&#xff09; #includ…

分享两个方法分析python打包exe

在Python开发中&#xff0c;常常需要将Python脚本打包成独立的可执行文件&#xff0c;以便在没有Python环境的电脑上运行。你是否曾为此感到困惑&#xff0c;不知道该选择哪种工具来实现这一目标&#xff1f;其实&#xff0c;打包Python脚本并不难&#xff0c;关键在于选择合适…

Mybatis框架——缓存(一级缓存,二级缓存)

本章将简单介绍Mybatis框架中的缓存&#xff0c;欢迎大家点赞➕收藏&#xff0c;蟹蟹&#xff01;&#xff01;&#xff01;&#x1f495; &#x1f308;个人主页&#xff1a;404_NOT_FOUND &#x1f308;MyBatis环境搭建步骤&#xff08;超全解析&#xff01;&#xff01;&am…

AI写论文真的可靠吗?免费推荐6款AI论文写作助手

在当今的学术研究和写作领域&#xff0c;AI论文写作助手已经成为不可或缺的工具。这些工具不仅能够提高写作效率&#xff0c;还能帮助研究者生成高质量的论文。以下是六款免费推荐的AI论文写作助手&#xff0c;包括千笔-aipasspaper&#xff0c;它们各自具有独特的功能和优势。…

【hot100篇-python刷题记录】【最小路径和】

R6-多维动态规划篇 好经典的dp题&#xff0c;纯粹的题。 多维动态规划无论是二维还是三维&#xff0c;无非是创建dp表&#xff0c;dp[][][][][][]即可 动态规划式子 dp[i][j]当前值min(dp[i][j-1],dp[i-1][j]) 边界问题处理&#xff1a;是否存在即可。哦对了好像不用这样&a…