【网络原理】Udp报文结构,保姆级详解,建议收藏

news2024/11/27 2:20:30

 💐个人主页:初晴~

📚相关专栏:计算机网络那些事


一、UDP报文格式

可以看出UDP报文主要由报头正文两部分构成,报头存储了此次报文的一些重要信息,而正文才是真正需要传输的内容。本篇文章就主要来介绍一下UDP报头的组成与作用了。

二、UDP报头的结构与作用

我们可以看到报头又被分为了源端口目的端口长度校验和四个部分,每个部分各占 16 个比特也就是 2 个字节,故UDP报头的总长度就为固定8 个字节

注意:

UDP报头的各字段的长度与作用是规定好的,我们作为普通程序员是没有权限修改的,换句话说,我们就算单方面修改了协议,由于其他人遵守的是官方协议,将会导致我们写的报文无法被其它人正确解读。因此,为了能正常地传输与解读数据,这里的这些协议细节我们一定要严格遵守

接下来我们就来深入解读一下这几个字段的作用与注意事项吧:

(1)源端口与目的端口

在网络通讯中,涉及到四个关键信息:

源IP、目的IP

源端口、目的端口

类比于寄快递时,一个快递单上也至少需要四个关键信息:

发件人地址、收件人地址

发件人电话、收件人电话

简单来说,这几个参数就像是网络通信中的“快递单”,起到了一个定位的作用,在庞大的互联网中确定了此次通信中的起始地目的地

在同一时刻,一个主机中的某一端口号只会映射一个进程,因此就可以通过端口号定位到对应的服务端/客户端的进程了。

值得注意的是一个端口号的长度为16比特(bit),也就是2个字节(byte),因此报头中的 源端口 与 目的端口 直接记录对应的端口号即可,不需要做过多的处理

(2)报文长度

报文长度=报头长度+载荷(正文)长度

它就是用来记录此次报文的总长度,让程序根据长度来对报文进行划分,进而能够正确地进行解读。

不过,值得注意的是,这里存储报文长度的空间只有2个字节,什么概念呢?就是代表整个报文的长度最多也只有64KB

这主要还是历史遗留性问题。UDP协议是在30多年前提出的,在当时,64KB已经是一个非常大的数据量了。不过那时候的开发者肯定想象不到在短短30年后的今天,随便拍张照片都是MB级别的了,64KB就完全不够看得了。

但如果我们就是要传输一个很大的数据该怎么办呢?

有两种方案:

<1>方案一

将一个大的数据包拆分成多个小的,再分别进行传输,接收方再通过组包最终获取到数据

但这个方案实施起来将会非常复杂。首先,数据的拆分与组合本身就十分复杂,再加上网络传输过程中充满了不确定性,数据包到达的先后顺序,甚至数据包是否能到达(丢包问题)都是无法确定的,这会导致接收方的组包操作将会变的异常复杂,就算真的可以处理,消耗的时间也是非常长的,这对于“时间就是金钱”的网络传输是十分致命的。

因此,我们一般不会采用这个方案

<2>方案二

选用别的适合传输大数据量的协议,比如大名鼎鼎的TCP协议

TCP协议对于长度没有任何限制,并且还带有可靠传输等机制,保障了传输的稳定性,通信质量也比较高。

小结

UDP报文的可传输的最大数据量比较小,实在要传输大量的数据时还是采用TCP协议比较合适

(3)校验和

因为网络传输主要是通过 电信号/光信号/电磁波 来传播的,而这些信号很容易会受到外界环境干扰,导致传输的数据发生改变,使最终结果出现错误。

举个例子:我要去超市买苹果、土豆、鸡蛋、番茄 4 样物品,这时,就用 4 来当做“校验和”,购物结束后,数一下实际购物数,与校验和进行比较,若相等,则任务此次购物时正确的,否则则认为此次购物出现错误

