UDP协议(UDP协议特点 UDP的报文格式 UDP的服务端和客户端代码(简单的步骤))

news2024/11/15 18:57:48

目录

端口号 

UDP协议

UDP协议特点

UDP 无连接  

 UDP 面向数据报 

UDP 全双工  

UDP 的报文格式 

什么是校验和?

如何基于校验和来完成数据校验呢?

CRC算法(循环冗余算法) 

MD5算法/SHA算法(这里只介绍MD5算法(工作中常用))

UDP的服务端和客户端代码(简单的步骤例子) 

UDP的服务端 

UDP的客户端 

 


 

本篇主要介绍传输层(TCP/IP五层(或四层)模型)中的 UDP协议

想要详细了解UDP的内容,我们还需要了解一个概念 —— 端口号

端口号 

写一个服务器,必须手动指定一个端口号,通过端口来区分当前这个主机上的不同的应用程序;写一个客户端,当客户端在通信的时候也会有一个端口号(代码中感受不到),系统自动分配。 

端口号,固定就是占2个字节的 . 意味着,端口号表示的数据范围就是 0 ~ 65535(一般 0 不使用)

1~1023 称为 "知名端口号"

1024~65535 是我们普通的端口号

 "知名端口号" :就是给一些比较 ”知名“ 的服务器,预留一个 ”位置“,但事实上,这些所谓的 ”知名“ 服务器,现在大部分都已经不再使用了

其中几个,到现在仍然知名的端口:

22:ssh 服务器的端口号 (ssh协议是用来登录远程主机的)

80:http 服务器的端口号

443:https 服务器的端口号

......

 我们要确保使用的端口号和别人的端口号不要重复

介绍完端口号,我们就可以来介绍 UDP了

UDP协议

UDP协议特点

UDP :无连接,不可靠,面向数据报,全双工 

UDP 无连接  

UDP 协议本身不会存储对端的信息,要在发送数据的时候,显示指定要传输给谁

 

 

不可靠,代码中体现不出来

 

 UDP 面向数据报 

 

UDP 全双工  

通过一个socket,既可以 send,又可以 receive 

 

(最底下有完整的代码) 

 

UDP 的报文格式 

学习一个协议,其中最主要的工作就是理解协议的报文格式 

 

ps:源ip, 目的ip 在 网络层 

 

什么是校验和?

计算机中非常广泛使用的概念

前提:网络传输中,由于一些外部的干扰,就可能会出现数据传输出错的情况。

因此我们就要想办法,能够识别出出错的程序校验和,就是这样的一种检查手段。

校验和本质上是 一个字符串,体积比原始的数据更小,又是通过原始的数据生成的。

原始数据相同,得到的校验和就一定相同,反之,校验和相同,原始数据大概率相同(理论上存在不同的情况,但实际的概率非常低,忽略不计) 

如何基于校验和来完成数据校验呢?

1.发送方,把要发送的数据整理好 —— data1,然后通过一定的算法,计算出校验和 checksum1

2.发送方 把 data1 和 checksum1 一起通过网络发送出去

3.接收方收到数据,收到的数据称为 data2(此时的这个数据可能就和 data1 不一样了),还收到了checksum1

4.接收方再根据data2重新计算校验和(按照相同的算法),得到checksum2

5.对比 checksum1 和 checksum2 是否相同,如果不同,则认为data2 和 data1 一定不相同。如果相同,则认为 data1 和 data2 大概率是相同的(理论上存在不同的可能性,概率低,忽略)

 通过上面方式,就能发现数据传输出错

计算校验和,有很多种算法,此处UDP中使用的 CRC算法(循环冗余算法) 

 

CRC算法(循环冗余算法) 

就是把当前要计算 校验和 的数据的每个字节,都进行累加,把结果保存到这两个字节的变量中(累加过程中如果溢出了,也没关系)

