传输层协议 —— UDP协议

news2024/9/21 17:01:05

目录

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.coloradmin.cn/o/2144668.html

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

相关文章

Nginx反向代理出现502 Bad Gateway问题的解决方案

🎉 前言 前一阵子写了一篇“关于解决调用百度翻译API问题”的博客,近日在调用其他API时又遇到一些棘手的问题,于是写下这篇博客作为记录。 🎉 问题描述 在代理的遇到过很多错误码,其中出现频率最高的就是502&#x…

JavaEE:网络编程(套接字)

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

驱动开发知识点

裸机开发 ——————————————linux驱动 SOC: 定义:SOC,全称System on Chip,是一种集成了多个功能模块的芯片,包括处理器、内存、外设、接口等。它将原本分散在多个芯片上的功能集成到一个芯片上&#xff0…

一个基于 laravel 和 amis 开发的后台框架, 友好的组件使用体验,可轻松实现复杂页面(附源码)

前言 随着互联网应用的发展,后台管理系统的复杂度不断增加,对于开发者而言,既要系统的功能完备,又要追求开发效率的提升。然而,传统的开发方式往往会导致大量的重复劳动,尤其是在构建复杂的管理页面时。有…

不限学历!这个证书在上海太香了!利于积分、落户、抵扣个税...

一、软考是什么? “软考”全称:计算机技术与软件专业技术资格(水平)考试,关于它你需要知道: 1、软考是全国性考试:软考实行全国统一规划,实行统一大纲,统一试题&#xff…

【vulhub】Os-hackNos-1

🏘️个人主页: 点燃银河尽头的篝火(●’◡’●) 如果文章有帮到你的话记得点赞👍收藏💗支持一下哦 【vulhub】Os-hackNos-1 环境搭建漏洞复现 环境搭建 进入vulnhub官网 https://vulnhub.com 下载镜像 在虚拟机中打开镜像文件…

100行Python代码实现FastAPI Websocket 聊天室(纯协程方案)

本文发表于入职啦(公众号: ruzhila) 大家可以访问入职啦学习更多的编程实战。 项目地址 代码已经开源, fastapi_chatroom 👏 欢迎Star 代码运行效果: 所有的项目都在github上开源:100-line-code 欢迎Star 👏 用100行…

open sora1.1容器构建教程指南

一、介绍 Open-Sora 1.1 项目是 Colossal AI 团队开发的一个完全开源的视频生成项目,该项目致力于高效制作高质量视频,并通过开源原则实现先进视频生成技术的低成本普及。 1. 项目背景与目标 Open-Sora 项目旨在通过提供开源的模型、工具和内容&#…

idea使用阿里云服务器运行jar包

说明&#xff1a;因为我用的阿里云服务器不是自己的&#xff0c;所以一些具体的操作可能不太全面。看到一个很完整的教程&#xff0c;供参考。 0. 打包项目 这里使用的是maven打包。 在pom.xml中添加以下模块。 <build><plugins><plugin><groupId>org…

JDBC导图

思维歹徒 一、使用步骤 二、SQL注入 三、数据库查询&#xff08;查询&#xff09; 四、数据库写入&#xff08;增删改&#xff09; 五、Date日期对象处理 六、连接池使用 创建连接是从连接池拿&#xff0c;释放连接是放回连接池 七、事务和批次插入 八、Apache Commons DBUtil…

进程监控与管理详解

一、进程的定义: 进程process是正在运行的程序,包括: 分配的内存地址空间 安全属性、包括所有权和特权 一个或多个线程 进程状态 进程的环境包括: 本地和全局变量 当前调度上下文…

多目标优化算法(Multi-Objective Optimization Algorithms, MOOA)介绍

在现实世界中&#xff0c;许多问题都涉及到多个目标的权衡和优化。例如&#xff0c;在工程设计中&#xff0c;可能需要同时考虑成本、效率和可靠性&#xff1b;在资源管理中&#xff0c;可能需要平衡环境保护和经济效益。多目标优化算法&#xff08;Multi-Objective Optimizati…

bmp格式图片怎么转换jpg?这几种转换方法超级好用!

bmp格式图片怎么转换jpg&#xff1f;BMP格式&#xff0c;这一历史悠久的图像编码方式&#xff0c;正逐渐在数字时代的浪潮中显得力不从心&#xff0c;其边缘化的趋势愈发明显&#xff0c;这一现象的根源&#xff0c;在于BMP格式固有的局限性难以匹配现代用户对于图像处理的多元…

【Python】探索Magenta:音乐与艺术的机器智能创作

下班了&#xff0c;今天的苦就先吃到这里。 在人工智能的浪潮中&#xff0c;机器学习技术正逐渐渗透到艺术创作的各个领域。今天&#xff0c;我们来探索一个特别的项目——Magenta&#xff0c;它是由Google Brain团队发起的&#xff0c;旨在使用机器智能生成音乐和艺术。这个项…

Lucene详解介绍以及底层原理说明

文章目录 什么是Lucene?示意图1. 倒排索引2. 索引创建过程3. 数据存储4. 搜索过程5. 相关性评分 Lucene底层原理1. 倒排索引2. 索引创建过程3. 数据存储4. 搜索过程5. 相关性评分 什么是Lucene? Lucene是一个高性能的全文搜索引擎库&#xff0c;它基于倒排索引技术实现快速、…

Threejs之看房案例(下)

本文目录 前言最终效果1、点精灵1.1 添加点精灵1.2 点精灵效果2、添加事件2.1 鼠标移动事件2.1.1 效果2.2 鼠标点击事件2.2.1 效果2.3 切换互通3. 完整代码前言 在Threejs之看房案例(上)这篇博客中我们已经完成了大厅的3d观看效果,但是我们会发现如果想去其他房间观看,没有…

vue3+ant design vue 中弹窗自定义按钮设置及以冒号为基准布局

1、自定义弹窗按钮&#xff0c;去除取消和确定按钮。&#xff08;网上很多方法都是说通过插槽来实现&#xff0c;但是试了下不生效&#xff0c;那既然插槽不生效的话&#xff0c;干脆直接写按钮就好了&#xff09; <a-modalv-model:open"open"title"人员信息…

为什么现在都流行开放式耳机?四款性能出色的蓝牙耳机推荐

在当下&#xff0c;开放式耳机逐渐成为众多消费者的新宠。与传统入耳式耳机相比&#xff0c;开放式耳机展现出诸多独特之处。它可以呈现出更清晰的音质效果&#xff0c;让用户有更美妙的听觉体验。在佩戴感上&#xff0c;开放式耳机更为舒适&#xff0c;不会给耳朵带来压迫感。…

MYSQL登录失败,确保密码正确,常见问题

今天登录MYSQL时&#xff0c;发现登录不进去,我能确保密码没有错误&#xff0c;并且我昨天以这样的方式登录成功&#xff0c;我已经重启过mysql服务&#xff0c;但是依旧登录不进去。 C:\Users\user>mysql -u root -p Enter password: ****** ERROR 1045 (28000): Access …

tidb 集群搭建

官网的搭建文档&#xff1a;使用 TiUP 部署 TiDB 集群 | TiDB 文档中心 我本地使用三台 centos7.9 服务器搭建&#xff0c;要保证三台服务器之间是可以互相通信的&#xff1b; 搭建集群的命令在其中一台服务器上执行即可&#xff1b; 1、安装tiup&#xff1a; curl --proto …