当前位置: 首页 > news >正文

【网络编程】十、详解 UDP 协议

文章目录

  • Ⅰ. 传输层概述
    • 1、进程之间的通信
    • 2、再谈端口号
      • 端口号的引出
      • 五元组标识一个通信
      • 端口号范围划分
      • 常见的知名端口号
      • 查看知名端口号
      • 协议号 VS 端口号
    • 3、两个问题
      • 一个端口号是否可以被多个进程绑定?
      • 一个进程是否可以绑定多个端口号?
    • 4、部分常见指令
      • pidof(用于查看进程id)
      • netstat(查看网络状态)
  • Ⅱ. UDP协议
    • 1、UDP协议所处位置
    • 2、UDP协议格式
      • 如何理解首部?
      • UDP协议如何将首部与有效载荷进行分离?
      • UDP协议如何决定将有效载荷交付给上层的哪一个协议?
    • 3、UDP的主要特点
    • 4、面向数据报
    • 5、UDP协议的缓冲区
      • 为什么UDP要有接收缓冲区?
    • 6、基于UDP的应用层协议

在这里插入图片描述

Ⅰ. 传输层概述

1、进程之间的通信

​ 在学习 HTTP 等应用层协议时,为了便于理解,可以简单的认为 HTTP 协议是将请求和响应直接发送到了网络当中。但实际应用层需要先将数据交给传输层,再由传输层对数据做进一步处理后再将数据继续向下进行交付,该过程贯穿整个网络协议栈,最终才能将数据发送到网络当中。
在这里插入图片描述

​ 传输层负责可靠性传输,确保数据能够可靠地传送到目标地址。从通信和信息处理的角度看,运输层为它上面的应用层提供通信服务
在这里插入图片描述

​ 但是我们要明确的是,真正进行通信的实体,其实是主机中的应用进程,也就是进程之间的通信!而为了达到传输层向上服务应用层的时候,可以找到对应的进程,就有了两个重要的功能:复用分用!如下图所示:
在这里插入图片描述

​ 此外,传输层还要对收到的报文进行差错检测,只不过 传输层只检验首部是否出现差错,而不检查有效载荷部分!

2、再谈端口号

端口号的引出

​ 应用层所有的应用进程都可以通过运输层再传送到网络层,这叫做复用;而运输层从网络层收到发送给各应用进程的数据后,必须分别交付指明的各应用进程,这就是分用。

​ 所以很明显,给应用层的每个应用进程赋予一个非常明确唯一的标志是至关重要的

​ 我们知道,一台计算机中的进程有着唯一标识的进程标识符,但因为这个进程标识符和操作系统是强相关的,如果我们将其作为复用和分用的标识的话,那么会有一个问题,就是一个进程的标识符由操作系统管理,所以进程的销毁和创建都会导致进程标识符的变化,但是我们又是希望在网络中传输的时候,对方的唯一标志可以是尽量保持不变的(因为一旦变化,请求连接的标识也需要改变),所以我们 不能用进程标识符作为复用和分用的唯一标志

​ 所以此时就有人使用了端口号这种方案来作为唯一标识!

端口号(Port)标识一个主机上进行网络通信的不同的应用程序。当主机从网络中获取到数据后,需要自底向上进行数据的交付,而这个数据最终应该交给上层的哪个应用处理程序,就是由该数据当中的目的端口号来决定的。

​ 从网络中获取的数据在进行向上交付时,在传输层就会提取出该数据对应的目的端口号,进而确定该数据应该交付给当前主机上的哪一个服务进程。
在这里插入图片描述

​ 因此端口号是属于传输层的概念的,在传输层协议的报头当中就会包含与端口相关的字段。

​ 请注意,端口号只具有本地意义,在互联网不同的计算机中,相同的端口号是没有关联的!

五元组标识一个通信

​ 在 TCP/IP 协议中,用 “源IP地址”、“源端口号”、“目的IP地址”、“目的端口号”、“协议号” 这样一个五元组来标识一个通信。

