【计算机网络】网络IP层
📚 博主的专栏
🐧 Linux | 🖥️ C++ | 📊 数据结构 | 💡C++ 算法 | 🅒 C 语言 | 🌐 计算机网络
上篇文章:传输层协议TCP
下篇文章:数据链路层
文章摘要:本文系统解析IP网络层的核心概念与技术,涵盖公网与私有IP的区别、IP协议的功能及报文结构,详解子网划分原理与CIDR技术如何优化地址分配。探讨路由机制中NAT技术如何实现内外网通信,以及IPv6对物联网与地址短缺问题的解决意义。同时分析IP分片与组装的实现逻辑、MTU限制及避免分片的策略,并结合实例说明路由表匹配与数据包转发流程。通过理解运营商网络架构与公网IP分配逻辑,揭示互联网高效运行的基础,为网络设计与故障排查提供全面参考。
目录
网络层
IP协议
协议头格式
1.如何将报头和有效载荷分离?
2.如何分用
字段含义
网段划分(重要)
为什么要进行网段划分
网段划分的主要目的是提高网络效率、增强安全性、简化管理。
特殊的 IP 地址
IP 地址的数量限制
私有 IP 地址和公网 IP 地址
我们的网络世界 = 内网 + 公网构成
任何主机,都有能力知道和自己直连的网络号是多少。
真实情况下的请求步骤:将报文从内网转到公网
公网IP
各国IP地址段示例
路由
IP 数据包的传输过程也和问路一样.
那么如何判定当前这个数据包该发送到哪里呢?
这个就依靠每个节点内部维护一个路由表;
理解IP分片和组装的字段
为什么网络层会分片、不想分片、如何做到不分片?
如何分片?如何组装?理解字段
在IP网络层,最重要的是要理解:运营商+私有和公网IP
网络层
在复杂的网络环境中确定一个合适的路径.
IP协议
IP的意义:IP地址提供了一种“能力”(具有很大的概率,能做成一件事), 将数据,从B主机,跨网络,可靠的送至C主机的能力。
网络层提供能力(不保证可靠性,保证不了),传输层提供策略
在计算机网络当中:TCP/IP提供的就是策略加能力
基本概念
主机: 配有 IP 地址, 但是不进行路由控制的设备;
路由器: 即配有 IP 地址, 又能进行路由控制;
节点: 主机和路由器的统称;
在Linux当中通过ifconfig查看IP地址:inet(在云服务器上内网IP)、ether就是mac地址
pupu@VM-8-15-ubuntu:~$ ifconfig eth0: flags=4163<UP,BROADCAST,RUNNING,MULTICAST> mtu 1500inet 10.2.7.35 netmask 255.255.252.0 broadcast 10.2.11.255inet6 fe80::5054:ff:fe35:6ffe prefixlen 64 scopeid 0x20<link>ether 52:54:00:35:6e:ee txqueuelen 1000 (Ethernet)RX packets 26444354 bytes 9407074884 (9.4 GB)RX errors 0 dropped 0 overruns 0 frame 0TX packets 20536961 bytes 3980058301 (3.9 GB)TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0
IP地址 = 网络号 + 主机号 ,路由的时候先根据网络号进行路由。
协议头格式
1.如何将报头和有效载荷分离?
对于网络层来说,报文的有效载荷部分就是传输层报头、应用层报头、以及数据。而报头也就是网络报头
通过观察网络层报头:与TCP报头相似
1. IP报文标准长度20字节(TCP的标准长度也是20字节)
2. 4位首部长度,取值范围【0-15】* 4字节--->[0, 60](同TCP)、又因为IP报文标准长度20字节,不谈选项的话---->x*4 = 20 ---> x = 5 ====> 填0101。
之后读取IP报文,首先读取20字节,再提取首部长度*4得到实际报文的长度,如果是20,那么剩下的就是数据,如果不是20,并且>20,那么就 - 20,得到选项长度。
2.如何分用
IP是通过8位协议来交付的(TCP、UDP是通过目的端口来交付的)
字段含义
字段名称 | 位数 | 描述 |
---|---|---|
版本 (Version) | 4 bit | 指定 IP 协议版本,IPv4 固定为 4、 IPv6(和IPv4不兼容)固定位6 。 |
头部长度 (Header Length) | 4 bit | 表示 IP 头部的长度,单位为 32bit(4字节)。最大值为 15 ,对应头部最大长度为 15 × 4 = 60 字节 。 |
服务类型 (Type Of Service) | 8 bit | - 3 位优先权字段(已弃用) - 4 位 TOS 字段:可选 最小延时 、最大吞吐量 、最高可靠性 、最小成本 (四者冲突,只能选其一)- 1 位保留字段:必须置 0 。 |
总长度 (Total Length) | 16 bit | 表示整个 IP 数据报的总字节数(包括头部和数据)。最大值为 65535 字节 。 |
生存时间 (Time To Live, TTL) | 8 bit | 报文最大可经过的路由跳数。初始值通常为 64 ,每经过一个路由减 1 ,归零时丢弃。 |
协议 (Protocol) | 8 bit | 标识上层协议类型(例如 ICMP=1 ,TCP=6 ,UDP=17 )。 |
头部校验和 (Header Checksum) | 16 bit | 使用 CRC 校验算法 验证头部完整性,接收端发现校验失败则丢弃报文。 |
源地址 (Source Address) | 32 bit | 发送端的 IPv4 地址(如 192.168.1.1 )。 |
目标地址 (Destination Address) | 32 bit | 接收端的 IPv4 地址(如 192.168.1.2 )。 |
选项字段 | (不定长, 最多 40 字节) | 略 |
虽然现在全球都使用的是IPv4。
但其实我们国家一直都在做IPv6,为未来做准备,并且做的最好的也是我们国家,也一直在推广,但是在现成的网络体系下,推广IPv6是很困难的。大部分公司在组建内网上,都使用的IPv6,而为什么国家要推广IPv6?在为物联网、自动驾驶做准备。IPv6做的好,支持比较好的地方,就能解决ip地址不足的问题,互联网公司上机房也是支持IPv6的,以及行政要求上做通信设备的厂商,路由器也必须支持IPv6。
五元组:
源IP、源端口、目的IP、目的端口、协议号----->标识一个网络通信
网段划分(重要)
在网段划分这里需要明白:
1. 两种网段划分的方式
IP是有用且有限的资源(石油等),经过合理划分,来给不同的区域,国家,地区,组织,学校等,因此为什么我们国家必须在IPv6大力建设。网络世界是被精心设计过的,从硬件到软件。
IP 地址分为两个部分, 网络号和主机号
• 网络号: 保证相互连接的两个网段具有不同的标识;
• 主机号: 同一网段内, 主机之间具有相同的网络号, 但是必须有不同的主机号
• 不同的子网其实就是把网络号相同的主机放到一起.
• 如果在子网中新增一台主机, 则这台主机的网络号和这个子网的网络号一致, 但是主机号必须不能和子网中的其他主机重复.
通过合理设置主机号和网络号, 就可以保证在相互连接的网络中, 每台主机的 IP 地址都不相同.
那么问题来了, 手动管理子网内的 IP, 是一个相当麻烦的事情.
默认网关也就是路由器:查询自己电脑的默认网关可以通过:ipconfig查询
路由器背面:通过浏览器就可以访问路由器(路由器具有web功能)
• 有一种技术叫做 DHCP, 能够自动的给子网内新增主机节点分配 IP 地址, 避免了手动管理 IP 的不便.
• 一般的路由器都带有 DHCP 功能. 因此路由器也可以看做一个 DHCP 服务器
过去曾经提出一种划分网络号和主机号的方案, 把所有 IP 地址分为五类, 如下图所示(该图出 自[TCPIP])。
• 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 类却浪费了大量地址;
• 例如, 申请了一个 B 类地址, 理论上一个子网内能允许 6 万 5 千多个主机. A 类地址的子网内的主机数更多.
• 然而实际网络架设中, 不会存在一个子网内有这么多的情况. 因此大量的 IP 地址都被浪费掉了.
针对这种情况提出了新的划分方案, 称为 CIDR(Classless Interdomain Routing):
• 引入一个额外的子网掩码(subnet mask)来区分网络号和主机号;
• 子网掩码也是一个 32 位的正整数. 通常用一串 "0" 来结尾;
• 将 IP 地址和子网掩码进行 "按位与" 操作, 得到的结果就是网络号;
• 网络号和主机号的划分与这个 IP 地址是 A 类、 B 类还是 C 类无关
任意一个IP一定隶属于某一个子网
可见,IP 地址与子网掩码做与运算可以得到网络号, 主机号从全 0 到全 1 就是子网的地址范围;
IP 地址和子网掩码还有一种更简洁的表示方法,例如 140.252.20.68/24,表示 IP 地址140.252.20.68, 子网掩码的高 24 位是 1,也就是 255.255.255.0
子网掩码和他的网络信息一般在路由器当中配置好。
为什么要进行网段划分
网段划分的主要目的是提高网络效率、增强安全性、简化管理。
通过将大型网络分割成多个子网(网段),可以有效控制广播流量、隔离不同区域的设备,并针对不同需求进行灵活管理。
举个简单例子🌰:
假设一家公司有 3个部门(行政部、技术部、财务部),所有设备最初都在同一个网段(如
192.168.1.0/24
)。这时可能会遇到以下问题:
广播风暴:所有设备都能收到彼此的广播消息(如ARP请求),导致网络拥堵。
安全风险:财务部的敏感数据可能被其他部门直接访问。
管理混乱:IP地址分配缺乏规律,难以排查问题。
划分网段后:
将网络划分为3个子网:
行政部:
192.168.1.0/24
技术部:
192.168.2.0/24
财务部:
192.168.3.0/24
带来的好处:
减少广播流量:每个部门的广播只在各自子网内传播,避免全网拥堵。
提升安全性:财务部子网可设置防火墙规则,限制其他部门的访问。
简化管理:IP地址按部门分配,故障排查更高效。
灵活扩展:未来新增部门时,只需分配新网段,不影响现有网络。
技术原理:
通过子网掩码(如
255.255.255.0
)将IP地址分为网络部分和主机部分,不同子网的设备需通过路由器或三层交换机通信,从而实现逻辑隔离。关键点:网段划分就像把一个大房间隔成多个小单间,既保证隐私(安全),又减少噪音干扰(效率)。
特殊的 IP 地址
• 将 IP 地址中的主机地址全部设为 0, 就成为了网络号, 代表这个局域网;
• 将 IP 地址中的主机地址全部设为 1, 就成为了广播地址, 用于给同一个链路中相互连接的所有主机发送数据包;
• 127.*的 IP 地址用于本机环回(loop back)测试,通常是 127.0.0.1
IP 地址的数量限制
- 我们知道, IP 地址(IPv4)是一个 4 字节 32 位的正整数. 那么一共只有 2 的 32 次方 个 IP地址, 大概是 43 亿左右. 而 TCP/IP 协议规定, 每个主机都需要有一个 IP 地址.
- 这意味着, 一共只有 43 亿台主机能接入网络么?
- 实际上, 由于一些特殊的 IP 地址的存在, 数量远不足 43 亿; 另外 IP 地址并非是按照主机台数来配置的, 而是每一个网卡都需要配置一个或多个 IP 地址.
- CIDR(子网掩码) 在一定程度上缓解了 IP 地址不够用的问题(提高了利用率, 减少了浪费, 但是 IP地址的绝对上限并没有增加), 仍然不是很够用.
这时候有三种方式来解决:
- 动态分配 IP 地址: 只给接入网络的设备分配 IP 地址. 因此同一个 MAC 地址的设备, 每次接入互联网中, 得到的 IP 地址不一定是相同的;
- NAT 技术(后面会重点介绍);
- IPv6: IPv6 并不是 IPv4 的简单升级版. 这是互不相干的两个协议, 彼此并不兼容; IPv6 用 16 字节 128 位来表示一个 IP 地址; 但是目前 IPv6 还没有普及;
私有 IP 地址和公网 IP 地址
如果一个组织内部组建局域网,IP 地址只用于局域网内的通信,而不直接连到 Internet 上,理论上使用任意的 IP 地址都可以,但是 RFC 1918 规定了用于组建局域网的私有 IP 地址
- 10.*,前 8 位是网络号,共 16,777,216 个地址。(在较大子网当中使用的)
- 172.16.*到 172.31.*,前 12 位是网络号,共 1,048,576 个地址(在学校)
- 192.168.*,前 16 位是网络号,共 65,536 个地址(在家庭)
包含在这个范围中的, 都成为私有 IP, 其余的则称为全局 IP(或公网 IP);
私有IP不能出现在公网中:
私有IP地址,在不同的私网中,可以重复。
比如我家和朋友的家里私有IP可以随便用,我们的私有IP可以一样。
IP地址标识全网当中的唯一性,这里的IP地址指的是公网IP。未来在通信的时候,每个主机都有自己的私有IP,私有IP不能出现在公网当中的。
真实的网络世界:私有IP地址和公有IP地址构成的、也就是局域网、和公网构成的。
在windows中查看自己的ip地址:ipconfig
在云服务器中:ifconfig
inet 10.2.8.15 netmask 255.255.252.0 broadcast 10.2.11.255
以上就是典型的私有IP地址
虽然存在公网,但是我们上网,都必须先接入一个指定的内网当中。我们所有人都在各自的内网当中。能接到公网的人只有运营商。
通过上图我们能够再次明确:
我们的网络世界 = 内网 + 公网构成
1.路由器是能够构建子网的、家里路由器给我们的手机电脑分配私有IP
2.路由器至少要级联两个网络、因此家庭路由器的另一侧连接运营商路由器,连接的是运营商的子网环境,运营商路由器也会构建子网。
3.前面有讲过一个路由器一旦横跨两个子网,他一定要配上两个IP,一个连接的是自己组建的子网的IP,另一边连接的是另一个子网的IP。自己构建的子网的IP称为:LAN口IP(一般都是.1也就是他是第一台),另一端连接的运营商构建的子网的其中一个IP:WAN口IP。
对于运营商来说家庭路由器也就是运营商所构建的子网当中的末端路由器。接下来运营商还能继续向上搭建,某个区的子网,某个市的子网....最后接入到公网的运营商的路由器就称为出入口路由器(也需要有LAN口IP和WAN口IP),出入口路由器的WAN口IP一般就是公网IP。现在存在着抖音的云服务器,是在公网当中的,运营商的出入口路由器也在公网当中,因此这些路由器之间就可以直接通信了,至此我们就从内网进入到公网环境。
正是因为有了这么多基础设施(建基站,组机房,组光纤,家家户户入网,家家户户买手机,买电脑)的建设,运营商其实也不愿意做,投入产出比太高,回报时间长、金钱少,背后都是由国家政府在大力推动和支持。运营商和政府的决心是决定一个国家互联网发展是否蓬勃向上的重要理由。为什么其他国家(韩国、日本、欧洲...)互联网应用上没有我们国家这么发达,他们不缺运营商,缺的是政府的决心。
全世界的网络是各个国家的运营商精心设计过的。
请求步骤:
这是我们的出发点和需要通信的目的地IP:
src: 192.168.1. 201
dst:122.77.241.3
任何主机,都有能力知道和自己直连的网络号是多少。
当发现先要通信的目的ip不在自己的所在的子网当中时,就只能将报文交给家用路由器。因为家用路由器是连接外网的。 家用路由器就会将报文交给运营商路由器,直连的运营商路由器发现目的地并不在自己所构建的子网中,就会将报文交给出入口路由器,最后会根据公网环境将报文直接转发到抖音服务器。
应答的步骤:
要注意,内网IP是有可能重复的,因此抖音在要应答的时候,目的IP如何填?
规定:私有IP不能出现在公网IP中。因此报文在不断转发的时候,是一直在被处理的。
真实情况下的请求步骤:将报文从内网转到公网
源发起请求的主机整理好报文
将报文发给家用路由器:
家用路由器根据目的IP,与自己的子网做比对,将报文处理后交给运营商出入口路由器。
出入口路由器在将报文转发之前,将src替换为自己的WAN口IP。报文转发到广域网后,直接被转发到目的服务器中。
在服务器应答时,报文回到入口路由器处。
NAT(网络地址转化)技术:
• 子网内的主机需要和外网进行通信时, 路由器将 IP 首部中的 IP 地址进行替换(替换成 WAN 口 IP), 这样逐级替换, 最终数据包中的 IP 地址成为一个公网 IP. 这种技术称为 NAT(Network Address Translation, 网络地址转换).
云服务器作用
• 如果希望我们自己实现的服务器程序, 能够在公网上被访问到, 就需要把程序部署在一台具有外网 IP 的服务器上. 这样的服务器可以在阿里云/腾讯云上进行购买
因此运营商是如何做到当网络欠费时,无法让我们上网的,不做NAT转化,把我们的报文直接丢弃。
公网IP
需要知道:公网IP的划分在实际情况下是非常复杂的。
先划分每个国家的网段,再划分每个省的网段,最后划分每个市、区的网段,这个时候,所留的IP如果还是按照公网IP来分,肯定不够了,因此由每个地区运营商再来将末端公网IP,来由私有IP来构建子网。
各国IP地址段示例
公网IP地址的分配由 区域互联网注册机构(RIR) 管理,全球共有5个RIR,负责不同地理区域的IP地址分配。每个国家/地区的IP地址段由所属RIR动态分配,且IP地址可能随时间调整。
以下为部分国家的IPv4地址段示例(动态变化,仅供参考):
1. 中国
IPv4:主要由APNIC分配
中国电信:
58.32.0.0/13
、202.97.0.0/16
中国移动:
111.0.0.0/10
、223.0.0.0/12
中国联通:
123.128.0.0/13
、210.52.0.0/15
2. 美国
IPv4:由ARIN分配
谷歌:
8.8.8.0/24
(DNS)、172.217.0.0/16
亚马逊:
52.0.0.0/15
、54.240.0.0/12
3. 日本
IPv4:由APNIC分配
软银(SoftBank):
126.0.0.0/8
NTT通信:
210.146.0.0/16
、203.141.0.0/16
4. 德国
IPv4:由RIPE NCC分配
德国电信(Deutsche Telekom):
62.0.0.0/8
、91.0.0.0/10
Hetzner:
88.198.0.0/16
、213.239.0.0/16
5. 印度
IPv4:由APNIC分配
Airtel:
116.119.0.0/17
、182.79.0.0/16
Jio:
49.36.0.0/14
、106.51.0.0/16
划分网段,划分了很多子网段,国家的组织等去认领,
路由
在复杂的网络结构中, 找出一条通往终点的路线
路由的过程, 就是这样一跳一跳(Hop by Hop) "问路" 的过程.
所谓 "一跳" 就是数据链路层中的一个区间. 具体在以太网中指从源 MAC 地址到目的MAC 地址之间的帧传输区间
跨网络转发的本质:就是要经历不同的子网,即子网间转发。
IP 数据包的传输过程也和问路一样.
• 当 IP 数据包, 到达路由器时, 路由器会先查看目的 IP;
• 路由器决定这个数据包是能直接发送给目标主机, 还是需要发送给下一个路由器;
• 依次反复, 一直到达目标 IP 地址;
那么如何判定当前这个数据包该发送到哪里呢?
这个就依靠每个节点内部维护一个路由表;
• 路由表可以使用 route 命令查看
• 如果目的 IP 命中了路由表, 就直接转发即可;
• 路由表中的最后一行,主要由下一跳地址和发送接口两部分组成,当目的地址与路由表中其它行都不匹配时,就按缺省路由条目规定的接口发送到下一跳地址。
假设某主机上的网络接口配置和路由表如下:
• 这台主机有两个网络接口,一个网络接口连到 192.168.10.0/24 网络,另一个网络接口连到 192.168.56.0/24 网络;
• 路由表的 Destination 是目的网络地址,Genmask 是子网掩码,Gateway 是下一跳地址,Iface 是发送接口,eth0、1网卡接口,lo-->loop:本地环回。Flags 中的 U 标志表示此条目有效(可以禁用某些 条目),G标志表示此条目的下一跳地址是某个路由器的地址,没有 G 标志的条目表示目的网络地址是与本机接口直接相连的网络,不必经路由器转发;
转发过程例 1: 如果要发送的数据包的目的地址是 192.168.56.3
• 跟第一行的子网掩码做与运算得 到 192.168.56.0,与第一行的目的网络地址不符
•再跟第二行的子网掩码做与运算得 到 192.168.56.0,正是第二行的目的网络地址,因此从 eth1 接口发送出去;
• 由于 192.168.56.0/24 正 是与 eth1 接口直接相连的网络,因此可以直接发到目的主机,不需要经路由器转发;
转发过程例 2: 如果要发送的数据包的目的地址是 202.10.1.2
• 依次和路由表前几项进行对比, 发现都不匹配;
• 按缺省路由条目, 从 eth0 接口发出去, 发往 192.168.10.1 路由器;
• 由 192.168.10.1 路由器根据它的路由表决定下一跳地址
现在我们回到网络层,报文协议头格式
理解IP分片和组装的字段
为什么网络层会分片、不想分片、如何做到不分片?
为什么网络层会分片:当IP数据报长度超过网络链路的 MTU(最大传输单元) 时,必须分片传输。
网络层究竟向数据链路层交多大的数据,由传输层决定,过大,到网络层要给数据链路层的时候,数据链路层无法转发,因此网络层进行分片转发。数据链路层、传输层并不会关心网络层是否进行报文分片,网络层给数据链路层的数据,数据链路层就直接发。一次性的数据,就会分片发给数据链路层,数据链路层也需要多次转发。转发给另外的主机后,到网络层时,网络层需要组装好在向上传给传输层。
为什么不想分片:容易丢包
1.在网络世界里,只有IP报文
2.一个IP报文 vs 10个IP报文,10片报文里,有一片丢失去,对方网络层是否能将9片报文组装交给对方传输层,不能。任意一片报文丢失,也就代表整个报文丢失,对方就不会应答,就会超时,就会重传。
过多的分片,会增加丢包概率,分片不是网络转发的主流。无论上层是UDP还是TCP,分片对上层的影响都是相同的,只不过TCP有丢包重传机制。
如何做到不分片:由传输层决定
因此我们可以回顾之前所讲过的滑动窗口:
为什么滑动窗口里的数据也需要分段,因为下层的需求。在传输层(报文 = 传输层报头+有效载荷)分段发了,能降低在网络层(报文 = 网络层报头+传输层报文)分片发的概率。底层有减少分片发送的需求
• 窗口大小指的是无需等待确认应答而可以继续发送数据的最大值.
• 发送前四个段的时候, 不需要等待任何 ACK, 直接发送
如何分片?如何组装?理解字段
如何组装?
1.如何区分,我收到的报文是否分片
2.如何保证收全报文片?将所有的片偏移进行升序排序,并将报头删除进行组装。
根据报头字段:
标识 (Identification) 16 bit 唯一的标识主机发送的报文. 如果 IP 报文在数据链路层被分片了, 那么每一个片里面的这个 id 都是相同的 标志字段 (Flags) 3 bit - 第 1 位:保留,置 0
- 第 2 位:禁止分片(DF)
,置1
时若报文超 MTU 则丢弃
- 第 3 位:更多分片(MF)
,最后一个分片置0
,其他分片置1
。分片偏移 (Fragment Offset) 13 bit 是分片相对于原始 IP 报文开始处的偏移.其实就是在表示当前分片在原报文中处在哪个位置. 实际偏移量是偏移的字节数(不包含报头)除以8. 因此, 除了最后一个报文之外, 其他报文的长度必须是 8 的整数倍(否则报文就不连续了).
每一个分片都要添加报头。
如果现在有长度为3000(2980 + 20)的报文;
MTU=1500字节时: 可用载荷 = 1500 - 20(IP头) = 1480字节 分片1:1480字节数据 → 偏移量0/8=0 分片2:1480字节数据 → 偏移量1480/8=185 分片3:剩余20字节 → 偏移量2960/8=370
分片结果
分片 数据长度(字节) 总长度(字节) 片偏移量 MF标志 1 1480 1500 0 1 2 1480 1500 185 1 3 20 40 370 0 [原始数据报] 3000字节 ├── [分片1] 1480数据 + 20头 = 1500字节 (MF=1) ├── [分片2] 1480数据 + 20头 = 1500字节 (MF=1) └── [分片3] 20数据 + 20头 = 40字节 (MF=0)
结语:
随着这篇博客接近尾声,我衷心希望我所分享的内容能为你带来一些启发和帮助。学习和理解的过程往往充满挑战,但正是这些挑战让我们不断成长和进步。我在准备这篇文章时,也深刻体会到了学习与分享的乐趣。
在此,我要特别感谢每一位阅读到这里的你。是你的关注和支持,给予了我持续写作和分享的动力。我深知,无论我在某个领域有多少见解,都离不开大家的鼓励与指正。因此,如果你在阅读过程中有任何疑问、建议或是发现了文章中的不足之处,都欢迎你慷慨赐教。
你的每一条反馈都是我前进路上的宝贵财富。同时,我也非常期待能够得到你的点赞、收藏,关注这将是对我莫大的支持和鼓励。当然,我更期待的是能够持续为你带来有价值的内容
相关文章:
【计算机网络】网络IP层
📚 博主的专栏 🐧 Linux | 🖥️ C | 📊 数据结构 | 💡C 算法 | 🅒 C 语言 | 🌐 计算机网络 上篇文章:传输层协议TCP 下篇文章:数据链路层 文章摘要࿱…...
Nginx重写功能
目录 一 . 简介 二. if指令 2.1基本语法 2.2 举例说明 2.3 配置实例 三. return 3.1 基本语法 3.2 配置实例 四. set指令 4.1 基本语法 4.2 举例说明 4.3 配置实例 五.break指令 5.1 作用 5.2 举例说明 5.3 配置实例 六.rewrite指令 6.1 基本语法 6.2 配…...
2025-05-11 项目绩效域记忆逻辑管理
好的,我们可以用一个故事来帮助记忆这些规划绩效域的要素,同时通过逻辑关系来串联它们。以下是一个故事化的版本: 《项目管理的奇幻之旅》 在一个遥远的王国里,有一个勇敢的项目经理名叫小K。小K被国王赋予了一个艰巨的任务&…...
全模态具身智能:从 VLM 到 MLLM
写在前面 人工智能的感知边界正在以前所未有的速度扩展。最初,我们惊叹于大型语言模型(LLM)对文本的深刻理解和流畅生成。很快,视觉语言模型(Vision-Language Models, VLM) 登场,让 AI 第一次真正“看见”了世界,能够理解图像内容并将其与语言关联,实现了“看图说话”…...
C++入门小馆: 二叉搜索树
嘿,各位技术潮人!好久不见甚是想念。生活就像一场奇妙冒险,而编程就是那把超酷的万能钥匙。此刻,阳光洒在键盘上,灵感在指尖跳跃,让我们抛开一切束缚,给平淡日子加点料,注入满满的pa…...
C++.IP协议通信
C++IP协议通信 1. TCP协议通信1.1 服务端实现创建套接字绑定地址监听连接接受连接数据传输关闭连接1.2 客户端实现创建套接字连接服务器数据传输关闭连接1.3 示例代码服务端代码示例客户端代码示例绑定地址接收数据发送数据关闭套接字2.2 客户端实现创建套接字发送数据接收数据…...
虚幻引擎5-Unreal Engine笔记之UE编辑器退出时的保存弹框
虚幻引擎5-Unreal Engine笔记之UE编辑器退出时的保存弹框 code review! 文章目录 虚幻引擎5-Unreal Engine笔记之UE编辑器退出时的保存弹框1. 退出编辑器时弹出的“Save Content”窗口2. File 菜单中的保存选项3. 区别总结 1. 退出编辑器时弹出的“Save Content”窗口 退出时…...
【KEIL】更新AC6编译器
看过部分的文章,Arm Compiler 6(AC6)编译器,相比AC5在编译速度和代码优化上提升了。因此,笔者决定升级到AC6的最新版本。可以更新keil5到最新版本,上面集成AC6编译器的版本,与最新版相差不远。假…...
Mosquitto MQTT库实战指南
目录 1. MQTT协议简介2. Mosquitto概述3. 开源MQTT实现对比4. 为什么选择Mosquitto5. Mosquitto的交叉编译6. MQTT发布订阅实战7. 进阶应用与最佳实践8. 总结 1. MQTT协议简介 MQTT(Message Queuing Telemetry Transport)是一种基于发布/订阅模式的轻…...
C语音学习---函数指针
目录 1. 函数指针解析 2. 自定义实现(函数指针赋值) 利用下面一段例子来解析: int (*set_slave)(modbus_t *ctx, int slave); 1. 函数指针解析 set_slave 是一个 函数指针,指向一个函数。 该函数接受两个参数: mo…...
04.three官方示例+编辑器+AI快速学习webgl_animation_skinning_additive_blending
本实例主要讲解内容 这个示例展示了Three.js中**骨骼动画的叠加混合(Additive Animation Blending)**技术。通过加载一个机器人模型,演示了如何在基础动画(如站立、行走、跑步)之上叠加额外的动画效果(如潜行姿态、悲伤表情、点头同意等),实现更丰富的角…...
WSL配置docker启动nacos容器load derby-schema.sql error.问题解决方案
nacos配置问题 问题再现查看错误logsQWEN的解答不挂载/data结论 问题再现 本来想要本地跑一下nacos,之前都是直接在Linux环境下面,现在就使用windows的wsl跑一下nacos,之前是需要先配置/conf文件下面的porperties文件以及构建对应的nacos-config数据库。所以我使用…...
游戏引擎学习第272天:显式移动转换
回顾并为今天的内容铺垫背景 我们刚开始为游戏主角编写一些程序逻辑,因为我们之前已经完成了大部分引擎方面的开发,现在可以专注在角色身上。这个角色的移动方式会有些特别,与大多数游戏角色的运动机制不太一样。我们当前正在实现的控制方式…...
AVL树解析
插入操作 // 插入操作 bool insert(const pair<K, V>& kv) {// 若树为空,直接构造,new一个if (_root nullptr) {_root new Node(kv);return true;}// 用于遍历树的当前节点Node* cur _root;// 用于记录当前节点的父节点Node* parent n…...
vue 中的数据代理
在 Vue 中,数据代理(Data Proxy) 是 Vue 实现 MVVM 模式 的关键技术之一。Vue 使用数据代理让你可以通过 this.message 访问 data.message,而不需要写 this.data.message —— 这大大简化了模板和逻辑代码。 我们来深入理解它的本…...
Linux共享内存深度解析:从内核机制到云原生应用
引言:超越进程边界的内存魔术 在Linux系统的进程间通信(IPC)领域,共享内存(Shared Memory)如同魔法镜子般的存在——不同进程透过它看到相同的内存镜像。这种机制摒弃了数据拷贝,直击性能瓶颈&…...
Vue Router全局拦截
Vue Router全局拦截全攻略 一、为什么需要全局拦截? 最近在开发后台管理系统时,突然发现所有页面都需要登录才能访问。如果每个页面都手动检查登录状态,那代码简直要写成意大利面条了。这时候,Vue Router的全局拦截功能就像个贴…...
从0开始学linux韦东山教程第三章问题小结(3)
本人从0开始学习linux,使用的是韦东山的教程,在跟着课程学习的情况下的所遇到的问题的总结,理论虽枯燥但是是基础。说实在的越看视频越感觉他讲的有点乱后续将以他的新版PDF手册为中心,视频作为辅助理解的工具。参考手册为嵌入式Linux应用开发…...
【前端】【css】【总复习】三万字详解CSS 知识体系
🌈 CSS 知识体系目录大纲 一、基础知识入门 1. CSS 简介与作用 CSS(Cascading Style Sheets,层叠样式表)是一种用于给 HTML 页面添加样式的语言,作用是让网页更美观、结构更清晰、布局更灵活。 核心作用: 控制网页元素的 颜色、字体、间距、边框、背景布局网页元素位置…...
Linux 进程等待
1、进程等待 僵尸进程 是一个比较麻烦的问题,如果不对其做出处理,僵尸进程 就会越来越多,导致 内存泄漏 和 标识符 占用问题 进程一旦变成僵尸状态,那就刀枪不入,“杀人不眨眼”的kill -9 也无能为力,因为…...
轻量服务器与宝塔
因为访问宝塔面板是需要在安全组设置一下开放端口,比如这里是42450 但是我们用的轻量服务器是把安全组这种功能削减了的,所以我就去尝试修改了一下防火墙设置 然后就可以访问了...
深入理解AMBA总线(六)AHB-lite Slave响应和其它控制信号
上一篇文章给大家介绍了AHB-lite的一些控制信号,重点是通过这些控制信号去理解AHB-lite为什么这么设计,采用这些控制信号有什么好处。这节课给大家带来剩余的一些控制信号介绍。 ** 1、Slave Response Signaling ** 1.1、Slave Transfer Responses …...
app加固
1、什么是加固? 我们之前讲的逆向,大多数都是用加密算法去加密一些明文字符串,然后把得到的结果用 Base64、Hex等进行编码后提交。加固其实也一样,只不过他通常加密的是 dex文件而已。但是 dex 文件加密以后,安卓系统是没法直接运行的。所以加固的核心&…...
Linux架构篇、第三章_2_Linux服务器监控与NGINX优化
Linux_架构篇 欢迎来到Linux的世界,看笔记好好学多敲多打,每个人都是大神! 题目: 版本号: 1.0,0 作者: 老王要学习 日期: 2025.05.11 适用环境: Centos7 文档说明 本文围绕 Linux 服务器监控与 NGINX 优化展开。介绍了 sysst…...
第26节:卷积神经网络(CNN)-数据增强技术(PyTorch)
1. 引言 在深度学习领域,数据增强(Data Augmentation)是提升卷积神经网络(CNN)性能的关键技术之一。通过人为地扩展训练数据集,数据增强能够有效提高模型的泛化能力,防止过拟合,特别是在训练数据有限的情况下。本文将全面介绍PyTorch框架下的数据增强技术,包括基本原理、…...
架构思维:通用架构模式_怀疑下游的设计思路与最佳实践
文章目录 1. 引言2. 为什么要“怀疑下游”3. 三大类下游依赖及应对方案3.1 对其他微服务的依赖3.1.1 分布式事务简易补偿方案3.2 对数据库的依赖3.3 对消息中间件的依赖 4. 分布式事务实战案例5. 小结 1. 引言 在 架构思维:通用架构模式_从设计到代码构建稳如磐石的…...
[Java实战]Spring Boot 中Starter机制与自定义Starter实战(九)
[Java实战]Spring Boot 中Starter机制与自定义Starter实战(九) 引言 Spring Boot 的 Starter 是其“约定优于配置”理念的核心体现,通过简化依赖管理和自动配置,极大提升了开发效率。本文将深入剖析 Starter 的设计思想、实现原…...
C++23 views::repeat (P2474R2) 深入解析
文章目录 引言C20 Ranges库回顾什么是Rangesstd::views的作用 views::repeat概述基本概念原型定义工作原理应用场景初始化容器模拟测试数据 总结 引言 在C的发展历程中,每一个新版本都会带来一系列令人期待的新特性,这些特性不仅提升了语言的性能和表达…...
【第三十五周】Janus-pro 技术报告阅读笔记
Janus-Pro 摘要Abstract文章信息引言方法Janus 架构Janus 训练Janus-Pro 的改进 实验结果总结 摘要 本篇博客介绍了Janus-Pro,这是一个突破性的多模态理解与生成统一模型,其核心思想是通过解耦双路径视觉编码架构解决传统方法中语义理解与像素生成的任务…...
基于Qt的app开发第七天
写在前面 笔者是大一下计科生,标题这个项目是笔者这个学期的课设,与学长共创,我负责客户端部分,现在已经实现了待办板块的新建、修改。 这个项目目前已经走上正轨了,博主也实现了主要功能的从无到有ÿ…...
第二十二节:图像金字塔-拉普拉斯金字塔
在数字图像处理的奇幻世界中,存在着一种能够连接不同视觉维度的神秘阶梯——图像金字塔。这种独特的结构让计算机视觉算法能够在不同尺度下观察和理解图像特征,而其中的拉普拉斯金字塔更是隐藏着图像细节重构的终极奥秘。 一、金字塔的数学基础:从高斯到拉普拉斯 1.1 高斯金…...
Flutter基础()
导航栏 appBar: AppBar() title: const Text(搜索) //标题 backgroundColor: Colors.blue //背景颜色 centerTitle: true //标题居中leading 属性 作用: 放置在应用栏左侧的控件,通常是一个图标按钮,用于导航或打开菜单。 AppBar(le…...
ES面试题系列「一」
1、Elasticsearch 是什么?它与传统数据库有什么区别? 答案:Elasticsearch 是一个基于 Lucene 的分布式、开源的搜索和分析引擎,主要用于处理大量的文本数据,提供快速的搜索和分析功能。与传统数据库相比,E…...
Oracle 通过 ROWID 批量更新表
Oracle 通过 ROWID 批量更新表 在 Oracle 数据库中,使用 ROWID 进行批量更新是一种高效的更新方法,因为它直接定位到物理行位置,避免了通过索引查找的开销。 ROWID 基本概念 ROWID 是 Oracle 数据库中每一行的唯一物理地址标识符ÿ…...
罗技无线鼠标的配对方法
罗技鼠标的配对方法: 重新连接鼠标 请按照以下步骤将鼠标与 USB 接收器重新配对。 1.将USB接收器插入计算机。 2.将鼠标关闭电源。 3.按住并持续按住向右按钮,直到操作结束。 4.切换鼠标电源。 5. 单击一次左侧按钮。 6. 单击一次中间按钮。 7.全部松开&…...
移动应用开发的六大设计原则
在移动应用开发中,遵循设计原则能大幅提升代码的可维护性和扩展性。本文以一个简单的学生管理系统为例,解析六大核心设计原则的实践方法。 1. 单一职责原则 优点: 提高可维护性:一个类只负责一项职责,代码的功能会更…...
LLM初识
从零到一:用 Python 和 LLM 构建你的专属本地知识库问答机器人 摘要: 随着大型语言模型(LLM)的兴起,构建智能问答系统变得前所未有的简单。本文将详细介绍如何使用 Python,结合开源的 LLM 和向量数据库技…...
【CTF】Linux Shell RCE绕过(bypass)技术总结
在Linux环境下,远程代码执行(RCE,Remote Code Execution)是一种常见的攻击手段。然而,许多系统会对命令注入进行过滤或限制,例如禁止特定关键字(如system)、斜杠(/&#…...
深入理解 Linux 权限控制机制
引言 在 Linux 系统中,权限控制是保障系统安全的核心机制。通过限制用户对文件和资源的访问,它能有效防止未授权操作,保护数据不被篡改或泄露。合理设置权限不仅有助于实现用户隔离和最小权限原则,还能降低系统被滥用或攻击的风险…...
技术书籍推荐(002)
20. 利用Python进行数据分析 免费 电子书 PDF 下载 书籍简介: 本书聚焦于使用Python进行数据处理和分析。详细介绍了Python中用于数据分析的重要库,如NumPy(提供高效的数值计算功能,包括数组操作、数学函数等)、panda…...
[SAP] SAP ERP用户参数设置
菜单路径 个人默认值的设置(数值,日期,时间) 个人参数值的设置 在给参数设置参数值后,当用户登录到对应功能页面时,这些参数值就会自动带出来 例如,我们分别对上述AAT,VKO以及VTW这3个参数设置了参数值&am…...
Python中,async和with结合使用,有什么好处?
在Python的异步编程中,async和with的结合使用(即async with)为开发者提供了一种优雅且高效的资源管理模式。这种组合不仅简化了异步代码的编写,还显著提升了程序的健壮性和可维护性。以下是其核心优势及典型应用场景的分析&#x…...
【信息系统项目管理师】第3章:信息系统治理 - 29个经典题目及详解
更多内容请见: 备考信息系统项目管理师-专栏介绍和目录 文章目录 【第1题】【第2题】【第3题】【第4题】【第5题】【第6题】【第7题】【第8题】【第9题】【第10题】【第11题】【第12题】【第13题】【第14题】【第15题】【第16题】【第17题】【第18题】【第19题】【第20题】【第…...
python实战项目69:基于Python爬虫的链家二手房数据采集方法研究
python实战项目69:链家二手房数据采集 一、项目需求1.1 房地产数据价值1.2 传统数据获取局限性1.3 技术可行性二、数据采集流程2.1 需求分析2.2 网页结构分析2.3 请求发送与反爬策略2.4 数据解析2.5 数据存储三、结论与展望四、完整代码一、项目需求 本文针对房地产数据分析需…...
PowerShell 脚本中文乱码处理
问题描述 脚本带中文,执行时命令行窗口会显示出乱码 示例 Write-Host "测试成功!"解决方法 问了DeepSeek,让确认是不是 UTF8 无 BOM 格式 事实证明方向对了 但是确认信息有偏差 改成 UTF8 with BOM 使用任意支持修改编码的文本…...
SpEL(Spring Expression Language)使用详解
SpEL(Spring Expression Language)是 Spring 框架中一种强大的表达式语言,支持在运行时动态查询和操作对象图。它与 Spring 生态深度集成,广泛应用于依赖注入、数据绑定、AOP、安全规则等场景。以下是其核心语法、应用场景及使用示…...
论文阅读与写作:《从探索到突破:解密科研和论文写作的思维密码》
文章目录 一、如何做科研1.科研的步骤2.课题选择3.快速入门一个新领域:读论文,先读综述(1)自己看论文的时候,每篇论文花3-5分钟记录一下自己的idea和一些瞬间的想法(2)高质量文献:顶会顶刊(3)如何检索 4.注重团队协作与学术交流5.…...
免费公共DNS服务器推荐
当自动获取的DNS或本地运营商的DNS出现问题,可能导致软件无法连接服务器。此时,手动修改电脑的DNS设置或许能解决问题。许多用户觉得电脑上网速度慢、游戏卡顿,归咎于DNS问题。确实,我们可以自行设置一个DNS来改善网络体验。不少用…...
CK-S650-PA60S半导体专用读写器|读写头与绿联RS232串口转接头联机测试说明
CK-S650-PA60S半导体专用读写器|读写头是一款国产替代欧姆龙V640系列,支持德州仪器公司(TI)制造的RI-TRP-DR2B、RI-TRP-WR2B-40低频玻璃管标签|射频标签读写,广泛应用半导体硅片盒、晶圆盒、花篮等RFID插件识别与产品追溯领域。 CK-S650-PA60S半导体专用…...
Babel 基础使用指南:从安装到编译的完整流程
Babel 是当今前端开发中不可或缺的工具,它允许开发者使用最新的 JavaScript 特性,同时确保代码能在各种浏览器和环境中运行。本文将带你从零开始学习 Babel 的基础使用,涵盖安装、配置到实际编译的全过程。 1. 安装 Babel 和插件 首先&…...