计算机网络(4)——网络层
1.概述
1.1 网络层服务
(1) 网络层为不同主机(Host)之间提供了一种逻辑通信机制
(2)每个主机和路由器都运行网络层协议
发送方:
将来自传输层的消息封装到数据报(datagram)中接收方:
向传输层交付数据段(segment)
1.2 网络层核心功能
路由选择(routing):
确定数据从源主机到目的主机经过的路径数据转发(forwarding):
将数据从输入端口转发到合适的输出端口
Question:路由器是如何确定数据的输出端口的?
Answer:在路由器内部通常会维护一张转发表,将数据的地址信息与转发表中的信息进行匹配,进而找到对应的输出端口
2.网络层服务模型
有连接服务(connection service)
- 首先为分组的传输确定从源主机到目的主机的传输路径(建立连接)
- 分组中的后续分片按照确定好的路径进行传输
- 分组中的每个分片的传输路径相同
- 传输结束后拆除连接
- 虚电路网络
无连接服务(connection-less service)
- 不事先为分组的传输确定的那个传输路径
- 分组中的每个分片都有独立的传输路径
- 数据报网络
-
注意1:
在计算机网络概述中提到,由路由器等设备组成的网络核心中依靠数据交换实现数据从源主机发送到目的主机,数据交换一共有电路交换、报文交换和分组交换三种方式。本文介绍的虚电路网络和数据报网络是两类经典的分组交换网络 -
注意2:
网络层的连接建立是两个主机之间的所有网络设备(如路由器)共同参与;传输层的连接建立对中间的网络设备透明
2.1 虚电路(virtual-circuit,VC)网络
2.1.1 概念
定义:
虚电路网络是一种面向连接的网络模式,在数据传输之前,需要在源节点和目标节点之间建立一条逻辑连接(称为虚电路VC)
特点:
- 面向连接:在数据传输之前,需要建立连接,数据传输完成后需要释放连接
- 固定路径:所有数据包沿着同一条路径传输,路径在连接建立时确定
- 有序到达:数据包按照发送的顺序到达目标节点
- 有状态:路径上的所有网络节点需要维护连接状态信息
2.1.2 具体实现
一条虚电路(VC)包括:
- 从源主机到目的主机路径上的所有网络设备
- 虚电路标识(VCID),虚电路中每段链路的一个编号
- 虚电路沿路的每个网络设备(如路由器),利用转发表记录经过的每条虚电路
在虚电路中的分组携带虚电路标识(VCID),而不是目的主机地址。在同一条VC上,每段链路上的VCID通常不同,路由器转发分组时依靠VC转发表改写/替换VCID
2.1.3 虚电路信令协议(Virtual Circuit Signaling Protocol)
虚电路信令协议(Virtual Circuit Signaling Protocol)是用于建立、维护和拆除虚电路的协议
(1)呼叫建立(Call Setup):
- 在数据传输之前,源节点向目标节点发送一个呼叫请求消息,用于建立虚电路。网络中的每个节点都会为这条虚电路分配一个唯一的标识符,称为虚电路标识符(VCID)
(2)连接确认(Connection Confirmation):
- 目标节点接收到呼叫请求后,如果同意建立连接,会发送一个确认消息给源节点。这个确认消息会沿着虚电路的路径反向传输,确保每个中间节点都准备好转发数据
(3)数据传输(Data Transfer):
- 一旦虚电路建立,数据就可以通过这条逻辑连接进行传输。每个数据包都携带虚电路标识符,路由器根据VCID进行转发,而不需要每次都进行路由查找
(4)连接释放(Connection Release):
- 数据传输完成后,源节点发送一个释放请求消息,用于拆除虚电路。网络中的每个节点(路由器)都会释放与这条虚电路相关的资源
2.2 数据报(datagram)网络
2.2.1 概念
定义:
数据报网络是一种无连接的网络模式,每个数据包(称为数据报)都独立传输,路径选择和转发决策在每个节点上独立进行
特点:
- 无连接:在数据传输之前,不需要建立连接。每个数据包独立路由
- 独立路由:每个数据包可能沿着不同的路径传输,路径选择基于当前网络状况
- 无序到达:由于每个数据包独立路由,数据包可能无序到达目标节点
- 无状态:网络节点不需要维护连接状态信息,简化了网络设计
2.2.2 转发表
IPv4地址是由32位的二进制数字表示,一共有2^32(大概43亿+)个IP地址。在转发表中,无法做到一个IP地址对应一个输出链路,往往是一段IP地址对应一个输出链路
Question:如果IP地址的划分不是连续性的会怎么样呢?
- 示例1:
与0号链路接口匹配,则转发到0号输出链路 - 示例2:
与1号链路和2号链路同时匹配,此时采用最长前缀匹配优先(在检索转发表时,优先选择与分组目的地址匹配前缀最长的入口)
策略,则优先转发到1号输出链路
举例说明:此时需要把某封信件发送到四川民族学院智能科学与技术学院某班某同学手中,上图的2号输出链路相当于能把该信件送到四川民族学院门口,上图的1号链路相当于能把该信件送到智能科学与技术学院楼下。虽然两个输出链路都不能精准送到某个同学手中,但是1号链路比2号链路精确,所以优先输出到1号链路
3.IPv4协议
3.1 IP数据报结构
(1)版本:指明协议的版本,IPv4就是4,IPv6就是6
(2)首部长度:单位是4字节,表示IP报头的长度范围是20~60字节
(3)8位区分服务:实际上只有4位TOS有效,分别是最小延时,最大吞吐量,最高可靠性,最小成本
(4)总长度:报头+数据部分。IP数据报最大长度为2^16字节,也就是64KB
(5)生存时间:单位是次数,防止数据在网络上无限转发,8个比特位表示IP数据报最多能在网络(路由器)上转发128次
由上图可知,从我这里到美国政府官网IP数据报也仅仅转发了18次,所以8位生存时间完全够用
(6)协议:表示在传输层使用什么协议,UDP还是TCP还是其他?
(7)校验和:只针对IP报头进行校验,因为IP载荷部分有UDP/TCP进行校验
(8)源地址:发送方的IP地址
(9)目的地址:接收方的IP地址
(10)可选字段:主要是拓展功能,最大长度是40字节
(11)填充:保证IP报头的长度是4的整数倍
Question:
16位标识,3位标志,13位片偏移分别有什么用?下面再说
3.2 IP分片
3.2.1 分片相关的字段
IP数据报最终会传递给数据链路层再封装,但是由于物理条件的影响,数据链路层的载荷最大能携带MTU字节(MTU表示最大传输单元,具体数值是多少和物理条件有关)
虽然IP数据报载荷最大能携带64KB的数据,但由于下层的限制,可以在网络层进行拆分,数据到达接收方的时候再组装。而拆分和组装的过程就需要用到标识,标志,片偏移这三个字段
(1)16位标识:唯一标识一个IP数据报。同一个数据报的标识是一样的,便于区分哪些分区属于同一个数据报
(2)3位标志:
1.第一位(保留位):
必须为0(暂时用不到这个保留位,所以先设为0,方便以后使用)2.第二位(DF):
如果为1,表示该数据报禁止分片。当IP载荷超过MTU时就会丢弃该数据报,并且返回ICMP错误信息给源主机(发送方)3.第三位(MF):
如果为1,表示该数据报不是最后一个分片;如果为0,表示是最后一个分片或者根本没有进行分片操作(3)13位片偏移: 指示当前分片在原数据报中的位置(以8字节为单位)
3.2.1 分片过程
- 假设IP分组总长度为
L
,待转发链路的MTU为M
- L > M,且DF = 0,表示可以分片
- 进行分片操作时,每个分片都需要复制原分组的16位标识位
- 一般来说,除了最后一个分片,其余分片的长度位
M
且是8
的整数倍,用公式表示: - 需要的总片数为:
- 每片的片偏移字段取值为:
- 每片的总长度字段为:
- 每片的MF标志位为:
3.3 IP地址
IPv4地址由4个8位二进制数组成,每个数的范围为0-255,通常以点分十进制的形式表示。用于标识接入网络中主机/路由器的接口
接口/interface:主机/路由器与物理链路的连接
- 实现了网络层功能
- 路由器一般有多个接口
- 主机一般只有1-2个接口(以太网接口和无线网/Wi-FI接口)
3.4 有类IP地址
IP地址 = 网络号 + 主机号
- 网络号(NetID) - 高位比特
- 主机号(HostID) - 低位比特
- A类地址:8位网络号 + 24位主机号(0.0.0.0 ~ 127.255.255.255),占所有IP地址的50%
- B类地址:16位网络号 + 16位主机号(128.0.0.0 ~ 191.255.255.255),占所有IP地址的25%
- C类地址:24位网络号 + 8位主机号(191.0.0.0 ~ 223.255.255.255),占所有IP地址的12.5%
- D类地址:不划分网络号和主机号(224.0.0.0 ~ 239.255.255.255),占所有IP地址的6.25%
- D类地址:不划分网络号和主机号(240.0.0.0 ~ 255.255.255.255),占所有IP地址的6.25%
特殊IP地址
NetID | HostID | 作为IP分组源地址 | 作为IP分组目的地址 | 用途 |
---|---|---|---|---|
全0 | 全0 | 可以 | 不可以 | 在本网范围内表示本主机 |
全0 | 特定值 | 不可以 | 可以 | 表示本网内的某个特定主机 |
全1 | 全1 | 不可以 | 可以 | 本网广播地址 |
特定值 | 全0 | 不可以 | 不可以 | 网络地址,表示一个网络 |
特定值 | 全1 | 不可以 | 可以 | 直接广播地址,对特定网络上的所有主机进行广播 |
127 | 非全0或非全1的任何数 | 可以 | 可以 | 用于本地软件环回测试,称为环回地址 |
3.5 IP子网与子网划分
IP子网:
- IP地址具有相同网络号的设备接口
- 子网中主机的接口可以物理连接而不用跨越路由器
- 主机号全为0
子网划分:
IP地址 = 网络号 + 子网号 + 主机号
- 网络号(NetID) - 高比特位
- 子网号(SubID) - 原主机号中的部分高位比特
- 主机号(HostID) - 低位比特
Question:
如何确定是否划分了子网?子网号有多少位? Answer:子网掩码 子网掩码(Subnet
Mask):用于划分IP地址中哪些是网络号,哪些是主机号的32位二进制数字
- 点分十进制表示
- 网络号、子网号全为1
- 主机号全为0
例如:A类地址的子网掩码是255.0.0.0;B类地址的子网掩码是255.255…0.0;C类地址的子网掩码是255.255.255.0
子网掩码的应用
- 将IP分组的目的IP地址与子网掩码按位与运算得到子网地址
例如:
目的IP地址:172.32.1.112,子网掩码:255.255.254.0
- 子网地址:172.32.0.0
- 地址范围:172.32.0.0 ~ 172.32.1.255
- 可使用地址范围:172.32.0.1 ~ 172.32.1.254
- 广播地址:172.32.1.255
4.域名系统
4.1 概念
上面已经介绍到IP地址是由32位二进制比特位组成,通常以点分十进制的形式表示,即4个0 ~ 255的十进制数。但是对于人来说,要想准确记忆一串数字是很难的,尤其是要记忆多个IP地址的时候,所以人们将IP地址转换为域名(如:www.example.com)来方便人们记忆
域名系统(Domain Name System,DNS)
是互联网的一项核心服务,它是一个将IP地址和域名相互映射的分布式层次式数据库,能够使人们更方便的访问互联网
Question:
为什么不使用集中式的DNS?
Answer:
- 单点失败问题
- 流量问题
- 距离问题
- 维护性问题
4.2 DNS层次结构
1.根DNS服务器(Root DNS Servers):
- 根DNS服务器是DNS层次结构的顶层,负责处理对顶级域(TLD)服务器的查询。当本地DNS服务器无法从缓存中找到域名解析结果时,它会首先向根DNS服务器发送查询请求
- 根DNS服务器不直接提供最终的IP地址,而是指示本地DNS服务器向相应的顶级域DNS服务器发送查询请求
2.顶级域DNS服务器(Top-Level Domain DNS Servers, TLD DNS Servers):
- TLD DNS服务器负责管理特定顶级域下的所有域名。例如,.com TLD DNS服务器负责管理所有以.com结尾的域名
- 当根DNS服务器指示本地DNS服务器向TLD DNS服务器发送查询请求时,TLD DNS服务器会进一步指示本地DNS服务器向权威DNS服务器发送查询请求
- 通用顶级域(gTLD):如.com、.org、.net、.edu等
- 国家/地区代码顶级域(ccTLD):如.cn(中国)、.us(美国)、.uk(英国)等
3.权威DNS服务器(Authoritative DNS Servers):
- 当TLD DNS服务器指示本地DNS服务器向权威DNS服务器发送查询请求时,权威DNS服务器会返回域名的最终IP地址
4.本地DNS服务器(Local DNS Servers):
- 本地DNS服务器负责接收用户的DNS查询请求,并代表用户进行递归/迭代查询
- 首先检查自己的缓存,如果找不到结果,则按照DNS层次结构依次向根DNS服务器、TLD DNS服务器和权威DNS服务器发送查询请求
- 不严格属于层次体系
- 本地DNS服务器充当用户和DNS层次结构之间的中介,提供缓存和加速查询的功能
4.3 DNS查询服务
场景假设:Cis.poly.edu的主机想获取gaia.cs.umass.edu的IP地址
迭代查询:
被查询服务器返回域名解析服务器的IP地址
- 1.主机向本地DNS服务器发送请求
- 2.本地DNS服务器检索缓存没有找到对应域名后向根DNS服务器发送请求
- 3.根DNS服务器返回管理
.edu
的顶级域DNS服务器的IP地址- 4.本地DNS服务器向管理
.edu
的顶级域DNS服务器发送请求- 5.顶级域DNS服务器返回对应的权威DNS服务器的IP地址
- 6.本地DNS服务器向权威DNS服务器发送请求
- 7.权威DNS服务器返回目标主机的IP地址
- 8.本地DNS服务器返回目标主机的IP地址
递归查询:
将域名解析的任务交给所联系的服务器
- 1.主机向本地DNS服务器发送请求
- 2.本地DNS服务器检索缓存没有找到对应域名后向根DNS服务器发送请求
- 3.根DNS服务器向管理
.edu
的顶级域DNS服务器发送请求- 4.顶级域DNS服务器向对应的权威DNS服务器发送请求
- 5.权威DNS服务器返回目标主机的IP地址
- 6.顶级域DNS服务器返回目标主机的IP地址
- 7.根DNS服务器返回目标主机的IP地址
- 8.本地DNS服务器返回目标主机的IP地址
4.4 DNS缓存
DNS缓存是指本地存储DNS查询的结果,以便在后续请求中快速响应,而无需再次查询DNS服务器。缓存可以发生在多个层级,包括:
- 1.浏览器缓存:浏览器会在本地存储最近访问过的域名及其对应的IP地址。
- 2.操作系统缓存:操作系统(如Windows的DNS客户端服务)也会缓存DNS查询结果。
- 3.路由器缓存:路由器可以缓存DNS查询结果,以便在局域网内快速响应。
- 4.ISP(互联网服务提供商)缓存:ISP的DNS服务器也会缓存查询结果,以减少对根DNS服务器的请求
5.CIDR与路由聚集
CIDR基本概念和表示法
无类域间路由(CIDR,Classless InterDomain
Routing)是一种用于IP地址分配和路由的机制,它取代了早期的基于类的IP地址分配,通过可变长子网掩码来分配IP地址
- 1.消除传统的A/B/C类地址界限:NetID + SubID ->Network Prefix(Prefix)可以任意长度
- 2.融合子网地址和子网掩码:a.b.c.d/x,其中x表示前缀Prefix长度
- 例如:子网地址:201.2.3.64,子网掩码:255.255.255.192 -> 201.2.3.64/26
CIDR的优势
- 1.提高IPv4地址空间分配效率:通过更细粒度的地址分配,减少了地址浪费
- 2.提高路由效率/简化路由表:将多个小的子网聚合成一个较大的子网
(路由聚合,route aggregation)
路由聚集:
指将多个路由合并为一个路由的过程,以减少路由表中条目的数量,从而提高路由的性能和效率
路由聚集的具体算法:
将几个子网前缀转换为二进制并比较,相同的部分不变,从不同的部分开始全部变成0,最后将二进制转换成十进制。例如:
- 子网①:11011111-00000001-000000
00-00000000
- 子网②:11011111-00000001-000000
10-00000000
- 子网③:11011111-00000001-000000
11-00000000
- 聚合后子网④:11011111-00000001-000000
00-00000000
(上面三个子网相同的部分是高22位比特,所以聚合后子网的网络前缀就是22,那么子网④的点分十进制形式:223.1.0.0/22
)
6.DHCP协议
Question:
一台主机如何获取IP地址? Answer:
- 静态配置
- 自动配置(使用DHCP协议)
6.1静态配置
需要手动配置的信息如下
- 1.本机IP地址
- 2.子网掩码
- 3.网关:你的主机连接的路由器的IP地址(一般是路由器的LAN口地址,LAN口连接本子网的主机,WAN口连接Internet)
- 4.首选DNS服务器和备用DNS服务器
6.2 自动配置
概念:
动态主机配置协议(Dynamic Host Configuration Protocol,DHCP)是一种用于自动为网络中的设备分配IP地址和网络配置参数的协议
工作原理:
DHCP采用客户端-服务器模型,使用UDP协议,客户端默认端口号68,服务器默认端口号67,工作过程分为四个步骤
- 1.客户端发送DHCP Discover(发现报文),寻找本网内可用DHCP服务器
- 2.DHCP服务器返回DHCP Offer(提供报文)响应,提供一个可用的IP地址及相关配置(如子网掩码、默认网关、DNS等)
- 3.客户端选择一个Offer,并广播DHCP Request(请求报文),正式请求该IP地址
- 4.服务器确认请求,发送DHCP Ack(确认报文),正式分配该IP地址。如果IP地址不可用(如已被占用),则返回DHCPNAK拒绝
7.NAT
概念:
NAT(Network Address Translation,网络地址转换)是一种在计算机网络中广泛使用的技术,主要用于缓解IPv4地址短缺的问题,同时提供一定的网络安全性。NAT技术允许一个子网/私网中的多台设备共享一个或多个公共IP地址,从而实现内部网络(私有网络)与外部网络(互联网)之间的通信。具体来说,NAT将内部网络中的私有IP地址转换为公共IP地址。公共IP地址必须是唯一存在的,但是不同私网中可以存在相同的私有IP地址
NAT地址转换
- 替换:利用路由器的WAN口IP地址+新端口号替换每个外出IP数据报的源IP地址+源端口号
- 记录:将每对WAN口IP地址+新端口号与源IP地址+源端口号的映射关系存储到
NAT转换表
中- 替换:检索NAT转换表,利用源IP地址+源端口号替换每个进入内网IP数据报的目的IP地址+目的端口号(即WAN口IP地址+新端口号)
8.ICMP协议
8.1 ICMP概念&类型
互联网控制消息协议(Internet Control Message Protocol,ICMP)主要在IP网络中传递控制协议,帮助实现网路诊断、错误报告和状态查询等功能。
ICMP报文主要分为两类:
差错报告报文
- 1.目的不可达:数据包无法到达目的主机(网络/主机/协议/端口不可达)
- 2.源抑制(Source Quench):通知发送方降低数据发送速率(现代网络较少使用)
- 3.超时:数据包的TTL(生存时间)减少为0时被丢弃
- 4.参数问题:IP数据包的首部字段有误、选项字段不正确等文体导致数据包无法正确解析或处理
- 5.重定向:路由器检测到数据包可以通过更优的路径到达目标时,路由器向源主机发送ICMP重定向报文,指示源主机使用更优的路由路径
网络探寻报文
- 1.回声请求与应答报文:通过发送回声请求报文并接收回声应答报文,可以测试源主机与目标主机之间的网络连通性和延迟
- 2.时间戳请求与应答报文:由源主机发送,请求目标主机或路由器返回当前时间,以获取网络设备之间的时间同步和延迟数据
几种不发送ICMP报文的特殊情况:
- 1.对ICMP差错报告报文不再发送ICMP差错报告报文
- 2.对于某分组,除了第一个分片,后续分片都不发送ICMP差错报告报文
- 3.对所有多播IP数据报都不发送ICMP差错报告报文
- 4.对具有特殊IP地址的数据报(如:127.0.0.1本机环回地址)不发送ICMP差错报告报文
8.2 ICMP报文结构
注意:校验和的计算包括整个ICMP报文
8.3 ICMP报文的封装
把需要进行差错报告的IP数据报的首部和前8个字节提取出来,作为ICMP报文的数据部分
如果该IP数据报使用的传输层协议是UDP,那么前8个字节就是UDP的首部
如果该IP数据报使用的传输层协议是TCP,那么前8个字节就是源端口号、目的端口号、序列号
8.4 ICMP的应用举例-Traceroute
在Windows系统的电脑上按住win + r
,再输入CMD
打开Windows的命令解释器,输入tracert + 目的IP地址
使用Traceroute应用对目的IP地址进行跟踪
(1)源主机向目的主机发送一系列UDP数据报
- 第①组数据报TTL设置为1
- 第②组数据报TTL设置为2
- 第n组数据报TTL设置为n
- 目的端口号为不可能使用的端口号
(2)当TTL = n的数据报达到第n和路由器时:
- 路由器丢弃该数据报
- 向源主机发送(type = 11,code = 0)ICMP报文
- ICMP报文携带当前路由器的IP地址
(3)当ICMP报文达到源主机时,记录RTT
注意:如果UDP数据报最终到达目的主机,则返回(type = 3,code =
3,目的端口不可达)ICMP报文,并且源主机停止发送UDP数据报
9.IPv6协议
IPv6是用于替代IPv4的下一代IP地址协议,核心目的是解决IPv4地址枯竭问题
9.1 IPv6报文格式
(1)版本号:固定为6
(2)优先级:类似于IPv4的TOS字段,用于QoS(Quality of service,服务质量)优先级控制
(3)流标签:标记同一数据流,路由器无需分用即可识别并保障QoS
(4)载荷长度:仅计算载荷长度(扩展首部 + 数据),不包含基本首部,最大值65535字节
(5)下一个首部:如果存在扩展首部,该字段指向扩展首部,扩展首部中的该字段同理;如果不存在扩展首部,则指向传输层(上层)协议首部
(6)跳步限制:类似于IPv4中的TTL,每经过一跳减1,归零时丢弃
(7)源地址/目的地址:发送方的IP地址和接收方的IP地址,最大能存在2 ^ 128个独立IP地址
注意:IPv6协议移除校验和,以减少每一跳的处理时间
9.2 IPv6地址
IPv6的基本地址类型有以下三种:
- 1.单播(unicast):点对点通信
- 2.多播(multicast):一对多通信,数据发送到一组计算机中的每一个(类似于广播)
- 3.任播(anycast);数据的终点是一组计算机,但只会交付给该组中的一个
IPv6地址的表示形式
- 1.冒号十六进制记法
例如:FF01:0:0:0:0:0:0:43(一般形式),可以将一连串的0使用一对冒号代替 -> FF01::43(压缩形式)- 2.因为16进制包含A~F字母,在URL中可能会造成歧义,所以使用[]来包裹IPv6地址
- 3.不再使用子网掩码,而是使用地址前缀的方式,如:FF01:0:0:0:0:0:0:43/64
9.3 IPv4 -> IPv6过渡
隧道(tunneling):IPv6数据报作为IPv4数据报的载荷进行封装,穿越IPv4网络
相关文章:

