传输层协议 —— UDP协议

目录

0.前言

1.UDP协议格式

16位源端口和目的端口

16位UDP长度 

16位校验和

2.UDP协议特点

无连接

不可靠

面向数据报

3.UDP的缓冲区


0.前言

首先,我们得明确一点,网络模型是分层的。自底向上分别是物理层、数据链路层、网络层、传输层、应用层。其中,应用层是用户直接使用的一层,也就是说,发送方的用户在应用层输入消息,接收方的用户在应用层接收消息。

我们还需要明确一点,发送方从应用层发送的数据需要自顶向下贯穿TCP/IP 协议栈,到达物理的设备上,通过物理的线路(可能有线,也可能无线)到达对方的物理设备上,然后自底向上贯穿TCP/IP 协议栈到达接收方的应用层。

发送方发送的消息自顶向下交付的时候,需要添加每一层的协议报头,接收方接收到的消息自底向上交付的时候,需要将自己这一层的协议报头分离,再向上交付。

铺垫:用户在应用层启动的一个个的应用程序其实就是一个个的进程,应用程序和应用程序之间进行通信,其实本质就是进程和进程之间进行通信

从接收方的角度来看,我们很明确的可以知道,应用层的数据来自于传输层,那么问题来了,传输层如何将数据准确无误的交给应用层中对应的进程呢?这个时候就需要传输层的协议来保证了。而UDP协议就是传输层的一个常用的协议

1.UDP协议格式

所谓协议,在代码实现上其实就是struct类型的数据,通信双方都定义相同的结构体类型的数据,这样一来,你发送的数据我能认识,我发送的数据你也能认识。

UDP是传输层的协议,传输层的协议是在操作系统内部实现的,所以操作系统源代码内部一定包含了UDP协议的相关内容。

Linux源代码中UDP协议相关字段:

我们可以将代码形象化,便得到了下面这张图:准确的说,下面这张图是UDP报文格式图。

其中,UDP协议报头中包含四个关键字段,分别是16位源端口地址16位目的端口地址16位UDP长度16位UDP校验和。累计8字节,下面依次介绍这几个字段。

16位源端口和目的端口

我们从接收方的视角来看,应用层中的进程收到的数据一定是传输层交给他的,也就倒逼传输层需要正确的把数据交给对应的进程,应用层中启动的进程可能不止一个,这就要求传输层需要有一种能够找到对应进程的能力。

16位目的端口便提供了这种能力,通过16位目的端口,传输层就知道将解包之后的数据交给应用层中的哪个进程了。

同样,接收方和发送方的角色并不是固定的。可能接收方也要向发送方发送数据,发送数据的时候就需要知道接收的数据是谁发给我的,我才能向特定主机下的特定进程进行响应。而16位源端口便可告知对方该数据从哪里来的,这就是16位源端口的作用。

16位UDP长度 

接收方传输层收到的是一个个UDP报文,向上交付的时候,不能把整个UDP报文交付给应用层,需要进行解包,将UDP报头分离下来之后,再交付给应用层。那么如何进行解包呢?这就需要使用到16位UDP长度了。

16位UDP长度表明了整个UDP报文的长度,包括报头和数据。由于UDP的协议报头是固定长度的8字节,而在前面我们知道了,协议是通信双方都认识的结构体类型,那我们只需要通过结构体类型的对象访问结构体中的16位UDP长度成员,不就可以得到整个UDP报文的长度了吗?再将整个UDP报文的长度减去定长8个字节的协议报头,就得到了有效载荷的长度,不就可以提取有效载荷了吗?这就是16位UDP长度的作用。

使用UDP协议的注意事项:

因为UDP的长度被规定为16位,也就是16个比特位从全0到全1的范围,换算下来大概 0kb ~ 64kb的空间。也就是说,使用UDP协议通信的最大范围就是64kb,并且这其中还包含UDP协议报头的长度。所以,如果传输的数据大一64kb,就需要在发送方的应用层手动分割数据包,并在接收方手动对数据包进行组装。

16位校验和

16位校验和也称为16位检验和。

什么是16位校验和?

16位校验和是一种用于检测报文在传输过程中是否发生错误的数据验证方法。具体来说,它涵盖了UDP报文头和数据部分,通过一种特定的算法计算得出,并附加在报文末尾。接收方在收到报文后,会重新计算校验和,并将其与报文中的校验和进行比较,以验证数据的完整性和正确性。

16位校验和的思想大概就是,发送方根据特定的方法提前通过要发送的数据计算出一个值,接收方接收到数据之后,再根据相同的方法通过接收到的数据计算出一个值,如果两个值一样说明数据传输的过程中没有出错,发送的数据就是要接受的数据。如果两个值不一样,就说明发送的数据和接收的数据不一致,接收方直接就丢弃了。

