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

【Linux】网络基础探索:开启你的网络之旅

🌈 个人主页:Zfox_
🔥 系列专栏:Linux

目录

  • 一:🔥 计算机网络背景
    • 🦋 1-1 网络发展
  • 二:🔥 初识协议
    • 🦋 2-1 协议分层
      • 协议分层 vs. 软件分层
    • 🦋 2-2 OSI七层网络模型
    • 🦋 2-3 TCP/IP 五层(或四层)模型
  • 三:🔥 再识协议
    • 🦋 3-1 为什么要有 TCP/IP 协议?
    • 🦋 3-2 什么是 TCP/IP 协议?
    • 🦋 3-3 TCP/IP 协议与操作系统的关系(宏观上, 怎么实现的)
    • 🦋 3-4 所以究竟什么是协议?
  • 四:🔥 网络传输基本流程
    • 🦋 4-1 局域网(以太网为例)通信原理
      • 4-1-1 认识 MAC 地址
      • 4-1-2 数据包封装和分用
    • 🦋 4-2 跨网络传输流程图
      • 4-2-1 网络中的地址管理 - 认识 IP 地址
  • 五:🔥 Socket 编程预备
    • 🦋 5-1 理解源 IP 地址和目的 IP 地址
    • 🦋 5-2 认识端口号
      • 5-2-1 端口号范围划分
      • 5-2-2 理解 "端口号" 和 "进程 ID"
      • 5-2-3 理解源端口号和目的端口号
    • 🦋 5-3 理解 socket
    • 🦋 5-4 传输层的典型代表
      • 5-4-1 认识 TCP 协议
      • 5-4-2 认识 UDP 协议
    • 🦋 5-5 网络字节序
    • 🦋 5-6 socket 编程接口
      • 5-6-1 socket 常见 API
      • 5-6-2 sockaddr 结构
        • 5-6-2-1 sockaddr 结构
        • 5-6-2-2 sockaddr_in 结构
        • 5-6-2-3 in_addr 结构
  • 六:🔥 共勉

一:🔥 计算机网络背景

🦋 1-1 网络发展


🛜 网络互联: 多台计算机连接在一起, 完成数据共享;


局域网 (Local Area Network,LAN): 计算机数量更多了, 通过交换机和路由器连接在一起;
在这里插入图片描述

📚 广域网 (Wide Area Network,WAN): 将远隔千里的计算机都连在一起;

在这里插入图片描述

所谓 “局域网” 和 “广域网” 只是一个相对的概念. 比如, 我们有 “天朝特色” 的广域网, 也可以看做一个比较大的局域网.

  • 计算机是人的工具, 人要协同工作, 注定了网络的产生是必然的

二:🔥 初识协议

  • " 协议" 是一种约定.
  • 打电话约定电话铃响的次数的约定
    在这里插入图片描述
    计算机之间的传输媒介是 光信号 和 电信号. 通过 “频率” 和 “强弱” 来表示 0 和 1 这样的信息. 要想传递各种不同的信息, 就需要约定好双方的数据格式.

🎯 思考: 只要通信的两台主机, 约定好协议就可以了么?

  • 定好协议, 但是你用频率表示 01, 我用强弱表示 01, 就好比我用中国话, 你用葡萄牙语一样, 虽然大家可能遵守的一套通信规则, 但是语言不同,即是订好了基本的协议, 也是无法正常通信的。

    所以, 完善的协议, 需要更多更细致的规定, 并让参与的人都要遵守。
  • 计算机生产厂商有很多;
  • 计算机操作系统, 也有很多;
  • 计算机网络硬件设备, 还是有很多;
  • 如何让这些不同厂商之间生产的计算机能够相互顺畅的通信? 就需要有人站出来, 约定一个共同的标准, 大家都来遵守, 这就是 网络协议;

📚 网络协议的核心作用包括:

  • 标准化:使不同厂商的设备能够互联互通。
  • 规范性:定义了数据在传输过程中的行为。
  • 可靠性:通过校验和重传机制,确保数据正确传输。

📚 举例:

  • HTTP协议:定义了网页浏览器与服务器之间的通信规则。
  • TCP协议:确保数据在传输中无错误且按顺序到达。

🦋 2-1 协议分层

网络通信是一个复杂的过程,为了降低设计难度并提高效率,网络协议通常采用分层设计的理念。分层设计将复杂的通信任务划分为若干独立的功能模块,每个模块专注于特定任务。

  • 在这个例子中, 我们的"协议"只有两层:语言层、 通信设备层。
  • 但是实际的网络通信协议, 设计的会更加复杂, 需要分更多的层
  • 但是通过上面的简单例子, 我们是能理解, 分层可以实现解耦合, 让软件维护的成本更低

协议分层的特点:

  1. 模块化设计
    每一层完成特定功能,互不干扰。例如,传输层关注数据的可靠传输,而物理层则负责信号的传递。

  2. 接口标准化
    各层之间通过接口传递数据和信息,无需了解其他层的具体实现。例如,应用层无需关注底层硬件如何工作。

  3. 便于开发与维护
    协议的分层设计使得开发者可以专注于某一层的优化,而不影响其他层。

协议分层 vs. 软件分层

协议分层与操作系统的软件分层理念相似。例如,在Linux系统中:

  • 操作系统的分层包括内核层、硬件抽象层和用户层。
  • 协议的分层则对应了从物理传输到应用服务的不同阶段。