计算机网络(4)——网络层
1.概述 1.1 网络层服务 (1) 网络层为不同主机(Host)之间提供了一种逻辑通信机制 (2)每个主机和路由器都运行网络层协议 发送方:将来自传输层的消息封装到数据报(datagram)中接收方:向传输层交付数据段(segment) 1.2 网络层核心功能 路由选择(routing…...
java 多线程中的volatile关键字作用
文章目录 前置作用一:多线程下,保证可见性作用二:多线程下,禁止指令重排序 前置 保证可见性和保证没有指令重排导致的问题 但是不保证原子性 volatile 常常见到和 static 一起使用,因为 volatile 用在多线程中共享变…...

ESP32基础知识1:项目工程建立和烧录
ESP32基础知识1:项目工程建立和烧录 一、本文内容与前置知识点1. 本文内容2. 前置知识点 二、新建工程1. 工程配置2. 依照模板建立项目 三、硬件烧录1. 硬件准备2. 烧录器和ESP32连接3. 电脑端设置4. 烧录成功演示 四、参考文献 一、本文内容与前置知识点 1. 本文内…...

allWebPlugin中间件VLC专用版之录像功能介绍
背景 VLC控件原有接口是不支持录像的,且libVLC提供的接口库,不能获取录像文件完整名称(VLC-3.0.11 录制直播时有的无法保存视频的解决方法 - 1CM - 博客园);因此,非常的不友好。为了能够彻底解决这个问题&a…...

Vim 支持多种编程语言编辑器
软件简介 Vim是Vi编辑器的增强版,它提供了更多的功能和快捷键。Vim是一款自由软件,它是由Bram Moolenaar在1991年创建的。Vim支持多种编程语言,包括C、C、Java、Python、Perl等等。它是一款轻量级的编辑器,可以快速打开和编辑大型…...

解决 IDEA 在运行时中文乱码问题
直接说解决办法 编译 IDEA 所在目录的启动的 .vmoptions 文件,添加以下JVM 参数即可 -Dfile.encodingUTF-8如下图所示,Help > Edit Custom VM Options,随后在编辑框中添加-Dfile.encodingUTF-8 的 JVM 参数...

Diffusion Planner:扩散模型重塑自动驾驶路径规划(ICLR‘25)
1. 概述 2025年2月14日,清华大学AIR智能产业研究院联合毫末智行、中科院自动化所和香港中文大学团队,在ICLR 2025会议上发布了Diffusion Planner——一种创新性的基于Diffusion Transformer的自动驾驶规划模型架构。该系统联合建模周车运动预测与自车行…...

华为OD机试真题——阿里巴巴找黄金宝箱 IV(2025A卷:200分)Java/python/JavaScript/C++/C语言/GO六种最佳实现
2025 A卷 200分 题型 本文涵盖详细的问题分析、解题思路、代码实现、代码详解、测试用例以及综合分析; 并提供Java、python、JavaScript、C++、C语言、GO六种语言的最佳实现方式! 2025华为OD真题目录+全流程解析/备考攻略/经验分享 华为OD机试真题《阿里巴巴找黄金宝箱 IV》:…...

数据结构:时间复杂度(Time Complexity)和空间复杂度(Space Complexity)
目录 什么是时间复杂度? 如何表示时间复杂度? 为什么需要时间复杂度? 用几个例子理解 怎么分析代码的时间复杂度? 什么是空间复杂度? 举例理解 什么是时间复杂度? 时间复杂度是用来衡量一个算法“…...
CentOS7.9环境离线部署docker和docker-compose的两种方式
目 录 一、yum安装,使用rpm安装包和相关依赖 1.1 准备rpm安装包 1.2 将docker-23.0.4.tar.gz上传至/opt目录下 二、二进制文件方式安装 三、安装docker-compose 一、yum安装,使用rpm安装包和相关依赖 1.1 准备rpm安装包 1)在一台与…...
北京大学肖臻老师《区块链技术与应用》公开课:06-BTC-网络
文章目录 比特币工作在应用层,它的底层是一个P2P overlay Network...

