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

【Linux网络与网络编程】10.网络层协议IP

前言

我们之前谈的主机B把数据传递给主机C过程都是黑盒式的,即并没有考虑它的中间过程。本篇博客和下一篇博客将要考虑的问题是:主机B和主机C并不是直接连接的,主机B想要把数据传输给主机C需要经过若干路由器的。我们就引出了两个问题:

1. 主机B凭什么把数据交给路由器F呢?

目标决定路径,这就需要网络通信的每一个主机都要有IP地址。本质就是路径的选择问题。

2. 数据是怎么从一个主机流转到另一台主机的呢?

同一子网内的主机是直接连接的,这也就转化成了局域网通信问题。

网络层所解决的问题就是问题1,数据链路层所解决的问题就是问题2。

于是乎,网络通信的本质就是由若干局域网通信所构成的广域网通信。

关于IP地址:

IP地址分为 IPv4 和 IPv6 。

IP 地址由网络号和主机号构成。

         • 网络号:保证相互连接的两个网段具有不同的标识

         • 主机号:同一网段内,主机之间具有相同的网络号,但是必须有不同的主机号

主机:配有 IP 地址,但是不进行路由控制的设备

路由器:配有 IP 地址,又能进行路由控制的设备

节点:主机和路由器的统称

1. IP协议格式图

在介绍IP协议格式图之前,我们先来回顾一个问题:

重谈TCP和IP

IP的核心作用是把数据包跨网络转发到目标主机,负责的是执行

TCP的核心人物是解决数据在网络传输中遇到的丢包等问题,负责的是策略

所以TCP+IP提供了把数据从A主机跨网络传输到B主机的能力,这解决的不就是远距离传输的核心问题吗?所以我们把所学的网络协议栈称为TCP/IP协议。

可以看出整体的格式和TCP协议很相似:固定大小的20字节的报头+选项+数据。

各部分的功能(整体认识,下文依次展开):

4 位版本号:指定 IP 协议的版本,对于 IPv4 来说就是 4

4 位首部长度:表面IP 头部有多少个 4 字节

8 位服务类型: 由 3 位优先权字段(已经弃用),4 位 TOS 字段和 1 位保留字段(必须置为 0)构成。4 位 TOS 分别表示:最小延时、最大吞吐量、最高可靠性和最小成本,这四者相互冲突,只能选择一个。对于 ssh/telnet 这样的应用程序,最小延时比较重要;对于 ftp 这样的程序,最大吞吐量比较重要

16 位总长度:IP 数据报整体占多少个字节

16 位标识:唯一的标识主机发送的报文。如果 IP 报文在数据链路层被分片了,那么每一个片里面的这个 id 都是相同的

3 位标志字段:第一位保留(保留的意思是现在不用,但是还没想好说不定以后要用到);第二位置为 1 表示禁止分片(如果报文长度超过 MTU,IP 模块就会丢弃报文);第三位表示更多分片(如果分片了的话,最后一个分片置为 0,其它是 1。 类 似于一个结束标记)

13 位分片偏移:分片相对于原始 IP 报文开始处的偏移。其实就是在表示当前分片在原报文中处在哪个位置,实际偏移的字节数是这个值 8 得到的。因此,除了最后一个报文之外,其它报文的长度必须是 8 的整数倍(否则报文就不连续了)

8 位生存时间:数据报到达目的地的最大报文跳数,一般是 64。 每次经过一个路由,TTL -= 1。如果减到 0 还没到达那么就丢弃了,这个字段主要是用来防止出现路由循环

8 位协议:表示上层协议的类型

16 位头部校验和:使用 CRC 进行校验鉴别头部是否损坏

32 位源地址和 32 位目标地址:表示发送端和接收端

选项字段:略

IP协议是如何解包,如何分用的?

首先读取固定的报头20字节,从而得到首部长度(基本单位为4字节),进而分离出报头+选项+报文。接下来就可以通过8位的协议字段区分上层的协议完成交付。

2. 网段划分

2.1 网段划分的意义

首先要明确一点:报文转发只有目的IP是不够的,还要有设计好的网络,这些网络主要是由三大运营商提前通过子网划分设计好的。

我们上面谈到过:在一个子网中的不同主机网络号是相同的,主机号是不同的,可以通过主机号来标识主机的唯一性。但是路由器往往是用来级联两个子网的,所以路由器有两个不同的IP地址。

子网内的IP地址是怎么来的?

路由器具备构建子网的能力,我们联网的本质就是向路由器申请一个IP地址。

