WebRTC学习七:WebRTC 中 STUN 协议详解
系列文章目录
第一篇 基于SRS 的 WebRTC 环境搭建
第二篇 基于SRS 实现RTSP接入与WebRTC播放
第三篇 centos下基于ZLMediaKit 的WebRTC 环境搭建
第四篇 WebRTC学习一:获取音频和视频设备
第五篇 WebRTC学习二:WebRTC音视频数据采集
第六篇 WebRTC学习三:WebRTC音视频约束
第七篇 WebRTC学习四:WebRTC常规视觉滤镜
第八篇 WebRTC学习五:从视频中提取图片
第九篇 WebRTC学习六:MediaStream 常用API介绍
第十篇 WebRTC学习七:WebRTC 中 STUN 协议详解
文章目录
- 系列文章目录
- 前言
- 一、STUN 协议的作用
- 二、STUN 协议的交互过程
- 1.客户端与 STUN 服务器的交互
- (1) 客户端发送请求:
- (2) STUN 服务器处理请求:
- (3) STUN 服务器返回响应:
- (4) 客户端获取公网地址:
- 2.客户端之间的交互准备
- 三、STUN 协议报文格式详解
- STUN Message Header(RFC5389/RFC8489)
- STUN Message Body
- 四、zlmediakit 中STUN 协议抓包
- 在这里插入图片描述
- 总结
前言
最近在看zlmediakit源码,发现webrtc部分涉及到STUN和DTLS协议,为了更方便的看懂这部分代码,网上查了下STUN协议和DTLS协议,将STUN协议部分先做个记录,后面结合代码如果有更深入的理解,再来更新其中的内容。
在 WebRTC(Web Real - Time Communication)技术体系里,STUN(Session Traversal Utilities for NAT,NAT 会话穿越应用程序)协议发挥着关键作用。WebRTC 旨在实现浏览器之间的实时音视频通信,但由于网络中广泛存在的 NAT(网络地址转换)设备,会对直接通信造成阻碍,而 STUN 协议则是解决这一问题的重要工具。
一、STUN 协议的作用
STUN 协议主要用于帮助处于 NAT 设备之后的客户端发现自己的公网 IP 地址和端口,也就是确定自己在公网上的可达地址。这样,即使客户端处于私有网络中,也能让对端知道如何与自己建立直接的连接,从而实现 WebRTC 通信的端到端连接。
二、STUN 协议的交互过程
1.客户端与 STUN 服务器的交互
(1) 客户端发送请求:
处于 NAT 之后的客户端向 STUN 服务器发送一个 Binding Request(绑定请求)消息。这个请求消息中包含了客户端的一些信息,例如客户端希望服务器返回的信息类型等。
(2) STUN 服务器处理请求:
STUN 服务器接收到请求后,会记录下接收到该请求的源 IP 地址和端口,这就是客户端经过 NAT 转换后的公网地址和端口。
(3) STUN 服务器返回响应:
STUN 服务器将客户端的公网地址和端口信息封装在 Binding Response(绑定响应)消息中,发送回客户端。
(4) 客户端获取公网地址:
客户端接收到响应消息后,就可以从消息中提取出自己的公网地址和端口信息,并将这些信息用于后续的 WebRTC 通信。
2.客户端之间的交互准备
客户端获取到公网地址和端口后,会将这些信息通过信令服务器发送给对端客户端。对端客户端收到信息后,就可以尝试与该客户端建立直接的连接。
三、STUN 协议报文格式详解
RFC5389(Session Traversal Utilities for NAT)是在RFC3489(Simple Traversal of UDP Through NAT)的基础上增加了对TCP的支持,使其不仅适用于UDP,还适用于TCP协议,从而提供更全面的NAT穿越解决方案。具体来说,RFC5389将STUN描述为一系列穿越NAT的工具,而不仅仅是基于UDP的简单穿透方法。
相比之下,RFC8489是对RFC5389的进一步扩展和标准化,但它并没有引入新的功能或协议变化,而是对现有的STUN协议进行了标准化和规范化。
目前RFC3489已经废弃,更多的用的是RFC5389和RFC8489。
STUN协议包含20字节的STUN Message header和STUN Message Body部分,body中可以含有0或多个Attribute.
STUN Message Header(RFC5389/RFC8489)
STUN 报文的头部固定为 20 字节,其具体含义如下:
最前面的2bit 00:不同的协议复用同一端口时,用于与其它协议做区分。
STUN Message Type:STUN 消息类型,定义了消息 class 和消息 method,用于标识该消息是请求、响应还是错误消息等。STUN Message Type的结构如下
其中C0和C1合起来定义class,M0-M11 定义了method。class 四个值定义如下表:
C1C0的值 | 含义 |
---|---|
0b00 | request |
0b01 | indication |
0b10 | success response |
0b11 | error response |
method只定义了一个方法,即Binding,0b000000000001(0x0001);
因此Binding的request的消息类型为0x0001,Binding的success response的消息类型为0x0101。
Message Length(2 字节)::消息长度,表示整个消息除去头部的长度,单位为字节。
Magic Cookie(4 字节):固定值 0x2112A442,用于快速识别 STUN 消息。
Transaction ID(96bit, 12 字节):用于唯一标识一个事务,客户端和服务器通过这个 ID 来匹配请求和响应。
STUN Message Body
20字节的STUN消息头之后是0个或者多个属性。每个属性进行TLV编码,每个属性的长度不固定,但都是 4 字节的整数倍。
属性的结构如下
Type(2 字节)::16字节属性类型。
Length(4 字节):属性长度,Value的长度,单位是字节,必须是4字节的整数倍。
Value:属性的数据。
属性定义表
Type | 属性名 | 含义 | 备注 |
---|---|---|---|
0x0001 | MAPPED-ADDRESS | 表示服务器观察到的客户端经NAT转换后的外网地址和端口,主要用于兼容遵循RFC 3489的旧版STUN客户端。 | |
0x0002 | RESPONSE - ADDRESS | 客户端通过此属性告知服务器将响应消息发送到指定的地址和端口,即客户端期望接收响应的目标地址。 | |
0x0003 | CHANGE - REQUEST | 客户端使用该属性请求服务器在发送响应时变更IP地址、端口或两者都变更,用于检测NAT的行为。 | |
0x0004 | SOURCE - ADDRESS | 服务器发送响应消息时所使用的源地址和端口,客户端可以通过该属性了解服务器的实际发送地址。 | |
0x0005 | CHANGED - ADDRESS | 服务器告知客户端,如果客户端发送CHANGE - REQUEST请求,服务器将使用此地址和端口发送响应,是服务器的备用响应地址。 | |
0x0006 | USERNAME | 用于消息完整性检查和认证过程,标识消息完整性验证中使用的用户名,该值为可变长度的UTF - 8编码序列,且需经过SASLprep处理。 | |
0x0007 | PASSWORD | 与认证相关,通常与USERNAME属性配合使用,用于验证客户端身份,但在RFC 5389中较少直接使用,更多结合其他认证机制。 | |
0x0008 | MESSAGE-INTEGRITY | 该属性包含STUN消息的HMAC - SHA1哈希值(20字节),用于确保消息在传输过程中未被篡改,保证消息的完整性和真实性。 | |
0x0009 | ERROR-CODE | 用于错误响应消息,包含一个300到699范围内的数字错误代码,以及一个UTF - 8编码的文本短语,用于描述错误的具体信息。 | |
0x000A | UNKNOWN-ATTRIBUTES | 当服务器收到包含其不识别属性的STUN消息时,会在错误码为420的错误响应中使用该属性列出这些未知属性的类型。 | |
0x000C | REFLECTED - FROM | 指示STUN消息是从哪个地址反射过来的,通常用于记录消息的传输路径信息。 | |
0x0014 | REALM | 可出现在请求和响应消息中,包含符合特定语法的文本,用于长期凭据认证。它是一个UTF - 8编码序列,长度少于128个字符,且经过SASLprep处理,出现该字段表示使用长期凭据认证方式。 | |
0x0015 | NONCE | 由服务器生成的一个可变长度的不透明值,用于防止重放攻击。客户端在后续请求中需要包含相同的NONCE值,服务器通过检查NONCE值确保消息的新鲜性和唯一性。 | 需UTF - 8编码且经SASLprep处理 |
0x001C | MESSAGE-INTEGRITY-SHA256 | 与MESSAGE - INTEGRITY类似,但使用SHA256算法计算消息的HMAC哈希值,提供更高的安全性,用于保证消息的完整性。 | |
0x001D | PASSWORD-ALGORITHM | 用于指定认证过程中所使用的密码算法,告知对端采用何种加密算法对密码进行处理和验证。 | |
0x001E | USERHASH | 对用户名进行哈希处理后的值,用于在不直接传输明文用户名的情况下进行用户标识和认证,增强了用户信息的安全性。 | |
0x0020 | XOR - MAPPED - ADDRESS | 是MAPPED - ADDRESS的改进版本,使用XOR运算对地址和端口进行加密处理,提高了地址信息在传输过程中的安全性,避免地址信息被轻易截取和分析。 | 格式见后面 |
0x0024 | PRIORITY | 在ICE(交互式连接建立)过程中,用于指示候选地址的优先级。客户端会收集多个候选地址,每个地址都有对应的优先级,服务器或对端可根据该优先级决定优先使用哪个候选地址建立连接。 | RFC 8445 ICE 扩展定义 |
0x0025 | USE-CANDIDATE | 用于通知对端立即使用指定的ICE候选地址对进行连接,跳过部分候选地址筛选和验证过程,加速连接的建立。 | RFC 8445 ICE 扩展定义 |
0x8002 | PASSWORD-ALGORITHMS | 列出服务器支持的所有密码算法,客户端可以根据这些信息选择合适的算法进行认证。 | |
0x8003 | ALTERNATE-DOMAIN | 提供一个备用的域名,用于在主域名不可用时作为替代,可能用于引导客户端到备用的服务或资源。 | |
0x8022 | SOFTWARE | 携带生成该STUN消息的软件或设备的相关信息,如软件名称、版本号等,有助于网络故障排查和统计分析。 | |
0x8023 | ALTERNATE - SERVER | 提供备用的STUN或TURN服务器地址,当主服务器不可用时,客户端可以尝试连接这些备用服务器。 | |
0x8028 | FINGERPRINT | 对消息计算的CRC - 32值,用于快速验证消息完整性。接收方重新计算CRC - 32值并与该属性值比较,若一致则消息未被篡改。 | |
0x8029 | ICE-CONTROLLED | 在ICE连接建立过程中,标识一个端点处于受控(Controlled)角色,该端点需遵循控制者端点的决策来建立连接。 | RFC 8445 ICE 扩展定义 |
0x802A | ICE-CONTROLLING | 在ICE连接建立过程中,标识一个端点处于控制(Controlling)角色,该端点负责协调和决定使用哪个候选地址对来建立连接。 | RFC 8445 ICE 扩展定义 |
四、zlmediakit 中STUN 协议抓包
总结
STUN 协议在 WebRTC 通信中是实现端到端连接的重要基础。通过客户端与 STUN 服务器的交互,客户端能够发现自己的公网地址和端口,为后续的直接通信提供了可能。了解 STUN 协议的交互过程和报文格式,对于深入研究 WebRTC 技术具有重要意义。
相关文章:
WebRTC学习七:WebRTC 中 STUN 协议详解
系列文章目录 第一篇 基于SRS 的 WebRTC 环境搭建 第二篇 基于SRS 实现RTSP接入与WebRTC播放 第三篇 centos下基于ZLMediaKit 的WebRTC 环境搭建 第四篇 WebRTC学习一:获取音频和视频设备 第五篇 WebRTC学习二:WebRTC音视频数据采集 第六篇 WebRTC学习三…...
力扣47. 全排列 II
思路 用 used 保存在一次答案中取过的数组索引。 先对数组进行排序,然后尝试取每个元素作为排列。 首先需要满足不重复取自己,即 !used.contains(i)。其次当前元素和前一个元素不同时可取,即 i 0 || nums[i] ! nums[i - 1]; 如…...
什么是将应用放在边缘服务器上创建?应用不是在用户手机上吗?边缘计算究竟如何优化?通过两个问题来辨析
元宇宙应用虽然可以在用户的手机等终端设备上运行,但大部分的计算和数据处理任务并不是完全在手机上完成的。元宇宙的运行需要庞大的计算资源和大量的数据交互,而这些是手机等终端设备难以独自承担的。因此,元宇宙应用需要借助边缘数据中心等…...
jmeter高级使用场景
JMeter 是一款功能强大的性能测试工具,除了基础的使用方法外,还有许多高级使用技巧,可帮助你更精准、高效地完成复杂的测试任务。以下为你详细介绍一些 JMeter 的高级使用方法: 分布式测试 当需要模拟大量并发用户来对系统进行压力测试时,单台机器的性能可能无法满足要求…...
智能升级、安全加倍,遨游防爆对讲机拉起通信安防线
在充斥着爆炸性气体和易燃物质的危险作业环境中,通信设备的选择关乎生命安全。一旦通信设备引发电火花,其后果将不堪设想。因此,专为防范易燃易爆环境而设计的防爆对讲机,凭借其独特的防爆技术和设计,成为了这些高风险…...
Flutter 上的 Platform 和 UI 线程合并是怎么回事?它会带来什么?
Flutter 在 3.29 发布了一个「重大」调整:从 3.29 开始,Android 和 iOS 上的 Flutter 将在应用的主线程上执行 Dart 代码,并且不再有单独的 Dart UI 线程 也许一些人对于这个概念还比较陌生,有时间可以看看以前发过的 《深入理解…...
IDEA关闭SpringBoot程序后仍然占用端口的排查与解决
IDEA关闭SpringBoot程序后仍然占用端口的排查与解决 问题描述 在使用 IntelliJ IDEA 开发 Spring Boot 应用时,有时即使关闭了应用,程序仍然占用端口(例如:4001 端口)。这会导致重新启动应用时出现端口被占用的错误&a…...
进程状态(R|S|D|t|T|X|Z)、僵尸进程及孤儿进程
文章目录 一.进程状态进程排队状态:运行、阻塞、挂起 二.Linux下的进程状态R 运行状态(running)S 睡眠状态(sleeping)D 磁盘休眠状态(Disk sleep)t 停止、暂停状态(tracing stopped)T 停止、暂停状态(stopp…...
Docker 搭建 Gitlab 服务器 (完整详细版)
参考 Docker 搭建 Gitlab 服务器 (完整详细版)_docker gitlab-CSDN博客 Docker 安装 (完整详细版)_docker安装-CSDN博客 Docker 日常命令大全(完整详细版)_docker命令-CSDN博客 1、Gitlab镜像 # 查找Gitlab镜像 docker search gitlab # 拉取Gitlab镜像 docker pull gitlab/g…...
Elasticsearch:使用经过训练的 ML 模型理解稀疏向量嵌入
作者:来自 Elastic Dai Sugimori 了解稀疏向量嵌入,理解它们的作用/含义,以及如何使用它们实现语义搜索。 Elasticsearch 提供语义搜索功能,允许用户使用自然语言进行查询并检索相关信息。为此,目标文档和查询必须首先…...
huggingface部署本地大模型DeepSeek-R1-Distill-Llama-70B使用streamlit构建交互式 Web 应用
文章目录 一、Streamlit介绍二、模型下载三 、模型部署四、效果展示 一、Streamlit介绍 Streamlit 是一个开源的 Python 库,专门用于快速构建和部署交互式 Web 应用程序,尤其适合数据科学和机器学习领域。以下是关于 Streamlit 的详细介绍: …...
中华人民共和国著作权法
目录 中华人民共和国著作权法 第一章 总则 第二章 著作权 第一节 著作权人及其权利 第二节 著作权归属 第三节 权利的保护期 第四节 权利的限制 第三章 著作权许可使用和转让合同 第四章 与著作权有关的权利 第一节 图书、报刊的出版 第二节 表 演 第…...
Maven 从下载到实战:一站式配置与使用指南
一、Maven 简介 Maven 是一款基于 POM(Project Object Model) 的 Java 项目管理工具,支持依赖管理、构建自动化、标准化项目结构等功能。其核心优势包括: 依赖管理:自动下载和管理第三方库(JAR 包…...
4部署kibana:5601
kibana 是一个基于浏览器页面的Elasticsearch前端展示工具,, 是一个开源和免费的工具 Kibana可以为 Logstash 和 ElasticSearch 提供的日志分析友好的 Web 界面, 可以帮你汇总、分析和搜索重要数据日志 1.安装-所有的es节点 # tar xf kibana-6.4.1-linux-x86_64.t…...
前端项目配置 Nginx 全攻略
在前端开发中,项目开发完成后,如何高效、稳定地将其部署到生产环境是至关重要的一步。Nginx 作为一款轻量级、高性能的 Web 服务器和反向代理服务器,凭借其出色的性能和丰富的功能,成为了前端项目部署的首选方案。本文将详细介绍在…...
Nmap网络安全审计
🍅 点击文末小卡片 ,免费获取网络安全全套资料,资料在手,涨薪更快 Nmap网络安全审计 什么是Nmap Nmap是由Gordon Lyon设计并实现的,于1997开始发布。最初设计Nmap的目的只是希望打造一款强大的端口扫描工具。但是随着…...
deepseek sse流式输出
链接 semi-ui-vue聊天组件 - 可以用这个组件优化界面 sse服务端消息推送 webflux&webclient Hi-Dream-Blog - 参考这个博客,可以在后台将markdown语法转为html 文章目录 链接效果代码pom.xmlDeepSeekControllerWebConfigDeepSeekClientAiChatRequestAiChatM…...
opencv(6): 形态学操作(二值化、自适应阈值、开闭、对比度)
如何在图片中识别出一些物体的位置。具体是什么不是形态学的范畴。 处理方法基本是对二进制图像进行处理。 卷积核决定着图像处理后的效果。 图像二值化 将图像的每个像素变成两种值, 如 0, 255。 全局二值化:全局按照某个阈值二值化 局部…...
P8681 [蓝桥杯 2019 省 AB] 完全二叉树的权值--完全 “二叉树” 不一定是 “满二叉树”
P8681 [蓝桥杯 2019 省 AB] 完全二叉树的权值 题目分析代码 题目 分析 我吧完全二叉树记成满二叉树了^^ 又卡我几分钟 代码 #include <iostream> #include <vector> #include <string> #include <algorithm> #include <math.h> #include <qu…...
Python驱动的餐饮企业智能数据分析:从数据清洗到可视化决策全流程实战
文章目录 Python驱动的餐饮企业智能数据分析:从数据清洗到可视化决策全流程实战引言一、案例背景1.1 需求分析1.2 数据准备1.2.1 模拟数据生成代码二、数据处理全流程2.1 数据清洗2.1.1 缺失值处理2.1.2 异常值检测2.2 核心指标计算2.2.1 营业额分析2.2.2 门店表现评估2.2.3 菜…...
深入理解IP子网掩码子网划分{作用} 以及 不同网段之间的ping的原理 以及子网掩码的区域划分
目录 子网掩码详解 子网掩码定义 子网掩码进一步解释 子网掩码的作用 计算总结表 子网掩码计算 子网掩码对应IP数量计算 判断IP是否在同一网段 1. 计算步骤 2. 示例 3. 关键点 总结 不同网段通信原理与Ping流程 1. 同网段通信 2. 跨网段通信 网段计算示例 3. P…...
Rust 中的内部可变性与 `RefCell<T>`
一、为什么需要内部可变性? 通常,Rust 编译器通过静态分析确保: 同一时刻只能存在一个可变引用,或任意多个不可变引用;引用始终保持有效。 这种严格的借用规则使得许多内存错误在编译阶段就能被捕获,但也…...
Android Audio实战——音频相关基础概念(附)
Android Audio 开发其实就是媒体源数字化的过程,通过将声波波形信号通过 ADC 转换成计算机支持的二进制的过程叫做音频采样 (Audio Sampling)。采样 (Sampling) 的核心是把连续的模拟信号转换成离散的数字信号。 一、声音的属性 1、响度 (Loudness) 响度是指人类可以感知到的…...
【Java项目】基于Spring Boot的教师人事档案管理系统
【Java项目】基于Spring Boot的教师人事档案管理系统 技术简介:采用Java技术、Spring Boot框架、MySQL数据库等实现。 系统简介:此系统的功能分为教师和管理员模块: 1、教师后台功能模块包括:首页、个人中心、个人档案管理、奖惩信…...
MySQL 中表和视图的关系
MySQL 中表和视图的关系 在 MySQL 中,表(Table) 是数据库中的基本存储结构,实际存储数据。而 视图(View) 是基于表或其他视图的虚拟表,它不存储数据,而是存储一条 SQL 查询的定义&a…...
BigDecimal线上异常解决方案:避免科学计数法输出的坑
文章目录 问题背景为什么BigDecimal会输出科学计数法?线上异常场景场景1:数据传递异常场景2:日志记录异常场景3:数据存储异常 解决方案1. 使用toPlainString()方法2. 设置格式化输出3. 自定义工具类 代码示例总结 在Java开发中&am…...
网络运维学习笔记(DeepSeek优化版)004网工初级(HCIA-Datacom与CCNA-EI)Console管理台使用、登录认证、破解恢复密码
文章目录 Console管理台使用、登录认证、破解恢复密码一、Console管理台使用和登录认证1.1 思科设备配置1.1.1 基本配置流程1.1.2 验证配置 1.2 华为设备配置1.2.1 本地密码认证1.2.2 AAA认证配置 二、远程管理协议Telnet和SSH配置2.1 思科Telnet基本配置2.2 华为Telnet基本配置…...
vmware系统磁盘扩容
扩展磁盘 关闭系统 编辑虚拟机设置,点击磁盘进行扩展 若无法点击检查是否有快照,若报错“在部分链上无法执行所调用的函数,请打开父虚拟磁盘”可查看解决方案 内部挂载 扩展分区 fdisk /dev/sda输入p,打印当前分区表删除/dev/…...
数据结构(陈越,何钦铭) 第四讲 树(中)
4.1 二叉搜索树 4.1.1 二叉搜索树及查找 Position Find(ElementTyoe X,BinTree BST){if(!BST){return NULL;}if(X>BST->Data){return Find(X,BST->Right)}else if(X<BST->Data){return Find(X,BST->Left)}else{return BST;} } Position IterFind(ElementTyp…...
OpenGL进阶系列19 - OpenGL SuperBible - basicfbo 例子学习
一:概述 在超级宝典之前的例子中,程序执行的所有渲染操作都是针对一个窗口,或者可能是计算机的主显示屏。片元着色器(fragment shader)的输出进入后台缓冲区(back buffer),而这个缓冲区通常由操作系统或窗口系统管理,并最终显示给用户。 当我们为渲染上下文选择格式时…...
猿大师播放器:交通水利、公安消防Web端Vue网页播放20路RTSP H.265 1080P监控视频流
随着互联网技术的飞速发展,视频监控已成为各行各业不可或缺的一部分。无论是交通物流、公安消防,还是水利农业、园区校园,视频监控都扮演着至关重要的角色。然而,传统的视频监控解决方案往往依赖于特定的客户端软件,这…...
文件下载技术的终极选择:`<a>` 标签 vs File Saver.js
文件下载技术的终极选择:<a> 标签 vs File Saver.js 在 Web 开发中,文件下载看似简单,实则暗藏玄机。工作种常纠结于 <a> 标签的原生下载和 File Saver.js 等插件的灵活控制之间。本文将从原理、优缺点、场景对比到实战技巧&…...
IDE(集成开发环境)
IDE(集成开发环境) 1. IDE 的定义 全称:Integrated Development Environment(集成开发环境)。中文:集成开发环境。作用:为程序开发提供全面的开发环境,集成了多种工具和服务&#x…...
数据安全_笔记系列02:国密算法(商用密码算法)详解
数据安全_笔记系列02:国密算法(商用密码算法)详解 国密算法是中国国家密码管理局(现国家密码管理局)制定的一系列自主可控的密码算法标准,旨在保障国内信息安全,满足合规要求。以下从 算法类型、技术细节、…...
全面汇总windows进程通信(三)
在Windows操作系统下,实现进程间通信(IPC, Inter-Process Communication)有几种常见的方法,包括使用管道(Pipe)、共享内存(Shared Memory)、消息队列(Message Queue)、命名管道(Named Pipe)、套接字(Socket)等。本文介绍如下几种: RPC(远程过程调用,Remote Pr…...
Python爬虫-破解字体加密技术
前言 本文是该专栏的第77篇,后面会持续分享python爬虫干货知识,记得关注。 字体加密是一种常见的反爬虫技术,通过自定义字体文件和字符映射来保护网页内容,防止爬虫直接获取文本信息。 而本文,笔者将针对“如何解决目标平台的字体加密技术,并获取目标数据”,进行详细介…...
Pytorch实现论文:基于多尺度融合生成对抗网络的水下图像增强
简介 简介:提出了一种新型的水下图像增强算法,基于多尺度融合生成对抗网络,名为UMSGAN,以解决低对比度和颜色失真的问题。首先经过亮度的处理,将处理后的图像输入设计的MFFEM模块和RM模块生成图像。该算法旨在适应各种水下场景,提供颜色校正和细节增强。 论文题目:Und…...
【Python量化金融实战】-第1章:Python量化金融概述:1.1量化金融的定义与发展历程
本小节学习建议:掌握Python编程、统计学(时间序列分析)、金融学基础(资产定价理论)三者结合,是进入量化领域的核心路径。 👉 点击关注不迷路 👉 点击关注不迷路 文章目录 1.1 量化金…...
大数据组件(四)快速入门实时数据湖存储系统Apache Paimon(3)
Paimon的下载及安装,并且了解了主键表的引擎以及changelog-producer的含义参考: 大数据组件(四)快速入门实时数据湖存储系统Apache Paimon(1) 利用Paimon表做lookup join,集成mysql cdc等参考: 大数据组件(四)快速入门实时数据…...
【论文解读】《Training Large Language Models to Reason in a Continuous Latent Space》
论文链接 1. 背景与动机 语言空间与推理的矛盾 目前大多数大语言模型(LLMs)在解决复杂问题时采用链式思维(Chain-of-Thought, CoT)方法,即利用自然语言逐步推导出答案。然而,论文指出: 自然语言…...
Linux-CentOS 7安装
Centos 7镜像:https://pan.baidu.com/s/1fkQHYT64RMFRGLZy1xnSWw 提取码: q2w2 VMware Workstation:https://pan.baidu.com/s/1JnRcDBIIOWGf6FnGY_0LgA 提取码: w2e2 1、打开vmware workstation 2、选择主界面的"创建新的虚拟机"或者点击左上…...
【Web RCE 漏洞常见类型】
Web RCE 漏洞常见类型 1. 注入类漏洞2. 反序列化漏洞3. 文件处理漏洞4. 模板引擎漏洞5. 服务端请求伪造(SSRF)6. 框架/中间件漏洞7. 第三方组件漏洞8. 配置不当与协议滥用9. 其他边缘场景防御建议 以下是可以导致远程代码执行(RCE)…...
【蓝桥杯单片机】第十三届省赛第二场
一、真题 二、模块构建 1.编写初始化函数(init.c) void Cls_Peripheral(void); 关闭led led对应的锁存器由Y4C控制关闭蜂鸣器和继电器 2.编写LED函数(led.c) void Led_Disp(unsigned char ucLed); 将ucLed取反的值赋给P0 开启锁存器 关闭锁存…...
【够用就好006】-PC桌面管理ECS服务器的实操步骤
背景介绍解决思路拓展知识 背景介绍 #够用就好#知其然知其所以然#aigc创意人左边 我计划搭建个人网站,计划格式化我的ECS服务器,但是里面有我之前的实践项目,我舍不得删除,我想要保存到本地。 通常我都是在vscode中用remotes ssh…...
Spring Boot 2/3.x 中 MultipartFile 接收问题深度解析与实战解决方案
文章目录 引言:文件上传的暗礁与应对一、核心机制解析1.1 多部分请求处理流程1.2 关键配置参数演进 二、典型问题排查与修复2.1 文件接收为null问题2.2 大文件上传内存溢出 三、版本差异陷阱3.1 Jakarta Servlet API迁移影响3.2 默认配置变更对比 四、高级问题解决方…...
MySQL的三种并发问题和四种隔离级别
阅读之前,请心里默念,脏读、不可重复读、幻读是三种常见的并发问题,隔离级别是应对并发问题的四种隔离级别,隔离级别和并发问题是两个东西,不要混淆。 在数据库事务中,脏读(Dirty Readÿ…...
【复习】Redis
数据结构 Redis常见的数据结构 String:缓存对象Hash:缓存对象、购物车List:消息队列Set:点赞、共同关注ZSet:排序 Zset底层? Zset底层的数据结构是由压缩链表或跳表实现的 如果有序集合的元素 < 12…...
【Docker】如何在Linux、Windows、MacOS中安装Docker
Linux安装Docker 在终端中执行一键安装脚本命令安装dockersudo curl -fsSL https://gitee.com/tech-shrimp/docker_installer/releases/download/latest/linux.sh | bash -s docker --mirror Aliyun1.1 配置docker镜像源 在终端执行 一行命令,编辑配置文件sudo tee /etc/docke…...
Linux System V - 消息队列与责任链模式
概念 消息队列是一种以消息为单位的进程间通信机制,允许一个或多个进程向队列中发送消息,同时允许一个或多个进程从队列中接收消息。消息队列由内核维护,具有以下特点: 异步通信:发送方和接收方不需要同时运行&#x…...
k2路由器登录校园网
教程1刷入Breed,并手动刷入Padavan固件:斐讯K1、K2、K2P 刷机、刷入Breed 辅助工具 | tb (tbvv.net) Padavan下载网址: 我用的是: Padavan 登录的网址是 192.168.123.1 Padavan配置教程: 先用网线连上校园网&#…...