​ 比如有多台客户端主机同时访问服务器,这些客户端主机上可能有一个客户端进程,也可能有多个客户端进程,它们都在访问同一台服务器。
在这里插入图片描述

而这台服务器就是通过 “源IP地址”、“源端口号”、“目的IP地址”、“目的端口号”、“协议号” 来识别一个通信的。

  • 先提取出数据当中的目的 IP 地址和目的端口号,确定该数据是发送给当前服务进程的。
  • 然后提取出数据当中的协议号,为该数据提供对应类型的服务。
  • 最后提取出数据当中的源 IP 地址和源端口号,将其作为响应数据的目的IP地址和目的端口号,将响应结果发送给对应的客户端进程。
    在这里插入图片描述

​ 通过 netstat 命令可以查看到这样的五元组信息。
在这里插入图片描述

​ 其中的 Local Address 表示的就是源IP地址和源端口号,Foreign Address 表示的就是目的IP地址和目的端口号,而 Proto 表示的就是协议类型。

端口号范围划分

端口号的长度是 16,因此端口号的范围是 0 ~ 65535

  • 0 ~ 1023知名端口号。比如 HTTPFTPSSH 等这些广为使用的应用层协议,它们的端口号都是固定的。
  • 1024 ~ 65535操作系统动态分配的端口号。客户端程序的端口号就是由操作系统从这个范围分配的。

常见的知名端口号

有些服务器是非常常用的,这些服务器的端口号一般都是固定的:

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

查看知名端口号

​ 我们可以查看 /etc/services 文件,该文件是记录网络服务名和它们对应使用的端口号及协议。
在这里插入图片描述

说明一下:文件中的每一行对应一种服务,它由 4 个字段组成,每个字段之间用 TAB 或空格分隔,分别表示“服务名称”、“使用端口”、“协议名称”以及“别名”。

协议号 VS 端口号

  • 协议号是存在于 IP 报头当中的,其长度是 8 位。协议号指明了数据报所携带的数据是使用的何种协议,以便让目的主机的 IP 层知道应该将该数据交付给传输层的哪个协议进行处理。
  • 端口号是存在于 UDPTCP 报头当中的,其长度是 16 位。端口号的作用是唯一标识一台主机上的某个进程。
  • 协议号是作用于传输层和网络层之间的,而端口号是作用于应用层于传输层之间的。

3、两个问题

一个端口号是否可以被多个进程绑定?

一个端口号绝对不能被多个进程绑定,因为端口号的作用就是唯一标识一个进程,如果绑定一个已经被绑定的端口号,就会出现绑定失败的问题。

一个进程是否可以绑定多个端口号?

一个进程是可以绑定多个端口号的,这与“端口号必须唯一标识一个进程”是不冲突的,只不过现在这多个端口唯一标识的是同一个进程罢了。

​ 我们限制的是从端口号到进程的唯一性,而没有要求从进程到端口号也必须满足唯一性,因此一个进程是可以绑定多个端口号的。

4、部分常见指令

pidof(用于查看进程id)

pidof httpServer | xargs kill -9 // xargs用于将管道前面获取的参数追加到该指令后面

netstat(查看网络状态)

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

Ⅱ. UDP协议

1、UDP协议所处位置

​ 网络套接字编程时用到的各种接口,是位于应用层和传输层之间的一层系统调用接口,这些接口是系统提供的,我们可以通过这些接口搭建上层应用,比如 HTTP。我们经常说 HTTP 是基于 TCP 的,实际就是因为 HTTPTCP 套接字编程上搭建的。

​ 而 socket 接口往下的传输层实际就是由操作系统管理的,因此 UDP 是属于内核当中的,是操作系统本身协议栈自带的,其代码不是由上层用户编写的,UDP 的所有功能都是由操作系统完成,因此网络也是操作系统的一部分。

2、UDP协议格式

