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

浅谈网络 | 应用层之流媒体与P2P协议

目录

    • 流媒体
        • 名词系列
        • 视频的本质
        • 视频压缩
        • 编码过程
        • 如何在直播中看到帅哥美女?
        • RTMP 协议
    • P2P
        • P2P 文件下载
        • 种子文件 (.torrent)
        • 去中心化网络(DHT)
        • 哈希值与 DHT 网络
        • DHT 网络是如何查找

流媒体

直播系统组成与协议

近几年直播比较火,很多人都喜欢看直播。那么一个直播系统里面都有哪些组成部分,都使用了什么协议呢?

无论是直播还是点播,其实都是对于视频数据的传输。一提到视频,大家都爱看,但一提到视频技术,大家都头疼,因为名词实在是太多了。

名词系列
  1. 名词系列一:AVI、MPEG、RMVB、MP4、MOV、FLV、WebM、WMV、ASF、MKV。例如 RMVB 和 MP4,看着是不是很熟悉?
  2. 名词系列二:H.261、H.262、H.263、H.264、H.265。这个是不是就没怎么听过了?别着急,要重点关注 H.264。
  3. 名词系列三:MPEG-1、MPEG-2、MPEG-4、MPEG-7。MPEG 好像听说过,但后面的数字是怎么回事?熟悉又陌生?
视频的本质

视频是什么?其实就是快速播放一连串连续的图片。每一张图片称为一帧。只要每秒钟帧的数据足够多,即播放得足够快,人的眼睛看不出这是一张张独立的图片,这就是我们常说的帧率(FPS)。

每一张图片,由像素组成,假设为 1024×768,每个像素由 RGB 组成,每个 8 位,共 24 位。

计算视频大小:

每秒钟的视频大小:
30帧 × 1024 × 768 × 24 = 566,231,040 Bits = 70,778,880 Bytes
一分钟视频大小:
4,246,732,800 Bytes = 4 GB

视频压缩

如何将如此大的数据量压缩呢?编码就是一个压缩的过程。

视频和图片的压缩特点

  1. 空间冗余:相邻像素之间有较强的相关性,可以通过算法计算出中间的像素。
  2. 时间冗余:视频序列中相邻图像内容相似,利用已有的图片进行预测和推断。
  3. 视觉冗余:人眼对某些细节不敏感,因此可以丢失一些数据。
  4. 编码冗余:像素值出现的概率不同,概率高的像素使用较少的字节,概率低的像素使用更多字节,类似霍夫曼编码。

在这里插入图片描述

视频编码的两大流派

  1. ITU-VCEG:侧重传输,主要制定了 H.261, H.264 等标准。
  2. ISO-MPEG:侧重存储,主要制定了 MPEG-1, MPEG-2 等标准。

后来的 H.264/MPEG-4 AVC 标准就是这两个组织合作制定的。

编码过程

视频流通过编码变成二进制,这些二进制数据会按照一定的格式保存为文件。这个文件格式就是名词系列一中的各类格式(如 MP4、RMVB 等)。

如何在直播中看到帅哥美女?

视频流可以通过网络协议封装并传输。在直播过程中,视频从主播端推送到服务器,服务器再转发到客户端。这是一个典型的推流与拉流过程。
在这里插入图片描述

编码过程细节

视频编码后,视频被分成三种帧类型:

  • I帧(关键帧):完整的图片,可以单独解码。
  • P帧(前向预测编码帧):与前一个关键帧或 P 帧的差异,解码时需要参考之前的图像。
  • B帧(双向预测内插编码帧):记录与前后帧的差异,解码时需要前后帧的参考数据。

推流与拉流

  1. 推流:将编码后的视频数据通过 RTMP 协议传输到流媒体服务器。
  2. 拉流:观众通过 RTMP 协议从流媒体服务器拉取视频流并解码,最终显示在客户端。
RTMP 协议

RTMP 是基于 TCP 的协议,确保数据有序传输。推流和拉流过程中,RTMP 会将视频流分成多个 Chunk 进行传输,以适应低带宽环境。
观众的客户端通过 RTMP 推流的过程:
在这里插入图片描述

观众的客户端通过 RTMP 拉流的过程:
在这里插入图片描述

小结

  • 视频编码通过时空冗余压缩数据;
  • 编码后的视频流被分为 NALU 单元进行网络传输;
  • 使用 RTMP 协议进行视频流的推送和拉取;
  • 视频流在客户端进行解码,播放出最终的视频。

P2P

在下载电影时,我们通常会选择不同的下载方式。最常见的方式是通过 HTTP 协议进行下载,但是许多人可能有过这样的体验:当文件较大时,使用浏览器直接下载的速度极其缓慢。

