【网络】UDP协议

文章目录

  • 一. 初识UDP
    • 1. UDP简介
    • 2. UDP协议的特点
      • 特点一:无连接
      • 特点二:不可靠
      • 特点三:面向数据报
    • 3. UDP报文的格式
    • 4. UDP的缓冲区
    • 5. 基于UDP实现的用户层协议
  • 二. UDP报文中各个字段
    • 1. 原端口号与目的端口号(16位)
      • 1.1 认识端口号
      • 1.2 端口号范围划分
      • 1.3 UDP中端口号字段的作用
    • 2. UDP长度(16位)
    • 3. UDP校验和(16位)

一. 初识UDP

1. UDP简介

UDP(User Datagram Protocol)是一种无连接的传输层协议,它提供了一种简单的、不可靠的数据传输服务。

UDP 提供了不面向连接的通信,且不对传送的数据报进行可靠的保证,适用于一次传送少量的数据,不适用于传输大量的数据。

UDP属于网络协议栈中的传输层协议,直接负责数据的传输和接收:
在这里插入图片描述

2. UDP协议的特点

特点一:无连接

两台主机在使用UDP进行数据传输时,不需要建立连接,只需知道对端的IP和端口号即可把数据发送过去。

特点二:不可靠

UDP协议没有没有确认重传机制,如果因为网络故障导致报文无法发到对方,或者对方收到了报文,但是传输过程中乱序了,对方校验失败后把乱序的包丢了,UDP协议层也不会给应用层任何错误反馈信息。

PS:在网络中,“不可靠”是个中性词,因为可靠就意味着要付出更多的代价去维护可靠,实现起来会复杂很多;而“不可靠”的话,实现起来会更简单。

特点三:面向数据报

UDP传输数据时,是以数据报文为单位一个个地发出去,然后一个个地接收的,这导致上面应用层无法灵活控制数据数据的读写次数和数量。
在这里插入图片描述

比如用UDP传输100个字节的数据,如果发送端调用一次sendto,发送100个字节,那么接收端也必须调用对应的一次recvfrom去全部接收这100个字节,而不能循环调用10次recvfrom,每次接收10个字节。

3. UDP报文的格式

具体每个字段的细节会在下文中介绍
在这里插入图片描述

理解报头

UDP协议属于内核协议栈,而内核是用C语言写的,在底层UDP的报头是一个位段类型的结构体
在这里插入图片描述

4. UDP的缓冲区

  • UDP没有真正意义上的发送缓冲区。调用sendto会直接把数据交给内核,简单包装后由内核将数据传给网络层协议进行再后续的传输动作。

  • UDP具有接收缓冲区

    • 这个接收缓冲区不能保证收到的UDP报文顺序和发送时UDP报文的顺序一致。比如我们网购多件商品,不是说谁先发货就先收到那个包裹,这些包裹运输途中的路径、运输方式、中转时间等都是不一样和不确定的;UDP发出去的报文也要经过各种路由转发,每个报文选择的路径并非是一样的,这也导致了UDP报文实际发的顺序和最终收的顺序不一定一致。
    • 如果接收端来不及收或收的慢的话,会导致UDP的接收缓冲区存满,之后到达的UDP报文因为无法存下而只能把它丢弃。

5. 基于UDP实现的用户层协议

  • NFS:网络文件系统
  • TFTP:简单文件传输协议
  • DHCP:动态主机配置协议
  • BOOTP:启动协议(用于无盘设备启动)
  • DNS:域名解析协议

二. UDP报文中各个字段

1. 原端口号与目的端口号(16位)

1.1 认识端口号

  • IP:32位无符号整数,用来标识公网中唯一的一台主机
  • 端口号:16位无符号整数,标识了主机中唯一的一个进程

在TCP/IP协议中,用 “源IP”, “源端口号”, “目的IP”, “目的端口号”, “协议号” 这样一个五元组来标识一个通信
在这里插入图片描述