二者的共同点在于通过分层实现复杂任务的简化和模块化。例如:

  • 协议分层:物理层负责电信号传输,传输层确保数据可靠到达。
  • 软件分层:驱动程序负责硬件控制,用户应用只需调用接口。

通过分层设计,网络协议不仅实现了多厂商设备的互通,还为Linux等操作系统提供了结构化的网络通信支持。

🦋 2-2 OSI七层网络模型

OSI(Open Systems Interconnection) 模型是国际标准化组织(ISO)提出的网络通信框架,是一种理论上的参考模型,用于定义网络通信的结构和分层。

OSI 模型将网络通信划分为七个层次,从硬件传输到应用服务,层与层之间通过标准接口交互。其核心目的是规范和简化不同设备、协议之间的通信,促进互联互通。

它的最大优点是将服务、 接口和协议这三个概念明确地区分开来, 概念清楚,理论也比较完整. 通过七个层次化的结构模型使不同的系统不同的网络之间实现可靠的通讯;

• 但是, 它既复杂又不实用; 所以我们按照 TCP/IP 四层模型来讲解

层次主要功能示例协议/设备
应用层面向用户,提供网络服务接口,如文件传输、邮件、远程登录等。HTTP、FTP、SMTP
表示层数据格式的转换、加密、解密和压缩,确保不同设备之间的数据表示一致。JPEG、GIF、TLS
会话层管理会话建立、维持和断开,如数据同步和传输控制。NetBIOS、RPC
传输层提供端到端的可靠数据传输和错误检测,确保数据完整到达目标端。TCP、UDP
网络层负责路由和逻辑地址(IP)的分配,确保数据能跨网络到达目标设备。IP、ICMP、IGRP
数据链路层负责数据帧的组装、传输与错误检测,在局域网中完成数据的正确传输。Ethernet、PPP、Wi-Fi
物理层负责比特流的传输,定义物理介质(如光纤、电缆)和信号规范(如电压、频率)。光纤、网线、无线信号

其实在网络角度, OSI 定的协议 7 层模型其实非常完善, 但是在实际操作的过程中, 会话层、 表示层是不可能接入到操作系统中的, 所以在工程实践中, 最终落地的是 5 层协议。

  • 但是要理解上面的话, 需要我们学习完网络才可以理解, 这里就知道就可以

🦋 2-3 TCP/IP 五层(或四层)模型

TCP/IP 是一组协议的代名词, 它还包括许多协议, 组成了 TCP/IP 协议簇.
TCP/IP 通讯协议采用了 5 层的层级结构, 每一层都呼叫它的下一层所提供的网络来完成自己的需求

  • 物理层: 负责光 / 电信号的传递方式. 比如现在以太网通用的网线(双绞 线)、 早期以太网采用的的同轴电缆(现在主要用于有线电视)、 光纤, 现在的 wifi 无线网使用电磁波等都属于物理层的概念。 物理层的能力决定了最大传输速率、 传输距离、 抗干扰性等. 集线器 (Hub) 工作在物理层.
  • 数据链路层: 负责设备之间的数据帧的传送和识别. 例如网卡设备的驱动、 帧同步(就是说从网线上检测到什么信号算作新帧的开始)、 冲突检测(如果检测到冲突就自动重发)、 数据差错校验等工作. 有以太网、 令牌环网, 无线 LAN 等标准. 交换机 (Switch) 工作在数据链路层.
  • 网络层: 负责地址管理和路由选择. 例如在 IP 协议中, 通过 IP 地址来标识一台主机, 并通过路由表的方式规划出两台主机之间的数据传输的线路(路由). 路由器 (Router) 工作在网路层.
  • 传输层: 负责两台主机之间的数据传输. 如传输控制协议 (TCP), 能够确保数据可靠的从源主机发送到目标主机.
  • 应用层: 负责应用程序间沟通,如简单电子邮件传输(SMTP)、文件传输协议(FTP)、网络远程访问协议(Telnet) 等. 我们的网络编程主要就是针对应用层.

在这里插入图片描述
物理层我们考虑的比较少, 我们只考虑软件相关的内容. 因此很多时候我们直接称为 TCP / IP 四层模型.

一般而言

  • 对于一台主机, 它的操作系统内核实现了从传输层到物理层的内容;
  • 对于一台路由器, 它实现了从网络层到物理层;
  • 对于一台交换机, 它实现了从数据链路层到物理层;
  • 对于集线器, 它只实现了物理层;
    但是并不绝对. 很多交换机也实现了网络层的转发; 很多路由器也实现了部分传输层的内容(比如端口转发);

三:🔥 再识协议

🦋 3-1 为什么要有 TCP/IP 协议?

  • 首先, 即便是单机, 你的计算机内部, 其实都是存在协议的, 比如: 其他设备和内存通信, 会有内存协议。 其他设备和磁盘通信, 会有磁盘相关的协议, 比如:SATA, IDE, SCSI 等。 只不过我们感知不到罢了。 而且这些协议都在本地主机各自的硬件中, 通信的成本、 问题比较少。

  • 其次, 网络通信最大的特点就是主机之间变远了。 任何通信特征的变化, 一定会带来新的问题, 有问题就得解决问题, 所以需要新的协议咯。

在这里插入图片描述

  • 所以, 为什么要有 TCP/IP 协议? 本质就是通信主机距离变远了