2.UDP协议特点

UDP协议具有无连接不可靠面向数据报的特点。

无连接

无连接指的是使用UDP协议进行通信时,通信双方只需要知道对方的IP地址和端口号就能直接进行数据的收和发,通信双方之间不需要建立连接。

这一点我们可以通过使用socket编程接口来理解。使用UDP协议时,客户端并不需要发起连接,服务器端也不需要获取连接,这一点和TCP是不同的。

不可靠

UDP协议的不可靠是指UDP协议并不保证报文准确无误的发送给对方,发送的数据包是否丢失、对方是否收到数据……UDP并不保证。所以UDP不像TCP那样拥有一系列的机制来保证可靠性。

UDP的不可靠特点,我们不能把他当成一个缺点。因为UDP在设计之初呢,就是为了通信双方能够更加快速的通信,必然导致UDP的设计比较简单,不具备支持可靠性的策略。

面向数据报

UDP面向数据报的特点指的就是上层交给UDP什么报文,UDP就发送什么报文,既不会拆分,也不会合并,接收方通过UDP协议就接收什么报文。整个通信的过程是基于数据报进行的。

3.UDP的缓冲区

UDP是传输层的协议,传输层的协议是在操作系统内部实现的,操作系统内部会为对应的协议分配一个接收缓冲区进行数据的接收,也会为对应的协议分配一个发送缓冲区进行数据的发送。

UDP协议没有真正意义上的发送缓冲区。因为UDP是面向数据报的协议,发送的数据直接通过sendto接口交给操作系统内核,由操作系统内核将数据交给网络层,直接就进行发送,所以UDP协议也不需要发送缓冲区。

UDP协议是有接收缓冲区的。UDP协议的接收缓冲区也仅仅是用来进行数据的接收,并不通过缓冲区提供可靠性保证;如果缓冲区满了,接收到的报文就会被丢弃。

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

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

MODIS/Landsat/Sentinel下载教程详解【常用网站及方法枚举】

