网络层(Internet Layer)

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

目录

  • 🚀 :🔥 前言
    • 🦋 IP 地址:网络中的“门牌号”
    • 🦋 IP 地址的组成
    • 🦋 IPv4 到 IPv6 的过渡
  • 一:🔥 IP 协议
    • 🦋 协议头格式
  • 二:🔥 网段划分 (重要)
    • 🦋 特殊的 IP 地址
    • 🦋 IP 地址的数量限制
    • 🦋 私有 IP 地址 和 公网 IP 地址
  • 三:🔥 路由
    • 🦋 [唐僧问路例子 1]
    • 🦋 [唐僧问路例子 2]
    • 🦋 路由表生成算法(选学)
  • 四:🔥 IP 分片和组装的具体过程
    • 🦋 分片
    • 🦋 组装
    • 🦋 分片的具体细节
    • 🦋 如何判断分片丢失
    • 🦋 分片与组装过程的示意图
  • 五:🔥 共勉

🚀 :🔥 前言

🧐 之前我们详细介绍了 传输层的 TCP 和 UDP 协议。当数据在应用层完成编写后,传输层会接收这些数据,并进行进一步封装,添加源端口号、目的端口号等信息。这样做的目的是确保数据包能够正确地交付给目标主机上的相应进程进行处理。那么,数据包是如何从一台主机传输到另一台主机的呢?今天,我们就要来介绍 IP 协议。

🛰️ 在理解 IP 协议之前,我们需要先清楚一个基础概念:什么是 IP 地址

🦋 IP 地址:网络中的“门牌号”

👑 IP 地址(Internet Protocol Address,互联网协议地址) 是分配给网络中每一台设备的标识符,用于在网络中定位和识别设备。有了 IP 地址,数据包就可以找到目标主机并进行传输。

🏎️ 不过,这里需要澄清一个常见的误解:IP 地址并不是设备的唯一标识符。 在网络中,仅靠 IP 地址是无法完全实现数据传输的。原因在于,网络中的设备数量太过庞大,而 IP 地址的数量是有限的。 例如,IPv4 地址已经无法满足当前互联网设备的需求。因此,我们还需要借助其他技术(如私有 IP 地址、网络地址转换等)来解决这些问题。

🦋 IP 地址的组成

🪜 IP 地址主要分为两种版本:IPv4IPv6

  1. IPv4 地址
    • IPv4 是目前使用最广泛的版本。它是一个 32 位的二进制数字,由 4 个字节组成,每个字节表示一个 0 到 255 之间的整数,通常以“点分十进制”的形式书写,例如:192.168.1.1
    • IPv4 地址支持大约 43 亿个(2³²)独立地址。虽然这个数字看起来很大,但由于互联网设备的爆发式增长,IPv4 地址已经近乎枯竭。为了应对这一问题,我们引入了 IPv6 地址。
  2. IPv6 地址
    • IPv6 是下一代 IP 地址协议,它是一个 128 位的二进制数字,由 16 个字节组成。IPv6 地址通常被划分为八组十六进制数字,每组之间用冒号(:)分隔,例如: 2001:0db8:85a3:0000:0000:8a2e:0370:7334。
    • IPv6 提供了 340 万亿个地址(2¹²⁸),这一数量远远超过了 IPv4 的地址数量,能够满足未来互联网设备的需求。

🦋 IPv4 到 IPv6 的过渡

🪁 虽然 IPv6 的优势显而易见,但地址版本的替换是一个非常复杂的过程。它面临着版本不兼容、设备升级、网络配置等多方面的挑战IPv4IPv6 的过渡需要协调各国和各地区的网络运营商、硬件厂商、软件供应商等,分阶段逐步推进。

🚢 在这个过程中,我们还会介绍一些过渡方案,例如网络地址转换(NAT)、私有 IP 地址等。这些技术可以帮助我们更高效地利用有限的 IPv4 地址资源,同时为 IPv6 的全面部署做好准备。

一:🔥 IP 协议

在这里插入图片描述
主机配有 IP 地址,但不进行路由控制。
路由器配有 IP 地址,能进行路由控制。
节点主机和路由器的统称。