🦋 3-2 什么是 TCP/IP 协议?

  • TCP/IP 协议的本质是一种解决方案
  • TCP/IP 协议能分层, 前提是因为问题们本身能分层

🦋 3-3 TCP/IP 协议与操作系统的关系(宏观上, 怎么实现的)

在这里插入图片描述

🦋 3-4 所以究竟什么是协议?

截止到目前, 我们还没接触过任何协议, 但是如何朴素的理解协议, 我们已经可以试试了。

  • OS 源代码一般都是用 C/C++语言写的。
    下面, 仔细看看下面的图

在这里插入图片描述
问题: 主机 B 能识别 data, 并且准确提取 a=10, b=20, c=30 吗?
回答: 答案是肯定的! 因为双方都有同样的结构体类型 struct protocol。 也就是说,用同样的代码实现协议, 用同样的自定义数据类型, 天然就具有”共识“, 能够识别对方发来的数据, 这不就是约定吗?

关于协议的朴素理解: 所谓协议, 就是通信双方都认识的结构化的数据类型

因为协议栈是分层的, 所以, 每层都有双方都有协议, 同层之间, 互相可以认识对方的协议。

四:🔥 网络传输基本流程

🦋 4-1 局域网(以太网为例)通信原理

  • 首先回答, 两台主机在同一个局域网, 是否能够直接通信? 是的
  • 原理类似上课
  • 每台主机在局域网上, 要有唯一的标识来保证主机的唯一性: mac 地址

4-1-1 认识 MAC 地址

  • MAC 地址用来识别数据链路层中相连的节点;
  • 长度为 48 位, 及 6 个字节. 一般用 16 进制数字加上冒号的形式来表示(例如 : 08:00:27:03:fb:19)
  • 在网卡出厂时就确定了, 不能修改. mac 地址通常是唯一的(虚拟机中的 mac 地址不是真实的 mac 地址, 可能会冲突; 也有些网卡支持用户配置 mac 地址).

后面我们详细谈论数据链路层的时候, 会谈 mac 帧协议, 此处我们做一个了解即可。

在这里插入图片描述

  • 以太网中, 任何时刻, 只允许一台机器向网络中发送数据
  • 如果有多台同时发送, 会发生数据干扰, 我们称之为数据碰撞
  • 所有发送数据的主机要进行碰撞检测和碰撞避免
  • 没有交换机的情况下, 一个以太网就是一个碰撞域
  • 局域网通信的过程中, 主机对收到的报文确认是否是发给自己的, 是通过目标 mac 地址判定
  • 这里可以试着从系统角度来理解局域网通信原理

初步明白了局域网通信原理, 再来看同一个网段内的两台主机进行发送消息的过程

而其中每层都有协议, 所以当我进行进行上述传输流程的时候, 要进行封装和解包

在这里插入图片描述
下面我们明确一下概念

- ** 报头部分, 就是对应协议层的结构体字段, 我们一般叫做 `报头`** - **除了报头, 剩下的叫做 `有效载荷`** - **故, `报文 = 报头 + 有效载荷`**

然后, 我们在明确一下不同层的完整报文的叫法

  • 不同的协议层对数据包有不同的称谓, 在 传输层叫做 段(segment) , 在 网络层叫做 数据报 (datagram) , 在 链路层叫做 帧(frame).
  • 应用层数据通过协议栈发到网络上时,每层协议都要加上一个 数据首部(header), 称为 封装(Encapsulation).
  • 首部信息中包含了一些类似于首部有多长, 载荷(payload) 有多长, 上层协议是什么等信息.
  • 数据封装成帧后发到传输介质上,到达目的主机后每层协议再剥掉相应的首部,根据首部中的 "上层协议字段" 将数据交给对应的上层协议处理

最后, 在整体复盘一下:

  • 在网络传输的过程中, 数据不是直接发送给对方主机的, 而是先要自定向下将数据交付给下层协议, 最后由底层发送, 然后由对方主机的底层来进行接受, 在自底向上进行向上交付, 下面是一张示意图。

4-1-2 数据包封装和分用

下图为数据封装的过程

下图为数据分用的过程 从今天开始, 我们学习任何协议, 都要先宏观上建立这样的认识: 1. 要学习的协议, 是如何做到解包的? 只有明确了解包, 封包也就能理解 2. 要学习的协议, 是如何做到将自己的有效载荷, 交付给上层协议的?(分用)

🦋 4-2 跨网络传输流程图

4-2-1 网络中的地址管理 - 认识 IP 地址

IP 协议有两个版本, IPv4 和 IPv6. 我们整个的博客, 凡是提到 IP 协议, 没有特殊说明的,默认都是指 IPv4

  • IP 地址是在 IP 协议中, 用来标识网络中不同主机的地址;
  • 对于 IPv4 来说, IP 地址是一个 4 字节, 32 位的整数;
  • 我们通常也使用 “点分十进制” 的字符串表示 IP 地址, 例如 192.168.0.1 ; 用点分割的每一个数字表示一个字节, 范围是 0 - 255;

📚 跨网段的主机的数据传输. 数据从一台计算机到另一台计算机传输过程中要经过一个或多个路由器

下面是一张示意图

首先理解一下 IP 地址的意义

  • 为什么要去目标主机, 先要走路由器?
  • 目的 IP 的意义

在这里插入图片描述
📚 然后结合封装与解包, 体现路由器解包和重新封装的特点