路由器的IP地址是怎么来的?

路由器往往是第一个连上网络的主机,所以它的主机标识往往是固定的一号主机。

在进行路由时,若目的网络号与当前所处的网络号相同就会进行内网转发,否则就会默认的交给路由器进行转发。所以一个IP地址的具体转发过程就是:根据目标网络号,转发报文到目标网络,转发到目标网络之后将报文进行内网转发。(路由的基本单位是网络)

其实我们可以看出来,网段划分有一点向学校根据我们的学号锁定学院来进行查找指定的同学。而通过对子网进行划分,可以加快了筛选速度,提高了淘汰了,从而提高了查找效率

2.2 网段划分的方法

有一种技术叫做 DHCP ,能够自动的给子网内新增主机节点分配 IP 地址,避免了手动管理 IP 的不便。一般的路由器都带有 DHCP 功能,因此路由器也可以看做一个 DHCP 服务器。过去曾经提出一种划分网络号和主机号的方案,即把所有 IP 地址分为五类,如下图所示:

A 类:0.0.0.0 到 127.255.255.255

B 类:128.0.0.0 到 191.255.255.255

C 类:192.0.0.0 到 223.255.255.255

D 类:224.0.0.0 到 239.255.255.255

E 类:240.0.0.0 到 247.255.255.255

随着 Internet 的飞速发展,这种划分方案的局限性很快显现出来。大多数组织都申请 B 类网络地址,导致 B 类地址很快就分配完了,而 A 类却浪费了大量地址。

针对这种情况提出了新的划分方案,称为 CIDR 。通过引入一个额外的子网掩码(subnet mask)来区分网络号和主机号,子网掩码也是一个 32 位的正整数,通常用一串 "0" 来结尾,将 IP 地址和子网掩码进行 "按位与" 操作,得到的结果就是网络号。网络号和主机号的划分与这个 IP 地址是 A 类、B 类还是 C 类无关。

 

可见,IP 地址与子网掩码做与运算可以得到网络号,主机号从全 0 到全 1 就是子网的地址范围。IP 地址和子网掩码还有一种更简洁的表示方法,例如:140.252.20.68/24 表示 IP 地址为 140.252.20.68,子网掩码的高 24 位是 1,即 255.255.255.0

特殊的 IP 地址:

• 将 IP 地址中的主机地址全部设为 0,这就成为了网络号,用来代表这个局域网

• 将 IP 地址中的主机地址全部设为 1,这就成为了广播地址,用于给同一个链路中相互连接的所有主机发送数据包

• 127.* 的 IP 地址用于本机环回(loop back)测试,通常是 127.0.0.1 

IP 地址的数量限制

我们知道IP 地址(IPv4)是一个 4 字节 32 位的正整数。那么一共只有2^{32}(43 亿)个 IP 地址,而 TCP/IP 协议规定,每个主机都需要有一个 IP 地址。这意味着一共只有 43 亿台主机能接入网络么?

实际上,由于一些特殊的 IP 地址的存在,数量远不足 43 亿。IP 地址不非是按照主机台数来配置的,而是每一个网卡都需要配置一个或多个 IP 地址。CIDR 在一定程度上缓解了 IP 地址不够用的问题(提高了利用率,减少了浪费,但是 IP 地址的绝对上限并没有增加),但还是有些不够用,这时候有三种方式来解决:

动态分配 IP 地址:只给接入网络的设备分配 IP 地址。因此同一个 MAC 地址的设备,每次接入互联网中得到的 IP 地址不一定是相同的。

NAT 技术:后面会重点介绍

IPv6: IPv6 并不是 IPv4 的简单升级版,这是互不相干的两个协议,彼此并不兼容。IPv6用 16 字节 128 位来表示一个 IP 地址。目前 IPv6 还没有普及。

2.3 运营商与全球网络

2.3.1 私有 IP 地址和公网 IP 地址

如果一个组织内部组建局域网,IP 地址用于局域网内的通信而不直接连到 Internet 上的话,理论上使用任意的 IP 地址都可以,但是 RFC 1918 规定了用于组建局域网的私有 IP 地址: 

10.* :前 8 位是网络号,共 16777216 个地址

172.16.*到 172.31.*:前 12 位是网络号,共 1048576 个地址

192.168.* :前 16 位是网络号,共 65536 个地址

包含在上述范围内的IP都成为私有 IP,其余的则称为公网IP

私有IP只能用来组建局域网,是绝对不能出现在公网中的!对于不同的子网,IP是可以重复的。