🦋 协议头格式

  • 4 位版本号 (version) : 指定 IP 协议的版本, 对于 IPv4 来说, 就是 4.
  • 4 位头部长度 (header length) : IP 头部的长度是多少个 32bit, 也就是 length 4 的字节数. 4bit 表示最大的数字是 15, 因此 IP 头部最大长度是 60 字节.
  • 8 位服务类型 (Type Of Service) : 3 位优先权字段(已经弃用), 4 位 TOS 字段, 和 1 位保留字段(必须置为 0). 4 位 TOS 分别表示: 最小延时, 最大吞吐量, 最高可靠性,最小成本. 这四者相互冲突, 只能选择一个. 对于 ssh / telnet 这样的应用程序, 最小延时比较重要; 对于 ftp 这样的程序, 最大吞吐量比较重要.
  • 16 位总长度(total length) : IP 数据报整体占多少个字节.
  • 16 位标识(id) : 唯一的标识主机发送的报文. 如果 IP 报文在数据链路层被分片了, 那么每一个片里面的这个 id 都是相同的.
  • 3 位标志字段 : 第一位保留(保留的意思是现在不用, 但是还没想好说不定以后要用到). 第二位置为 1 表示禁止分片, 这时候如果报文长度超过 MTU, IP 模块就会丢弃报文. 第三位表示"更多分片", 如果分片了的话, 最后一个分片置为 0, 其他是 1. 类似于一个结束标记.
  • 13 位分片偏移(framegament offset) : 是分片相对于原始 IP 报文开始处的偏移. 其实就是在表示当前分片在原报文中处在哪个位置. 实际偏移的字节数是这个值 8 得到的. 因此, 除了最后一个报文之外, 其他报文的长度必须是 8 的整数倍(否则报文就不连续了).
  • 8 位生存时间(Time To Live, TTL) : 数据报到达目的地的最大报文跳数. 一般是 64. 每次经过一个路由, TTL -= 1, 一直减到 0 还没到达, 那么就丢弃了. 这个字段主要是用来防止出现路由循环
  • 8 位协议 : 表示上层协议的类型
  • 16 位头部校验和: 使用 CRC 进行校验, 来鉴别头部是否损坏.
  • 32 位源地址和 32 位目标地址: 表示发送端和接收端.
  • 选项字段 (不定长, 最多 40 字节): 略

二:🔥 网段划分 (重要)

💲 IP 地址分为两个部分, 网络号 和 主机号

  • 网络号 : 表示保证相互连接的两个网段具有不同的标识;
  • 主机号 : 表示同一网段内, 主机之间具有相同的网络号, 但是必须有不同的主机号;
    在这里插入图片描述
  • 不同的子网其实就是把网络号相同的主机放到一起.
  • 如果在子网中新增一台主机, 则这台主机的网络号和这个子网的网络号一致, 但是主机号必须不能和子网中的其他主机重复.

🐍 通过合理设置主机号和网络号, 就可以保证在相互连接的网络中, 每台主机的 IP 地址都不相同.

🌧️ 那么问题来了, 手动管理子网内的 IP, 是一个相当麻烦的事情.

  • 有一种技术叫做 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 类却浪费了大量地址;

  • 例如, 申请了一个 B 类地址, 理论上一个子网内能允许 6 万 5 千多个主机. A 类地址的子网内的主机数更多.
  • 然而实际网络架设中, 不会存在一个子网内有这么多的情况. 因此大量的 IP 地址都被浪费掉了

