UDP报头结构 和注意事项

news2024/11/16 13:46:09

UDP协议

UDP这个协议的学习 ,最只要学习的就是报文格式
UDP数据报 = UDP报头 + UDP载荷

UDP协议端口格式

报头由4个部分组成 : 源端口号 、目的端口号、UDP长度、UDP校验和

UDP长度描述了整个UDP数据报,占多少个字节
通过UDP长度 就可以知道,当前载荷一共有多少个字节
UDP长度占两个字节 也就是0~65535 转化一下就是64kb ,一个UDP数据报,最长就是64kb,不能更长了 他的最大限制就是64kb

在这里假如面试官问你 : UDP数据报中,载荷最多能承载多少数据?
这里我们应该回答是64kb 而不是 64kb-8 .

校验和

数据在网络传输中,是可能会“出错的” ,可能会发生“比特翻转” 就是 本来数据想传过去1 但是到了接收方 就变成了 0 这就是发生了比特翻转
这就需要我们能够有办法 对传输的数据进行校验
第一层: 能够识别出 是否出错了
第二层: 最好能发现哪一位出错 ,并且能够进行纠错 但是这一层 往往需要消耗的时间和空间会更多

校验和 就是拿着数据进行一系列计算 ,得到结果,如果数据部分发生改变,此时得到的结果也就会不一样
就比如 现在有主机A和主机B 主机A给主机B发送一个数据 主机A先通过算法算出校验和 A 发送给B B再按照和A相同的算法算出校验和2,再把自己算出来的校验和2 和收到的校验和 比较是否一致

UDP中使用的是CRC算法作为校验和
CRC是一种简单粗暴的计算校验和的方式,循环冗余校验

就比如设定2个字节的变量,把数据的每个字节取出来,往这个变量上进行累加,假如结果溢出 ,超过了2个字节 溢出部分全部删除。

UDP的特点

全双工

UDP也就是说既能读 ,也能写 而相反的就是半双工 读和写只能一个

不可靠

就是UDP 发送方发送数据报之后,如果由于一些网络故障等原因没有把数据发送给对方 此时UDP协议层也不会给应用层发送任何错误信息 没用任何的安全机制 这里的可靠和不可靠 和 有无连接没有多大关系

无连接

就是知道 接收方的端口号和IP地址就可以直接进行传输 不需要进行连接

缓冲区

UDP没有正在意义上的发送缓冲区 发送的数据会直接给到内核处理 ,UDP有接收缓冲区,但是这个接收缓冲区收到的数据和发送的数据报的顺序是否一致 。还有 UDP的大小是受限的 UDP最大的传输的数据长度为64kb

高频面试题: UDP和TCP的区别

在这里插入图片描述

通过UDP实现单词查询 (网络编程)

UDP服务器:

package network;

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

public class UDPEchoServer {
    private DatagramSocket socket = null;
    public  UDPEchoServer(int port) throws SocketException {
        socket = new DatagramSocket(port);
    }

    public void start() throws IOException {
        System.out.println("服务器启动");
        while (true) {
            //1 读取请求并解析
            DatagramPacket requestPacket = new DatagramPacket(new byte[4096],4096);
            socket.receive(requestPacket);
            //为了方便打印  把二进制数据转为字符串String
            String request = new String(requestPacket.getData(),0,requestPacket.getLength());

            //根据请求计算回响
            String response = this.process(request);
            //把响应写回到客户端
            DatagramPacket responsePacket = new DatagramPacket(response.getBytes(),0,response.getBytes().length,requestPacket.getSocketAddress());
            socket.send(responsePacket);
            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();
    }
}

服务器子类:

package network;

import java.io.IOException;
import java.net.SocketException;
import java.util.HashMap;

public class UdpDictServer extends UDPEchoServer{

    //创建一个哈希表
    private HashMap<String,String> dict = null;
    public UdpDictServer(int port) throws SocketException {
        super(port);
        dict = new HashMap<>();
        dict.put("Animal","动物");
        dict.put("apple","苹果");
        dict.put("hello","你好");
        dict.put("bonus","红利");
    }

    //重写process方法

    @Override
    public String process(String request) {
        return dict.getOrDefault(request,"没有该单词");
    }

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

客户端:

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;

    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 scanner = new Scanner(System.in);
        while (true) {
            System.out.print("请输入要发送的请求:");
            String request = scanner.next();  //从控制台中读取用户输入
            //构造请求并发送  有数据 也要有目标
            DatagramPacket requestPacket = new DatagramPacket(request.getBytes(),0,request.getBytes().length, InetAddress.getByName(serverIp),serverPort);
            socket.send(requestPacket);  //发送请求
            //读取响应数据
            DatagramPacket responsePacket = new DatagramPacket(new byte[4096],4096);
            socket.receive(responsePacket);
            //显示响应到控制台
            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);
        client.start();
    }
}