如果中间某个数据,出现传输错误,第二次计算的 校验和 就会和第一次不同。

ps: CRC 这个算法其实不是特别靠谱,导致两个不同数据,得到相同的CRC校验和的概率比较大

(比如前一个字节恰好少个1,后一个字节恰好多个1,其实概率还是不大的,但确实有一定的风险) 

 

MD5算法/SHA算法(这里只介绍MD5算法(工作中常用))

 MD5算法 里有一系列的公式,来完成MD5的计算(咱们不需要考虑公式,这是给数学问题),但是咱们需要知道MD5 的特点

 MD5 的特点

1.定长:无论你原始数据多长,计算得到的MD5,都是固定长度 (这就很适配校验和,校验和就不应该太长,要不然不方便网络传输)

 

 

2.分散:给定两个原始 数据,哪怕绝大多数内容都一样,但只要有一个字节不同,得到的MD5值都会差异很大

 

  

3.不可逆:给你一个原始数据,计算MD5,非常容易,但是给你MD5,让你还原始数据,计算量非常庞大,以至于超出了现有计算机的算力极限,理论上是不可行的  

 

UDP的服务端和客户端代码(简单的步骤例子) 

UDP的服务端 

package network;

import java.io.IOException;
import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.SocketException;

public class UdpEchoServer {
    // 创建一个 DatagramSocket 对象. 后续操作网卡的基础.
    private DatagramSocket socket = null;

    public UdpEchoServer(int port) throws SocketException {
        // 这么写就是手动指定端口
        socket = new DatagramSocket(port);
        // 这么写就是让系统自动分配端口
        // socket = new DatagramSocket();
    }