​ 其格式如下:
在这里插入图片描述

  • 16 位源端口号:表示数据从哪里来。
  • 16 位目的端口号:表示数据要到哪里去。
  • 16 位整个报文长度:表示整个数据报(UDP 首部 + UDP 数据)的长度。
    • 这也就说明 UDP 最大可传输的长度为 2^1664KB(包含首部字段),如果需要 传输大于 64KB 的数据,就需要应用层多次分包,并在接收端手动拼装
  • 16 位检验和:如果 UDP 报文的检验和出错,就会直接将报文丢弃。

​ 之所以我们在应用层看到的端口号大部分都是 16 位的,比如使用 uint16_t 类型,其根本原因就是因为传输层协议当中的端口号就是 16 位的。

如何理解首部?

​ 操作系统是 C 语言写的,而 UDP 协议又是属于内核协议栈的,因此 UDP 协议也一定是用 C 语言编写的,所以 UDP 首部本质上是一个结构体对象或者包含位段的结构体,如下所示:

struct udphdr {uint16_t uh_sport;  /* 源端口号 */uint16_t uh_dport;  /* 目的端口号 */uint16_t uh_ulen;   /* UDP数据报长度(包括头部+数据) */uint16_t uh_sum;    /* 数据校验和 */
};

UDP数据封装:

  • 当应用层将数据交给传输层后,在传输层就会创建一个 UDP 报头类型的变量,然后填充报头当中的各个字段,此时就得到了一个 UDP 报头。
  • 此时操作系统再在内核当中开辟一块空间,将 UDP 报头和有效载荷拷贝到一起,此时就形成了 UDP 报文。

UDP数据分用:

  • 当传输层从下层获取到一个报文后,就会读取该报文的前 8 个字节,提取出对应的目的端口号。
  • 通过目的端口号找到对应的上层应用层进程,然后将剩下的有效载荷向上交付给该应用层进程。

UDP协议如何将首部与有效载荷进行分离?

UDP的报头当中只包含四个字段,每个字段的长度都是 16 位,总共 8 字节。因此 UDP 采用的实际上是一种定长报头,UDP 在读取报文时读取完前 8 个字节后剩下的就都是有效载荷了。

​ 而我们只需要提取报头中的 数据报长度 字段,减去 8 个字节,最后的大小就是有效载荷的长度,是可以直接读取上来的!

UDP协议如何决定将有效载荷交付给上层的哪一个协议?

UDP 上层也有很多应用层协议,因此 UDP 必须想办法将有效载荷交给对应的上层协议,也就是交给应用层对应的进程。

​ 应用层的每一个网络进程都会绑定一个端口号,服务端进程必须显示绑定一个端口号,客户端进程则是由系统动态绑定的一个端口号。UDP 就是通过报头当中的目的端口号来找到对应的应用层进程的。

​ 说明一下: 内核中用哈希的方式维护了端口号与进程 ID 之间的映射关系,因此传输层可以通过端口号得到对应的进程 ID,进而找到对应的应用层进程

3、UDP的主要特点

  1. 无连接。发送数据之前不需要建立连接。
  2. 使用尽最大努力交付。即 不保证可靠交付
  3. 面向报文UDP 一次传送和交付一个完整的报文。
  4. 没有拥塞控制。网络出现的拥塞不会使源主机的发送速率降低。很适合多媒体通信的要求。
  5. 支持一对一、一对多、多对一、多对多等交互通信。
  6. 首部开销小,只有 8 个字节。

​ 总结一点,就是【简单方便,但不可靠】。
在这里插入图片描述

​ 此外,应用程序必须选择合适大小的报文。若报文太长,IP 层在传送时可能要进行分片,降低 IP 层的效率。若报文太短,会使 IP 数据报的首部的相对长度太大,降低 IP 层的效率。

4、面向数据报

​ 应用层交给 UDP 多长的报文,UDP 就原样发送,既不会拆分,也不会合并,这就叫做面向数据报。

​ 比如用 UDP 传输 100 个字节的数据:

​ 如果发送端调用一次 sendto,发送 100 字节,那么接收端也必须调用对应的一次 recvfrom,接收 100 个字节,而不能循环调用 10recvfrom 去每次接收 10 个字节。

5、UDP协议的缓冲区