上面就是本篇文章的全部内容 !谢谢大家的浏览!!!

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

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

相关文章

第3章 内存管理(2)

3.2虚拟内存管理 3.2.1 传统内存和虚拟内存对比 传统内存虚拟内存一次性:全部装入内存才能运行多次性:仅装入当前需要的数据驻留性:作业装入内存,运行时一直驻留内存对换性:暂时用不到的数据换出外存虚拟性:逻辑上扩充内存作业过大无法装入,作业过多也无法装入需要添加请求调…

3.10设计模式——Template Method 模版方法模式(行为型)

意图 定义一个操作中的算法骨架&#xff0c;而将一些步骤延迟到子类中&#xff0c;Template Method 使得子类可以不改变一个算法的结构即可重新定义该算法的某些特定步骤。 结构 AbstractClass&#xff08;抽象类&#xff09;定义抽象的原语操作&#xff0c;具体的子类将重定…

贪吃蛇(下)游戏的实现

感谢大佬的光临各位&#xff0c;希望和大家一起进步&#xff0c;望得到你的三连&#xff0c;互三支持&#xff0c;一起进步 个人主页&#xff1a;LaNzikinh-CSDN博客 文章目录 前言一.蛇和食物的打印二.游戏的运行逻辑三.结束游戏 &#xff08;善后工作&#xff09;四.游戏的测…

MacBook Pro 原生安装 Ubuntu 24.04 ARM 版

趁着休假整理家里闲置的设备&#xff0c;看到了一台许久不用的 M2 芯片的 MacBook Pro&#xff0c;想着或许应该把它改造成 ARMv64 的 CI/CD 构建机&#xff0c;于是就有了这篇文章。 本篇文章适用于 M1、M2 全系列的设备&#xff0c;包括&#xff1a;MacBook Air、MacBook Pr…

JVM笔记2--垃圾收集算法

1、如何确认哪些对象“已死” 在上一篇文章中介绍到Java内存运行时的各个区域。其中程序计数器、虚拟机栈、本地方法栈3个区域随着线程而生&#xff0c;随线程而灭&#xff0c;栈中的栈帧随着方法的进入和退出而有条不紊的执行着入栈和出栈操作。每个栈帧中分配多少内存基本上…

OpenCV多张图片堆叠显示

OpenCV实现多张图片堆叠显示 程序思路效果代码 程序思路 读取两张或多张图片&#xff1b;获取图片尺寸&#xff1b;选择多张图片中较大的宽度和高度建立画布&#xff1b;合并图片到画布&#xff1b; 效果 代码 import cv2 import numpy as np# 读取两张图片 img1 cv2.imrea…

【软件开发规范篇】JAVA后端开发编程规范

作者介绍&#xff1a;本人笔名姑苏老陈&#xff0c;从事JAVA开发工作十多年了&#xff0c;带过大学刚毕业的实习生&#xff0c;也带过技术团队。最近有个朋友的表弟&#xff0c;马上要大学毕业了&#xff0c;想从事JAVA开发工作&#xff0c;但不知道从何处入手。于是&#xff0…

Endnote X9 20 21如何把中文引用的et al 换(变)成 等

描述 随着毕业的临近&#xff0c;我在写论文时可能会遇到在引用的中文参考文献中出现“et al”字样。有的学校事比较多&#xff0c;非让改成等等&#xff0c;这就麻烦了。 本身人家endnote都是老美的软件&#xff0c;人家本身就是针对英文文献&#xff0c;你现在让改成等等&a…

Fetch的概述和基本使用

03 【Fetch的概述和基本使用】 1.XMLHttpRequest缺点 浏览器提供了原生的AJAX实现类XMLHttpRequest&#xff0c;基于该类实例&#xff0c;我们可以实现在网页上发送AJAX请求到服务端。 但是XMLHttpRequest的设计并不完美&#xff0c;主要体现在以下几个方面&#xff1a; HT…

贪吃蛇(上)Win32API