不过这里主要就是为了让大家知道什么是校验和。事实上这种算法比较草率,没法确定购买物品的准确性当我购买的其它物品种类为 4 时,仍然会认为这次购买是正确的。为了更准确的判断,就需要更加严谨的 检查策略和算法

下图就为UDP数据校验的检查过程:

上述这种校验方法被称之为CRC检验方法。通过对前后两次数据分别计算校验和,接着通过比较校验和来判断两次数据是否一致,如果不相同,则会直接对数据进行丢弃

由于这种机制,发送方无法得知接收方是否成功接收数据,也就无法进行数据重发等补救机制,这会导致接收方可能会出现数据丢失数据接收不完整,从而导致最终数据解析出现问题。因此,我们一般认为 UDP 是一种不可靠传输

  • 有人可能会问,记录校验和的空间只有 2 个字节,万一校验和太长了怎么办?
  • 事实上不必担心这一问题,就算校验和过大,发生溢出,也不会影响“相等性判断”,我们只需要判断两次校验和是否相等即可,相等的值溢出后仍会保持相等,因此这并不会影响我们的判断。我们也并不关注校验和的具体指是多少。

那么,在计算校验和的过程中,是否可能会出现两个不同的数据,生成的校验和相同呢?

这的确可能发生,不过概率是非常低的。不过对于CRC算法来说,这个概率相对还比较高

除了CRC算法,还可能会用到其它一些算法来计算校验和,比如两个经典算法 MD5 SHA1

<1>MD5

MD5算法, 本质上可以理解为 字符串Hash算法

背后的实现过程是一个 “数学过程” , 可以理解为 套公式 

不过具体的计算细节就不是我们需要关注的了,我们更需要关心它的特点

1、定长: 无论输入的字符串 长度是多少 , 得到的 MD5 都是固定长度 的

2、分散性: 对于不同的字符串, 即使字符串中只改变了一点点, 得到的 MD5 差异都是很大的

我们知道,数据越分散,越有利于建哈希表,越不容易发生哈希冲突。因此,MD5 算法适合用来做哈希算法

3、不可逆性: 根据输入内容计算 MD5值 是非常容易的,但已知 MD5 值想还原出原始内容就几乎无法实现了

因此MD5 算法适合做加密算法

<2>SHA1

SHA1算法与MD5是十分类似的,也具有以上三个特点,博主这里就不做过多赘述了


总结

UDP报头结构

  1. 源端口(Source Port):16位,标识发送方的应用程序端口号
  2. 目的端口(Destination Port):16位,标识接收方的应用程序端口号
  3. 长度(Length):16位,表示整个UDP数据报的长度,包括头部和数据部分。
  4. 校验和(Checksum):16位,用于检测数据报在传输过程中是否发生了损坏。此字段在某些情况下(如IPv4中)可能是可选的。

UDP报文的使用场景

  1. 实时多媒体传输:由于UDP无需建立连接,发送速度快,适用于语音、视频等实时传输。
  2. 广播或多播通信:UDP支持向多个接收者同时发送数据,适用于广播或多播应用。
  3. 简单服务查询:如DNS查询等,要求快速响应,但对数据准确性要求不高。
  4. 游戏:在线游戏中,为了保证玩家体验,通常使用UDP进行实时数据传输。

那么本篇文章就到此为止了,如果觉得这篇文章对你有帮助的话,可以点一下关注和点赞来支持作者哦。如果有什么讲的不对的地方欢迎在评论区指出,希望能够和你们一起进步✊

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

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

相关文章

【Kubernetes】常见面试题汇总(五十二)

目录 116. K8S 集群服务暴露失败&#xff1f; 117.外网无法访问 K8S 集群提供的服务&#xff1f; 特别说明&#xff1a; 题目 1-68 属于【Kubernetes】的常规概念题&#xff0c;即 “ 汇总&#xff08;一&#xff09;~&#xff08;二十二&#xff09;” 。 题目 69-…