UDP 协议不需要考虑多个报文之间的粘连问题,因为 UDP 没有真正意义上的发送缓冲区。调用 sendto 函数会直接交给内核(应用层发一个,传输层送走一个),由内核将数据传给网络层协议进行后续的传输动作。

​ 但是 UDP 具有接收缓冲区。但是这个接收缓冲区不能保证收到的 UDP 报的顺序和发送 UDP 报的顺序一致。如果缓冲区满了,再到达的 UDP 数据就会直接被丢弃,所以 UDP 协议是一种不可靠、全双工的协议。
在这里插入图片描述

为什么UDP要有接收缓冲区?

​ 如果 UDP 没有接收缓冲区,那么就要求上层及时将 UDP 获取到的报文读取上去,如果一个报文在 UDP 没有被读取,那么此时 UDP 从底层获取上来的报文数据就会被迫丢弃。

​ 一个报文从一台主机传输到另一台主机,在传输过程中会消耗主机资源和网络资源。如果 UDP 收到一个报文后仅仅因为上次收到的报文没有被上层读取,而被迫丢弃一个可能并没有错误的报文,这就是在 浪费主机资源和网络资源

​ 因此 UDP 本身是会维护一个接收缓冲区的,当有新的 UDP 报文到来时就会把这个报文放到接收缓冲区当中,此时上层在读数据的时就直接从这个接收缓冲区当中进行读取就行了,而如果 UDP 接收缓冲区当中没有数据那上层在读取时就会被阻塞。因此 UDP 的接收缓冲区的作用就是,将接收到的报文暂时的保存起来,供上层读取。

6、基于UDP的应用层协议

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

当然,也包括自己写 UDP 程序时自定义的应用层协议。

在这里插入图片描述

相关文章:

【网络编程】十、详解 UDP 协议

文章目录 Ⅰ. 传输层概述1、进程之间的通信2、再谈端口号端口号的引出五元组标识一个通信端口号范围划分常见的知名端口号查看知名端口号协议号 VS 端口号 3、两个问题一个端口号是否可以被多个进程绑定?一个进程是否可以绑定多个端口号? 4、部分常见指令…...

求职困境:开发、AI、运维、自动化

文章目录 问:我的技术栈是web全栈(js,css,html,react,typscript),C开发,python开发,音视频图像开发,神经网络深度学习开发,运维&#…...

如何将数据从一部手机传输到另一部手机 | 5 种便捷传输方式

更换新手机可能是一种令人兴奋的体验,但您仍然需要解决问题 - 如何将数据从一部手机传输到另一部手机。幸运的是,有多种方法可以简化此过程,从一键式解决方案到基于云的传输。本文探讨了五种流行的技术来帮助您无缝迁移数据。 第 1 部分&…...

GEE计算 RSEI(遥感生态指数)

🛰️ 什么是 RSEI?为什么要用它评估生态环境? RSEI(遥感生态指数,Remote Sensing Ecological Index) 是一种通过遥感数据计算得到的、综合反映区域生态环境质量的指标体系。 它的设计初衷是用最少的变量&…...

k8s监控方案实践补充(二):使用kube-state-metrics获取资源状态指标

k8s监控方案实践补充(二):使用kube-state-metrics获取资源状态指标 文章目录 k8s监控方案实践补充(二):使用kube-state-metrics获取资源状态指标一、Metrics Server简介二、kube-state-metrics实战部署1. 创…...

JavaScript:PC端特效--元素可视区client系列

一、client系列 client翻译过来就是客户端,我们使用client系列的相关属性来获取元素可视区的相关信息。通过client系列的相关属性可以动态的得到该元素的边框大小、元素大小等。 client系列属性作用element.clientTop返回元素上边框的大小element.clientLeft返回元…...

Centos7 中 Docker运行配置Apache

1、拉去httpd镜像(不加版本号,默认拉最新版本) docker pull httpd 2、运行httpd docker run -di --name httpd-test -p 8080:80 httpd 3、创建文件夹后边做映射 mkdir -p /Docker/apache/www /Docker/apache/logs /Docker/apache/conf 4、…...