另一种常见的下载方式是通过 FTP(文件传输协议)。FTP 采用两个 TCP 连接来传输文件,具体包括控制连接和数据连接。

  • 控制连接:服务器通常通过端口 21 以被动的方式监听,客户端则主动发起连接。这条连接负责传递命令和服务器的响应。例如,常见的命令包括:

    • list:列出文件目录;
    • retr:下载文件;
    • store:上传文件。
  • 数据连接:每次文件传输时,客户端和服务器会建立一个独立的数据连接来传输文件内容。

FTP 工作模式

FTP 有两种工作模式,分别是主动模式(PORT)和被动模式(PASV)。这两种模式的区别在于数据连接的建立方式,下面分别介绍:

  • 主动模式(PORT):在主动模式下,客户端会随机选择一个大于 1024 的端口 N,然后通过端口 21 向服务器发起连接。客户端会向服务器发出一个 PORT N+1 的命令,告诉服务器自己打开了一个监听端口 N+1。接着,服务器从自己的端口 20 主动连接到客户端的端口 N+1 来建立数据连接。

  • 被动模式(PASV):在被动模式下,客户端首先通过端口 21 连接到服务器并发送 PASV 命令。随后,服务器会选择一个大于 1024 的端口 P,并返回 227 entering passive mode 消息,告知客户端数据传输的端口号。客户端收到这个消息后,会使用端口 N+1 连接服务器的端口 P,并通过这两个端口进行数据传输。

P2P 文件下载

虽然 HTTP 和 FTP 是常见的文件下载方式,但它们都存在一个主要的缺点:单一服务器的带宽压力大。因为这两种方式采用的是传统的客户端-服务器架构,所有数据都依赖于中心服务器。

为了克服这一问题,P2P(Peer-to-Peer)文件传输方式应运而生。P2P 不再依赖单一的服务器来存储和传输资源,而是通过多台设备(即 Peer)之间的点对点连接来分散资源。

在 P2P 模式下,当你想下载一个文件时,系统会连接到已经拥有该文件的其他 Peer,你可以直接从这些设备下载数据,而无需依赖中心服务器。一旦下载完成,你的设备也会成为 P2P 网络的一部分,其他设备可以通过你的设备获取该文件。这样,随着网络中的 Peer 越多,下载速度也越快。

常见的 P2P 下载工具,如 BitTorrent,就利用这种分布式下载方式。在使用 BitTorrent 等软件时,你不仅会看到下载流量,还会看到上传流量。因为你在下载的同时,也在为其他用户提供文件。

种子文件 (.torrent)

在 P2P 下载中,如何知道哪些 Peer 已经拥有文件是一个关键问题。这个问题通过“种子”文件(.torrent)来解决。我们比较熟悉的 .torrent 文件由两部分组成:announce(tracker URL)文件信息

种子文件结构

  1. 文件信息(Info 区):包含文件的基本信息,如文件数量、每个文件的大小、目录结构等。
    • Name 字段:指定顶层目录的名称。
    • 每个段的大小:BT 协议将文件拆分成多个小段,这样可以并行下载各个段。
    • 段哈希值:每个文件段的 SHA-1 哈希值,所有段的哈希值合并在一起,保证文件完整性。

下载过程

  1. 解析种子文件:BT 客户端首先解析 .torrent 文件,获取 tracker 地址,然后连接到 tracker 服务器。
  2. 连接和获取 Peer 信息:tracker 服务器回应请求,提供其他下载者的 IP 地址,包括发布者。客户端通过这些信息连接到其他下载者。
  3. 交换文件段:客户端和其他 Peer 之间交换文件段。每个客户端会告知对方自己已下载的段,未下载的部分会从其他 Peer 处获取。
  4. 文件完整性验证:每次下载一个文件段后,客户端会计算该段的哈希值并与 .torrent 文件中的值对比。如果匹配,说明该段下载正确,否则需要重新下载。

依赖 Tracker 的问题

这种下载方式依赖于 tracker 服务器,tracker 是一个中心化的服务器,负责登记哪些用户请求哪些文件并协调 Peer 之间的连接。尽管下载过程是去中心化的,但加入 P2P 网络时仍需要借助 tracker 来进行连接。

缺点:如果 tracker 服务器出现故障或被屏蔽,P2P 下载就会受到影响,导致无法正常工作。

去中心化网络(DHT)

能否实现完全的去中心化?答案是可以的,这就是 DHT(Distributed Hash Table) 的应用。

什么是 DHT?

DHT 是一种分布式哈希表,每个加入 DHT 网络的节点都负责存储网络中的资源信息和其他成员的联系信息。简单来说,所有节点共同构成一个庞大的分布式数据库,分担信息存储和查询的工作。

Kademlia 协议