netstat命令介绍

功能:查看当前主机下的网络状况

语法:netstat[选项]

常用选项

  • n 拒绝显示别名,能显示数字的全部转化成数字
  • l 仅列出有在 Listen(监听)的服务状态
  • p 显示建立相关链接的程序名
  • t (tcp)仅显示tcp相关选项
  • u (udp)仅显示udp相关选项
  • a (all)显示所有选项,默认不显示Listen相关

示例
在这里插入图片描述

端口号和进程的关系

  • 一个进程可以绑定多个端口号
  • 一个端口号只能被一个进程绑定

实际需要:通过端口号来找进程,所以要确保端口号到进程的唯一性;而实际中不会有通过进程来找端口号的情况,所以不关心进程绑定了多少个端口号

1.2 端口号范围划分

端口号一共有 2^16 = 65536 个,其中前面的端口号被分配给了一些常用的协议。

  • 知名端口号(0 - 1023): HTTP、FTP、SSH等这些广为使用的应用层协议,它们的端口号都是固定的
  • 其他端口号(1024 - 65535): 这个范围内的端口号是在我们使用时,由操作系统从动态配的

认识知名端口号

在网络中,有些服务器是经常被大家都用到的,这时为了使用方便,人们给这些服务器约定俗成地绑定了一些特定的端口,之后大家使用这些服务时,通过端口号就能直接知道你所使用的服务类型是什么。

下面是一些知名端口及其所对应的服务类型,我们自己写程序需要设置端口号时,注意避开这些知名端口号:

  • ssh服务器,使用22端口
  • ftp服务器,使用21端口
  • telnet服务器,使用23端口
  • http服务器,使用80端口
  • https服务器,使用443端口

我们可以通过命令:less /etc/services 来查看所有知名端口和它们对应的服务:

在这里插入图片描述

1.3 UDP中端口号字段的作用

有了目的端口号,就能找到对应的服务器进程,然后在这个进程上获取服务,此外还可以把自己的端口号(源端口号)告诉服务器,服务器得到后也可以向源客户端进程发送数据,这样双方就能全双工的通信了。

在这里插入图片描述

一个UDP报文如何通过目的端口,找到对应的服务器进程的呢?

  1. 分割8字节的定长报头,然后拿到里面的16位目的端口号
  2. 系统中有一个长度为65536的数组hash,根据下标(端口号)直接定址法存储对应进程的PCB(进程控制快)
  3. 通过 hash[目的端口号] 直接可以找到对应的服务进程
    在这里插入图片描述

2. UDP长度(16位)

UDP协报头中有一个16位的最大长度的字段,也就是说一个UDP报文能传输的数据最大长度是64K(包含UDP首部)

然而64K在当今的互联网环境下,是一个非常小的数字。如果我们需要传输的数据超过64K,就需要在应用层手动的分包,多次发送,并在接收端手动拼装。

在这里插入图片描述

UDP把数据包交给应用层后,应用层如何让报头和有效载荷分离?

先读取8字节的定长报头,在读取里面的16位UDP长度字段,减去8字节后得到的就是有效载荷的长度,知道了报头和有效载荷的大小就能把二者明显地区分开了。

3. UDP校验和(16位)

报文在进行网络传输时,会经过各种传输线、路由器、信号放大器等传输介质,且随着网络的状况不同,每个包具体选择的路径也不一样。在网络传输中,受到外界干扰,数据可能会出错,比如某几个位置的数据发生了乱序,0变成1,1变成0;因此,在接收方收到数据后,就需要先确认一下,这个报文数据是否在传输过程中发送了乱序。校验和就是简单有效的方式。

在这里插入图片描述

实际的校验和,不仅仅是一个”长度“,而是根据数据的内容来生成的。当内容发生改变的时候,就能感知出错误。

UDP的校验和具体是怎么实现的呢?使用了一种简单粗暴的循环冗余校验(Cyclic Redundancy Check, CRC)算法:
在这里插入图片描述

