传输层——UDP

news2024/9/20 22:32:42
在学习计算机网络的过程中,我们知道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协议的一个较为深刻的理解。

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

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

相关文章

Windows平台C#版RTSP转RTMP直播推送定制版

技术背景 前几年我们发布了C版的多路RTMP/RTSP转RTMP转发官方定制版。在秉承低延迟、灵活稳定、低资源占用的前提下,客户无需关注开发细节,只需图形化配置转发等各类参数,实现产品快速上线目的。 如监控类摄像机、NVR等,通过厂商…

关于堆排序

今天我们不刷力扣了,我们来复习(手撕)一下数据结构中的八大排序算法之一,堆排序 基本概念: 堆是一种特殊的树形数据结构,即完全二叉树。 堆分为大顶堆和小顶堆: 大顶堆:每个节点的值…

手机上制作证件照

最近由于需要给老姐弄一组证件照,找了一通手机上的软件,找到一款性价比较高的,详细流程记录下来。vx小程序上搜索"泰世茂证件照",打开首页如下图所示∶ 单击"开始制作" ,选择一个证件照类别&#…

Python中Web开发-FastAPI框架

大家好,在当今Web开发领域,高性能、易用性和可扩展性是开发者们追求的目标。Python作为一种流行的编程语言,在Web开发领域也有着强大的影响力。而在众多的Python Web框架中,FastAPI凭借其快速、现代和易用的特性,成为了…

语雀——云知识库/笔记

对于日常进行学习/创作或是记录学习、工作内容与心得的群体来说,能够及时同步的云笔记应用有着广泛的应用场景。近期,我也探索了许多款不同的软件应用,今天来分享一款很有特点的应用——语雀。 语雀,为每一个人提供优秀的文档和知…

docker-file 网络

docker挂载 1.绑定挂载(Bind Mounts):绑定挂载是将主机上的文件或目录挂载到容器中。 docker run -v /host/path:/container/path image_name 2.卷挂载(Volume Mounts):卷挂载将 Docker 数据卷挂载到容器中…

[数据结构1.0]计数排序

读者老爷好,本鼠鼠最近学了计数排序,浅浅介绍一下! 目录 1.统计相同元素出现次数 2.根据统计的结果将序列回填到原来的序列中 3.相对映射计数排序 计数排序又称为鸽巢原理,是对哈希直接定址法的变形应用,是非比较排…

AI语音及其应用

文章目录 一、基本认识二、AI语音应用场景三、真人录音与AI配音的区别四、AI语音创作基本步骤 本文将简单了解下AI语音、应用场景及其优势和创作核心步骤。 一、基本认识 AI语音是指基于人工智能技术开发的语音识别和语音合成系统。语音识别是指计算机识别和理解人类语音的能力…

决定了,将ChatGPTer开源!主打一个大模型人人可用。

一个快速上手且极易部署的类ChatGPT开源应用,可接入 OPENAI API 或 通义千问API 开源地址: https://github.com/isnl/EsChat 大声(偷偷)告诉你:通义千问有免费API额度可白嫖!!! 版本特性 OPENAI 和 通义千…

北航提出part2whole:可控⼈体图像⽣成的统⼀参考框架,可从任何数量和不同来源的参考人体部位图像中生成逼真的、高质量的各种姿势的人体人物图。

Parts2Whole,它可以从任何数量和不同来源的参考人体部位图像中生成逼真的、高质量的各种姿势的人体人物。我们的方法保持了与相应条件语义区域的高度一致性,同时保证了整体之间的多样性和协调性。 (a)以不同人的参考图像为条件生成人的图像。每对包括4个…

6.Redis之String命令

1.String类型基本介绍 redis 所有的 key 都是字符串, value 的类型是存在差异的~~ 一般来说,redis 遇到乱码问题的概率更小~~ Redis 中的字符串,直接就是按照二进制数据的方式存储的. (不会做任何的编码转换【讲 mysql 的时候,知道 mysql 默认的字符集, 是拉丁文,插入中文…

ChatGLM2-6B 模型基于 [P-Tuning v2]的微调

ChatGLM2-6B-PT 一、介绍 1、本文实现对于 ChatGLM2-6B 模型基于 [P-Tuning v2](https://github.com/THUDM/P-tuning-v2) 的微调 2、运行至少需要 7GB 显存 3、以 [ADGEN](https://aclanthology.org/D19-1321.pdf) (广告生成) 数据集为例介绍代码的使用方法。 模型部署参考…

OC笔记之foundation框架

OC学习笔记(三) 文章目录 OC学习笔记(三)常用Foundation框架结构体NSRangeNSRange结构体的定义定义 NSRange 的方法打印Range的相关信息NSRange的实际运用查找子字符串返回NSRange结构体 NSPointNSRect NSStringNSString的创建NSS…

Python文件操作(Excel、PDF、XML、Word)

大家好,在现代数据驱动的世界中,对于数据的处理和管理是至关重要的。Python作为一种强大而灵活的编程语言,提供了丰富的工具和库来处理各种文件格式。本文将探讨Python中的文件操作,重点介绍如何使用Python处理Excel、PDF、XML和W…

【python】python tkinter 计算器GUI版本(模仿windows计算器 源码)【独一无二】

👉博__主👈:米码收割机 👉技__能👈:C/Python语言 👉公众号👈:测试开发自动化【获取源码商业合作】 👉荣__誉👈:阿里云博客专家博主、5…

每日一题《leetcode--2816.翻倍以链表形式表示的数字》

https://leetcode.cn/problems/double-a-number-represented-as-a-linked-list/ 这里我们直接模拟翻倍后链表的数字,首先我们得先考虑链表的头结点的值是否大于4(*2后是否需要进位)。 处理完头结点后,就需要考虑其余结点。因为求的是链表中每个结点翻倍后…

这个开源的多模态模型无敌。。。

InternVL 由 OpenGVLab 开发,是一个开源的多模态对话模型,其性能接近商业化的 GPT-4V 模型。 GPT-4V 是 OpenAI 去年推出的多模态模型,使用它你可以分析所需的任何类型的图像并获取有关该图像的信息。 1. InternVL 开源模型 而今天的主角研究…

基于python实现的深度学习web多格式纠错系统

基于python实现的深度学习web多格式纠错系统 开发语言:Python 数据库:MySQL所用到的知识:Django框架工具:pycharm、Navicat、Maven 系统功能实现 用户登录 登录功能是本系统一个非常重要的功能,这极大的保护了系统的安全。登录…

跨平台之用VisualStudio开发APK嵌入OpenCV(一)

序 本篇是杂谈以及准备工作(此处应无掌声) 暂时不管iOS(因为开发hello world都要年费) 软件: Visual Studio 2019(含Android SDK和NDK编译器等) OpenCV 这是一个女仆级的系列文章&#xf…

php之sql代码审计

1 SQL注入代码审计流程 1.1 反向查找流程 通过可控变量(输入点)回溯危险函数 查找危险函数确定可控变量 传递的过程中触发漏洞 1.2 反向查找流程特点 暴力:全局搜索危险函数 简单:无需过多理解目标网站功能与架构 快速:适用于自动化代码审…