DHT 网络的一个著名协议是 Kademlia 协议,类似于区块链的概念,但更为抽象。下面我们来详细讲解它的工作原理。

DHT 网络中的角色

每个启动的 BitTorrent 节点扮演两个角色:

  1. Peer:监听一个 TCP 端口,用于上传和下载文件。这个角色标识该节点拥有某个文件。
  2. DHT Node:监听一个 UDP 端口,加入 DHT 网络。在 DHT 网络中,每个节点都有一个唯一的 ID,它是一个长串的哈希值。

文件索引与责任

在 DHT 网络中,每个节点并不存储所有文件,而是负责存储文件索引信息。具体来说:

  • 每个 DHT 节点需要知道某些文件在哪些节点上保存,但它自己不一定存储这些文件。
  • 这些节点通过 DHT 网络相互联系,共同维护文件的索引信息,确保文件的分布是去中心化的。

在这里插入图片描述

哈希值与 DHT 网络

每个 DHT node 并不拥有全局的文件信息,它只需要知道一部分文件的信息。要确定一个节点需要知道哪些文件,哈希算法便应运而生。

哈希值与文件

每个文件通过哈希算法计算出一个哈希值,而每个 DHT node 的 ID 长度与哈希值相同。

DHT 网络的规则是:如果某个文件的哈希值与某个 DHT node 的 ID 完全相同,那么该节点负责知道这个文件的下载位置。尽管该节点可能没有存储文件本身。

节点 ID 与文件哈希相似性

实际上,完全匹配的 DHT node 很难找到。为了应对这一问题,DHT 网络规定了:除了与哈希值完全相同的节点,还允许 与哈希值接近的 N 个节点 知道该文件的信息。

那么,如何判断“接近”呢?简单来说,接近是指哈希值在某些位上的差异较小。例如,修改文件哈希值的最后几位,仍然算作“接近”。

文件与节点的匹配过程

举个例子:

  • 文件 1 的哈希值与 node C 的 ID 完全匹配。因此,node C 知道文件 1 的下载位置,尽管它本身并没有存储文件 1。
  • 文件 2 的哈希值与 node E 的 ID 完全匹配,但 node D 的 ID 与 E 的哈希值很接近,因此 node D 也能得知文件 2 的位置。

新节点加入 DHT 网络

当一个新的节点 node new 加入 DHT 网络并想下载文件 1 时,首先它会找到种子文件(.torrent)中的 DHT 节点列表,并通过其中任意一个节点加入网络。

node new 会计算文件 1 的哈希值,并查找与哈希值匹配或接近的节点,如 node C。如果 node new 不能直接联系到 node C,它会向它能够联系到的其他节点询问,直到找到连接 node C 或其他相似节点的路径。

一旦 node new 开始下载文件,它就会向网络中其他节点报告自己也拥有该文件,成为新的文件“源”。

去中心化与分布式共享

此时,DHT 网络已经实现了文件的分布式共享。每个节点既能存储文件信息,又能提供文件下载路径,整个网络去除了中心化的依赖,保证了文件传输的高效性和可靠性。

DHT 网络的工作原理

  • 节点 ID 与文件哈希:节点 ID 和文件哈希值都使用 160 位(20 字节)长度的哈希空间。

  • 相似度计算:DHT 网络中节点 ID 的相似度通过 异或(XOR)运算 来判断。例如,对于 5 位 ID:

    • 0101001000 的距离是 00010,即 2。
    • 0101000010 的距离是 01000,即 8。
    • 0101000011 的距离是 01001,即 9。

    通过这种计算方式,判断 ID 之间的“距离”有助于确定哪些节点对文件的存储和下载路径最为重要。

类比社交网络

在 DHT 网络中,节点的距离更像是社交网络中的“社交距离”——即不同节点之间的联系程度,而非地理距离。就像在 LinkedIn 上,工作经历丰富的人可能与你的“社交距离”较近,尽管你们没有住在同一地方。

DHT 网络是如何查找

DHT(分布式哈希表)网络的查找和更新机制是通过 Kademlia 协议实现的,允许节点高效地查找其他节点和文件。以下是该协议的工作原理和核心机制:


1. 节点查找

假设节点 A 的 ID 为 00110,需要查找节点 B,ID 为 10000。这两个节点的异或距离为 10110,即 AB 之间的距离是 31。根据 Kademlia 协议,节点 A 会尝试在自己的 k-bucket 中查找 B,并根据以下步骤进行折半查找:

1.1 查找目标节点所在的 k-bucket

  • A 计算异或值 10110,并根据异或的结果确定 B 可能在的 k-bucket。在此例中,BA 的 ID 从第 5 位开始不同,因此 B 可能在 k-bucket 5 中。
  • 如果 Ak-bucket 5 中存在 B,查找成功;如果不存在,继续下一步。