在这里插入图片描述
对比 IP 地址和 Mac 地址的区别

  • IP 地址在整个路由过程中, 一直不变(目前, 我们只能这样说明, 后面在修正)
  • Mac 地址一直在变
  • 目的 IP 是一种长远目标, Mac 是下一阶段目标, 目的 IP 是路径选择的重要依据, mac 地址是局域网转发的重要依据

提炼 IP 网络的意义和网络通信的宏观流程
在这里插入图片描述
IP 网络层存在的意义: 提供网络虚拟层, 让世界的所有网络都是 IP 网络, 屏蔽最底层网络的差异

五:🔥 Socket 编程预备

🦋 5-1 理解源 IP 地址和目的 IP 地址

  • IP 在网络中, 用来标识主机的唯一性
  • 注意: 后面我们会讲 IP 的分类, 后面会详细阐述 IP 的特点

但是这里要思考一个问题: 数据传输到主机是目的吗? 不是的。 因为数据是给人用的。 比如: 聊天是人在聊天, 下载是人在下载, 浏览网页是人在浏览?

但是人是怎么看到聊天信息的呢? 怎么执行下载任务呢? 怎么浏览网页信息呢? 通过启动的 qq, 迅雷, 浏览器。

而启动的 qq, 迅雷, 浏览器都是进程。 换句话说, 进程是人在系统中的代表, 只要把数据给进程, 人就相当于就拿到了数据。

所以: 数据传输到主机不是目的, 而是手段。 到达主机内部, 在交给主机内的进程,才是目的。

但是系统中, 同时会存在非常多的进程, 当数据到达目标主机之后, 怎么转发给目标进程? 这就要在网络的背景下, 在系统中, 标识主机的唯一性。

在这里插入图片描述

🦋 5-2 认识端口号

端口号(port)是传输层协议的内容.

  • 端口号是一个 2 字节 16 位的整数;
  • 端口号用来标识一个进程, 告诉操作系统, 当前的这个数据要交给哪一个进程来处理;
  • IP 地址 + 端口号能够标识网络上的某一台主机的某一个进程;
  • 一个端口号只能被一个进程占用

在这里插入图片描述

5-2-1 端口号范围划分

  • 0 - 1023: 知名端口号 , HTTP, FTP, SSH 等这些广为使用的应用层协议, 他们的端口号都是固定的.
  • 1024 - 65535 : 操作系统动态分配的端口号. 客户端程序的端口号, 就是由操作系统从这个范围分配的.

5-2-2 理解 “端口号” 和 “进程 ID”

我们之前在学习系统编程的时候, 学习了 pid 表示唯一一个进程; 此处我们的端口号也是唯一表示一个进程. 那么这两者之间是怎样的关系?

10086 例子
另外, 一个进程可以绑定多个端口号; 但是一个端口号不能被多个进程绑定;

  • 进程 ID 属于系统概念, 技术上也具有唯一性, 确实可以用来标识唯一的一个进程, 但是这样做, 会让系统进程管理和网络强耦合, 实际设计的时候, 并没有选择这样做。

5-2-3 理解源端口号和目的端口号

📚 传输层协议(TCP 和 UDP)的数据段中有两个端口号, 分别叫做 源端口号 和 目的端口号. 就是在描述 “数据是谁发的, 要发给谁”;

🦋 5-3 理解 socket

  • 综上, IP 地址用来标识互联网中唯一的一台主机, port 用来标识该主机上唯一的一个网络进程
  • IP+Port 就能表示互联网中唯一的一个进程
  • 所以, 通信的时候, 本质是两个互联网进程代表人来进行通信, {srcIp,srcPort, dstIp, dstPort}这样的 4 元组就能标识互联网中唯二的两个进程
  • 所以, 网络通信的本质, 也是进程间通信
  • 我们把 ip+port 叫做套接字 socket

🦋 5-4 传输层的典型代表

如果我们了解了系统, 也了解了网络协议栈, 我们就会清楚, 传输层是属于内核的, 那么我们要通过网络协议栈进行通信, 必定调用的是传输层提供的系统调用, 来进行的网络通信。
在这里插入图片描述

5-4-1 认识 TCP 协议

此处我们先对 TCP(Transmission Control Protocol 传输控制协议) 有一个直观的认识; 后面我们再详细讨论 TCP 的一些细节问题.

  • 传输层协议
  • 有连接
  • 可靠传输
  • 面向字节流

5-4-2 认识 UDP 协议

此处我们也是对 UDP(User Datagram Protocol 用户数据报协议) 有一个直观的认识; 后面再详细讨论.

  • 传输层协议
  • 无连接
  • 不可靠传输
  • 面向数据报

因为我们暂时还没有深入了解 tcp、 udp 协议, 此处只做了解即可

🦋 5-5 网络字节序

我们已经知道,内存中的多字节数据相对于内存地址有大端和小端之分, 磁盘文件中的多字节数据相对于文件中的偏移地址也有大端小端之分, 网络数据流同样有大端小端之分. 那么如何定义网络数据流的地址呢?

  • 发送主机通常将发送缓冲区中的数据按内存地址从低到高的顺序发出;
  • 接收主机把从网络上接到的字节依次保存在接收缓冲区中,也是按内存地址从低到高的顺序保存;
  • 因此,网络数据流的地址应这样规定:先发出的数据是低地址,后发出的数据是高地址.
  • TCP / IP 协议规定,网络数据流应采用大端字节序,即低地址高字节.
  • 不管这台主机是大端机还是小端机, 都会按照这个 TCP/IP 规定的网络字节序来发送/接收数据;
  • 如果当前发送主机是小端, 就需要先将数据转成大端; 否则就忽略, 直接发送即可