SSL/TLS 协议详解:安全通信的基石
一、概述 SSL(Secure Sockets Layer) 及其继任者 TLS(Transport Layer Security) 是位于 传输层(TCP)与应用层之间 的加密协议,用于在网络通信中实现 机密性、身份认证和数据完整性。 核心目标…...

设计模式——外观设计模式(结构型)
摘要 本文介绍了外观设计模式,它是一种结构型设计模式,通过引入一个外观类来封装复杂子系统的调用细节,对外提供简单统一的接口。文中通过生活类比、关键角色介绍、使用场景分析以及结构说明等方面对这一模式进行了全面阐述,还涉…...

Linux `vi/vim` 编辑器深度解析与高阶应用指南
Linux `vi/vim` 编辑器深度解析与高阶应用指南 一、核心功能解析1. 模式系统2. 与主流编辑器对比二、核心操作体系1. 高效导航命令2. 文本操作矩阵三、高阶配置体系1. .vimrc 配置示例2. 插件管理系统四、企业级开发实践1. 代码编辑技巧2. 宏录制与批量处理五、可视化与多窗口1…...

ES中must与filter的区别
在 Elasticsearch 的布尔查询(bool query)中,must 和 filter 是两个核心子句,它们的核心区别在于 是否影响相关性评分,这直接决定了它们在查询性能、使用场景和结果排序上的差异。以下是详细对比: 一、核心…...