1.2 查找接近的节点

  • 如果 A 没有在自己的 k-bucket 5 中找到 B,它会从该桶中随机选择一个节点 C,并请求 C 查询自己的通讯录,看看是否能找到 B
  • 由于 CB 的 ID 在第 5 位相同,因此 C 能找到与 B 更接近的节点,进一步缩小查找范围。
  • 这种过程逐步缩小距离,每次通过折半查找来加速查找过程。

1.3 查找过程的递归

  • 如果 C 也没有找到 B,它会继续向自己的通讯录请求,直到找到距离 B 更近的节点,如 D,然后 D 继续查找,直到最终找到 B
  • 最坏的情况是,每次找到的节点都离目标节点较远,需要多个步骤才能最终找到 B

1.4 查找效率

  • Kademlia 协议采用了 折半查找 的机制,最多只需要 log2(N) 次查询(其中 N 为网络中节点总数)就能找到目标节点。这保证了查询过程的高效性。

2. 节点通信

在 DHT 网络中,节点之间通过 4 个核心指令进行通信:

  • PING:测试一个节点是否在线,类似打电话确认对方是否还活跃。
  • STORE:请求一个节点保存一份数据。加入网络的节点需要保存一定的数据。
  • FIND_NODE:根据目标节点的 ID 查找该节点。即通过节点的 ID 查找节点的位置。
  • FIND_VALUE:根据文件的哈希值(即 KEY)查找存储该文件的节点。实际上,这个操作与 FIND_NODE 类似,只不过目标是文件而非节点。

3. 节点的通讯录更新

Kademlia 协议通过更新每个节点的通讯录来保证网络的稳定性和高效性。每个节点的 k-bucket(即通讯录)按照接触时间倒序排列,最近联系的节点排在最前面。

3.1 更新机制

  • 每次节点与其他节点接触时,都会检查这个节点是否已经在自己的 k-bucket 中。如果节点已经存在,它会被移到 k-bucket 列表的末尾,表示最近联系过的节点。
  • 如果通讯录满了(通常是一个固定的大小,如 20 个节点),新的节点会替换最旧的节点。如果最旧的节点在线(通过 PING 测试),它会被移到通讯录的末尾;如果下线,则删除并加入新的节点。

3.2 维持网络稳定性

  • 通过这种方式,Kademlia 协议保证了即使某些节点加入或离开网络,整体的网络结构和效率不会受到影响。节点始终保持高效且动态的通讯录,不断更新与其他节点的联系。

总结一下:

  • 集中式下载 vs 非中心化下载:下载一个文件通常使用 HTTP 或 FTP,这两种方式都是依赖中心化服务器的,而 P2P(点对点)则采用了去中心化的方式,改变了传统的下载模式。

  • P2P 的两种方式

    1. 基于 Tracker 的 P2P:这种方式中,元数据(即文件的位置信息)集中存储在 Tracker 上,而文件数据则分散存储在多个节点中。下载过程需要通过 Tracker 来获得文件的相关信息。
    2. 基于 DHT 的 P2P:这是一种完全去中心化的方式,文件的元数据和文件数据都被分散存储在整个网络中。每个节点都可能既是数据存储者,也可能是数据查找者,通过分布式哈希算法(DHT)来完成文件的查找和下载。

通过这两种方式,P2P 网络能够有效实现文件的共享和分发,并且避免了传统集中式下载的单点故障问题。

相关文章:

浅谈网络 | 应用层之流媒体与P2P协议

目录 流媒体名词系列视频的本质视频压缩编码过程如何在直播中看到帅哥美女?RTMP 协议 P2PP2P 文件下载种子文件 (.torrent)去中心化网络(DHT)哈希值与 DHT 网络DHT 网络是如何查找 流媒体 直播系统组成与协议 近几年直播比较火,…...

Brain.js(六):构建FNN神经网络实战教程 - 用户喜好预测

在前文不同的神经网络类型和对比 针对不同的神经网络类型做了对比,本章将对FNN稍作展开 测试环境: chrome 版本 131.0.6778.86(正式版本) (64 位) 一、引言 Brain.js 是一个简单易用的 JavaScript 神经网…...

重学设计模式-建造者模式

本文介绍一下建造者模式,相对于工厂模式来说,建造者模式更为简单,且用的更少 定义 建造者模式是一种创建型设计模式,它使用多个简单的对象一步一步构建成一个复杂的对象。这种模式的主要目的是将一个复杂对象的构建过程与其表示…...

linux下c++调用opencv3.4.16实战技巧

