传输层——UDP

在学习计算机网络的过程中,我们知道OSI七层协议模型,但是在实际开发应
用中我们发现OSI七层协议模型并不适合实施,因为OSI上三层通常都是由开
发人员统一完成的,这三层之间在实现过程中没有一个明确的界限,所以我
们更多的是将七层模型认为是TCP/IP四层协议(除去硬件层),而TCP、IP
分别是两个网络层中非常具有代表性的网络协议,其中TCP处于传输层。而
在传输层中除却TCP协议之外,还有一个很重要的协议那就是UDP协议,所
以,今天我们就来认识一下UDP协议是什么样的。

需要注意的是,本篇文章讲述的是UDP的较为底层的知识,默认读者已经会使用socket套接字的网络编程,以及UDP和TCP的简单认识。

1. 如何认识网络协议

关于对网络协议的比较简单的认识方法,可以看我的另一篇博客:应用层协议,无论是哪一层的网络协议,它们的认识方法都是大致相同的,那就是认识网络协议在计算机中做出的约定,也就是结构化字段。

2. UDP的结构化字段

在这里插入图片描述
在传输层中的报文我们一般叫做数据段。
在学习某一层的某一个网络协议时,我们都要明白,这个报文如何将报头和有效载荷分离,以及如何将有效载荷向上交付?
对于两台主机的网络通信,对于传输层,我们需要知道两台主机的IP地址、端口号、以及传输层协议,这样我们就可以使用IP地址定位到唯一一台主机,协议号知道传输层使用的是哪个协议(这个是IP层的事情),然后利用端口号定位到一台主机的唯一一个进程,我们就可以在网络上精准的与一台主机上的一个进程进行网络通信了,而我们将上面需要的两台主机的IP地址、端口号、以及协议号,称为一个五元组。
所以我们自然的就解决了UDP协议如何向上交付的问题,那就是利用目的端口号。
而对于报头和有效载荷的分离,我们发现UDP协议中有一个字段就是16位报文长度,这个表示了一个UDP报文的长度,而UDP报头长度是固定的八字节,所以我们向上交付有效载荷的时候只需要根据UDP报头做出偏移就可以,至此有效载荷与报头的分离也明了了。
可能有人还有问题,那就是在TCP协议是面向字节流的,作为面向字节流的协议,这意味着上层使用该协议的应用层往往需要自行确保自己收到的报文是完整的(这通常需要应用层协议的配合),而我们在使用UDP协议进行socket编程的时候,好像从来没注意过这个问题,我们直接使用sendto、recvfrom两个系统调用将数据拿上来,这个数据就是独立且完整的,这是因为UDP协议是面向数据报的,报文和报文之间有着明显的边界,所以我们才不需要对UDP报文单独做处理。
但是好像还是不对,无论你是那个协议在底层传输时不都是字节序吗,那有什么面向数据报,面向字节流的说法,凭什么UDP的报文就不需要考虑报文的完整性和独立性的问题?
所以我在这里给出结论:UDP协议也是要确保自己收到的报文是独立且完整的,但是这一点不需要用户来做,UDP协议会自行处理。说是UDP协议处理,UDP协议是内嵌在操作系统中的,UDP协议处理,不就是操作系统处理吗?
对于接收到的报文,UDP协议会检测它是否有八字节的报头长度,没有直接丢弃,反之根据16位报文长度来进行进一步报文的完整性的验证以及报文之间的分离。期间有任何一个条件不满足,直接将报文丢弃,这也就是UDP协议不可靠的主要原因。
在UDP的协议的结构化字段中,还有一个字段是16位检验和,这个是用来检验报文是否有问题的,我们不讨论。
而上面的结构化字段中端口号无论是目的端口号还是源端口号,大小都是16位,这也是为什么socket编程中,端口变量都是使用uint16_t而不是int。

3. UDP协议的进一步理解