qt之开发大恒usb3.0相机三
上一篇大恒相机的开发 是基于Qt Creator msvc工具链编译的,大恒相机msvc使用的的lib库是c版的。如果想要使用mingw工具链开发大恒相机,那么找连接对相应的lib库。mingw对应的库是c的。 配置如下: 图像获取核心代码如下 void __stdcall Wid…...

Transformer架构详解:从Attention到ChatGPT
Transformer架构详解:从Attention到ChatGPT 系统化学习人工智能网站(收藏):https://www.captainbed.cn/flu 文章目录 Transformer架构详解:从Attention到ChatGPT摘要引言一、Attention机制:Transformer的…...

数据中台(大数据平台)之数据安全管理
数据安全管理是结合大数据技术和行业特性,数据中台产品应具备数据分类分级、敏感数据智能识别的功能,并结合敏感数据管理、数据脱敏、数据加密等安全管控方式,保障数据安全可用。 1.安全分级分类:数据分级分类是一种将不同数据按…...

github双重验证密码忘记或者获取不了了怎么办
背景 近期由于换了新手机,之前配置好的Authenticator这个App无法使用,导致获取不到二次验证的Authenticator code,登陆不上GitHub,不知道有没有人和我遇到同样的问题? 当我们配置2FA双重验证后,每次登陆gi…...