网络在架设的时候,在内网和公网统一采用了用各自的子网掩码的方式来进行网络构建。

2.3.2 运营商

在家庭中的路由器就有构建子网的能力,这一在局域网中构建子网的工作运营商也在做!对于我们申请的IP,无论是公网 IP 还是私有 IP ,网络的建设工作都是由运营商来做的!

对于路由器,可以分为家用路由器和企业路由器。一般来说,路由器在私网中的 IP 地址往往是xxx.xxx.xxx.1。以家用路由器为例,它还是运营商所构建的子网中一台主机,所以路由器至少会级联两个网络,有两个不同的IP地址。我们把家用子网路由器对应的 IP 称为LAN口 IP ,把运营商构建的子网对应的IP称为WAN口 IP 。 

换句话说,从家用路由器中出去的报文没有直接到达公网,而是必须要先到达由运营商所构建的更大的子网中。

为什么要给运营商交钱?

我们的报文必须要经过运营商构建的子网的路由器才能到达公网。运营商可以因为你欠费而不对你的报文进行转发;运营商也可以对你访问的非法目标地址而进行拦截,这其实也说明了想要使用魔法就要骗过运营商。

由私网IP请求一个目的IP会根据相应的路由算法进行转发,但是怎么从相应的目标IP向我们的私有IP发回请求呢?

子网内的主机需要和外网进行通信时,路由器将 IP 首部中的 IP 地址进行替换 (替换成 WAN 口 IP),这样逐级替换,最终数据包中的 IP 地址成为一个公网 IP。这种技术称为 NAT (Network Address Translation,网络地址转换),后续的博客会详细介绍。

上面我们提到NAT技术可以缓解IP地址不足的问题,这是问什么呢?

因为NAT技术单独的切分出来一部分IP用做内网,这样大大的提高了IP地址的的复用率。

2.3.3 全球网络

全球网络实际上就是以国家、地区、组织等为单位对全球的公网IP进行划分的过程。

下图就是各个国家的IP数量:

接下来我们通过下面的一个demo样例来帮助大家理解:

 

上面的这个图其实就能够帮助大家进行理解网络转发的过程了,也能理解为什么现实中除了广域网和局域网,还存在城域网的概念。

网段划分的直接体现就是把IP地址的若干位充当了子网的入口地址,把配置信息体现在路由器当中,全球当中都以这种方式进行就可以在全球范围内进行网段划分。所以,网段划分不仅仅是要把IP地址划分好,还要把划分好的网段在所在地区、国家、组织进行落实,并配置到对应的路由器当中,全球所有的路由器共同构成了网段划分的结果。

3. 路由

其实只要把网络的基础设施建设好,路由的工作几乎解决了。所谓路由,就是在复杂的网络结构中找出一条通往终点的路线。下图就可以看出可以看出路由的基本单位是子网。

路由的过程,就是上图这样这样一跳一跳 "问路" 的过程。所谓 "一跳" 就是数据链路层中的一个区间,具体在以太网中指从源 MAC 地址到目的 MAC 地址之间的帧传输区间。

IP 数据包的传输过程也和问路一样。当 IP 数据包到达路由器时,路由器会先查看目的 IP 。根据目的IP,路由器决定这个数据包是直接发送给目标主机还是需要发送给下一个路由器。依次反复,一直到达目标 IP 地址。

那么如何判定当前这个数据包该发送到哪里呢? 这个就依靠每个节点内部维护一个路由表。路由表可以使用 route 命令查看,如果目的 IP 命中了路由表就直接转发即可。路由表中的最后一行主要由下一跳地址和发送接口两部分组成,当目的地址与路由表中其它行都不匹配时,就按缺省路由条目规定的接口发送到下一跳地址。

[caryon@ALiClode ~]$ route
Kernel IP routing table
Destination     Gateway         Genmask         Flags Metric Ref    Use Iface
default         gateway         0.0.0.0         UG    0      0        0 eth0
link-local      0.0.0.0         255.255.0.0     U     1002   0        0 eth0
172.24.112.0    0.0.0.0         255.255.240.0   U     0      0        0 eth0

路由表的 Destination 是目的网络地址,Genmask 是子网掩码,Gateway 是下一跳地址,Iface 是发送接口,Flags 中的 U 标志表示此条目有效(可以禁用某些条目)、G 标志表示此条目的下一跳地址是某个路由器的地址,没有 G 标志的条目表示目的网络地址是与本机接口直接相连的网络,不必经路由器转发。