PostgreSQL中的全页写

一、概述 在PGSQL数据库中,默认的页面大小为8KB,但是磁盘buffer的大小为4KB,扇区大小为512B。这就导致在操作系统的角度看数据库的写操作,其实并不是一种原子操作。如果操作系统发生了系统级别的故障,此时正好操作系统…...

对称二叉树的判定:双端队列的精妙应用

一、题目解析 题目描述 给定一个二叉树,检查它是否是镜像对称的。例如,二叉树 [1,2,2,3,4,4,3] 是对称的: 1/ \2 2/ \ / \ 3 4 4 3而 [1,2,2,null,3,null,3] 则不是镜像对称的: 1/ \2 2\ \3 3问题本质 判断一棵二叉…...

Redis + ABP vNext 构建分布式高可用缓存架构

🚀 Redis ABP vNext 构建分布式高可用缓存架构 🔧 环境准备 开发环境 .NET 8.0 SDKVisual Studio 2022 / VS CodeDocker & Docker Compose NuGet 包 Volo.Abp.Caching.StackExchangeRedis v8.1.5Volo.Abp.DistributedLocking.StackExchangeRedis v…...

jvm第一篇《内存与垃圾回收》学习笔记第一章jvm初始

jvm是虚拟机的通称。 java实际默认的应用是hotspot(基于栈的指令集架构) 注:注意区分寄存器的指令集和栈指令集的架构。(大概理解java移植性好就是因为是栈指令集) jvm虚拟机,具有跨语言功能&#xff0…...

MySQL——3、数据类型

数据类型 1、数据类型分类2、数值类型2.1、tinyint类型2.2、bit类型2.3、小数类型2.3.1、float2.3.2、decimal 3、字符串类型3.1、char3.2、varchar3.3、char和varchar比较3.4、日期和时间类型3.5、enum和set 1、数据类型分类 2、数值类型 2.1、tinyint类型 首先创建t1表&…...

Flutter - 集成三方库:日志(logger)