目录 参考:在图像上绘框在图像上绘圆在图像上绘文字在图像上绘制线灰度图rgb转yuvOpenCV 读取视频,设置起始帧、结束帧及帧率获取(1.1)简介(1.2)Mat类型(1.3)IplImage类型将OpenCV抓拍的图片进行x264编码并保存到文件c++调用opencv,读取rtsp视频流参考: https://blog…...

记录css模糊程度的属性

记录需要模糊以及透明化图片需求: opacity: (0到1之间数字,dom透明程度)。 filter: blur() 括号里需数字,单位为px,值越大模糊程度越大。 关于css中filter属性记录 filter 滤镜属性: blur&…...

K8S的监控与告警配置有哪些最佳实践

在 Kubernetes (K8s) 集群中实现有效的监控与告警是确保集群稳定性、性能以及及时响应潜在问题的关键。以下是 K8s 监控与告警配置的最佳实践,涵盖了监控工具的选择、告警规则的配置、数据存储与可视化等方面。 1. 选择合适的监控工具 Kubernetes 生态系统有多种监…...

如何在Ubuntu 20.04上安装和使用PostgreSQL:一步步指南

如何在Ubuntu 20.04上安装和使用PostgreSQL:一步步指南 在Ubuntu 20.04上安装和使用PostgreSQL数据库包括几个明确的步骤:安装、配置、创建用户和数据库、以及基本的数据库操作。下面,我将详细解释每个步骤,并提供具体的命令行示…...

PostGis学习笔记

– 文本方式查看几何数据 SELECT ST_AsText(geom)FROM nyc_streets WHERE name ‘Avenue O’; – 计算紧邻的街区 SELECT name,ST_GeometryType(geom) FROM nyc_streets WHERE ST_DWithin( geom,ST_GeomFromText(‘LINESTRING(586782 4504202,586864 4504216)’,26918),0.1); …...

JDK17 线程池 ThreadPoolExecutor

文章目录 线程池ThreadPoolExecutor状态向线程池添加任务 executeWorker线程池新建工作线程 addWorker 拒绝策略 线程池 线程池将创建线程和使用线程解耦。优点是 避免重复创建和销毁线程,降低资源消耗。任务不用等待创建线程的时间,提高响应速度。统一…...

Dify+Docker

1. 获取代码 直接下载 (1)访问 langgenius/dify: Dify is an open-source LLM app development platform. Difys intuitive interface combines AI workflow, RAG pipeline, agent capabilities, model management, observability features and more, …...

分布式会话 详解

分布式会话详解 在分布式系统中,用户的会话状态需要在多个服务器或节点之间共享或存储。分布式会话指的是在这种场景下如何管理和存储会话,以便在多个节点上都能正确识别用户状态,从而保证用户体验的一致性。 1. 为什么需要分布式会话 在单…...

Java进阶

Java进阶 java注解 java中注解(Annotation),又称为java标注,是一种特殊的注释,可以添加在包,类,成员变量,方法,参数等内容上面.注解会随同代码编译到字节码文件中,在运行时,可以通过反射机制获取到类中的注解,然后根据不同的注解进行相应的解析. 内置注解 Java 语言中已经定…...

Qt/C++实现帧同步播放器/硬解码GPU绘制/超低资源占用/支持8K16K/支持win/linux/mac/嵌入式/国产OS等

一、前言 首先泼一盆冷水,在不同的电脑上实现完完全全的帧同步理论上是不可能的,市面上所有号称帧同步的播放器,同一台电脑不同拼接视频可以通过合并成一张图片来绘制实现完完全全的帧同步,不同电脑,受限于网络的延迟…...

hhdb数据库介绍(10-33)

管理 数据归档 归档记录查询 功能入口:“管理->数据归档->归档记录查询” 需要确保配置的归档用户对数据归档规则所在的逻辑库具备CREATE权限,以及对原数据表具有所有权限。 清理归档数据 (一)功能入口:“…...

UE4_材质节点_有关距离的_流体模拟

一、材质节点介绍: 特别注意:距离场需要独立显卡支持。 1、什么是距离场? 想象一下空间中只有两个实体, 一个球,一个圆柱. 空间由无数个点组成, 取其中任何一个点, 比如,它跟球面的最近距离是3, 跟圆柱面的最近距离是2, 那么这个点的值就…...

SpringBoot集成 SpringDoc (SpringFox 和 Swagger 的升级版)

阅读 SpringDoc 官网 - Migrating from SpringFox 只需要导入以下一个依赖即可&#xff1a; <dependency><groupId>org.springdoc</groupId><artifactId>springdoc-openapi-starter-webmvc-ui</artifactId><version>2.7.0</version>…...

分布式推理框架 xDit