在这里插入图片描述

🎯 为使网络程序具有可移植性,使同样的 C 代码在大端和小端计算机上编译后都能正常运行,可以调用以下库函数做网络字节序和主机字节序的转换。

在这里插入图片描述

  • 这些函数名很好记, h 表示 host , n 表示 network , l 表示 32 位长整数 , s 表示 16 位短整数
  • 例如 htonl 表示将 32 位的长整数从主机字节序转换为网络字节序 , 例如将 IP 地址转换后准备发送。
  • 如果主机是小端字节序, 这些函数将参数做相应的大小端转换然后返回;
  • 如果主机是大端字节序, 这些函数不做转换, 将参数原封不动地返回。

🦋 5-6 socket 编程接口

5-6-1 socket 常见 API

// 创建 socket 文件描述符 (TCP/UDP, 客户端 + 服务器)
int socket(int domain, int type, int protocol);// 绑定端口号 (TCP/UDP, 服务器)
int bind(int socket, const struct sockaddr *address, socklen_t address_len);// 开始监听 socket (TCP, 服务器)
int listen(int socket, int backlog);// 接收请求 (TCP, 服务器)
int accept(int socket, struct sockaddr* address, socklen_t* address_len);// 建立连接 (TCP, 客户端)
int connect(int sockfd, const struct sockaddr *addr, socklen_t addrlen);

5-6-2 sockaddr 结构

🦁 socket API 是一层抽象的网络编程接口,适用于各种底层网络协议,如 IPv4、 IPv6, 以及后面要讲的 UNIX Domain Socket. 然而, 各种网络协议的地址格式并不相同.

  • Pv4 和 IPv6 的地址格式定义在 netinet / in.h 中,IPv4 地址用 sockaddr_in 结构体表示,包括 16 位地址类型, 16 位端口号和 32 位 IP 地址.
  • IPv4、 IPv6 地址类型分别定义为常数 AF_INETAF_INET6 . 这样,只要取得某种 sockaddr 结构体的首地址,不需要知道具体是哪种类型的 sockaddr 结构体,就可以根据地址类型字段确定结构体中的内容.
  • socket API 可以都用 struct sockaddr \* 类型表示, 在使用的时候需要强制转化成 sockaddr_in ; 这样的好处是程序的通用性, 可以接收 IPv4, IPv6, 以及 UNIX Domain Socket 各种类型的 sockaddr 结构体指针做为参数;
5-6-2-1 sockaddr 结构

在这里插入图片描述

5-6-2-2 sockaddr_in 结构

在这里插入图片描述
虽然 socket api 的接口是 sockaddr, 但是我们真正在基于 IPv4 编程时, 使用的数据结构是 sockaddr_in; 这个结构里主要有三部分信息: 地址类型, 端口号, IP 地址。

📚 其中,__SOCKADDR_DOMMON 是一个宏 即 sin_family
在这里插入图片描述

5-6-2-3 in_addr 结构

在这里插入图片描述

  • in_addr 用来表示一个 IPv4 的 IP 地址. 其实就是一个 32 位的整数;

六:🔥 共勉

以上就是我对 【Linux】线程同步与互斥 的理解,觉得这篇博客对你有帮助的,可以点赞收藏关注支持一波~😉
在这里插入图片描述

相关文章:

【Linux】网络基础探索:开启你的网络之旅

🌈 个人主页:Zfox_ 🔥 系列专栏:Linux 目录 一:🔥 计算机网络背景 🦋 1-1 网络发展 二:🔥 初识协议 🦋 2-1 协议分层协议分层 vs. 软件分层 🦋 2-…...

function isBulkReadStatement, file SQLiteDatabaseTracking.cpp

一问题:Xcode16.0运行在iPhone16/ios18.0 以上发生闪退, 闪退在 YYCache–>YYKVStorage 文件内。 以上删除保以下错误: function isBulkReadStatement, file SQLiteDatabaseTracking.cpp 解决方案: 找到YYKVStorage文件中_d…...

React 中hooks之useTransition使用总结

目录 概述基本用法使用场景最佳实践注意事项 概述 什么是 useTransition? useTransition 是 React 18 引入的新 Hook,用于标记非紧急的状态更新。它允许组件在状态转换期间保持响应,通过将某些更新标记为"过渡"来推迟它们的渲染。 主要特…...

leetcode 3097. 或值至少为 K 的最短子数组 II 中等

给你一个 非负 整数数组 nums 和一个整数 k 。 如果一个数组中所有元素的按位或运算 OR 的值 至少 为 k ,那么我们称这个数组是 特别的 。 请你返回 nums 中 最短特别非空 子数组 的长度,如果特别子数组不存在,那么返回 -1 。 示例 1&…...

C# OpenCV机器视觉:特征匹配 “灵魂伴侣”

在一个阳光仿佛被施了魔法,欢快得直蹦跶的早晨,阿强像个即将踏上神秘寻宝之旅的探险家,一屁股墩在实验室那张堆满各种奇奇怪怪小玩意儿的桌前。桌上,零件、线路、半成品设备乱成一团,唯有他那宝贝电脑屏幕散发着清冷又…...