Windows 环境上安装 NASM 和 YASM 教程

NASM 和 YASM NASM NASM&#xff08;Netwide Assembler&#xff09;是一个开源的、可移植的汇编器&#xff0c;它支持多种平台和操作系统。它可以用来编写16位、32位以及64位的代码&#xff0c;并且支持多种输出格式&#xff0c;包括ELF、COFF、OMF、a.out、Mach-O等。NASM使用…

复习HTML(进阶)

前言 上一篇的最后我介绍了在表单中&#xff0c;上传文件需要使用到 method属性 和enctype属性。本篇博客主要是详细的介绍这些知识 <form action"http://localhost:8080/test" method"post" enctype"multipart/form-data"> method属性…

SQL Inject-基于报错的信息获取

常用的用来报错的函数 updatexml() : 函数是MYSQL对XML文档数据进行查询和修改的XPATH函数。 extractvalue(): 函数也是MYSQL对XML文档数据进行查询的XPATH函数。 floor(): MYSQL中用来取整的函数。 思路&#xff1a; 在MySQL中使用一些指定的函数来制造报错&am…

YOLOv8改进 - 注意力篇 - 引入SEAttention注意力机制

一、本文介绍 作为入门性篇章&#xff0c;这里介绍了SEAttention注意力在YOLOv8中的使用。包含SEAttention原理分析&#xff0c;SEAttention的代码、SEAttention的使用方法、以及添加以后的yaml文件及运行记录。 二、SEAttention原理分析 SEAttention官方论文地址&#xff1…

深度学习——线性神经网络(一、线性回归)

目录 一、线性回归1.1 线性回归的基本元素1.1.1 术语介绍1.1.2 线性模型1.1.3 损失函数1.1.4 解析解1.1.5 随机梯度下降1.1.6 模型预测 1.2 正态分布与平方损失 因为线性神经网络篇幅比较长&#xff0c;就拆成几篇博客分开发布。目录序号保持连贯性。 一、线性回归 回归&#x…

基于单片机智能百叶窗卷帘门自动门系统

** 文章目录 前言概要功能设计设计思路 软件设计效果图 程序文章目录 前言 &#x1f497;博主介绍&#xff1a;✌全网粉丝10W,CSDN特邀作者、博客专家、CSDN新星计划导师&#xff0c;一名热衷于单片机技术探索与分享的博主、专注于 精通51/STM32/MSP430/AVR等单片机设计 主要对…

二叉树深度学习——将二叉搜索树转化为排序的双向链表

1.题目解析 题目来源&#xff1a;LCR 155.将二叉搜索树转化为排序的双向链表 测试用例 2.算法原理 首先题目要求原地进行修改并且要求左指针代表前驱指针&#xff0c;右指针代表后继指针&#xff0c;所以思路就是 1.使用前序遍历创建两个指针cur、prev代表当前节点与前一个节点…

STM32三种启动模式:【详细讲解】

STM32在上电后&#xff0c;从那里启动是由BOOT0和BOOT1引脚的电平决定的&#xff0c;如下表&#xff1a; BOOT模式选引脚启动模式BOOT0BOOT1X0主Flash启动01系统存储器启动11内置SRAM启动 BOOT 引脚的值在重置后 SYSCLK 的第四个上升沿时被锁定。在重置后,由用户决定是如何设…

硬件开发笔记(三十):TPS54331电源设计(三):设计好的原理图转设计PCB布板,12V输入电路布局设计

若该文为原创文章&#xff0c;转载请注明原文出处 本文章博客地址&#xff1a;https://hpzwl.blog.csdn.net/article/details/142694484 长沙红胖子Qt&#xff08;长沙创微智科&#xff09;博文大全&#xff1a;开发技术集合&#xff08;包含Qt实用技术、树莓派、三维、OpenCV…

挖矿病毒记录 WinRing0x64.sys