☂️ 针对这种情况提出了新的划分方案, 称为 CIDR(Classless Interdomain Routing):

  • 引入一个额外的 子网掩码 (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 次方 个 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 地址, 一个是 WAN 口 IP , 一个是 LAN 口 IP(子网 IP) .
  • 路由器 LAN 口连接的主机, 都从属于当前这个路由器的子网中.
  • 不同的路由器, 子网 IP 其实都是一样的 (通常都是 192.168.1.1). 子网内的主机 IP 地址不能重复. 但是子网之间的 IP 地址就可以重复了
  • 每一个家用路由器, 其实又作为运营商路由器的子网中的一个节点. 这样的运营
    商路由器可能会有很多级, 最外层的运营商路由器, WAN 口 IP 就是一个公网 IP 了.
  • 子网内的主机需要和外网进行通信时, 路由器将 IP 首部中的 IP 地址进行替换 (替换成 WAN 口 IP), 这样逐级替换, 最终数据包中的 IP 地址成为一个公网 IP. 这种技术称为 NAT(Network Address Translation, 网络地址转换).
  • 如果希望我们自己实现的服务器程序, 能够在公网上被访问到, 就需要把程序部署在一台具有外网 IP 的服务器上. 这样的服务器可以在阿里云/腾讯云上进行购买

三:🔥 路由

🫎 在复杂的网络结构中, 找出一条通往终点的路线;

🦋 [唐僧问路例子 1]

🎩 路由的过程, 就是这样一跳一跳 (Hop by Hop) “问路” 的过程.

🍑 所谓 “一跳” 就是 数据链路层中的一个区间. 具体在以太网中指从 源 MAC 地址目的 MAC 地址 之间的帧传输区间.

在这里插入图片描述
🦬 IP 数据包的传输过程也和问路一样.

  • 当 IP 数据包, 到达路由器时, 路由器会先查看目的 IP;
  • 路由器决定这个数据包是能直接发送给目标主机, 还是需要发送给下一个路由器;
  • 依次反复, 一直到达目标 IP 地址;

🥘 那么如何判定当前这个数据包该发送到哪里呢?

  • 这个就依靠每个节点内部维护一个路由表;

🦋 [唐僧问路例子 2]

在这里插入图片描述

  • 路由表可以使用 route 命令查看
  • 如果目的 IP 命中了路由表, 就直接转发即可;
  • 路由表中的最后一行,主要由下一跳地址和发送接口两部分组成,当目的地址与路由表中其它行都不匹配时,就按缺省路由条目规定的接口发送到下一跳地址。

📚 假设某主机上的网络接口配置和路由表如下:
在这里插入图片描述

  • 这台主机有两个网络接口,一个网络接口连到 192.168.10.0/24 网络,另一个网络接口连到 192.168.56.0/24 网络;
  • 路由表的 Destination 是目的网络地址, Genmask 是子网掩码, Gateway 是下一跳地址, Iface 是发送接口, 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 路由器根据它的路由表决定下一跳地址

🦋 路由表生成算法(选学)

路由表生成算法是网络通信中的一个重要组成部分,它决定了数据包在网络中的传输路径。最短通路算法是路由表生成中常用的算法之一,它能够智能地计算出网络中各节点间的最短路径,从而优化网络传输速度。常见的最短通路算法包括:

  • Dijkstra 算法:一种基于贪心策略的单源最短路径算法,从源节点开始,逐步增加网络图中距离源点最近的顶点,直到计算出所有节点的最短路径。
  • Bellman-Ford 算法:一种动态规划算法,可以处理带有负权边的图,但不允许有负权回路。
  • A* 算法:一种启发式搜索算法,它结合了 Dijkstra 算法和贪心搜索的优点,通过估计从当前节点到目标节点的距离来寻找最短路径。

在网络优化中,最短通路算法能够计算出网络中节点间的最短路径,从而优化路由选择,提高数据包传输速度,减少网络拥塞,并通过动态调整路由表来适应网络拓扑结构的变化。OSPF(开放最短路径优先)是一种链路状态路由协议,它利用Dijkstra算法计算网络中各节点间的最短路径,并构建最优路由表。

路由表的生成方式包括静态配置和动态协议学习。静态配置是指网络管理员手动在网络设备上添加路由条目。动态协议学习是通过动态路由协议自动生成和维护路由表,常见的动态路由协议有RIP、OSPF、BGP 等。这些协议允许路由器之间自动交换路由信息,根据网络拓扑的变化动态调整路由表

四:🔥 IP 分片和组装的具体过程

🤔 为了讨论 IP 报文的分片问题,我们先思考一下为什么 TCP 协议中滑动窗口中的数据,不打包成一个报文发送呢?为什么要一段一段的发?

首先,传输层要依次将报文向下层发送(数据段–>数据报–>数据帧),由于数据链路层规定,单次发送数据帧的有效载荷不能超过 MTU(最大传输单元),当一个 IP 数据报的大小超过了网络的 MTU 限制时,就需要进行分片!

分片组装场景

所以,当 IP报文太长时,要进行分片;但是谁来分片呢?网络层自己分,因此网络层报头中多了3个字段。
首次我们要明确一下,分片是好还是不好呢?

不好,丢包概率增加了。

  • 传输层向下发送一个X大小的报文段,对端传输层就只关心收到的报文段大小是不是X,它不关心是否分片了
  • 分片以后,发送的包更多了,丢包的概率增加了;对端网络层无法对包进行组装,因此就会被传输层判定为丢包。
  • 所以,丢包不仅仅是在“路上”丢,也有可能是分片后导致拼不起来了,造成丢包

所以,分片不能作为网络发送的主流,那如何不分片呢?

  • 网络层不要发太长的报文,但是网络层决定不了,真正决定发多少的是传输层,所以问题的根源就是传输层不要发太长的报文段,所以滑动窗口才会一段一段的发(它考虑了分片的问题)

🦋 分片

  1. 检查 MTU 限制:
    • 当一个 IP 数据报的大小超过了网络的 MTU(最大传输单元) 限制时, 就需要进行分片。 MTU 是数据链路层对 IP 层数据包进行封装时所能接受的最大数据长度。
  2. 分割数据报:
    • IP 层将原始的 IP 数据报分割成多个较小的片段。
    • 对于每个片段, IP 层会设置相应的标识(Identification) 、 偏移量(Fragment Offset) 和标志位(Flags) 等字段。
    • 标识字段用于标识属于同一个数据报的不同分片, 确保所有分片能够被正确地重新组装。
    • 偏移量字段指示了当前分片相对于原始数据报的起始位置, 以 8 字节为单位。
    • 标志位字段包含了 3 个位, 其中 MF(More Fragment) 位用于指示是否还有更多的分片, DF(Do Not Fragment) 位用于指示数据报是否允许进行分片。
  3. 添加 IP 头部:
    • 每个分片都会加上自己的 IP 头部, 与完整 IP 报文拥有类似的 IP 头结构, 但 MF 和 Fragment Offset 等字段的值会有所不同。
  4. 发送分片:
    • 分片在传输过程中独立传输, 每个分片都有自己的 IP 头部, 并且各自独立地选择路由。

🦋 组装

  1. 接收分片:
    • 当目的主机的 IP 层接收到这些分片后, 会根据标识字段将属于同一个数据报的所有分片挑选出来。
  2. 排序与组装:
    • 利用片偏移字段, IP 层会对属于同一个数据报的分片进行排序。
    • 当所有的分片都到达并正确排序后, IP 层会将这些分片重新组装成一个完整的 IP 数据报。
  3. 传递给上层协议:
    • 组装好的 IP 数据报会传递给上层的协议进行处理。

在这里插入图片描述

那么这里就要讲讲:

  • 16 位标识(id) : 唯一的标识主机发送的报文. 如果 IP 报文在数据链路层被分片了, 那么每一个片里面的这个 id 都是相同的.
  • 3 位标志字段 : 第一位保留(保留的意思是现在不用, 但是还没想好说不定以后要用到). 第二位置为 1 表示禁止分片, 这时候如果报文长度超过 MTU, IP 模块就会丢弃报文. 第三位表示"更多分片", 如果分片了的话, 最后一个分片置为 0, 其他是 1. 类似于一个结束标记.
  • 13 位分片偏移(framegament offset) : 是分片相对于原始 IP 报文开始处的偏移. 其实就是在表示当前分片在原报文中处在哪个位置. 实际偏移的字节数是这个值 8 得到的. 因此, 除了最后一个报文之外, 其他报文的长度必须是 8 的整数倍(否则报文就不连续了).

🦋 分片的具体细节

  1. 有效载荷的分片
    IP报文的有效载荷是进行分片的主要对象。分片时,数据包被分割成多个片段,每个片段都包含一部分原始数据。

  2. 片偏移
    片偏移是指每个分片相对于原始IP报文有效载荷的开始位置的偏移量。这个偏移量必须是8字节的整数倍,因为IP分片的偏移量字段以8字节为单位。

  3. 分片包含IP报头
    每个分片都是一个完整的IP报文,这意味着每个分片都包含自己的IP报头。这样做是为了确保即使在分片过程中发生错误,每个分片也能够被正确地路由和处理。

🦋 如何判断分片丢失

在这里插入图片描述

在网络传输过程中,可能会发生分片丢失的情况。

假设原始数据包的大小为 3020 字节,MTU 为 1500 字节,那么分片丢失情况如下:

  • 第一个分片:
    • 此时 16位标识:6666
    • 更多分片:1
    • 片偏移:0
    • 大小:1480字节(1500字节MTU - 20字节IP头)
  • 第二个分片(中间分片):
    • 16位标识:6666
    • 更多分片:1
    • 片偏移:185(1480字节 / 8字节,向上取整)
    • 大小:1480字节
  • 第三个分片:
    • 16位标识:6666
    • 更多分片:0
    • 片偏移:370(2960字节 / 8字节,向上取整)
    • 大小:60字节(3020字节 - 2*1480字节)

此时假设第一个丢了 那么片偏移为 0 的分片就没有了,能判断出分片丢失,如果中间的丢了 那么片偏移也对不上,如果最后一个丢了 那么更多分片为 0 的结尾没了,也能判断出分片丢失,这也就解决了接收方如何确定自己收到收全了

🦋 分片与组装过程的示意图

在这里插入图片描述

五:🔥 共勉

以上就是我对 【linux】网络层 的理解,觉得这篇博客对你有帮助的,可以点赞收藏关注支持一波~😉
在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/978067.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

final / 抽象类与抽象方法 / 接口

1. final 关键字 final:最终的 1.final可以用来修饰的结构:类,方法,变量 2.final用来修饰一个类:此类不能被其它类继承; 如 String类,System类,StringBuffer类 3.final用来修饰…

DeepSeek开源周Day1:FlashMLA引爆AI推理性能革命!

项目地址:GitHub - deepseek-ai/FlashMLA 开源日历:2025-02-24起 每日9AM(北京时间)更新,持续五天! ​ 一、开源周震撼启幕 继上周预告后,DeepSeek于北京时间今晨9点准时开源「FlashMLA」,打响开源周五连…

9.编写负载均衡模块|编写judge功能|postman进行调试(C++)

编写负载均衡模块 代码整体结构 oj_control.hpp // code: #include... // input: "" void Judge(const std::string &number, const std::string in_json, std::string *out_json) {// 0. 根据题目编号,直接拿到对应的题目细节// 1. in_json进行反…

安装react报错

安装react报错 背景 执行命令npx create-react-app my-app,然后出现报错unable to resolve dependency tree 解决: 出现这个报错是因为依赖包版本出现冲突,查看package.json可以看到react版本是19.0.0,但是testing-library/rea…

CAD实现一键 面域转线(闭合多段线)——CAD c#二次开发

CAD中存在面域(region),当用系统自带命令是,生成的是断开的直线Line。 此插件可实现面域转为闭合的多段线(Polyline)。效果如下: 一次转600个图形 部分代码如下: public class 面…

快速理解Raft分布式共识算法

目录 拜占庭将军问题 Raft算法是干什么的? 一、领导选举(选老板) 二、日志复制(发通知) 三、安全性(防篡改) 🌰 举个真实例子 ✔️ Raft的优势 基础 状态机 节点类型 任期…

Python学习第十七天之PyTorch保姆级安装

PyTorch安装与部署 一、准备工作二、pytorch介绍三、CPU版本pytorch安装1. 创建虚拟环境2. 删除虚拟环境1. 通过环境名称删除2. 通过环境路径删除 3. 配置镜像源4. 安装pytorch1. 首先激活环境变量2. 进入pytorch官网,找到安装指令 5. 验证pytorch是否安装成功 四、…

Para-Lane: 首个真实世界多车道数据集,目的评估自动驾驶系统中的新型视角合成能力。

2025-02-22,阿里巴巴集团菜鸟自动驾驶实验室和百度研究院共同创建了一个名为 Para-Lane 的真实世界多车道数据集。该数据集目的评估自动驾驶系统中的新型视角合成(NVS)能力,通过提供大量真实世界的数据,弥补了现有合成…

Linux | Ubuntu 与 Windows 双系统安装 / 高频故障 / UEFI 安全引导禁用

注:本文为 “buntu 与 Windows 双系统及高频故障解决” 相关文章合辑。 英文引文,机翻未校。 How to install Ubuntu 20.04 and dual boot alongside Windows 10 如何将 Ubuntu 20.04 和双启动与 Windows 10 一起安装 Dave’s RoboShack Published in…

flutter 专题 八十二 Flutter路由框架Fluro简介

在Flutter应用开发过程中,除了使用Flutter官方提供的路由外,还可以使用一些第三方路由框架来实现页面管理和导航,如Fluro、Frouter等。 Fluro作为一款优秀的Flutter企业级路由框架,Fluro的使用比官方提供的路由框架要复杂一些&…

(十)趣学设计模式 之 外观模式!

目录 一、 啥是外观模式?二、 为什么要用外观模式?三、 外观模式的实现方式四、 外观模式的优缺点五、 外观模式的应用场景六、 总结 🌟我的其他文章也讲解的比较有趣😁,如果喜欢博主的讲解方式,可以多多支…

为AI聊天工具添加一个知识系统 之124 详细设计之65 人类文化和习俗,即文化上的差异-根本差异 之2

本文要点 要点 “取” 本身 是一个具有 主谓宾 三格的 多“格”词。 三“格”(主/谓/宾)分别是: 主取,取法(能取:两组分别 是 析取取“异”(三个“不同”)和合取取“同”&#xf…

AXI协议详解及FPGA仿真

AXI协议详解及FPGA仿真 1 摘要 AMBA AXI 协议是以高性能,高频系统设计为目标,提供了很多适合高速亚微型系统互连的特征。为相邻存储器连续进行数据传输提供的一种高频率,高带宽,低延迟的总线协议,是一种突发传输协议…

互联网怎样利用人性-思维导图-markdown

互联网怎样利用人性 傲慢 留言、点评饥饿营销、吵架营销 懒惰 一键下单、扫二维码默认登录、多平台同步单点登录SSO美女论坛、美女头像事业线开箱防御力破女性装饰 贪婪 团购、秒杀、抽奖免费试吃、下载存储空间、在家赚钱晒单返现 窥视 订阅、悄悄关注名人博客微博、惊人标题…

javascript-es6 (五)

内置构造函数 在 JavaScript 中 最主要 的数据类型有 6 种: 基本数据类型: 字符串、数值、布尔、undefined、null 引用类型: 对象 但是,我们会发现有些特殊情况: //普通字符串 const str peiqi console.log(str.length) //…

Hive从入门到运用

hive简介 hive的设计思想(本质是一个翻译器) 上传安装包 解压,查看 运行hive(一定要启动hadoop,是有依赖关系的。) 测试启动方法,和建表 文件创建很上传到hdfs,直接上传到hive表的目…

RK3588部署YOLOv8(1):YOLOv8和YOLOv8-pose转ONNX及Python后处理代码实现

前言 由于种种原因,原始的YOLOv8系列的模型,在RK3588上难以部署,在 .pt 转 .onnx 的时候需要去掉后处理层(主要是DFL层)。因此,模型的后处理需要自己来实现。 本文基于Rockship 官方给的源码(导…

Lua的table(表)

Lua表的基本概念 Lua中的表(table)是一种多功能数据结构,可以用作数组、字典、集合等。表是Lua中唯一的数据结构机制,其他数据结构如数组、列表、队列等都可以通过表来实现。 表的实现 Lua的表由两部分组成: 数组部分…

权限(1)

权限1 一、shell命令及运行原理二、linux中的用户1、身份切换 2、sudo :指令的短暂提权(输入用户自己的密码)3、权限理解4、拥有者,所属组,other5,文件属性6、修改权限(角色 / 属性)…

【实战】使用PCA可视化神经网络提取后的特征空间【附源码】

《------往期经典推荐------》 一、AI应用软件开发实战专栏【链接】 项目名称项目名称1.【人脸识别与管理系统开发】2.【车牌识别与自动收费管理系统开发】3.【手势识别系统开发】4.【人脸面部活体检测系统开发】5.【图片风格快速迁移软件开发】6.【人脸表表情识别系统】7.【…