感谢大佬的光临各位&#xff0c;希望和大家一起进步&#xff0c;望得到你的三连&#xff0c;互三支持&#xff0c;一起进步 个人主页&#xff1a;LaNzikinh-CSDN博客 文章目录 前言一、Win32 API二、地图的绘制和初始化总结 前言 贪吃蛇&#xff08;也叫做贪食蛇&#xff09;游…

Noir Dark Mode for Safari:夜间浏览的舒适伴侣

Noir Dark Mode for Safari是一款实用的浏览器插件&#xff0c;它使夜间浏览网页变得更加轻松和舒适。通过自动为访问的每个网站添加暗色模式&#xff0c;Noir减少了用户在暗光环境下浏览网页时可能产生的眼睛疲劳。 Noir的自定义功能允许用户根据自己的喜好调整暗色模式的设置…

配电室智能巡检机器人

近年来&#xff0c;生产过程高度自动化&#xff0c;各工矿企业关键场所需定期巡检维护。但目前巡检主要靠人工&#xff0c;既耗时费力效率又低&#xff0c;且受环境等因素影响&#xff0c;巡检难以全面规范&#xff0c;隐患或问题易被忽视。在此情况下&#xff0c;如何利用现有…

IoTDB 入门教程 基础篇③——基于Linux系统快速安装启动和上手

文章目录 一、前文二、下载三、解压四、上传五、启动六、执行七、停止八、参考 一、前文 IoTDB入门教程——导读 二、下载 下载二进制可运行程序&#xff1a;https://dlcdn.apache.org/iotdb/1.3.1/apache-iotdb-1.3.1-all-bin.zip 历史版本下载&#xff1a;https://archive.…

Linux Systemd基础教程

一、什么是systemd&#xff1f; systemd是Linux系统的一套基本构建模块。它提供了一个系统和服务管理器&#xff0c;作为PID 1运行并启动系统的其余部分。 systemd提供积极的并行化功能&#xff0c;使用套接字和D-Bus激活来启动服务&#xff0c;提供按需启动守护进程&#xf…

金属表面粗糙度对信号的影响

在进行PCB的传输线设计时&#xff0c;如果希望仿真结果更加贴合于实际的效果&#xff0c;就需要考虑很多的附加因素&#xff0c;比如&#xff0c;真实的叠构参数、介电常数、损耗角正切值、蚀刻因子、金属表面粗糙度、玻纤效应等&#xff0c;在常规的信号仿真中&#xff0c;前三…

Git系列:如何为不同的Git仓库设置不同的配置项?

&#x1f49d;&#x1f49d;&#x1f49d;欢迎莅临我的博客&#xff0c;很高兴能够在这里和您见面&#xff01;希望您在这里可以感受到一份轻松愉快的氛围&#xff0c;不仅可以获得有趣的内容和知识&#xff0c;也可以畅所欲言、分享您的想法和见解。 推荐:「stormsha的主页」…

如何配置X86应用程序启用大地址模式(将用户态虚拟内存从2GB扩充到3GB),以解决用户态虚拟内存不够用问题?(项目实战案例解析)

目录 1、概述 2、为什么不直接将程序做成64位的&#xff1f; 3、进程内存不足导致程序发生闪退的案例分析 3.1、问题说明 3.2、将Windbg附加到程序进程上进行动态调试 3.3、动态调试的Windbg感知到了中断&#xff0c;中断在DebugBreak函数调用上 3.4、malloc或new失败的…

新手去做抖音小店,这七点千万别忽视!建议收藏!

大家好&#xff0c;我是电商小V 今天咱们就来详细的说一下新手操作抖音小店的几个通病&#xff0c;想要去做抖音小店的小伙伴千万要注意&#xff0c;一定要避免&#xff0c;不要踩坑&#xff0c; 第一点&#xff1a;新手刚去做抖音小店不赚钱的主要原因不是因为你选择了大类目&…

从零开始Hadoop安装和配置,图文手把手教你,定位错误(已部署成功)

文章目录 时间急的可以看速成&#xff0c;虚拟机和配置方法已给出&#xff0c;提供下载的为一台主节点一台分结点的虚拟机下载&#xff0c;只需进行ip地址更换即可 [现成Hadoop配置&#xff0c;图文手把手交你](https://blog.csdn.net/weixin_52521533/article/details/1328627…

7.string

目录 学库一定会看文档 1.Member functions string介绍 2.迭代器iterator 1.正向迭代器 2.反向迭代器 3.反向const 4.反向const 3.容量capacity 0.size(),capacity(),max_size(),length() 1.扩容机制&#xff08;vs和Linux g对比&#xff09; 2.clear&#xff08;&a…