在上面对UDP结构化字段的认识过程中,经常会提到 “报头” 这个字眼,我们也说学习某一层的某一个网络协议我们都需要研究它的结构化字段,也就是报文,而报文就是报头 + 有效载荷。有效载荷是用户的应用层数据,我们可以使用一个缓冲区来将它们存放起来,这个好理解,那么报头如何在计算机中理解呢?
其实报头在计算机中就是一个结构体:

struct udphdr
{
	uint16_t src_port; // 源端口号
	uint16_t des_port; // 目的端口号
	uint16_t length; // 报文长度
	uint16_t check; // 校验和
};

现在我们就需要意识到一个场景,我们的计算机中会不会同时存在大量的UDP报文?这个显然是会的,那么既然存在大量的UDP报文,就需要对这些报文进行管理,如何管理?先描述,再组织。
那么我们就可以描述一下这个报文:

struct sk_buff
{
	char* data;
	char* tail;
	sk_buff* prev;
	sk_buff* naxt;
	//...
};

其中如果有应用层协议向下交付了一个报文,我们需要使用UDP协议将这个有效载荷进行封装,我们可以这样封装:
在这里插入图片描述

我们先创建一个结构体sk_buff,此时我们需要让data指针向前移动有效载荷个大小,然后将应用层的数据拷到缓冲区中,再让data指针向前移动八字节,然后再放入UDP报头。这样我们就完成了报文的封装,我们的计算机中存在大量的UDP报文,我们的传输层中可能就是这样:

在这里插入图片描述

这样的话,对UDP报文的管理就转化为了对该链表的增删查改。
现在我们就明白了UDP协议的报文的管理以及报文的封装,现在我们将报文发出去了,如何接收呢?对端主机不是也遵守UDP协议吗?它也认识这个sk_buff啊,那么拿到有效载荷不是很自然吗?
而对于UDP的接收方,会将有效载荷存放在一个接收缓冲区中,UDP协议没有发送缓冲区,这一点与TCP协议是不同的:
在这里插入图片描述

UDP协议为什么需要接收缓冲区呢?这是因为没有接收缓冲区的话,上层应用来不及处理报文的话,继续来到的报文就直接被丢弃了,如果是这样的话UDP协议也太不靠谱了,怎么说也还是得靠谱一点。
那么为什么没有发送缓冲区呢?
这是因为UDP协议是不可靠的,而至于进一步的理解,则需要配合TCP协议来了解。

4. UDP协议知识的补充

在Linux源代码中我们可以找到上面提到的两个结构体:
在这里插入图片描述
在这里插入图片描述
UDP的特点:无连接,不可靠,面向数据报。
UDP没有发送缓冲区,只有接收缓冲区,如果接收缓冲区满了之后,继续接收到的报文会直接丢弃,直到接收缓冲区有多余空间。
这个接收缓冲区你可以理解为它就是一个队列,里面放的是交付上层的有效载荷。
UDP是全双工的,对于一个文件描述符,发的同时也可以收。
在使用UDP协议的时候需要注意发送的报文的大小不可以超过16位报文长度可表示的长度,不然多余的载荷会被丢弃。而16位能表示的大小在现如今是非常小的,只有65536字节,这也是它的局限性之一。
但是仍然有一些应用层协议使用的仍是UDP协议,这些应用层协议的特点就是传输的报文大小不会太大,以下是一些上层使用UDP协议的比较出名的应用层协议:
NFS: 网络文件系统
TFTP: 简单文件传输协议
DHCP: 动态主机配置协议
BOOTP: 启动协议(用于无盘设备启动)
DNS: 域名解析协议
以上就是我对UDP协议的一个较为深刻的理解。

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

001集—创建、写入、读取文件fileopen函数——vb.net

此实例为在指定路径下创建一个txt文本文件,在文本文件内输入文字,并弹窗显示输入文字,代码如下: Public Class Form1Private Sub Button2_Click(sender As Object, e As EventArgs) Handles Button2.ClickDim testcontent As Str…