DDD - 整洁架构_解决技术设计困局

文章目录 Pre如何落地 DDD底层技术的更迭 整洁架构的设计主动适配器/北向适配器被动适配器/南向适配器 整洁架构的落地总结 Pre DDD - 软件退化原因及案例分析 DDD - 如何运用 DDD 进行软件设计 DDD - 如何运用 DDD 进行数据库设计 DDD - 服务、实体与值对象的两种设计思路…...

金融项目实战 07|Python实现接口自动化——连接数据库和数据清洗、测试报告、持续集成

目录 一、投资模块(投资接口投资业务) 二、连接数据库封装 和 清洗数据 1、连接数据库 2、数据清洗 4、调用 三、批量执行测试用例 并 生成测试报告 四、持续集成 1、代码上传gitee 2、Jenkin持续集成 一、投资模块(投资接口投资业务…...

Ceph与RAID在存储中的协同工作过程

本文将结合架构图,详细讲解Ceph与RAID如何在存储环境中相互配合,共同提供高效且可靠的存储服务。 架构概述 从上图中可以看到,Ceph的架构主要分为四个层次: 客户端和服务接口层:这一层包括客户端访问存储应用的接口…...

《重生到现代之从零开始的C++生活》—— 类和对象2

类的默认成员函数 默认成员函数就是用户没有显示实现,编译器会自动生成的成员函数,一个类会默认生成6个成员函数 构造函数 构造函数时特殊的成员函数,构造函数的初始化对象 函数名与类名相同 没有返回值 对象实例化的时候胡自动调用构造…...

MFC 使用 32位带Alpha通道的位图

最近需要做一个MFC界面上的图片,众所周知,MFC 好像只支持 bmp 格式的! 先看我的原始24位图片,RGB 三个颜色各占8位 (256色), 所以是24位。 如果放到MFC界面上,是这个很丑的效果 它是一个正方形图片,周围的白色可以看见。 解下来,进入今天的主题: 32位带 Alpha 通…...

QT:子控件VLC播放视频时,父控件无法截取鼠标事件

具体来说: 反复验证,结论正确。只要是播放区(即传递给VLC的窗口区域),就无法点击。 比如WidgetA,新建一个WidgetB,设置位置时留有一点边框。这个时候WidgetA的边框区是能收到鼠标事件的。 这…...

力扣 739. 每日温度

🔗 https://leetcode.cn/problems/daily-temperatures 题目 给定一个数组,表示每天的天气返回一个数组,index i 表示几天后比当前的温度要高,没有则为 0 思路 维护一个单调递减栈,若当前的温度比栈顶大&#xff0c…...

蓝桥杯 阶乘的和(C++完整代码+详细分析)

题目描述 原题链接 阶乘的和 问题描述 给定 n 个数 Ai​,问能满足 m! 为 ∑(Ai!) 的因数的最大的 m 是多少。其中 m! 表示 m 的阶乘,即 123⋯m。 输入格式 输入的第一行包含一个整数 n。 第二行包含 n 个整数,分别表示 Ai​,相…...

OpenAI进军实体机器人:GPT赋能的智能未来

近年来,人工智能技术飞速发展,深刻地改变着我们的生活。而OpenAI作为人工智能领域的领军者,其最新动作更是引人注目:进军实体机器人领域!这不仅标志着人工智能技术应用场景的重大拓展,也预示着未来智能机器…...

【Python运维】用Python管理Docker容器:从`docker-py`到自动化部署的全面指南

《Python OpenCV从菜鸟到高手》带你进入图像处理与计算机视觉的大门! 解锁Python编程的无限可能:《奇妙的Python》带你漫游代码世界 在现代软件开发和运维过程中,Docker容器化技术因其高效、轻量和可移植性而被广泛应用。Python作为一种灵活且功能强大的编程语言,通过doc…...

【机器学习实战入门项目】MNIST数字分类机器学习项目

Python 深度学习项目:手写数字识别 为了使机器更加智能,开发者们正在深入研究机器学习和深度学习技术。人类通过不断练习和重复来学习执行某项任务,从而记住如何完成这些任务。然后,大脑中的神经元会自动触发,他们能够…...

【统计信号处理基础——估计与检测理论】Vol1.Ch1 引言

文章目录 1. 信号处理中的估计2. 估计的数学问题3. 估计量性能评估习题1.11.21.31.41.5 1. 信号处理中的估计 从离散时间波形或一组数据集中提取参数的问题。我们有 N N N点数据集 { x [ 0 ] , x [ 1 ] , ⋯ , x [ N − 1 ] } \{x[0],x[1],\cdots,x[N-1]\} {x[0],x[1],⋯,x[N−…...

Linux 存储设备和 Ventoy 启动盘制作指南

一、Linux 存储设备基础知识 1. 设备路径(/dev) 设备路径是 Linux 系统中物理存储设备的唯一标识,类似设备的"身份证号"。 命名规则解析 /dev/sda: /dev:device(设备)的缩写&…...

第14章:Python TDD应对货币类开发变化(一)

写在前面 这本书是我们老板推荐过的,我在《价值心法》的推荐书单里也看到了它。用了一段时间 Cursor 软件后,我突然思考,对于测试开发工程师来说,什么才更有价值呢?如何让 AI 工具更好地辅助自己写代码,或许…...

网络协议入门:OSI模型与TCP/IP栈

在网络通信的世界中,数据从一台设备传输到另一台设备,需要遵循一系列规则,这些规则统称为网络协议。OSI模型和TCP/IP协议栈作为网络通信的基石,帮助我们理解数据传输的全流程。这篇文章将深入解析它们的结构、功能和实际应用&…...

pthread_exit函数

pthread_exit 是 POSIX 线程库(pthread)中的一个函数,用于显式地终止调用线程。与 exit 函数不同,pthread_exit 仅影响调用它的线程,而不是整个进程。使用 pthread_exit 可以确保线程在退出时能够正确地释放线程相关的…...

从语音识别到图像识别:AI如何“看”和“听”

引言 随着人工智能技术的不断进步,AI的“听”和“看”能力正变得越来越强大。从语音识别到图像识别,AI不仅能够通过声音与我们互动,还能通过视觉理解和分析周围的世界。这些技术不仅改变了我们与机器的交互方式,也在各行各业中带…...

UML-对象图(Object Diagram)

定义 在UML(统一建模语言)中,对象图用于描述在某一时刻,一组对象以及它们之间关系的图形。它是系统详细状态在某一时刻的快照,常用于表示复杂的类图的一个实例。关联、依赖和继承是对象图中常见的三种关系,下面将对这三种关系进行详细说明,并阐述它们之间的区别。 Pla…...

Pytorch - YOLOv11自定义资料训练

►前言 本篇将讲解目前最新推出的YOLOv11搭配Roboflow进行自定义资料标注训练流程,透过Colab上进行实作说明,使大家能够容易的了解YOLOv11的使用。 ►YOLO框架下载与导入 ►Roboflow的资料收集与标注 进行自定义资料集建置与上传 透过Roboflow工具进行…...

大模型GUI系列论文阅读 DAY2续2:《使用指令微调基础模型的多模态网页导航》

摘要 自主网页导航的进展一直受到以下因素的阻碍: 依赖于数十亿次的探索性交互(通常采用在线强化学习),依赖于特定领域的模型设计,难以利用丰富的跨领域数据进行泛化。 在本研究中,我们探讨了基于视觉-语…...

Docker 搭建mysql 连接超时问题,xxl-job启动mysql连接报错,禁用dns

1.本地连接Navicat报错信息,猜测是navicat默认连接超时导致的,后面换成idea一个插件虽然慢但连接上了 2013 - Lost connection to MySQL server at reading initial communication packet 2.启动xxl-job会报错,网上有人mysql驱动与数据库不匹…...

SSM课设-学生管理系统

【课设者】SSM课设-学生管理系统 技术栈: 后端: SpringSpringMVCMybatisMySQLJSP 前端: HtmlCssJavaScriptEasyUIAjax 功能: 学生端: 登陆 学生信息管理 个人信息管理 老师端: 多了教师信息管理 管理员端: 多了班级信息管理 多了年级信息管理 多了系统用户管理...

JavaScript笔记APIs篇03——DOM节点Bom操作本地存储正则表达式

黑马程序员视频地址:黑马程序员前端JavaScript入门到精通全套视频教程https://www.bilibili.com/video/BV1Y84y1L7Nn?vd_source0a2d366696f87e241adc64419bf12cab&spm_id_from333.788.videopod.episodes&p78https://www.bilibili.com/video/BV1Y84y1L7Nn?…...

JS 有哪些模块化规范

一、CommonJS 规范 1. 主要应用场景 主要用于服务器端开发,尤其是 Node.js 环境。 2. 核心思想 使用 require() 函数来引入模块,使用 module.exports 或 exports 对象来导出模块中的内容。 // math.js 模块const add (a, b) > a b;const subtr…...

摘录人工智能面试笔试题汇总

一、人工智能面试问答题汇总 1、什么是人工智能? 人工智能(AI)是一种计算机科学,它增强了像人类一样工作和反应的智能机器。机器模拟人类智能行为的能力。人工智能通常用于各种应用,如决策、语音识别、感知、认知能力…...

【PCIe 总线及设备入门学习专栏 6.1 -- PCIe MCTP】

文章目录 1 什么是 MCTP?2 MCTP 消息在 PCIe 中的传输特点3 PCIe MCTP 的局限性(1) 出站(Outbound)MCTP 消息分解的限制(2) 入站(Inbound)MCTP 消息组装的限制4 MCTP 消息的实际使用流程发送端处理流程接收端处理流程5 实际使用场景例 1:管理命令传输例 2:监控数据报告例…...

RabbitMQ集群安装rabbitmq_delayed_message_exchange

1、单节点安装rabbitmq安装延迟队列 安装延迟队列rabbitmq_delayed_message_exchange可以参考这个文章: rabbitmq安装延迟队列-CSDN博客 2、集群安装rabbitmq_delayed_message_exchange 在第二个节点 join_cluster 之后,start_app 就会报错了 (CaseC…...

doris 2.1 Queries Acceleration-Hints 学习笔记

1 Hint Classification 1.1 Leading Hint:Specifies the join order according to the order provided in the leading hint. 1.2 Ordered Hint:A specific type of leading hint that specifies the join order as the original text sequence. 1.3 Distribute Hint:Speci…...

【网络协议】【http】【https】TLS解决了HTTP存在的问题-加密通信+摘要,数字签名+CA证书

【网络协议】【http】【https】TLS解决了HTTP存在的问题-加密通信摘要数字签名CA证书 ps:TLS前期发送的密码套件里面主要就是约定:密钥交换算法,签名算法,对称加密算法,摘要算法 1加密通信 一般选择非对称加密交换密钥 对称加密…...

某讯一面,感觉问Redis的难度不是很大

前不久,有位朋友去某讯面试,他说被问到了很多关于 Redis 的问题,比如为什么用 Redis 作为 MySQL 的缓存?Redis 中大量 key 集中过期怎么办?如何保证缓存和数据库数据的一致性?我将它们整理出来,…...

【json_object】mysql中json_object函数过长,显示不全

问题:json只显示部分 解决: SET GLOBAL group_concat_max_len 1000000; -- 设置为1MB,根据需要调整如果当前在navicat上修改,只有效本次连接和后续会话,重新连接还是会恢复默认值1024 在my.ini配置文件中新增或者修…...

【KOA框架】koa框架基础入门

koa是express的一层封装,语法比express更加简洁。所以有必要了解下koa的相关开发方法。 代码实现 package.json {"name": "koapp","version": "1.0.0","main": "index.js","scripts": {&…...

kubernetes 集群 YAML 文件详解

Kubernetes 是一个开源的容器编排平台,用于自动化部署、扩展和管理容器化应用程序。在 Kubernetes 中,YAML 文件扮演着至关重要的角色,因为它们是用来定义资源对象(如 Pods、Deployments、Services 等)的配置文件。正确…...

【STM32G4xx的CAN驱动记录】

STM32G4xx的CAN驱动记录 CAN说明CAN的波特率计算数据测试总结 本文主要记录了基于STM32G4xx的CAN接口解析某型号雷达数据遇到的问题及规避方法,CAN总线波特率500Kbps,采样点要求80%附近。 注意CAN总线同步段的时间!!! …...

VSCode下EIDE插件开发STM32

VSCode下STM32开发环境搭建 本STM32教程使用vscode的EIDE插件的开发环境,完全免费,有管理代码文件的界面,不需要其它IDE。 视频教程见本人的 VSCodeEIDE开发STM32 安装EIDE插件 Embedded IDE 嵌入式IDE 这个插件可以帮我们管理代码文件&am…...

HTML之拜年/跨年APP(改进版)

目录: 一:目录 二:效果 三:页面分析/开发逻辑 1.页面详细分析: 2.开发逻辑: 四:完整代码(不多废话) index.html部分 app.json部分 二:效果 三:页面…...

解决 WSL 2 中 Ubuntu 22.04 安装 Docker 后无法启动的问题

问题场景 安装Docker后,执行sudo service docker start启动Docker,提示启动成功 rootDev:~# sudo service docker start * Starting Docker: docker [ OK ]执行su…...

Chrome 132 版本新特性

Chrome 132 版本新特性 一、Chrome 132 版本浏览器更新 1. 在 iOS 上使用 Google Lens 搜索 在 Chrome 132 版本中,开始在所有平台上推出这一功能。 1.1. 更新版本: Chrome 126 在 ChromeOS、Linux、Mac、Windows 上:在 1% 的稳定版用户…...

《贪心算法:原理剖析与典型例题精解》

必刷的贪心算法典型例题! 算法竞赛(蓝桥杯)贪心算法1——数塔问题-CSDN博客 算法竞赛(蓝桥杯)贪心算法2——需要安排几位师傅加工零件-CSDN博客 算法(蓝桥杯)贪心算法3——二维数组排序与贪心算…...

CSS笔记基础篇02——浮动、标准流、定位、CSS精灵、字体图标

黑马程序员视频地址: 前端Web开发HTML5CSS3移动web视频教程https://www.bilibili.com/video/BV1kM4y127Li?vd_source0a2d366696f87e241adc64419bf12cab&spm_id_from333.788.videopod.episodes&p70https://www.bilibili.com/video/BV1kM4y127Li?vd_source…...

Golang Gin系列-6:Gin 高级路由及URL参数

在本章中,我们将深入研究使用Gin框架的高级路由和URL参数。我们将介绍如何创建和使用路由组、应用中间件、提取路径参数、处理查询字符串、处理静态文件以及使用HTML模板。 路由分组 为什么要使用路由组? 使用路由组有助于保持代码结构整洁有序。当路由…...

重温STM32之环境安装

缩写 CMSIS:common microcontroller software interface standard 1,keil mdk安装 链接 Keil Product Downloads 安装好后,开始安装平台软件支持包(keil 5后不在默认支持所有的平台软件开发包,需要自行下载&#…...

web应用引入cookie机制的用途和cookie技术主要包括的内容

web应用引入cookie机制,用于用户跟踪。 (1)HTTP响应报文中的Cookie头行:set-Cookie (2)用户浏览器在本地存储、维护和管理的Cookie文件 (3)HTTP请求报文中的Cookie头行:…...

Visual Studio Code + Stm32 (IAR)

记录一下, 以前看别人在 vsc 下配置 stm32 工程非常麻烦。 最近,突然发现, iar 官方出了两个插件, iar build 、 iar C-Spy 安装之后,配置一下 iar 软件路径。 然后,直接打开工程目录,编译…...

小程序获取微信运动步数

1、用户点击按钮&#xff0c;在小程序中触发getuserinfo方法&#xff0c;获取用户信息 <scroll-view class"scrollarea" scroll-y type"list"><view class"container"><button bind:tap"getLogin">获取</button&…...