日志 使用print方法时,会提示 添加依赖 $ flutter pub add logger下载依赖 $ flutter pub get使用 打印 import package:logger/logger.dart;var logger Logger(); logger.d("debug"); logger.e("error"); logger.i("info"); logger.f(&qu…...

第五部分:第五节 - Express 路由与中间件进阶:厨房的分工与异常处理

随着你的 Express 应用变得越来越大,所有的路由和中间件都写在一个文件里会变得难以管理。这时候就需要将代码进行拆分和组织。此外,一个健壮的后端应用必须能够优雅地处理错误和一些常见的 Web 开发问题,比如跨域。 路由模块化 (express.Ro…...

国标GB/T 12536-90滑行试验全解析:纯电动轻卡行驶阻力模型参数精准标定

摘要 本文以国标GB/T 12536-90为核心框架,深度解析纯电动轻卡滑行试验的完整流程与数据建模方法,提供: 法规级试验规范:从环境要求到数据采集全流程详解行驶阻力模型精准标定:最小二乘法求解 ( FAv^2BvC ) 的MATLAB实…...

组件导航 (Navigation)+flutter项目搭建-混合开发+分栏

组件导航 (Navigation)flutter项目搭建 接上一章flutter项目的环境变量配置并运行flutter 上一章面熟了搭建flutter并用编辑器运行了ohos项目,这章主要是对项目的工程化改造 先创建flutter项目,再配置Navigation 1.在开发视图的resources/base/profi…...

物联网中的WiFi模式解析:AP、STA与混合模式

物联网现在还是比较火的,各种设备都要联网,那么WiFi已成为设备联网的“标配”。但你是否想过,为什么有的设备能自己创建WiFi热点,有的只能连接路由器?为什么有些网关既能收数据又能传数据? 主要还是因为Wi…...

spring cloud gateway 源码解析

参考:Spring Cloud Gateway SpringCloud gateway源码走读(顺带聊聊响应式) - 掘金 1,原理图 还是从starter 开始看 要实现网关的核心概念, 肯定是需要接受请求的server ,从上面的截图看 starter-gateway 只负责了包的依赖,并没有定义自动配置 , 他依赖了starter-webf…...

游戏引擎学习第286天:开始解耦实体行为

回顾并为今天的内容定下基调 我们目前正在进入实体系统的一个新阶段,之前我们已经让实体的移动系统变得更加灵活,现在我们想把这个思路继续延伸到实体系统的更深层次。今天的重点,是重新审视我们处理实体类型(entity type&#x…...

【论文阅读】KIMI K1.5: SCALING REINFORCEMENT LEARNING WITH LLMS

KIMI K1.5: SCALING REINFORCEMENT LEARNING WITH LLMS Scaling的解释: 通过系统性的方法扩展强化学习算法的能力,使其能够处理更复杂的问题、更大的状态/动作空间、更长的训练周期或更高效的资源利用 原文摘要: 研究背景与问题定位 传统预训…...

大语言模型与多模态模型比较

一、核心差异:输入数据类型与模态融合 输入数据类型 LLM:仅处理文本数据,例如文本分类、机器翻译、问答等任务,通过大规模语料库学习语言规律。 LMM:支持文本、图像、音频、视频等多种模态输入,例如根据图…...

vscode debug node + 前端

方法 2:调试全栈(Node 前端) 如果需同时调试后端和前端: 分别启动两个调试会话 一个配置调试 Node.js 后端(server.js)。 另一个配置调试浏览器前端(如上)。 {// Use IntelliS…...

RK3568-鸿蒙5.1与原生固件-扇区对比分析

编译生成的固件目录地址 ../openharmony/out/rk3568/packages/phone/images鸿蒙OS RK3568固件分析 通过查看提供的信息,分析RK3568开发板固件的各个组件及其用途: 主要固件组件 根据终端输出的文件列表,RK3568固件包含以下关键组件&#x…...

Java线程池(Thread Pool)性能优化解析

在高性能、高并发的Java应用开发中,线程池(Thread Pool)是不可或缺的组件。它通过复用线程,避免了线程频繁创建和销毁带来的资源开销,提高了系统的响应速度和稳定性。然而,不合理的线程池配置和使用方式也可能成为系统性能瓶颈的根源。 本文旨在深入解析Java线程池的性能…...

AI重塑未来学者:研究生教育的“进化论”与“数字化生存指南

目录: 一、引言:AI浪潮下的“象牙塔”新挑战与新机遇 二、AI的“双刃剑”:深度剖析对研究生教育的颠覆性影响 1. 研究范式的革新:从“人工”到“智能” 2. 知识获取与传授方式的重塑 3. 创新能力与批判性思维的再定义 4. 伦理困境与学术诚信的新考验 三、他山之石:发达国家…...

IHttpHandler和Tcp Listener的web服务器接收上传文件有什么区别

IHttpHandler和Tcp Listener的web服务器接收上传文件有什么区别 IHttpHandler 与 TCP Listener 处理文件上传的核心区别 IHttpHandler 和 TcpListener 是ASP.NET中处理 HTTP 请求的两种不同抽象层级,它们在文件上传处理上存在以下关键区别: 1. 抽象层…...

C++ --- new与delete

new与delete 一、回顾1.malloc2.calloc3.realloc4.free 二、new与delete的特殊之处(1)(2) 三、new与delete的底层原理四、总结 一、回顾 在C语言阶段我们学习了动态内存管理:malloc,calloc,realloc,free。 1.malloc …...

Guided Filtering相关记录

一、背景介绍 以前折腾保边滤波时候,刷了一些Guided Filtering相关资料。这里主要是对它们做个算法效果复现和资料简单整理。 二、Guided Filtering 1、基本原理 原版Guided Filtering的提出,主要是为了改善双边滤波做保边平滑滤波器时候的梯度翻转伪影…...

Rust 学习笔记:关于 String 的练习题

Rust 学习笔记:关于 String 的练习题 Rust 学习笔记:关于 String 的练习题选出描述正确的那一个。该程序最多可能发生多少次堆的内存分配?哪种说法最能解释为什么 Rust 不允许字符串索引?哪种说法最能描述字符串切片 &str 和字…...

AG-UI 协议:重构多模态交互,开启智能应用新纪元

一、协议诞生的时代背景:填补 AI 生态最后一块拼图 在人工智能技术飞速发展的今天,AI 代理(Agent)作为能够主动执行复杂任务的智能实体,正从实验室走向生产环境,重塑各个行业的工作流程。然而,…...

网络世界的“百变身份“:动态IP让连接更自由

深夜的程序调试​​ 凌晨两点,我盯着电脑屏幕上的报错信息:"Connection timed out"。这是本周第三次测试服务器响应时被拒绝访问了——只因为之前同一个IP地址尝试登录太过频繁。正在改代码的朋友小王凑过来看了眼:"老兄&…...

【学习笔记】因果推理导论第1课

因果推理导论第1课 为何要做因果推理 一、辛普森悖论一个例子 二、相关不代表因果性三、什么揭示因果四、观测研究五、结论 本节课通过 一、辛普森悖论 一个例子 书中举了一个疫情两种治疗方法A,B,分析哪一个治疗方法更好的例子. 首先已知B治疗方法更稀缺,因此观测数据样本上…...

Android 中 权限分类及申请方式

在 Android 中,权限被分为几个不同的类别,每个类别有不同的申请和管理方式。 一、 普通权限(Normal Permissions) 普通权限通常不会对用户隐私或设备安全造成太大风险。这些权限在应用安装时自动授予,无需用户在运行时手动授权。 android.permission.INTERNETandroid.pe…...

深度学习算法介绍

深度学习算法是一种基于人工神经网络结构的机器学习方法,其核心理念是通过多层次的神经元组成的神经网络来模拟人类大脑的工作原理。以下是几种常见的深度学习算法及其简要介绍: 多层感知器(Multilayer Perceptron, MLP)&#xff…...

Java【13_1】final、初始化块、继承(测试题)

测试题 1、简述final修饰符的功能 ① 修饰类 该类不能被继承 ② 修饰变量 该变量就是常量(一旦被初始化,就不可以修改) ③ 修饰方法 该方法不能被重写 2、写出程序结果 (仔细认真) public class MyClass { static int x,y; static{ …...

小结:JavaScript 模块化工具链

JavaScript 模块化工具链 是现代前端开发中用于组织、管理和优化模块化代码的核心工具集合。以下是关于 JS 模块化工具链的概述,包括关键工具、作用和常见工作流程:** **1. **模块化的背景 JavaScript 模块化是为了解决代码组织、依赖管理和作用域隔离…...

RabbitMQ ④-持久化 || 死信队列 || 延迟队列 || 事务

消息确认机制 简单介绍 RabbitMQ Broker 发送消息给消费者后,消费者处理该消息时可能会发生异常,导致消费失败。 如果 Broker 在发送消息后就直接删了,就会导致消息的丢失。 为了保证消息可靠到达消费者并且成功处理了该消息,…...

十一、Hive JOIN 连接查询

作者:IvanCodes 日期:2025年5月16日 专栏:Hive教程 在数据分析的江湖中,数据往往分散在不同的“门派”(表)之中。要洞察数据间的深层联系,就需要JOIN这把利器,将相关联的数据串联起来…...

启用rvzi可视化自己的机器人发现joint state publisher gui没有滑块

启用rvzi可视化自己的机器人发现joint state publisher gui没有滑块&#xff1f; 解决方法&#xff1a; 一&#xff1a;查看urdf中joint type定义是不是revolute。 二&#xff1a;查看urdf关节限制是不是正确&#xff0c;如果是0到0则不正确。 <joint name"joint_…...

Gitee DevOps:中国企业数字化转型的“本土化加速器“

在数字化浪潮席卷全球的当下&#xff0c;DevOps已经从技术热词转变为企业的核心生产力工具。根据IDC最新报告&#xff0c;到2025年中国DevOps市场规模将达到15亿美元&#xff0c;年复合增长率高达25%。在这一快速增长的市场中&#xff0c;一个显著趋势正在显现&#xff1a;越来…...

RKNN开发环境搭建(ubuntu22.04)

以下情况在RV1106G3的平台上验证正常。 1、conda安装 1&#xff09;conda --version//确认是否安装 2&#xff09;创建一个安装目录&#xff0c;进行下一步 3&#xff09;wget https://mirrors.tuna.tsinghua.edu.cn/anaconda/miniconda/Miniconda3-4.6.14-Linux-x…...

2025年上软考 考试时间+准考证打印全攻略

各位同学好呀&#xff01;我是你们的老朋友大老李~之前咱们聊过软考报名和机考模拟系统的使用技巧。今天要和大家分享一下&#xff0c;最近好多同学私信的问题&#xff1a;"老李&#xff01;准考证到底哪天能打印&#xff1f;""考试时间会不会有变动&#xff1f…...

vllm量化05—FP8 W8A8

本系列基于Qwen2.5-7B&#xff0c;学习如何使用vllm量化&#xff0c;并使用benchmark_serving.py、lm_eval 测试模型性能和评估模型准确度。 测试环境为&#xff1a; OS: centos 7 GPU: nvidia l40 driver: 550.54.15 CUDA: 12.3本文是该系列第5篇——FP8 W8A8 一、量化 fro…...

OpenCV 图像透视变换详解

在计算机视觉领域&#xff0c;图像的视角问题常常会影响后续的分析与处理。例如&#xff0c;从倾斜角度拍摄的文档、带有畸变的场景图像等&#xff0c;都需要通过特定的方法进行矫正。OpenCV 作为计算机视觉领域的重要库&#xff0c;提供了强大的图像透视变换功能&#xff0c;能…...

Vue主题色切换实现方案(CSS 变量 + 类名切换)

定义主题变量 // styles/themes.scss :root {--primary-color: #314099;--secondary-color: #1E3968;--text-color: #2c44ce; }[data-theme"红系主题"] {--primary-color: #d74146;--secondary-color: #c20707;--text-color: #db3b3b; }在组件中使用变量 <templ…...

MySQL 高可用

目录 一、概述MySQL高可用 1. 什么是高可用性&#xff08;High Availability, HA&#xff09;&#xff1f; 2. MySQL 高可用常见方案 3. 高可用核心机制 4. 选型建议 注意事项 二、案例环境组成 MySQL 主主复制 keepalived HAProxy 的高可用负载均衡架构 三、案例架构…...

C#学习教程(附电子书资料)

概述 C#&#xff08;读作"C Sharp"&#xff09;是一种由微软开发的现代编程语言&#xff0c;结合了C的高效性和Java的简洁性&#xff0c;专为.NET框架设计。以下是其核心特性和应用领域的详细介绍电子书资料&#xff1a;https://pan.quark.cn/s/6fe772420f95 一、语…...

MySQL性能优化

目录 一、索引优化 1、慢查询日志分析 2、EXPLAIN 执行计划分析 3、索引类型选择 4、索引使用原则 5、常见索引失效场景 二、SQL语句优化 1、避免低效操作符 2、减少数据扫描量 3、子查询优化 4、其他高频优化技巧 三、表设计优化 1、数据类型优化 四、架构设计优…...

Mendix 中的XPath 令牌(XPath Tokens)详解

在 Mendix 中&#xff0c;XPath 令牌&#xff08;XPath Tokens&#xff09; 是一种特殊的动态参数化查询技术&#xff0c;允许你在 XPath 表达式中使用变量或上下文相关的值&#xff0c;从而实现更灵活的查询逻辑。 1. 什么是 XPath 令牌&#xff1f; XPath 令牌是 Mendix 提…...

Feign异步模式丢失上下文问题

Feign异步模式丢失上下文问题 问题描述 当我们使用异步对我们代码进行操作优化时&#xff0c;代码中使用了RequestContextHolder去获取上下文的数据&#xff0c;当我们执行原来可以执行的业务时发现报了空指针异常或数据为空&#xff0c;这是为什么呢&#xff1f; 原理解释 …...