告别复杂操作!电脑极简风格计时使用
无论是工作、学习还是日常生活,这款小巧实用的计时工具都能成为你掌控时间的好帮手。特别适合需要频繁切换正计时、倒计时和查看当前时间的场景。界面简洁,操作便捷,助你高效管理每一刻。 这是一款免安装的工具,下载后可直接打开…...
stm32cube ide如何将工具链替换成arm-none-eabi-gcc
在 STM32Cube IDE 中替换工具链为GNU Arm Embedded Toolchain (arm-none-eabi-gcc),可按以下步骤操作: 1. 检查是否已安装工具链 首先确认系统中是否已安装 arm-none-eabi-gcc: Windows:检查环境变量 PATH 中是否包含工具链路径…...

[STM32问题解决(2)]STM32通过串口与PC通信,打开串口助手后无法在打开状态下下载程序和复位STM32
问题回顾 最近学习STM32单片机,经常使用STM32通过USART1串口与PC的串口助手进行通信。为了简单便捷,通常在打开串口的状态下下载程序。这样子下载程序后,STM32发出的信号,PC马上可以收到。 但是,突然出现了一个问题&a…...
RabbitMQ 与其他 MQ 的对比分析:Kafka/RocketMQ 选型指南(二)
四、三者性能大比拼 4.1 吞吐量 吞吐量是衡量消息队列处理能力的重要指标,它反映了在单位时间内消息队列能够处理的消息数量。在这方面,Kafka 表现最为出色,其独特的设计使其能够轻松处理每秒数百万条消息 。Kafka 采用分布式架构和分区机制…...