1. xDiT 简介 xDiT 是一个为大规模多 GPU 集群上的 Diffusion Transformers&#xff08;DiTs&#xff09;设计的可扩展推理引擎。它提供了一套高效的并行方法和 GPU 内核加速技术&#xff0c;以满足实时推理需求。 1.1 DiT 和 LLM DiT&#xff08;Diffusion Transformers&am…...

《Vue零基础入门教程》第十七课:侦听器

往期内容 《Vue零基础入门教程》第九课&#xff1a;插值语法细节 《Vue零基础入门教程》第十课&#xff1a;属性绑定指令 《Vue零基础入门教程》第十一课&#xff1a;事件绑定指令 《Vue零基础入门教程》第十二课&#xff1a;双向绑定指令 《Vue零基础入门教程》第十三课&…...

【人工智能-基础】SVM中的核函数到底是什么

文章目录 支持向量机(SVM)中的核函数详解1. 什么是核函数?核函数的作用:2. 核技巧:从低维到高维的映射3. 常见的核函数类型3.1 线性核函数3.2 多项式核函数3.3 高斯径向基函数(RBF核)4. 总结支持向量机(SVM)中的核函数详解 支持向量机(SVM,Support Vector Machine)…...

RoBERTa- 稳健优化的 BERT 预训练模型详解

一、引言 自 BERT&#xff08;Bidirectional Encoder Representations from Transformers&#xff09;问世&#xff0c;预训练语言模型在自然语言处理&#xff08;NLP&#xff09;领域掀起革命浪潮&#xff0c;凭卓越表现大幅刷新诸多任务成绩。RoBERTa 承继 BERT 架构&#x…...

20.(开发工具篇github)Git上次超过100M单文件

1:安装lfs git lfs install 2: 撤销所有更改&#xff08;包括未暂存的更改&#xff09; git reset --hard 3:查找大于100M的文件 find ./ -size 100M 4:加入到 track git lfs track “./data/geo_tif_zzjg/2023年_种植结构影像.tif” git lfs track “./data/geo_tif_zz…...

Redis使用场景-缓存-缓存击穿

前言 之前在针对实习面试的博文中讲到Redis在实际开发中的生产问题&#xff0c;其中缓存穿透、击穿、雪崩在面试中问的最频繁&#xff0c;本文加了图解&#xff0c;希望帮助你更直观的了解缓存击穿&#x1f600; &#xff08;放出之前写的针对实习面试的关于Redis生产问题的博…...

uniapp Electron打包生成桌面应用exe文件

1.uniapp Electron打包生成桌面应用exe文件 随着跨平台开发的需求日益增长,UniApp 成为了开发者们的首选之一。通过 UniApp,你可以使用 Vue.js 的语法结构和组件系统来构建原生应用、Web 应用甚至是桌面应用。本文将详细介绍如何使用 UniApp 将你的项目打包成 Windows 桌面端…...

【机器学习】Sigmoid函数在深层神经网络中存在梯度消失问题,如何设计一种改进的Sigmoid激活函数,既能保持其概率预测优势,又能避免梯度消失?

为了解决 Sigmoid 函数在深层神经网络中的梯度消失问题&#xff0c;可以设计一种改进的 Sigmoid 激活函数&#xff0c;使其同时具备以下特性&#xff1a; 减缓梯度消失问题&#xff1a;避免在输入值远离零时梯度趋于零的问题。保持概率预测能力&#xff1a;保留 Sigmoid 的单调…...

SpringBoot中实现EasyExcel实现动态表头导入(完整版)

前言 最近在写项目的时候有一个需求&#xff0c;就是实现动态表头的导入&#xff0c;那时候我自己也不知道动态表头导入是什么&#xff0c;查询了大量的网站和资料&#xff0c;终于了解了动态表头导入是什么。 一、准备工作 确保项目中引入了处理 Excel 文件的相关库&#xff…...

前端用到的一些框架

拖拽框架&#xff1a;Vue.Draggable Vue.Draggable是一款基于Sortable.js拖拽插件 官网&#xff1a;https://github.com/SortableJS/Vue.Draggable 分屏插件&#xff1a;fullPage.js fullPage.js 是一个基于 jQuery 的插件&#xff0c;它能够很方便、很轻松的制作出全屏网站…...

“量子跃迁与数据织网:深入探索K最近邻算法在高维空间中的优化路径、神经网络融合技术及未来机器学习生态系统的构建“

&#x1f3bc;个人主页&#xff1a;【Y小夜】 &#x1f60e;作者简介&#xff1a;一位双非学校的大二学生&#xff0c;编程爱好者&#xff0c; 专注于基础和实战分享&#xff0c;欢迎私信咨询&#xff01; &#x1f386;入门专栏&#xff1a;&#x1f387;【MySQL&#xff0…...

10个Word自动化办公脚本