    public void start() throws IOException {
        // 通过这个方法来启动服务器.
        System.out.println("服务器启动!");
        // 一个服务器程序中, 经常能看到 while true 这样的代码.
        while (true) {
            // 1. 读取请求并解析.
            DatagramPacket requestPacket = new DatagramPacket(new byte[4096], 4096);
            socket.receive(requestPacket);
            // 当前完成 receive 之后, 数据是以 二进制 的形式存储到 DatagramPacket 中了.
            // 要想能够把这里的数据给显示出来, 还需要把这个二进制数据给转成字符串.
            String request = new String(requestPacket.getData(), 0, requestPacket.getLength());
            // 2. 根据请求计算响应(一般的服务器都会经历的过程)
            //    由于此处是回显服务器, 请求是啥样, 响应就是啥样.
            String response = process(request);
            // 3. 把响应写回到客户端.
            //    搞一个响应对象, DatagramPacket
            //    往 DatagramPacket 里构造刚才的数据, 再通过 send 返回.
            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().toString(),
                    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的客户端 

package network;

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

public class UdpEchoClient {
    private DatagramSocket socket = null;
    private String serverIp = "";
    private int serverPort = 0;

    public UdpEchoClient(String ip, int port) throws SocketException {
        // 创建这个对象, 不能手动指定端口.
        socket = new DatagramSocket();
        // 由于 UDP 自身不会持有对端的信息. 就需要在应用程序里, 把对端的情况给记录下来.
        // 这里咱们主要记录对端的 ip 和 端口 .
        serverIp = ip;
        serverPort = port;
    }

    public void start() throws IOException {
        System.out.println("客户端启动!");
        Scanner scanner = new Scanner(System.in);
        while (true) {
            // 1. 从控制台读取数据, 作为请求
            System.out.print("-> ");
            String request = scanner.next();
            // 2. 把请求内容构造成 DatagramPacket 对象, 发给服务器.
            DatagramPacket requestPacket = new DatagramPacket(request.getBytes(), request.getBytes().length,
                    InetAddress.getByName(serverIp), serverPort);
            socket.send(requestPacket);
            // 3. 尝试读取服务器返回的响应了.
            DatagramPacket responsePacket = new DatagramPacket(new byte[4096], 4096);
            socket.receive(responsePacket);
            // 4. 把响应, 转换成字符串, 并显示出来.
            String response = new String(responsePacket.getData(), 0, responsePacket.getLength());
            System.out.println(response);
        }
    }

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

 

 

 

 

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

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

相关文章

智能AI创作系统ChatGPT详细搭建教程/AI绘画系统/支持GPT联网提问/支持Prompt应用/支持国内AI模型

一、智能AI创作系统 SparkAi创作系统是基于OpenAI很火的ChatGPT进行开发的Ai智能问答系统,支持OpenAI GPT全模型国内AI全模型。本期针对源码系统整体测试下来非常完美,可以说SparkAi是目前国内一款的ChatGPT对接OpenAI软件系统。那么如何搭建部署AI创作…

JavaScript Web APIs第五天笔记

Web APIs - 第5天笔记 目标: 能够利用JS操作浏览器,具备利用本地存储实现学生就业表的能力 BOM操作综合案例 js组成 JavaScript的组成 ECMAScript: 规定了js基础语法核心知识。比如:变量、分支语句、循环语句、对象等等 Web APIs : DOM 文档对象模型&…

ElementUI--数据表格增删改查与表单验证

一、CRUD实现 1.1 后台CRUD编写 package com.zking.ssm.controller;import com.zking.ssm.model.Book; import com.zking.ssm.service.IBookService; import com.zking.ssm.util.JsonResponseBody; import com.zking.ssm.util.PageBean; import com.zking.ssm.vo.BookFileVo;…

arm 点灯实验代码以及现象(c语言版本)

.led.h #ifndef __LED_H__ #define __LED_H__ //构建寄存器组织结构体 typedef struct {unsigned int moder; unsigned int otyper; unsigned int ospeedr;unsigned int pupdr;unsigned int idr;unsigned int odr; }gpio_t;#define GPIOE (*(gpio_t*)0x50006000) #define G…

全图化在线系统设计

Pillars是什么 Pillars是一个Serverless全图化业务托管平台。Pillars应用全图化开发模型,提供丰富的运行时组件,支持CI/CD全生命周期项目管理,具备主动式资源优化能力。 Pillars解决什么问题 当前广告系统架构采用分布式微服务的设计理念,通过服务分治实现各组织间开发、…

java基础 API Calendar类

Calendar日历类 : package daysreplace;import com.sun.jdi.IntegerValue;import java.text.ParseException; import java.text.SimpleDateFormat; import java.util.Arrays; import java.util.Calendar; import java.util.Date;public class Test {public static v…

关于AAPT2 error: check logs for details 的问题分析定位与排查解决方法

关于AAPT2 error: check logs for details 的问题分析定位与排查解决方法 现象描述1、排查2、定位3、解决 现象描述 在android studio的项目开发过程中,经常会遇到关于AAPT2 error: check logs for details 这种类似的问题。一般都是jar包冲突导致的,尤其…

无声的世界,精神科用药并结合临床的一些分析及笔记(四)

目录 关于镇静催眠药 第二代与第三代药物的主要区别 第二代镇静催眠药物 如何简单的识别 适用性 第三代镇静催眠药物 如何简单的识别 适用性 关于成瘾性 为什么会变胖? “开源” “节流” 哪种催眠药“劲儿”大? 第二代 BZDs 第三代 non-BZDs 用药…

【数据结构】算法效率的度量方法

🦄个人主页:修修修也 🎏所属专栏:数据结构 ⚙️操作环境:Visual Studio 2022 目录 🎏事后统计方法 🎏事前分析估算方法 🎏函数的渐进式增长 结语 在上篇文章中我们提到了算法的设计要求中我们要尽量满足时间效率高…

Zabbix第二部分:基于Proxy分布式部署实现Web监控和Zabbix HA集群的搭建

代理和高可用 一、基于zabbix-proxy的分布式监控1.1 分布式监控的作用1.2 数据流向1.3 构成组件 二、部署zabbix代理服务器Step1 前置准备Step2 设置 zabbix 的下载源,安装 zabbix-proxyStep3 部署数据库并将zabbix相关文件导入Step4 修改zabbix-proxy的配置文件&am…

【NLTK系列01】:nltk库介绍

一、说明 NLTK是个啥?它是个复杂的应用库,可以实现基本预料库操作,比如,、将文章分词成独立token,等操作。从词统计、标记化、词干提取、词性标记,停用词收集,包括语义索引和依赖关系解析等。 …

ntlm哈希传递

哈希传递就是ntlm哈希 概念 早期SMB协议铭⽂在⽹络上传输数据,后来诞⽣了LM验证机制,LM机制由于过于简 单,微软提出了WindowsNT挑战/响应机制,这就是NTLM LM NTLM 哈希传递攻击是针对相同密码的用户认证直接发起攻击&#xff0c…

Flex 布局中避免子元素高度被撑高

Flex 布局中避免子元素高度被撑高 Flex 布局中子元素高度容易被最高元素撑高,使用 align-self 可避免。 之前: 之后: /* 此处是居中对齐,也可使用 flex-start 顶部对齐 */ align-self: center;

SuperMap iServer 影像服务自动守护能力

作者:Carlo 目录 一、监控目录能力1、影像服务创建后,在添加影像集合时配置自动追加2、配置集合基本信息3、开启自动追加4、效果展示 二、静默切片支持计划任务1、配置影像集合静默切片任务2、配置瓦片方案3、配置静默切片计划任务4、效果展示 背景&…

leetCode 15.三数之和 双指针解法

给你一个整数数组 nums ,判断是否存在三元组 [nums[i], nums[j], nums[k]] 满足 i ! j、i ! k 且 j ! k ,同时还满足 nums[i] nums[j] nums[k] 0 。请你返回所有和为 0 且不重复的三元组。 注意:答案中不可以包含重复的三元组。 示例 1&…

日常学习记录随笔-大数据之日志(hadoop)收集实战

数据收集(nginx)--->数据分析---> 数据清洗--->数据聚合计算---数据展示 可能涉及到zabix 做任务调度我们的项目 电商日志分析 比如说我们现在有一个系统,我们的数仓建立也要有一个主题 我这个项目是什么我要干什么定义方向 对用户进行分析,用户信息 要懂整个数据的流…

【c++】new一个新数组时数组地址变化的现象

若new生成数组的时候&#xff0c;无论每一行的行数组大小是否相同&#xff0c;其一维指针与实际元素存放的地址完全不同。 #include<iostream> using namespace std;int main(void) {int** dp new int* [5 1];for (int i 0; i < 5; i) {dp[i] new int[i];//初始化…

java基础API date日期

package daysreplace; import com.sun.jdi.IntegerValue;import java.text.SimpleDateFormat; import java.util.Arrays; import java.util.Date;public class Test {public static void main(String[] args) {Date date new Date();System.out.println(date);//输出不为内存地…

乐鑫 ESP-Mesh-Lite在windows下的开发环境搭建(二)

上一篇文章的只能在例程文件夹内进行编译&#xff0c;一旦将示例程序复制到其他文件夹&#xff0c;清理后再编译时会出现编译错误。今天发现了一种的开发环境部署方法&#xff0c;实际上esp-mesh-lite文件夹里就有介绍&#xff0c;只是我还不熟悉IDF的操作&#xff0c;到今天才…

[LitCTF 2023]作业管理系统 - 文件上传+弱口令

[LitCTF 2023]作业管理系统 解题流程 解题流程 1、F12看到页面源代码有注释&#xff1a;默认账户admin admin   使用&#xff1a;admin-admin 可直接登录 2、上传一句话木马   3、蚁剑连接找flagNSSCTF{d969ad7a-9cb5-4564-a662-191a00e007a5}