OpenHarmony定制系统组合按键(一)
一、开发环境 系统版本:OpenHarmony 4.0.10.13 设备平台:rk3568 SDK版本:fullSDK 4.0.10.13 DevEco Studio版本:4.1.0.400 二、需求背景 定制OpenHarmony 系统组合按键功能,例如仿Android Power VOL_Up组合键实现截…...
ORDER BY子句在一个 SQL 查询中只能出现一次
order by A.create_time,A.update_time desc和 order by A.create_time desc,A.update_time desc有区别吗? 关键区别 第一个排序中 create_time 是升序(默认是ASC),第二个是降序(DESC) 只有在 DESC 关键字紧跟在列名后面时,该列才会按降序排…...

Spring Boot 3 整合 MQ 构建聊天消息存储系统
引子 在构建实时聊天服务时,我们既要保证消息的即时传递,又需要对消息进行持久化存储以便查询历史记录。然而,直接同步写入数据库在高并发场景下容易成为性能瓶颈,影响消息的实时性。秉承"没有什么问题是加一层解决不了的&q…...
DeepSeek实战:打造智能数据分析与可视化系统
DeepSeek实战:打造智能数据分析与可视化系统 1. 数据智能时代:DeepSeek数据分析系统入门 在数据驱动的决策时代,智能数据分析系统正成为企业核心竞争力。本节将使用DeepSeek构建一个从数据清洗到可视化分析的全流程智能系统。 1.1 系统核心功能架构 class DataAnalysisS…...

非线性声学计算与强化学习融合框架:突破复杂环境人机交互的新技术
随着人工智能的快速发展,尤其是在深度学习和强化学习领域,声学计算和人机交互进入前所未有的扩展和创新阶段。尽管传统声学方法取得了显著成功,但这些线性或准线性方法在实际环境中往往存在关键的不足,尤其在动态、复杂或混响环境…...

C++ - STL #什么是STL #STL的版本 #闭源开源 #STL的六大组件
文章目录 前言 一、什么是STL 二、STL的版本 1、原始版本 2、P.J.版本 3、RW版本 4、SGI版本 三、闭源、开源 四、STL的六大组件 总结 前言 路漫漫其修远兮,吾将上下而求索; 一、什么是STL STL(standard template libaray 标准模板库)&#…...

Flutter - 原生交互 - 相机Camera - 01
环境 Flutter 3.29 macOS Sequoia 15.4.1 Xcode 16.3 集成 Flutter提供了camera插件来拍照和录视频,它提供了一系列可用的相机,并使用特定的相机展示相机预览、拍照、录视频。 添加依赖 camera: 提供使用设备相机模块的工具path_provider: 寻找存储图…...