⛄前言 在当今快速发展的地球观测时代,遥感技术作为获取地球表面及其环境信息的重要手段,正以前所未有的广度和深度改变着我们对自然界的认知与管理方式。MODIS(Moderate-resolution Imaging Spectroradiometer,中分辨率成像光谱…

unity安装配置和vs2022联动教程

目录 1.选择vs2022配置 2.安装unity 2.1安装unity hub 2.2注册个人账号 2.3安装编辑器 2.4修改为简体中文 2.5添加许可证 2.6安装位置修改 3.项目的创建 3.1如何创建 3.2如何选择 3.3配置语言 3.4去哪里找语言包 4.unity编辑器窗口的介绍 4.1游戏的运行和停止 4…

AI编程的特点及SCSAI平台在AI编程方面的一些思路

团长团 AI智造AI编程 2024年09月18日 18:25 北京 说先来看看AI编程的优缺点,然后我们再看看SCSAI在AI编程方面的一些可能选择 使用AI编程的优点 ‌AI编程的优点包括提升编程效率、降低编程门槛、优化程序结构、加强软件可靠性、促进跨领域融合,而缺点则…

JS落叶动画代码分析

秋天到了,秋高气爽的季节。我们来做一个落叶动画吧!来迎接秋天的到来 文字可以更换。 1.目录如下 在线演示:点击我在线演示 images两张照片,首先,你得要准备一个vscode编辑器。和一个chorme浏览器或edge浏览器。 …

Qt常用控件——QLCDNumber

文章目录 QLCDNumber核心属性倒计时小程序倒计时小程序相关问题 QLCDNumber核心属性 QLCDNumber是专门用来显示数字的控件,类似于这样: 属性说明intValue获取的数字值(int).value获取的数字值(double)和intValue是联动的例如value设为1.5,in…

Kubernetes Ingress

文章目录 一、为什么需要 Ingress二、什么是Ingress,Ingress Controller三、Ingress 的工作原理四、Ingress 配置资源模版五、实例1、搭建 Ingress 环境1.1、Ingress-Nginx官网地址1.2、master 节点下载 deploy.yaml1.3、所有节点提前 pull 必须的镜像1.4、修改并应用 deploy.y…

保护您的企业免受网络犯罪分子侵害的四个技巧

在这个日益数字化的时代,小型企业越来越容易受到网络犯罪的威胁。网络犯罪分子不断调整策略,并使用人工智能来推动攻击。随着技术的进步,您的敏感数据面临的风险也在增加。 风险的不断增大意味着,做好基本工作比以往任何时候都更…

JavaEE:网络编程(套接字)

文章目录 Socket套接字TCP和UDP的区别有连接/无连接可靠传输/不可靠传输面向字节流/面向数据报全双工/半双工 UDP/TCP api的使用UDPDatagramSocketDatagramPacketInetSocketAddress练习 TCPServerSocketSocket练习 Socket套接字 Socket是计算机网络中的一种通信机制&#xff0…

MySQL高阶1777-每家商店的产品价格

题目 找出每种产品在各个商店中的价格。 可以以 任何顺序 输出结果。 准备数据 create database csdn; use csdn;Create table If Not Exists Products (product_id int, store ENUM(store1, store2, store3), price int); Truncate table Products; insert into Products …

运行npm install 时,卡在sill idealTree buildDeps没有反应

一直停留在sill idealTree buildDeps 解决方法 npm config set registry https://registry.npm.taobao.org 配置后用下面命令看是否配置成功 npm config get registry 如果配置还不好使 就执行下行的ssl npm set strict-ssl false 然后执行 npm install 成功执行

【Python报错已解决】 TypeError: Descriptors cannot not be created directly

🎬 鸽芷咕:个人主页 🔥 个人专栏: 《C干货基地》《粉丝福利》 ⛺️生活的理想,就是为了理想的生活! 专栏介绍 在软件开发和日常使用中,BUG是不可避免的。本专栏致力于为广大开发者和技术爱好者提供一个关于BUG解决的经…

Java--stream流、方法引用

Stream流 - Stream流的好处 - 直接阅读代码的字面意思即可完美展示无关逻辑方式的语义 - Stream流把真正的函数式编程风格引入到Java中 - 代码简洁 - Stream流的三类方法 - 获取Stream流 - 创建一条流水线,并把数据放到流水线上准备进行操作 - 中间方法 - 流水线上的操作 - 一次…

83.static关键字

目录 一.static关键字 1.1 修饰局部变量 1.2 修饰全局变量 1.3 修饰函数 二.视频教程 一.static关键字 static关键字可以修饰局部变量,全局变量和函数。 1.1 修饰局部变量 使用static关键字修饰局部变量,只在第一次进入作用域的时候初始化 。函数…

C++ | Leetcode C++题解之第409题最长回文串

题目&#xff1a; 题解&#xff1a; class Solution { public:int longestPalindrome(string s) {unordered_map<char, int> count;int ans 0;for (char c : s)count[c];for (auto p : count) {int v p.second;ans v / 2 * 2;if (v % 2 1 and ans % 2 0)ans;}retur…

下拉框QComboBox

文本 // 获取和设置当前条目的索引 int currentIndex() const void setCurrentIndex(int index)// 获取和设置当前条目的文本 QString currentText() const void setCurrentText(const QString &text)// 获取和设置指定索引条目的文本 QString itemText(int index) co…

AI+代码审核平台CodeSec获CCIA中国网络安全创新创业大赛总决赛三等奖

近日&#xff0c;由中央网信办指导&#xff0c;中国网络安全产业联盟&#xff08;CCIA&#xff09;主办的2024年中国网络安全创新创业大赛总决赛及颁奖典礼在国家网络安全宣传周落下帷幕。开源网安“AI代码审核平台CodeSec V4.0” 凭借在AI方向的技术创新、技术突破及功能应用创…

TCP.IP四层模型

一、TCP/IP模型协议分层 1、应用层&#xff1a; 2、传输层&#xff1a; TCP&#xff1a;传输控制协议 UDP&#xff1a;用户数据报协议 3、网络层&#xff1a; IP: 国际协议&#xff08;IP地址&#xff09; ICMP&#xff1a; 互联网控制消息协议&#xff08;互联网…

blender软件下载地址,blender哪个版本好用

​blender软件下载 不废话&#xff0c;blender软件下载直接点&#xff1a;https://download.blender.org/release/ blender最新稳定版&#xff1a;Blender 4.2.1 LTS 【渲染101云渲染】&#xff1a;如果您希望使用Blender的最新功能&#xff0c;并且愿意接受可能存在的一些小…

JAVA基础,利用for循环找水仙花个数

public class learn2 {public static void main(String[] args) {int count 0;//定义水仙花的个数for (int i 100; i<999; i){int g i%10;int s i/10%10;int b i/100%10;if (i b*b*b s*s*s g*g*g){count1;System.out.println(i);}}System.out.println("一共有"…

食品检测与分类系统源码分享

食品检测与分类检测系统源码分享 [一条龙教学YOLOV8标注好的数据集一键训练_70全套改进创新点发刊_Web前端展示] 1.研究背景与意义 项目参考AAAI Association for the Advancement of Artificial Intelligence 项目来源AACV Association for the Advancement of Computer V…