4. 分片与组装

之前我们在谈论TCP协议时曾提出过一个问题:为什么不把滑动窗口中的数据整体打包成一个报文进行转发,而是分成了一个一个的数据段进行转发呢?而实际上在IP协议中,过长的报文也会进行分片处理,这是为什么呢?

这是因为数据链路层规定单次发送的数据帧的有效载荷不能超过mtu(1500)。

 

 

于是乎就产生了网络层的分片与组装。

首先我们来分析一下分片和组装的行为好吗?

首先,传输层并不关心分片和组装的细节,但是分片会使丢包的概率大大的增加了。所以分片的报文不能作为网络传输的主流情况,应当尽可能的让传输层不要发送太大的报文,这也就解释了为什么TCP协议会使用滑动窗口将数据分成一块一块的。

4.1 分片的过程

检查 MTU 限制:

当一个 IP 数据报的大小超过了网络的 MTU(最大传输单元)限制时,就需要进行分片

分割数据报:

IP 层将原始的 IP 数据报分割成多个较小的片段,对于每个片段,IP 层会设置相应的标识(Identification)、偏移量 (Fragment Offset)和标志位(Flags)等字段。标识字段用于标识属于同一个数据报的不同分片,确保所有分片能够被正确地重新组装。偏移量字段指示了当前分片相对于原始数据报的起始位置,以 8 字节为单位。标志位字段包含了 3 位,其中 MF(More Fragment)位用于指示是否还有更多的分片,DF(Do Not Fragment)位用于指示数据报是否允许进行分片

添加 IP 头部:

每个分片都会加上自己的 IP 头部,与完整 IP 报文拥有类似的 IP 头结构,但 MF 和 Fragment Offset 等字段的值会有所不同

发送分片:

分片在传输过程中独立传输,每个分片都有自己的 IP 头部,并且各自独立地选择路由。 

4.2 组装的过程 

接收分片:

当目的主机的 IP 层接收到这些分片后,会根据标识字段将属于同一个数据报的所有分片挑选出来。

排序与组装:

利用片偏移字段,IP 层会对属于同一个数据报的分片进行排序。当所有的分片都到达并正确排序后,IP 层会将这些分片重新组装成一个完整的 IP 数据报。

传递给上层协议:

将组装好的 IP 数据报会传递给上层的协议进行处理。

相关文章:

【Linux网络与网络编程】10.网络层协议IP

前言 我们之前谈的主机B把数据传递给主机C过程都是黑盒式的,即并没有考虑它的中间过程。本篇博客和下一篇博客将要考虑的问题是:主机B和主机C并不是直接连接的,主机B想要把数据传输给主机C需要经过若干路由器的。我们就引出了两个问题&#x…...

Docker 搭建 RabbitMQ

Docker 搭建 RabbitMQ 前言一、准备工作二、设置目录结构三、编写启动脚本四、Host 网络模式 vs Port 映射模式1. Host 网络模式2. Port 映射模式 五、端口配置对比六、配置示例七、查看与管理八、扩展与高可用九、常用命令 前言 在现代微服务与分布式架构中,Rabbi…...

浏览器自动化检测对抗:修改navigator.webdriver属性的底层实现

一、背景介绍:你被自动化检测拒之门外了吗? 在使用 Selenium 或 Playwright 等浏览器自动化工具爬取数据时,经常会遇到「被检测」问题,尤其像 Amazon 这样反爬策略严密的网站。常见的检测机制之一就是检查 JavaScript 中的 navig…...

聊聊Spring AI Alibaba的DocumentParser