在日常工作和学习中&#xff0c;我们常常需要处理Word文档&#xff08;.docx&#xff09;。 Python提供了强大的库&#xff0c;如python-docx&#xff0c;使我们能够轻松地进行文档创建、编辑和格式化等操作。本文将分享10个使用Python编写的Word自动化脚本&#xff0c;帮助新…...

【青牛科技】D35摄氏温度传感器芯片,低功耗,静态工作电流小于60 μA

概述&#xff1a; D35是基于模拟电路的一种基本摄氏温度传感器&#xff0c;其作用是将感测的环境温度/物体温度精确的以电压的形式输出&#xff0c;且输出电压与摄氏温度成线性正比关系&#xff0c;转换公式为Vo0 10 mV / ℃*T&#xff08;℃&#xff09;&#xff0c;0C时输出为…...

无分类编址的IPv4地址

/20含义&#xff1a;前20比特位为网络号&#xff0c;后面32-2012为主机号 路由聚合&#xff1a;找共同前缀 所有可分配地址的主机都能接收广播地址&#xff0c;...

LeetCode - #150 逆波兰表达式求值

文章目录 前言1. 描述2. 示例3. 答案关于我们 前言 我们社区陆续会将顾毅&#xff08;Netflix 增长黑客&#xff0c;《iOS 面试之道》作者&#xff0c;ACE 职业健身教练。&#xff09;的 Swift 算法题题解整理为文字版以方便大家学习与阅读。 LeetCode 算法到目前我们已经更新…...

如何避免数据丢失:服务器恢复与预防策略

在当今数字时代&#xff0c;数据对于个人和企业来说都至关重要。数据丢失可能会导致严重的财务损失、业务中断甚至法律责任。因此&#xff0c;采取措施防止数据丢失至关重要。本文将讨论服务器数据丢失的常见原因以及如何防止数据丢失的有效策略。 服务器数据丢失的常见原因 服…...

pytorch中model.eval的理解

在复现simsam的过程中&#xff0c;看到在线性评估部分的训练函数中设置了model.eval,不太理解&#xff0c;印象中一直觉得&#xff0c;model.eval会影响梯度的回传&#xff0c;这里来拨乱反正一下。 事实上&#xff0c;model.eval()主要影响 BatchNorm 和 Dropout 层的行为&am…...

【AI+教育】一些记录@2024.11.19-11.25

通向AGI之路&#xff1a;大型语言模型&#xff08;LLM&#xff09;技术精要 https://zhuanlan.zhihu.com/p/597586623 在Bert和GPT模型出现之前&#xff0c;NLP领域流行的技术是深度学习模型&#xff0c;而NLP领域的深度学习&#xff0c;主要依托于以下几项关键技术&#xff1…...

CSS变量用法及实践

目录 一、基本用法 1.1、定义变量 1.2、使用变量 1.3 、修改变量的值 二、命名规范 2.1、使用有意义的名称 2.2、使用命名空间 三、变量值类型 3.1、如果变量值是一个字符串&#xff0c;可以与其他字符串拼接&#xff0c;例如&#xff1a; 3.2、 如果变量值是数值&a…...

【Python网络爬虫笔记】8- (BeautifulSoup)抓取电影天堂2024年最新电影,并保存所有电影名称和链接

目录 一. BeautifulSoup的作用二. 核心方法介绍2.1 构造函数2.2 find()方法2.3 find_all()方法2.4 select()方法 三. 网络爬虫中使用BeautifulSoup四、案例爬取结果 一. BeautifulSoup的作用 解析HTML/XML文档&#xff1a;它可以将复杂的HTML或XML文本转换为易于操作的树形结构…...

STM32 ADC --- 知识点总结

STM32 ADC — 知识点总结 文章目录 STM32 ADC --- 知识点总结cubeMX中配置注解单次转换模式、连续转换模式、扫描模式单通道采样的情况单次转换模式&#xff1a;连续转换模式&#xff1a; 多通道采样的情况禁止扫描模式&#xff08;单次转换模式或连续转换模式&#xff09;单次…...

使用PHP脚本实现GitHub API搜索与数据库同步

在现代软件开发中&#xff0c;自动化数据收集和同步是提高效率的关键。今天&#xff0c;我将分享一个我最近开发的PHP脚本&#xff0c;它能够自动从GitHub API搜索特定关键词的仓库&#xff0c;并将这些数据同步到MySQL数据库中。这个过程不仅涉及到API调用和数据处理&#xff…...

使用docker-compese部署SFTPGo详解

官网&#xff1a;SFTP & FTP as a Managed Service (SaaS) and On-premise 一、SFTPGo简介 SFTPGo 是一款功能强大的文件传输服务器软件。它支持多种协议&#xff08;SFTP、SCP、FTP/S、WebDAV、HTTP/S&#xff09;和多个存储后端。 借助 SFTPGo&#xff0c;您可以利用本地…...