加着加着,可能就溢出了~~溢出也无所谓。所有字节都加了一遍,最终就得到了校验和。传输数据的时候,就会把原始数据和校验和一起传递过去。接收方收到数据,同时也收到了发送端送过来的校验和(旧的校验和)。接收方按照同样的方式再算一遍,得到新的校验和。如果旧的校验和和新的校验和相同,就可以认为数据传输过程中是正确的。如果不同,则视为传输过程中数据出错了。

但是,有时候会出现,校验和相同,但是传输的数据和发送时候的数据不同,也就是数据发生了乱序,但校验和是对的。

比如:好巧不巧,某个字节,多了1。某个字节,少了1。二者相加,正好抵消。

此校验和方法并不是那么严谨,但在工程上,也是够用的。

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

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

相关文章

《Redis使用手册之Lua脚本》

《Redis使用手册之Lua脚本》 EVAL:执行脚本 127.0.0.1:6379> eval “return ‘hello world’” 0 “hello world” 127.0.0.1:6379> eval “return redis.call(‘set’,KEYS[1],ARGV[1])” 1 “message” “hello world” OK 127.0.0.1:6379> get message…

网络安全知识点

网络安全 1. 网络安全的定义,网络安全的属性。 定义:针对各种网络安全威胁研究其安全策略和机制,通过防护、检测和响应,确保网络系统及数据的安全性。 属性:机密性 认证(可鉴别性&#xff09…

ASP.NET淘宝店主交易管理系统的设计与实现

摘 要 淘宝店主交易管理系统主要采用了ASPACCESS的B/S设计模式,通过网络之间的数据交换来实现客户、商品、交易的管理和对客户、商品、交易统计工作,从而提高淘宝店主在管理网店过程中的工作效率和质量。 系统分为基本资料模块,统计资料模…

Windows php 安装 Memcached扩展、php缺失 Memcached扩展、Class ‘Memcached‘ not found

在Windows系统下如何安装 php Memcached 扩展 下载dll文件 pecl地址:https://pecl.php.net/package/memcached 根据版本进行选择 : 解压下载的文件后得到了这么样的文件结构: 配置 移动dll文件到相应文件位置 重点: libme…

PG数据库结构与oracle比较

1.数据库集簇逻辑结构 数据库集簇概念:一个大的数据库是由若干个小的数据库组成,实现数据的隔离存放,在概念上应该是与mysql一样的 在mysql中可以用show database列出数据库 PG中用\l 数据库对象存放在数据库中: PG中的所有数据…

2024小米SU7首批锁单用户调研报告

来源:电动汽车用户联盟 80%的锁单用户认为自己是米粉,64%的用户拥有10个以上米家生态产品, 使用小米手机的比例为67%,使用苹果手机的比例为47% 2. 81%的用户为90后,均龄31岁,未婚者和已婚无孩者占比63%&am…

word启动缓慢之Baidu Netdisk Word Addin

word启动足足花了7秒钟,你知道我这7秒是怎么过来的吗? 原因就是我们可爱的百度网盘等APP,在我们安装客户端时,默认安装了Office加载项,不仅在菜单栏上加上了一个丑陋的字眼,也拖慢了word启动速度........ 解…

C++:智能指针

C:智能指针 内存泄漏RAII智能指针auto_ptrunique_ptrshared_ptr循环引用 weak_ptr deletershared_ptrunique_ptr 内存泄漏 内存泄漏是指程序在动态分配内存后,忘记或无法释放已经不再使用的内存,从而导致系统内存资源被逐渐耗尽的问题。这种…

038——基于STM32和I.MX6uLL实现uart控制GPS(失败者总结)

目录 1、GPS模块简介 2、GPS数据格式 3、方案梳理 1、GPS模块简介 全球定位系统(Global Positioning System, GPS)是一种以空中卫星为基础的高精度无线电导航的定位系统,它在全球任何地方以及近地空间都能够提供准确的地理位置、车行速度及精确的时间…

78、贪心-跳跃游戏

思路 方法1: canJump01 - 使用递归(回溯法) 这个方法是通过递归实现的,它从数组的第一个位置开始,尝试所有可能的跳跃步数,直到达到数组的最后一个位置或遍历完所有的可能性。 思路: 如果数组为空或者长…

018、Python+fastapi,第一个Python项目走向第18步:ubuntu24.04 安装cuda和pytorch环境

一、说明 我们安装了pytorch环境之后,会用yolo v9 来测试一下,看8g 显存能不能跑下来,上次用无影云电脑,4cpu8g内存直接爆了,云电脑也死机了,提示一直占用内存不释放,我自己的云电脑不能占用内…

帕金森患者应该怎么注意生活方式?

在面对帕金森病的挑战时,科学合理地改善日常生活方式,不仅能帮助患者更好地管理病情,还能提升生活质量。今天,让我们一起探索如何通过简单的日常调整,为患有帕金森病的朋友们带来积极的变化。 饮食调整:营养…

安全再升级,亚信安慧AntDB数据库与亚信安全二次牵手完成兼容性互认证

日前,湖南亚信安慧科技有限公司(简称:亚信安慧)的产品与亚信科技(成都)有限公司(简称:亚信安全)再次携手,完成亚信安慧AntDB数据库与亚信安全IPoE接入认证系统…

PPO 学习笔记

用PPO算法求解整个神经网络在迭代过程中的梯度问题 每走一步就会得到一个新的状态,把这个状态传到网络里面,会得到一个 action,执行这个 action 又会到达一个新状态 policy 中由状态 st 生成动作 at,生成的这个 at 是由整个网络的…

CGAL 点云数据生成DSM、DTM、等高线和数据分类

原文链接 CGAL 点云数据生成DSM、DTM、等高线和数据分类 - 知乎 在GIS应用软件中使用的许多传感器(如激光雷达)都会产生密集的点云。这类应用软件通常利用更高级的数据结构:如:不规则三角格网 (TIN)是生成数字高程模型 (DEM) 的基础,也可以利…

CSS中的圆角和阴影

目录 盒子圆角 圆角基础使用 圆角常见使用 通过设置盒子圆角得到一个圆形 通过设置盒子圆角,得到一个“操场”的样式 盒子阴影 文字阴影 盒子圆角 圆角基础使用 在 CSS3 中,新增了圆角边框样式,这样我们的盒子就可以变圆角了。 使用…

深入浅出TCP 与 UDP

🔥 引言 在互联网的广阔天地里,TCP(Transmission Control Protocol)和UDP(User Datagram Protocol)作为传输层的两大支柱,各自承担着不同的使命。下面这篇文章将带你从基础到进阶,全…

8. Django 表单与模型

8. 表单与模型 表单是搜集用户数据信息的各种表单元素的集合, 其作用是实现网页上的数据交互, 比如用户在网站输入数据信息, 然后提交到网站服务器端进行处理(如数据录入和用户登录注册等).网页表单是Web开发的一项基本功能, Django的表单功能由Form类实现, 主要分为两种: dj…

练习题(2024/5/1)

1二叉树的层平均值 简单 相关标签 相关企业 给定一个非空二叉树的根节点 root , 以数组的形式返回每一层节点的平均值。与实际答案相差 10-5 以内的答案可以被接受。 示例 1: 输入:root [3,9,20,null,null,15,7] 输出:[3.00000,14.50000…

关于建表、表字段的增删改等的语法及举例(字段类型、字段约束、建表语法、表字段增删改、注意事项等)

天行健,君子以自强不息;地势坤,君子以厚德载物。 每个人都有惰性,但不断学习是好好生活的根本,共勉! 文章均为学习整理笔记,分享记录为主,如有错误请指正,共同学习进步。…