之前下载过福晰pdf编辑器&#xff0c;使用正常。 某天发现机器启动后&#xff0c;过个几分钟(具体为5min)会自动运行几个 cmd 脚本(一闪而过)&#xff0c;但是打开任务管理器没有发现异常程序&#xff08;后面发现病毒程序伪装成System系统程序&#xff0c;见下图&#xff09;…

Ascend C算子加速:优化与创新

Ascend C算子加速&#xff1a;优化与创新 随着大模型的迅速发展和人工智能计算需求的剧增&#xff0c;优化硬件性能变得尤为重要。针对这一需求&#xff0c;昇腾推出了Ascend Operator Library&#xff08;AOL&#xff09;算子加速库&#xff0c;专注于为开发者提供高效的算子…

C++-vector模拟实现

###vector底层相当于是数组&#xff0c;查看源码可以发现&#xff0c;这个类的私有成员变量是三个迭代器&#xff1b;在实现时迭代器就可以当作是vector里面的元素的指针类型&#xff1b; ###vector是一个类模板&#xff0c;实现时也应当按照这样的写法用一个模板去实现&#…

某项目实战代码(一)

1.下载安装并配置环境变量openssl&#xff0c;可自行在网上寻找。 2.在项目中导入opensll中的“包含(include)”和“库(lib)” 3.选择debug x86平台&#xff0c;不然会报错。 4.运行结果如下。可自行比对 md5 value: 33b3bc8e05b4fcc16bd531dd9adac166 5.代码如下 #define…

基于STM32的智能家居灯光控制系统设计

引言 本项目将使用STM32微控制器实现一个智能家居灯光控制系统&#xff0c;能够通过按键、遥控器或无线模块远程控制家庭照明。该项目展示了如何结合STM32的外设功能&#xff0c;实现对灯光的智能化控制&#xff0c;提升家居生活的便利性和节能效果。 环境准备 1. 硬件设备 …

unix中的exec族函数介绍

一、前言 本文将介绍unix中exec族函数&#xff0c;包括其作用以及使用方法。当一个进程调用fork函数创建一个新进程后&#xff0c;新进程可以直接执行原本正文段的其他内容&#xff0c;但更多时候&#xff0c;我们在一个进程中调用fork创建新的进程后&#xff0c;希望新进程能…

在pycharm中设置后直接运行js代码

环境&#xff1a; pycharm专业版2020.3.2 已经安装nodejs和npm&#xff0c;并已经加入环境变量。 nodejs的安装参考在pycharm中运行js文件以及附加node.js下载步骤_python_脚本之家 下面开始在pycharm中设置&#xff0c;让其可以直接运行js代码&#xff0c;即需要安装一个叫…

C# 字符与字符串

本课要点&#xff1a; 1、字符类Char的使用 2、字符串类String的使用 3、可变字符串****StringBuilder 4、常见错误 一 何时用到字符与字符串 问题&#xff1a; 输出C#**课考试最高分&#xff1a;**98.5 输出最高分学生姓名&#xff1a;张三 输出最高分学生性别&#x…

六.应用层

目录 ​编辑 4.11 DHCP 6.1应用层的概述 6.2网络应用模型 CS P2P 6.3DNS 域名 www是什么&#xff0c;http是什么&#xff0c;到底什么区别&#xff1f; DNS出现及演化 DNS概括 DNS域名解析过程 6.4FTP FTP客户/服务器 FTP工作原理 FTP传输模式 6.5电子邮件 电…

King of Range 2024牛客国庆集训派对day3

原题 King of Range 解析 m 的值不大, 每次时间在 n logn 以内即可 我们遍历整个数组, 以 i 为右边界, 检测是否有满足条件的左边界, 一次只加上左面的所有可能, 用两个双向队列维护两个单调栈, 一个存最大值, 一个存最小值, 这样可以帮助找到合适的左边界 代码 #include …