序 本文主要研究一下Spring AI Alibaba的DocumentParser DocumentParser spring-ai-alibaba-core/src/main/java/com/alibaba/cloud/ai/document/DocumentParser.java public interface DocumentParser {/*** Parses a given {link InputStream} into a {link Document}. T…...

用css给div列表加个序号

用 CSS 的 counter 相关属性来为列表添加序号。以下是具体的代码,我将以 HTML 文件的形式提供,并且会运行展示效果: .as-div {// counter-reset: my-counter; /* 计数器名称是my-counter */// counter-reset: small-apple; /* 计数器名称是s…...

CSS标签选择器与类选择器

CSS标签选择器 标签选择器(元素选择器)是最基本的选择器之一,用于选择HTML文档中的特定标签元素并应用样式。它使用HTML标签名称作为选择器,选择匹配该标签的所有元素。 作用:通过HTML标签名选择元素 以下是CSS标签选…...

(51单片机)LCD显示日期时间时钟(DS1302时钟模块教学)(LCD1602教程)

目录 源代码 main.c LCD1602.c LCD1602.h DS1302.c DS1302.h 代码解析与教程: LCD1602模块 DS1302模块 效果视频: 源代码 如上图将5个文放在Keli5 中即可,然后烧录在单片机中就行了 烧录软件用的是STC-ISP,不知道怎么安装的…...

编译原理(自考13007)

资源内容 大纲 概述...

C#Winform程序将子窗体嵌入容器方法

private void OpenForm(Form childFrom) { //首先判断容器中是否有其他的窗体 foreach (Control item in this.panelRight.Controls) { if (item is Form) { ((Form)item).Close(); } } //嵌入新的窗体 childFrom.TopLevel false;//将子窗体设置成非顶级控件 childFrom.Parent…...

WPS JS宏编程教程(从基础到进阶)-- 第八部分:字符串技术与WPS结合应用

目录 第8章 字符串技术与WPS结合应用8-1 字符串的3种引用方式场景:动态生成报表标题三种引用方式对比代码解析表模板字符串核心优势8-2 字符串处理之切片与搜索场景:提取身份证中的出生年份三大截取方法对比方法选择指南索引搜索实战8-3 字符串处理之修改与填充场景:规范商品…...

WPS Office安卓版文档编辑功能与兼容性评测【高效编辑】

一、界面设计与操作体验 WPS Office安卓版采用简洁直观的界面设计,首页默认展示近期文档列表,支持一键新建文档、表格或演示文稿。整体操作逻辑与PC端保持一致,新用户也能快速上手。编辑工具栏设计合理,常用功能如字体设置、段落…...

【经验记录贴】使用配置文件提高项目的可维护性

mark一下。 整体修改前后如下: 课题: 在项目中有一个支持的文件类型的FILE_TYPE的定义, 这个是写死在主程序中,每次增加可以支持的文件类型的时候,都需要去修改主程序中这个FILGE_TYPE的定义。 主程序修改其实不太花时…...

传统建筑管理人力成本高,楼宇自控系统如何有效降低运营成本

在传统建筑管理模式下,人力成本一直居高不下,成为建筑运营方沉重的负担。从设备的日常巡检、维护,到环境的调控以及能源的管理,无一不需要大量人力投入。然而,随着科技的飞速发展,楼宇自控系统应运而生&…...

RabbitMQ demo案例

1. 下载和安装 RabbitMQ RabbitMQ 依赖 Erlang 运行时,所以得先装 Erlang,再装 RabbitMQ。下面以 Ubuntu 为例,Windows 和 macOS 也顺便提一下。 1.1 安装 Erlang RabbitMQ 需要 Erlang 支持,先装它。 Windows: 去 Erl…...

第T8周:猫狗识别

🍨 本文为🔗365天深度学习训练营 中的学习记录博客🍖 原作者:K同学啊 第T8周:猫狗识别 tf.config.list_physical_devices(“GPU”),用于检测当前系统是否有可用的 GPU,并将结果存入 gpus 变量。…...

旅游特种兵迪士尼大作战:DeepSeek高精准路径优化

DeepSeek大模型高性能核心技术与多模态融合开发 - 商品搜索 - 京东 随着假期的脚步日渐临近,环球影城等备受瞩目的主题游乐场,已然成为大人与孩子们心中不可或缺的节日狂欢圣地。然而,随之而来的庞大客流,却总让无数游客在欢乐的…...

ffmpeg-将多个视频去掉音频 然后切片组合成一个视频,再将新视频配置上新的音频

需求分解 1、去除原视频的音频轨道。 2、对去掉音频的视频进行切片。 3、将多个视频切片合并为一个新视频。 4、给新的视频添加新的音频轨道。 去除视频音频 要去除视频中的音频,只需使用以下命令 ffmpeg -i input1.mp4 -an -c:v copy output1_no_audio.mp4解释&a…...

05-微服务可观测性体系建设:从日志、监控到链路追踪实战指南

微服务可观测性体系建设:从日志、监控到链路追踪实战指南 一、可观测性:微服务架构的 “神经系统” 1.1 为什么需要可观测性? 在分布式微服务架构中,服务节点可能达数百个,请求链路跨越多服务、数据库、消息队列&am…...

音视频小白系统入门笔记-0

本系列笔记为博主学习李超老师课程的课堂笔记&#xff0c;仅供参阅 音视频小白系统入门课 音视频基础ffmpeg原理 绪论 ffmpeg推流 ffplay/vlc拉流 使用rtmp协议 ffmpeg -i <source_path> -f flv rtmp://<rtmp_server_path> 为什么会推流失败&#xff1f; 默认…...

基于 PyTorch 的 LSTM 实现降雨量预测

基于 PyTorch 的 LSTM 实现降雨量预测示例。包括数据准备、模型定义、训练和预测等。 文章目录 1. 数据准备:2. 模型定义:3. 训练过程:4. 预测和评估:5. 可视化:代码实现1. 数据准备: 使用随机生成的数据作为示例,实际应用中请替换为真实数据。数据被归一化到 [0, 1] 范…...

Spring-Bean的生命周期

一、什么是Bean生命周期&#xff1f; Spring容器中的Bean从创建到销毁的完整过程被称为Bean生命周期&#xff0c;包含实例化→属性注入→初始化→使用→销毁五个核心阶段。Spring提供了丰富的扩展点&#xff0c;允许开发者在各阶段插入自定义逻辑。 二、Bean生命周期全流程&am…...

AI大模型如何重塑科研范式:从“假说驱动”到“数据涌现”

📝个人主页🌹:慌ZHANG-CSDN博客 🌹🌹期待您的关注 🌹🌹 一、引言:科研进入“模型共研”时代 传统科研范式通常以“假设→实验→验证→理论”的方式推进,这一经典路径建立在人类的认知能力与逻辑推理基础上。然而,随着数据规模的爆炸式增长与知识系统的高度复杂…...

yml文件上传并映射到实体类

文章目录 功能背景功能需要前端开发组件选用组件嵌套和参数绑定上传逻辑示例 后端开发接收逻辑解析逻辑省流纯手动实现&#xff08;不建议&#xff09; 功能背景 开发一个配置文件解析功能&#xff0c;需要兼容老版本的配置文件。 功能需要 前端&#xff1a;两个配置文件分别…...

What are the advantages of our neural network inference framework?

What are the advantages of our neural network inference framework? 1. Background2. What are the advantages of our neural network inference framework?References 1. Background Let me introduce /ˌɪntrəˈdjuːs/ the background /ˈbkɡraʊnd/ first. Today…...

猿辅导集团推首个教育AI范式小猿AI 聚焦家校应用场景发布3款新品

近两年&#xff0c;通用大模型呈爆发式发展&#xff0c;垂类AI遭遇“技术平替”危机。 4月15日&#xff0c;猿辅导集团在“小猿AI暨智能硬件战略发布会”上&#xff0c;正式推出首个教育AI范式——“小猿AI”&#xff0c;并发布覆盖家校两端的“软件应用智能终端通识课程”三位…...

10【模块学习】LCD1602(二):6路温度显示+实时时钟

项目&#xff1a;6路温度显示实时时钟 1、6路温度显示①TempMenu.c文件的代码②TempMenu.h文件的代码③main.c文件的代码④Timer.c文件的代码⑤Delay.c文件的代码⑥Key.c文件的代码 2、实时时钟显示①BeiJingTime.c文件的代码②BeiJingTime.h文件的代码③main.c文件的代码如下④…...

Embedding在RAG中的核心作用及其几何类比-来自DeepSeek

1. 核心概念映射 Embedding的本质&#xff1a;将文本、图像等非结构化数据转化为高维空间中的坐标点&#xff08;向量&#xff09;&#xff0c;例如&#xff1a; 句子A → 向量 [0.2, -1.5, 3.0, ..., 0.7]&#xff08;假设维度为768&#xff09; 句子B → 向量 [0.3, -1.4, 2…...

前端快速入门——JavaScript函数、DOM

1.JavaScript函数 函数是一段可重复使用的代码块&#xff0c;它接受输入(参数)、执行特定任务&#xff0c;并返回输出。 <scricpt>function add(a,b){return ab;}let cadd(5,10);console.log(c); </script>2.JavaScript事件 JavaScript绑定事件的方法&#xff1…...

AOSP14 Launcher3——最近任务TaskViewSimulator详解

前言&#xff1a;TaskViewSimulator 这个类在最近任务中起到了一个非常重要的作用。 从字面意思上理解&#xff0c;这个单词是由TaskViewSimulator组合而来&#xff0c;字面意思就是TaskView的模拟器&#xff0c;顾名思义&#xff0c;就是一个用来模拟TaskView的类。 为什么要模…...

层次式架构核心:中间层的功能、优势与技术选型全解析

层次式架构中的中间层是整个架构的核心枢纽&#xff0c;承担着多种重要职责&#xff0c;在功能实现、优势体现以及技术选型等方面都有丰富的内容&#xff0c;以下为你详细介绍&#xff1a; 一、功能 1.业务逻辑处理 复杂规则运算&#xff1a;在许多企业级应用中&#xff0c;…...

MySQL主从同步原理及面试回答

1. 什么是主从结构 主从复制、读写分离&#xff08;分库&#xff09;解决的是访问的压力 2. Mysql主从复制的原理 Mysql主从复制的核心是binlog日志文件&#xff08;二进制日志文件&#xff09; 二进制日志&#xff08;BINLOG&#xff09;记录了所有的 DDL&#xff08;数据定…...

利用quartus的DDS函数信号发生器设计

一、功能要求 采用数字频率合成&#xff08;Direct Digital FrequencySynthesis&#xff0c;简称DDS&#xff09;设计制作一个波形发生器&#xff0c;仿真后&#xff0c;在DE2-115开发板上实践。 要求&#xff1a; 1、利用DDS技术合成正弦波和方波&#xff1b; 2、输出信号的…...

2.1 腾讯校招通关指南-算法与数据结构

2.1腾讯校招算法与数据结构通关攻略&#xff1a;高频题型真题拆解实战技巧 在腾讯技术岗面试中&#xff0c;算法与数据结构是占比30%的核心考核项&#xff0c;直接决定了面试通过率的「生死线」。本文结合腾讯近三年校招真题&#xff0c;拆解4大高频题型的解题套路、专项训练方…...

数据一致性的守护神:深入Spring声明式事务管理 (@Transactional)

在前面几篇文章中&#xff0c;我们一路打怪升级&#xff0c;掌握了Spring IoC/DI、Bean管理、AOP&#xff0c;并用JdbcTemplate和Spring Data JPA简化了数据库访问。我们的代码越来越简洁、高效。但想象一下这个场景&#xff1a; 用户A向用户B转账100元。这至少需要两个数据库…...

神经网络复习

1 机器学习 1.1 定义 机器学习是人工智能的一个分支领域&#xff0c;它致力于让计算机系统能够自动从数据中学习规律&#xff0c;并利用这些规律对新的数据进行预测或决策&#xff0c;而无需显式地编写针对特定任务的规则。 1.2 分类 全监督学习 全监督学习是指在训练模型时…...

从代码学习深度学习 - 自注意力和位置编码 PyTorch 版

这里写自定义目录标题 前言一、自注意力:Transformer 的核心1.1 多头注意力机制的实现1.2 缩放点积注意力1.3 掩码和序列处理1.4 自注意力示例二、位置编码:为序列添加位置信息2.1 位置编码的实现2.2 可视化位置编码总结前言 深度学习近年来在自然语言处理、计算机视觉等领域…...

Web前端开发——图像与多媒体文件(上)

学习目标&#xff1a; 优秀的商业网站往往通过为页面添加大量的图像、声音、视频、动画等多媒体信息来丰富网站的内容&#xff0c;吸引更多网络访问者的关注。目前大型商业网站非常注重对Web前端开发技术的研究&#xff0c;通过组合各类前端开发技术来改善用户体验和增加用户互…...

C#核心学习(三)常见的泛型数据结构类(1)List和Dictionary

前面我们刚刚学习了&#xff0c;什么是泛型。今天我们就来看看C#中有哪些&#xff0c;常见的泛型数据结构&#xff0c;今天要介绍的是List,和Dictionary。 引言 在C#编程中&#xff0c;泛型集合是高效管理数据的核心工具。List<T>和Dictionary<TKey, TValue>作为两…...

运行时数据区

运行时数据区 Java 虚拟机在运行 Java 程序过程中管理的内存区域称之为运行时数据区&#xff0c;运行时数据区负责管理 JVM 使用到的内存&#xff0c;例如创建对象和销毁对象。 程序计数器 程序计数器又叫 PC 寄存器&#xff0c;每个线程都会通过程序计数器记录当前要执行的字…...

union all 关联查询

UNION ALL 并非用于表的关联查询&#xff0c;而是用于将多个 SELECT 语句的结果集合并成一个结果集。它会保留所有重复的行&#xff0c;不像 UNION 会去除重复行。下面为你提供几种使用 UNION ALL 的场景示例。 示例表结构 假设存在两个表 sales_2024 和 sales_2025&#xff…...

npm ERR! vue-admin-beautiful@1.0.0 dev: `vue-cli-service serve` 问题解决

笔者在跑实习公司的前端时&#xff0c;老是报这个错&#xff0c;并且网上(csdn)并没有好的解决方法&#xff0c;于是这篇文章就诞生了。[吐槽一下]&#xff1a;小公司的实习生干的活是真的多啊。。。 解决方案 依赖有些包装不上&#xff0c;换个源就行了&#xff0c;这里采用…...

玩转Docker | 使用Docker部署Xnote笔记工具

玩转Docker | 使用Docker部署Xnote笔记工具 前言一、Xnote介绍Xnote简介1.2 Xnote特点二、系统要求环境要求环境检查Docker版本检查检查操作系统版本三、部署Xnote服务下载镜像编辑配置文件编辑部署文件创建容器检查容器状态检查服务端口安全设置四、访问Xnote服务访问Xnote首页…...

TDengine 与其他时序数据库对比:InfluxDB/TimescaleDB 选型指南(二)

四、应用场景分析 &#xff08;一&#xff09;TDengine 适用场景 TDengine 适用于对写入性能和存储效率要求极高的物联网设备数据采集场景。在一个拥有数百万个传感器的智能工厂中&#xff0c;每个传感器每秒都会产生多条数据&#xff0c;TDengine 能够高效地处理这些高并发的…...

ARM Cortex汇编宏定义

在ARM架构(尤其是Cortex-M系列MCU)的汇编中,**宏定义(Macro)**用于复用代码片段,支持参数化编程,简化重复逻辑(如寄存器操作、循环、条件判断等)。以下是ARM汇编宏定义的核心语法、用法及示例: 一、宏定义的基本语法 使用 MACRO 和 MEND 伪指令包裹宏体,通过 参数…...

【含文档+PPT+源码】基于Python心理健康管理系统

项目视频介绍&#xff1a; 毕业作品心理健康管理系统 课程简介&#xff1a; 本课程演示的是一款基于Python心理健康管理系统&#xff0c;主要针对计算机相关专业的正在做毕设的学生与需要项目实战练习的 Python学习者。 1.包含&#xff1a;项目源码、项目文档、数据库脚本、软…...

Dockerfile项目实战-单阶段构建Vue2项目

单阶段构建镜像-Vue2项目 1 项目层级目录 以下是项目的基本目录结构&#xff1a; 2 Node版本 博主的Windows电脑安装了v14.18.3的node.js版本&#xff0c;所以直接使用本机电脑生成项目&#xff0c;然后拷到了 Centos 7 里面 # 查看本机node版本 node -v3 创建Vue2项目 …...

大数据驱动的供应链透明化:从数据孤岛到智能协同

大数据驱动的供应链透明化:从数据孤岛到智能协同 在全球化供应链环境下,透明化不仅是一种企业责任,更是提高效率、降低成本和增强供应链韧性的关键举措。然而,传统供应链体系因数据孤岛、信息滞后、信任缺失等问题,常常导致生产过剩、库存积压、资源浪费,甚至供应链断裂…...

第四篇:[特殊字符] 深入理解MyBatis[特殊字符] 掌握MyBatis Generator ——入门与实战

引言 什么是 MyBatis Generator&#xff1f; MyBatis Generator (MBG) 是一个代码生成工具&#xff0c;专为 MyBatis 框架设计。它可以根据数据库表结构自动生成 Java 实体类、Mapper 接口、Mapper XML 文件以及 Example 类。通过使用 MBG&#xff0c;开发者可以显著减少编写…...

LeetCode算法题(Go语言实现)_48

题目 在给定的 m x n 网格 grid 中&#xff0c;每个单元格可以有以下三个值之一&#xff1a; 值 0 代表空单元格&#xff1b; 值 1 代表新鲜橘子&#xff1b; 值 2 代表腐烂的橘子。 每分钟&#xff0c;腐烂的橘子 周围 4 个方向上相邻 的新鲜橘子都会腐烂。 返回 直到单元格中…...

ESP-ADF外设子系统深度解析:esp_peripherals组件架构与核心设计(核心API详解之单个外设管理)

目录 单个外设管理APIesp_periph_createesp_periph_set_functionesp_periph_startesp_periph_stopesp_periph_set_dataesp_periph_get_dataesp_periph_get_stateesp_periph_get_idesp_periph_set_idesp_periph_initesp_periph_runesp_periph_destroy 单个外设管理API esp_peri…...