基于CNN+LSTM深度学习网络的时间序列预测matlab仿真,并对比CNN+GRU网络

目录 1.算法运行效果图预览 2.算法运行软件版本 3.部分核心程序 4.算法理论概述 4.1 CNN基础 4.2 LSTM原理 4.3 GRU原理 4.4 CNNLSTM与CNNGRU对比 5.算法完整程序工程 1.算法运行效果图预览 2.算法运行软件版本 MATLAB2022A 3.部分核心程序 ......................…

IS-IS DIS

原理概述 OSPF 协议支持4种网络类型, IS-IS 协议只支持两种网络类型,即广播网络和点到点网络。与 OSPF 协议相同, IS-IS 协议在广播网络中会将网络视为一个伪节点( Pseudonode ,简称 PSN ),并选举出一台 DIS ( Designa…

Springboot+Vue+ElementUI开发前后端分离的员工管理系统01--系统介绍

项目介绍 springboot_vue_emp是一个基于SpringbootVueElementUI实现的前后端分离的员工管理系统 功能涵盖: 系统管理:用户管理、角色管理、菜单管理、字典管理、部门管理出勤管理:请假管理、考勤统计、工资发放、工资统计、离职申请、个人资…

部署LAMP平台

目录 一、LAMP简介与概述 1.1 各组件作用 1.2 LAMP平台搭建时各组件安装顺序 1.3 httpd服务的目录结构 1.4 httpd.conf配置文件 二、编译安装Apache httpd服务 2.1 关闭防火墙,将安装Apache所需软件包传到/opt目录下 2.2 安装环境依赖包 ​2.3 配置软件模块…

监控员工电脑屏幕的五大软件(电脑监控软件大盘点)

监控员工电脑屏幕是企业为了提升工作效率、确保信息安全和合规性而采取的一种常见做法。以下是五款在2024年备受推荐的员工电脑屏幕监控软件,每款软件都具有其独特的功能和优势: 1. 域智盾 域智盾是一款全面的终端管理系统,集成了实时屏幕监…

CSP俄罗斯方块(简单易懂)

开始将题目理解成了&#xff0c;开始的列应该是从输入图案的最左端开始计算&#xff0c;将前面所有的空列都删掉&#xff0c;代码如下&#xff1a; #include<bits/stdc.h> using namespace std; const int N 1e410; const int M 1e510; int a[20][20]; int b[5][5];int…

docker同步bilibili收藏视频到群晖,可配合emby

作者是amtoaer&#xff0c;在github项目地址&#xff1a;https://github.com/amtoaer/bili-sync 有两个版本&#xff0c;1.0和2.0&#xff0c;我使用的是2.0 PS2&#xff1a;2.0和1.0版本目录结构不兼容&#xff0c;所以部署后会全量重新下载视频。 演示&#xff1a; 依然是…

啊哈!算法-第2章-栈、队列、链表

啊哈!算法-第2章-栈、队列、链表 第1节 解密qq号——队列第2节 解密回文——栈第3节 纸牌游戏——小猫钓鱼第4节 链表第5节 模拟链表 第1节 解密qq号——队列 新学期开始了&#xff0c;小哈是小哼的新同桌(小哈是个大帅哥哦~)&#xff0c;小哼向小哈询问 QQ 号&#xff0c; 小…

XXE(XML外部实体注入)

1、XXE原理 XXE&#xff08;XML外部实体注入&#xff0c;XML External Entity) &#xff0c;在应用程序解析XML输入时&#xff0c;当允许引用外部实体时&#xff0c;可构造恶意内容&#xff0c;导致读取任意文件、探测内网端口、攻击内网网站、发起DoS拒绝服务攻击、执行系统命…

DOS学习-目录与文件应用操作经典案例-more

新书上架~&#x1f447;全国包邮奥~ python实用小工具开发教程http://pythontoolsteach.com/3 欢迎关注我&#x1f446;&#xff0c;收藏下次不迷路┗|&#xff40;O′|┛ 嗷~~ 目录 一.前言 二.使用 三.案例 一.前言 DOS系统的more命令是一个用于查看文本文件内容的工具。…

【教学类-58-04】黑白三角拼图04(2-10宫格,每个宫格随机1张-6张,带空格纸)

背景需求&#xff1a; 前期制作了黑白三角拼图2*2、3*3、4*4&#xff0c;确定了基本模板&#xff0c;就可以批量制作更多格子数 【教学类-58-01】黑白三角拼图01&#xff08;2*2宫格&#xff09;固定256种随机抽取10张-CSDN博客文章浏览阅读522次&#xff0c;点赞13次&#x…

通过扩展指令增强基于覆盖引导的模糊测试

本文由Bruno Oliveira于2024年4月25日发表于IncludeSec的官方网站上。作为IncludeSec的安全研究人员&#xff0c;在他们日常的安全审计和渗透测试工作中&#xff0c;有时需要为客户开发一些模糊测试工具。在安全评估方法中使用模糊测试技术&#xff0c;可以有效地在复杂的现代化…

全免费的数据恢复工具哪个好?分享2024年性价比超高的12款数据恢复软件!

当您丢失重要文件时&#xff0c;您应该可不想遇到措手不及的情况吧&#xff1f;相反&#xff0c;您需要在系统中使用一些可靠的数据恢复软件&#xff0c;但是全免费的数据恢复工具哪个好呢&#xff1f;别担心&#xff0c;本文将帮助您选择最适合您的解决方案。 如何挑选一款合适…

QT常量中有换行符

头文件添加&#xff1a; #pragma execution_character_set("utf-8")

我用LLaMA-Factory微调大模型来实现商品评论情感分析,准确率高达91.70%

大家好&#xff0c;我是程序锅。 最近在modelscope上闲逛的时候&#xff0c;在数据集板块发现有一个商品评论情感预测数据集。这个数据集源自一个比赛&#xff0c;它的目的是为了预测电商平台顾客的评论是好评还是差评。 数据示例如下所示&#xff08;其中0代表差评&#xff…

【YOLOv10训练教程】如何使用YOLOv10训练自己的数据集并且推理使用

《博主简介》 小伙伴们好&#xff0c;我是阿旭。专注于人工智能、AIGC、python、计算机视觉相关分享研究。 ✌更多学习资源&#xff0c;可关注公-仲-hao:【阿旭算法与机器学习】&#xff0c;共同学习交流~ &#x1f44d;感谢小伙伴们点赞、关注&#xff01; 《------往期经典推…

【二叉树】力扣OJ题

文章目录 前言1. 翻转二叉树1.1 题目1.2 解题思路1.3 代码实现1.4 时空复杂度 2. 对称二叉树2.1 题目2.2 解题思路2.3 代码实现2.4 时空复杂度 3. 平衡二叉树3.1 题目3.2 解题思路3.3 代码实现3.4 时空复杂度 结语 前言 本篇博客主要介绍二叉树的经典 OJ 题&#xff0c;题目主…

间接平差——以水准网平差为例 (python详细过程版)

目录 一、原理概述二、案例分析三、代码实现四、结果展示本文由CSDN点云侠原创,间接平差——以水准网平差为例 (python详细过程版),爬虫自重。如果你不是在点云侠的博客中看到该文章,那么此处便是不要脸的爬虫与GPT生成的文章。 一、原理概述 间接平差的函数模型和随机模型…

算法与数据结构汇总

刷题建议步骤 求职硬通货&#xff1a;一&#xff0c;好的学历&#xff0c;这个要下血本。本科&#xff0c;可以考研&#xff0c;读研。专科&#xff0c;可以专升本&#xff0c;再考研&#xff0c;读研&#xff0c;二&#xff0c;软考&#xff0c;一年考两次&#xff0c;有些科…