JavaScript根据数据生成柱形图

分析需求 // 定义一个数组来存储四个季度的数据 dataArray = []// 循环4次,获取用户输入的数据并存储到数组中 for i from 0 to 3// 获取用户输入的数据inputData = 获取用户输入的第(i + 1)季度的数据// 将数据存入数组dataArray[i] = inputData// 遍历数组,根据数据生成柱…...

Android笔记【12】脚手架Scaffold和导航Navigation

一、前言 学习课程时&#xff0c;对于自己不懂的点的记录。 对于cy老师第二节课总结。 二、内容 1、PPT介绍scaffold 2、开始代码实操 先新建一个screen包&#xff0c;写一个Homescreen函数&#xff0c;包括四个页面。 再新建一个compenent包&#xff0c;写一个displayText…...

VirtualBox注册已有虚拟机:未能打开位于虚拟电脑E_INVALIDARG (0X80070057)

错误如下 解决办法1 产生虚拟机的机器&#xff0c;与当前使用机器不兼容。建议在当前机器重新产生虚拟机。比如我家里电脑是WIN7&#xff0c;公司电脑是WIN11。 原来的虚拟机内容&#xff0c;找老机器导出。 解决办法2&#xff08;存疑&#xff09; 搜索到一个说法&#xf…...

开发中使用UML的流程_08 PIM-4:定义操作及方法

目录 1、序列图概述 2、序列图调用方式 3、创建消息与销毁消息 4、几项建议 1、序列图概述 在PIM-4中&#xff0c;系统分析员可以用序列图来表达&#xff0c;系统内部一群对象合力完成某一个系统用例时&#xff0c;执行期间的交互情形。之后&#xff0c;序列图可能通过设计…...

软件设计 —— 检测按键单击、多击、长按或组合动作

目 录 按键单一动作识别按键组合动作识别 按键单一动作识别 带有按键的作品设计时&#xff0c;按键动作检测是必不可少的&#xff0c;如何判断按键是单击、双击、三击和长按动作呢&#xff1f; 1、定时器定时一个10ms周期 2、把按键检测函数放到这个周期内执行&#xff0c;即…...

【GPT】主要影响代谢的因素

代谢的快慢受到多种因素的影响&#xff0c;包括遗传、生活习惯和健康状况等。以下是主要影响代谢的因素&#xff1a; 1. 年龄 影响&#xff1a;年龄增长会导致基础代谢率&#xff08;BMR&#xff09;逐渐降低&#xff0c;这是因为随着年龄增加&#xff0c;肌肉量减少&#xff…...

LLM Agents can Autonomously Hack Websites 论文阅读

paper:LLM Agents can Autonomously Hack Websites abstract:近年来,大型语言模型(llm)已经变得越来越有能力,现在可以与工具交互(例如,调用函数),读取文档,并递归地调用自己。因此,这些llm现在可以作为代理自主运行。随着这些代理能力的提高,最近的工作推测了LLM代…...

STM32标准库-FLASH

FLASH模仿EEPROM STM32本身没有自带EEPROM&#xff0c;但是自带了FLASH存储器。 STM32F103ZET6自带 1M字节的FLASH空间&#xff0c;和 128K64K的SRAM空间。 STM32F4 的 SPI 功能很强大&#xff0c;SPI 时钟最高可以到 37.5Mhz&#xff0c;支持 DMA&#xff0c;可以配置为 SPI协…...

【机器学习】机器学习的基本分类-监督学习-决策树-ID3 算法

ID3&#xff08;Iterative Dichotomiser 3&#xff09;是决策树的一种构造算法&#xff0c;由 Ross Quinlan 在 1986 年提出。它主要用于分类问题&#xff0c;通过信息增益选择特征来构建决策树。ID3 假设数据是离散型特征&#xff0c;且不支持连续型数据。 1. 核心思想 划分标…...

nginx配置http及https

nginx配置http及https 1.动静分离2.负载均衡3.配置https4.请求重定向5.常用参数配置介绍 现在日常工作中的项目大多数都是采用前后端分离&#xff0c;就用到了nginx进行反向代理、处理静态资源等&#xff1b;因此&#xff0c;记录整理了nginx一些常用的配置&#xff1b; 1.动静…...

威联通-001 手机相册备份

文章目录 前言1.Qfile Pro2.Qsync Pro总结 前言 威联通有两种数据备份手段&#xff1a;1.Qfile Pro和2.Qsync Pro&#xff0c;实践使用中存在一些区别&#xff0c;针对不同备份环境选择是不同。 1.Qfile Pro 用来备份制定目录内容的。 2.Qsync Pro 主要用来查看和操作文…...