跳转到主内容
极星编程网:以代码为星,赴技术山海!

【网络协议详解】——IPv4(学习笔记)

目录 🕒 1. IPv4地址概述 🕒 2. 分类编址 🕒 3. 划分子网 🕘 3.1 概述 🕘 3.2 如何实现 🕘 3.3 无分类编址 🕘 3.4 应用规划 🕤 3.4.1 定长的子网掩码FLSM(Fixed Length Subnet Mask) 🕤 3.4.2 变长的子网掩码VLSM(Variable Length Subnet Mask) 🕒 4. IPv4数据报的首部格式 🕒 5. 网际控制报文协议ICMP 🕘 5.1 差错报告报文类型 🕤 5.1.1 终点不可达 🕤 5.1.2 源点抑制 🕤 5.1.3 时间超过 🕤 5.1.4 参数问题 🕤 5.1.5 改变路由(重定向) 🕘 5.2 询问报文类型 🕤 5.2.1 回送请求和回答 🕤 5.2.2 时间戳请求和回答 🕘 5.3 不发送ICMP的情况 🕘 5.4 ICMP应用举例 🕒 6. 实验:IP组网规划设计 🕒 1. IPv4地址概述 IPv4地址就是因特网上的 每一台主机(或路由器)的每一个接口 分配一个在全世界范围内是 唯一的32比特的标识符 。

IP地址由因特网名字和数字分配机构ICANN(Internet Corporation for Assigned Names and Numbers)进行分配。

我国用户可向亚太网络信息中心APNIC(Asia Pacific Network Information Center)申请IP地址,需要缴费。

2011年2月3日,互联网号码分配管理局IANA (由ICANN行使职能)宣布,IPv4地址已经分配完毕。

我国在2014至2015年也逐步停止了向新用户和应用分配IPv4地址。

同时全面开展商用部署IPv6。

lPv4地址的编址方法经历了如下 三个历史阶段 :分类编址(1981年)、划分子网(1985年)、无分类编址(1993年)

32

比特的IPv4地址不方便阅读、记录以及输入等,因此IPv4地址采用 点分十进制 表示方法以方便用户使用。

进制转换 十进制→二进制:除2取余法、观察法 二进制↔八进制:每3个二进制位对应一个八进制位 二进制↔十六进制:每4个二进制位对应一个十六进制位 🕒 2. 分类编址

A类、B类和C类 地址都是 单播地址 ,只有单播地址可分配给网络中的主机或路由器的各接口 主机号为“ 全0 ”的地址是 网络地址 ,不能分配给主机或路由器的各接口 主机号为“ 全1 ”的地址是 广播地址 ,不能分配给主机或路由器的各接口 网络类型第一个可指派的网络号最后一个可指派的网络号不能指派的网络号占总地址空间IP地址范围网络数量及主机数量A类地址11260和1271/21.0.0.1~126.255.255.254126(28-1-2)个,每个网络能容纳16,777,214(224-2)个主机B类地址128.0191.255无1/4128.0.0.1~191.255.255.25416384(216-2)个,每个网络能容纳65534(216-2)个主机C类地址192.0.0223.255.255无1/8192.0.0.1~223.255.255.2542097152(224-3)个,每个网络能容纳254(28-2)个主机D类地址多播地址1/16224.0.0.1~239.255.255.254E类地址保留为今后使用1/16240.0.0.1~255.255.255.254 A类地址网络号 第1位固定为0 ,网络号后面部分 不能全0 (保留不指派),也 不能全1 (作为本地环回测试地址),其中最小的本地环回测试地址为

127.0.0.1

,最大的本地环回测试地址为

127.255.255.254

。

所以网络号范围是1~126 B类地址网络号 前2位固定为10 ,网络号后面部分 可以全取0(即128.0)或1(即191.255) ,所以网络号范围是128.0~191.255 C类地址网络号 前3位固定为110 ,网络号后面部分 可以全取0(即192.0.0)或1(即223.255.255) ,所以网络号范围是192.0.0~223.255.255 D类地址为多播地址,IP地址为224.0.0.0~239.255.255.255 注: 地址

0.0.0.0

是一个特殊的IPv4地址,只能作为源地址使用,表示“在本网络上的本主机”。

封装有DHCP Discovery报文的IP分组的源地址使用0.0.0.0; 以127开头且后面三个字节非“全0”或“全1”的IP地址是一类特殊的IPv4地址,既可以作为源地址使用,也可以作为目的地址使用,用于本地软件环回测试,例如常用的环回测试地址

127.0.0.1

; 地址

255.255.255.255

是一个特殊的IPv4地址,只能作为目的地址使用,表示“只在本网络上进行 广播 (各路由器均不转发)”。

一般不使用的特殊IP地址 : 网络号主机号IP地址作为源地址作为目的地址表示的意思 000.0.0.0可以不可以在本网络上的本主机(例如,DHCP协议)0host-id0.host-id可以不可以在本网络上的某台主机host-id全1全1255.255.255.255不可以可以只在本网络上进行广播(各路由器均不转发)net-id全1A类:net-id.255.255.255;B类:net-id.255.255;C类:net-id.255不可以可以对网络net-id上的所有主机进行广播127非全0或全1的任何数127.0.0.1~127.255.255.254可以可以用于本地软件环回测试 【练习】请给出下图各网络的IPv4地址分配方案,要求尽量节约IP地址。

解析:1. 找出图中有哪些网络;2. 根据各网络中主机和路由器的接口总数量给各网络分配相应类别的网络号。

3.依据所确定的网络号类别,为每个网络挑选一个网络号。

🕒 3. 划分子网 🕘 3.1 概述 为什么需要划分子网?

比如一个单位有300台主机,如果申请C类网络地址,只有254个,不够使用,此时需要申请一个B类网络地址,很容易得知,分配出去300个IP地址后,申请得到的B类网络还剩下很多IP地址。

当单位扩大规模,需要再添加两个子网的时,又要为这两个子网分别申请B类地址,这会花费一些不必要的支出,实际上子网1申请到的B类地址还有很多没用到,我们希望能够将这些剩余地址应用到其他子网中(节约地址),具体实现上可以从主机号部分借用一部分比特作为子网号。

🕘 3.2 如何实现 32比特的子网掩码可以表明分类IP地址的主机号部分被借用了几个比特作为子网号 : 子网掩码使用 连续的比特1 来对应 网络号和子网号 (子网号来自原先的一部分主机号); 子网掩码使用 连续的比特0 来对应 主机号 ; 将划分子网的

IPv4

地址与其相应的 子网掩码 进行 逻辑与运算 (即掩码是1的部分)就可得到IPv4地址 所在子网的网络地址 。

【习题】已知某个网络的地址为218.75.230.0,使用子网掩码255.255.255.128对其进行子网划分,请给出划分细节。

解析:根据所给网络地址可知其为C类网络地址,网络号占3字节,主机号占1字节;根据所给子网掩码可知,从1字节主机号中借用1比特作为子网号。

划分出的子网数量:2 1 = 2 每个子网可分配的地址数量:2 (8-1) – 2 = 126 (减2是去掉主机号为全0的网络地址和全1的广播地址)

【练习】已知某个网络的地址为145.13.0.0,使用子网掩码255.255.192.0对其进行子网划分,请给出划分细节。

解析:根据所给网络地址可知其为B类网络地址,网络号和主机号各占2字节;根据所给子网掩码可知,从2字节主机号中借用2比特作为子网号。

划分出的子网数量:2 2 = 4 每个子网可分配的地址数量:2 (16-2) – 2

【2012年题39】某主机的IP地址为180.80.77.55,子网掩码为255.255.252.0,如该主机向其所在子网发送广播分组,则目的地址可以是() A.180.80.76.0 B.180.80.76.255 C.180.80. D.180.80.79.255 解析:由题目可知这是一个B类网络地址,将子网掩码的主机号部分转换为16个二进制比特,即1111 1100.0000 0000,其中有6个连续的比特1表示从主机号中借用6个比特作为子网号。

将IP地址的主机号部分转换为二进制形式,即0100 1101.0011 0111,然后将子网掩码中连续6个比特1所对应的主机号部分作为子网号。

因此本题选D。

默认的子网掩码 :是指在未划分子网的情况下使用的子网掩码。

🕘 3.3 无分类编址 划分子网在一定程度上缓解了因特网在发展中遇到的困难,但是 数量巨大的C类网 因为其 地址空间太小 并 没有得到充分使用 ,而因特网的IP地址仍在加速消耗,整个IPv4地址空间面临 全部耗尽 的威胁。

为此,因特网工程任务组IETF又提出了采用 无分类编址 的方法来解决IP地址紧张的问题,同时还专门成立IPv6工作组负责研究新版本IP以彻底解决IP地址耗尽问题。

1993年,IETF发布了 无分类域间路由选择CIDR (Classless Inter-Domain Routing)的RFC文档:RFC 1517~1519和1520。

CIDR消除了传统的A类、B类和C类地址,以及划分子网的概念 ; CIDR可以更加有效地分配IPv4的地址空间 ,并且可以在新的IPv6使用之前允许因特网的规模继续增长。

CIDR使用“ 斜线记法 ”,或称CIDR记法。

即在

IPv4

地址后面加上斜线“

/

”,在 斜线后面写上网络前缀所占的比特数量 。

CIDR实际上是 将网络前缀都相同的连续的IP地址组成一个“CIDR地址块” 。

我们只要知道CIDR地址块中的任何一个地址,就可以知道该地址块的全部细节。

地址块的 最小地址 地址块的 最大地址 地址块中的 地址数量 地址块 聚合某类网络(A类、B类或C类)的数量 地址掩码 (也可继续称为子网掩码) 例1 :请给出CIDR地址块128.14.35.7/20的全部细节(最小地址,最大地址,地址数量,聚合C类网数量,地址掩码)。

解析:

使用无分类编址方法,可以根据客户的需要 分配适当大小的CIDR地址块 ,因此可以更加有效地分配IPv4的地址空间。

使用无分类编址方法的另一个好处是路由聚合(也称为构造超网)。

路由聚合 (构造超网) 【举例】

网络前缀越长,地址块越小,路由越具体 ; 若路由器查表转发分组时发现有多条路由可选,则选择网络前缀最长的那条,这称为 最长前缀匹配 ,因为这样的路由更具体。

【2011年题38】在子网192.168.4.0/30中,能接收目的地址为192.168.4.3的IP分组的最大主机数是( ) A.0 B.1 C.2 D.4 解析:

因此选C。

【2018年题38】某路由表中有转发接口相同的4条路由表项,其目的网络地址分别为35.230.32.0/21、35.230.40.0/21、35.230.48.0/21和35.230.56.0/21,将该4条路由聚合后的目的网络地址为() A.35.230.0.0/19 B.35.230.0.0/20 C.35.230.32.0/19 D.35.230.32.0/20 解析:路由聚合的方法:找共同前缀

🕘 3.4 应用规划 IPv4地址的应用规划是指将给定的IPv4地址块(或分类网络)划分成若干个更小的地址块(或子网),并将这些地址块(或子网)分配给互联网中的不同网络,进而可以给各网络中的主机和路由器的接口分配IPv4地址。

🕤 3.4.1 定长的子网掩码FLSM(Fixed Length Subnet Mask) 使用 同一个子网掩码 来划分子网。

子网划分方式 不灵活 :只能划分出2 n 个子网(n是从主机号部分借用的用来作为子网号的比特数量) 每个子网所分配的 IP地址数量相同 ,造成lP地址的浪费。

【举例】假设申请到的C类网络为218.75.230.0,请使用定长的子网掩码给下图所示的小型互联网中的各设备分配IP地址。

应用需求:将C类网络218.75.230.0划分成5个子网,每个子网上可分配的IP地址数量不得少于各自的需求。

即网络1需要IP地址数量为9,网络2需要IP地址数量为28,网络3需要IP地址数量为15,网络4需要IP地址数量为13,网络5需要IP地址数量为4。

🕤 3.4.2 变长的子网掩码VLSM(Variable Length Subnet Mask) 使用 不同的子网掩码 来划分子网。

子网划分方式灵活:可以按需分配 每个子网所分配的 IP地址数量可以不同 ,尽可能减少对IP地址的浪费。

【举例】假设申请到的地址块为218.75.230.0/24,请使用变长的子网掩码给下图所示的小型互联网中的各设备分配IP地址。

应用需求:从地址块218.75.230.0/24中取出5个地址块(1个“/27”地址块,3个“/28”地址块,1个“/30"地址块),按需分配给上图所示的5个网络。

在218.75.230.0/24地址块中给上图所示的网络N1~N5分配子块,分配原则是“ 每个子块的起点位置不能随意选取,只能选取块大小整数倍的地址作为起点 ”。

建议先给大的子块分配。

如果从小的开始分配:

🕒 4. IPv4数据报的首部格式 IPv4数据报的首部格式及其内容是实现IPv4协议各种功能的基础。

在TCP/IP标准中,各种数据格式常常以

32

比特(即4字节)为单位来描述。

固定部分是指每个IPv4数据报都 必须要包含的部分 。

某些IPv4数据报的首部,除了包含20字节的固定部分,还包含一些 可选的字段 来增加IPv4数据报的功能。

IPv4数据报首部中的各字段或某些字段的组合,用来表达IPv4协议的相关功能。

版本 占

4

比特,表示IP协议版本。

通信双方使用的IP协议版本必须一致。

目前广泛使用的IP协议版本为号为

4

(

IPv4

) 首部长度 占

4

比特,表示IP数据报首部长度。

该字段取值以 4字节为单位 最小十进制取值为

5

,表示IP数据报首部只有

20

字节(

4

字节单位,所以取值

5

对应

20

字节) 固定部分 最大十进制取值为

15

,表示IP数据报首部包含

20

字节固定部分 + 最大

40

字节可变部分 可选字段 长度从

1

到

40

个字节不等。

用来支持 排错、测量及安全 等措施 可选字段增加了 IP数据报 的功能,但这同时也 使得IP数据报的首部长度成为可变的。

这就增加了每一个路由器处理IP数据报的开销 。

实际上可选字段很少被使用 填充字段 确保首部长度为

4

字节长度的整数倍,使用全

0

进行填充 区分服务 占

8

比特,利用该字段的不同数值可提供不同等级的服务质量,只有在使用区分服务时,该字段才起作用。

一般情况下不使用该字段 总长度 占

16

比特,表示 IP数据报 的总长度( 首部+数据载荷 ),最大取值为十进制

65535

, 以字节为单位 标识 占

16

比特,属于同一个数据报的各分片数据报应该具有相同的标识(可理解为ID) IP软件维持一个计数器,每产生一个数据报,计数器值

+1

,并将此值赋给标识字段 标志 占

3

比特,各比特含义如下

DF

位:

1

表示不允许分片,

0

表示允许分片

MF

位:

1

表示"后面还有分片",

0

表示"这是最后一个分片" 保留位:必须为

0

片偏移 (必须是8的整数倍) 占

13

比特,指出分片数据报的数据载荷部分偏移其在原数据报的位置有多少单位 片偏移以

8

个字节为单位 以上三个字段共同用于IP数据报分片:

【举例】某个IPv4数据报总长度为3820字节,采用20字节固定首部,根据数据链路层要求,需要将该IPv4数据报分片为长度不超过1420字节的数据报片。

总长度标识MFDF片偏移 原始数据报3800+2012345000 / 8 = 0分片1的数据报1400+2012345100 / 8 = 0分片2的数据报1400+2012345101400 / 8 = 175分片3的数据报1000+2012345002800 / 8 = 350 生存时间 TTL 占

8

比特,最初以秒为单位,最大生存周期为

255

秒;路由器转发IP数据报时,将IP数据报首部中的该字段值减去IP数据报在本路由器上耗费的时间,若不为

0

(说明路由器消耗时间后还活着)就转发,否则丢弃 现在以" 跳数 "为单位,路由器转发IP数据报时,将IP数据报首部中的该字段值减

1

,若不为

0

就转发,否则丢弃(防止兜圈) 协议 占

8

比特,指明

IPv4

数据报的数据部分是何种协议数据单元PDU 常用的一些协议和相应的协议字段值如下: 协议名称

ICMP

IGMP

TCP

UDP

IPv6

OSPF

协议字段值

1

2

6

17

41

89

\begin{array}{|c|c|c|c|c|c|c|} \hline \text { 协议名称 } & \text { ICMP } & \text { IGMP } & \text { TCP } & \text { UDP } & \text { IPv6 } & \text { OSPF } \\ \hline \text { 协议字段值 } & 1 & 2 & 6 & 17 & 41 & 89 \\ \hline \end{array}协议名称协议字段值​ICMP1​IGMP2​TCP6​UDP17​IPv641​OSPF89​​ 首部检验和 占

16

比特,用来检测首部在传输过程中是否出现差错,比

CRC

检验码简单,称为 因特网检验和 IP数据报每经过一个路由器,路由器都要重新计算首部检验和,因为某些字段(生存时间、标志、片偏移等)的取值可能发生变化 由于IP层本身 不提供可靠传输 服务,并且计算首部校验和是一项耗时的操作,因此在

IPv6

中,路由器不再计算首部校验和,从而更快转发IP数据报 源IP地址和目的IP地址 各占

32

比特,用来填写发送该IP数据报的源主机IP地址和接收该IP数据报的目的主机 【2018年题47】某公司网络下图所示。

IP地址空间192.168.1.0/24被均分给销售部和技术部两个子网,并已分别为部分主机和路由器接口分配了IP地址,销售部子网的MTU=1500B,技术部子网的MTU=800 B. (2)假设主机192.168.1.1向主机192.168.1.208发送一个总长度为1500B的IP分组,IP分组的头部长度为20B,路由器在通过接口F1转发该IP分组时进行了分片。

若分片时尽可能分为最大片,则一个最大IP分片封装数据的字节数是多少?

至少需要分为几个分片?

每个分片的片偏移量是多少?

解析:

具体方法:向下取整 ⌊

(

780

÷

8

)

⌋

×

8

=

97

×

8

=

776

\lfloor (780 \div 8) \rfloor \times 8 = 97 \times 8 = 776⌊(780÷8)⌋×8=97×8=776

从图中可知,主机的默认网关就是路由器R,主机会将Web请求发送给默认网关,由默认网关将Web请求转发到因特网。

因此,以太网帧头中的目的MAC地址字段,封装的就是默认网关的MAC地址。

具体为00-21-27-21-51-ee IP分组经过路由器R时,生存时间字段被减1;首部检验和会被重新计算;若IP分组总长度大于MTU,则需要进行分片。

此时总长度字段、标志字段、片偏移字段都需要修改。

🕒 5. 网际控制报文协议ICMP 为了更有效地转发IP数据报和提高交付成功的机会,在网际层使用了网际控制报文协议ICMP 主机或路由器使用ICMP来发送 差错报告报文 和 询问报文 ICMP报文被封装在 IP数据报 中发送

🕘 5.1 差错报告报文类型 ICMP差错报告报文共有以下五种: 🕤 5.1.1 终点不可达 当路由器或主机不能交付数据报时,就向源点发送终点不可达报文。

具体可再根据ICMP的代码字段细分为目的网络不可达、目的主机不可达、目的协议不可达、目的端口不可达、目的网络位置、目的主机未知等13种错误

🕤 5.1.2 源点抑制 当路由器或主机由于 拥塞 而丢弃数据报时,就向源点发送源点抑制报文,使源点知道应当把数据报发送速率放慢

🕤 5.1.3 时间超过 当路由器收到一个目的IP地址不是自己的IP数据报,会将其生存时间TTL字段值减

1

。

若结果不为0,则将该IP数据报转发出去;若结果为0,除丢弃该IP数据报外,还要向源点发送时间超过报文 当终点在预先规定的时间内不能收到一个数据报的全部数据报片时,就把已收到的数据报片都丢弃,也会向源点发送时间超过报文

🕤 5.1.4 参数问题 当路由器或目的主机收到IP数据报后,根据其首部中的检验和字段发现 首部 在传输过程中出现了 误码 ,就丢弃该数据报,并向源点发送参数问题报文

🕤 5.1.5 改变路由(重定向) 路由器把改变路由报文发送给主机,让主机知道下次应将数据报发送给另外的路由器(可通过更好的路由) 如主机1的默认路由是R1,信息经过R1时,R1发现最佳路由不是自己,而是R2,所以通过ICMP告知主机1

🕘 5.2 询问报文类型 🕤 5.2.1 回送请求和回答 ICMP回送请求报文是由主机或路由器向一个特定的目的主机发出的询问 收到此报文的主机必须给源主机或路由器发送ICMP回送回答报文 这种询问报文用来 测试目的站是否可达 及了解其有关状态 🕤 5.2.2 时间戳请求和回答 ICMP时间戳请求报文是请某个主机或路由器回答当前的日期和时间 在ICMP时间戳回答报文中有一个

32

比特的字段,其中写入的整数代表从1900年1月1日起到当前时刻一共有多少秒 这种询问报文用来 进行时钟同步和测量时间 🕘 5.3 不发送ICMP的情况 对 ICMP差错报告报文 不再发送ICMP差错报告报文 对第一个分片的数据报片的所有后续数据报片都不发送ICMP差错报告报文 对具有 多播地址 的数据报都不发送ICMP差错报告报文 对具有 特殊地址 (如127.0.0.0或0.0.0.0)的数据报不发送ICMP差错报告报文 🕘 5.4 ICMP应用举例 分组网间探测PING (Packet InterNet Groper) 用来测试主机或路由器间的连通性(如

ping www.baidu.com

) 应用层直接使用网际层的ICMP(没有通过运输层的TCP或UDP) 使用ICMP 回送请求和回答 报文 跟踪路由tracerouce 用来测试IP数据报从源主机到达目的主机要经过哪些路由器 Windows版本 tracert命令 应用层直接使用网际层ICMP 使用了ICMP 回送请求和回答报文以及差错报告 报文 Unix版本 traceroute命令 在运输层使用UDP协议 仅使用ICMP差错报告报文 实现方法 由主机发送出去的数据包中的生存时间字段TTL由1开始逐渐增加,每个路由器都会返回一个时间超过报文,由此达到跟踪路由器的目的 🕒 6. 实验:IP组网规划设计 实验背景:假设你是某高校的网络管理员。

该高校申请到了一个公网地址102.3.1.1/30。

现在要为该高校进行IP组网规划。

假设使用172.16.0.0/16地址块。

应如何规划才能尽量不浪费IP地址?

请给出IP地址规划方案,并用下图实验拓扑进行模拟实验。

该校区有教学办公楼、图书馆、南区学生宿舍、英东楼北区学生宿舍公有5个区域需要分配IP地址。

其中南区学生宿舍有1500台主机,英东楼中有700台主机,北区学生宿舍有500台主机,教学办公楼有100台主机,图书馆有50台主机。

实验步骤: 1、根据学校需求分配IP网段(理论方案) 区域主机数网段子网掩码(前缀)网关 南区学生宿舍1500172.16.0.0/21255.255.248.0172.16.7.254英东楼700172.16.8.0/22255.255.252.0172.16.11.254北区学生宿舍500172.16.12.0/23255.255.254.0172.16.13.254教学办公楼100172.16.14.0/25255.255.255.128172.16.14.126图书馆50172.16.14.128/26255.255.255.192172.16.14.190外网网段2102.3.1.0/30255.255.255.252102.3.1.2 注:网关为网段内可用的最大主机地址。

2、完成出口路由器R1和ISP的接口配置 路由器所用主要配置命令:

# R1 sys # 进入系统视图

[Huawei]sysname R1 # 修改设备名称 [R1]int g0/0/0 # 进入接口视图 [R1-GigabitEthernet0/0/0]ip add 172.16.7.254 21 [R1-GigabitEthernet0/0/0]quit [R1]int g0/0/1 [R1-GigabitEthernet0/0/1]ip add 172.16.11.254 22 [R1-GigabitEthernet0/0/1]q [R1]int g0/0/2 [R1-GigabitEthernet0/0/2]ip add 172.16.13.254 23 [R1]int g2/0/0 [R1-GigabitEthernet4/0/0]ip add 172.16.14.126 25 [R1]int g2/0/1 [R1-GigabitEthernet4/0/1]ip add 172.16.14.190 26 [ISP]int s2/0/0 [ISP-Serial2/0/0]ip add 102.3.1.1 30

# ISP

[ISP]int s4/0/0 [ISP-Serial4/0/0]ip add 102.3.1.2 30

# 查看接口信息

[R1]dis ip int b

3、五个区域的IPv4地址配置 以PC1为例:

4、验证内网连通

5、出口路由配置 在R1配置:

[R1]ip route-static 0.0.0.0 0.0.0.0 102.3.1.2

在ISP上配置:

[ISP]ip route-static 172.16.0.0 20 102.3.1.1

6、验证ISP与内网连通

思考题:如果设备R1上不做默认路由的配置,对本次实验是否有影响?

A:没有影响,对R1而言,所有网段均是直连网段,均已生成。

可以使用

display ip routing-table

查看R1路由表 ❗ 转载请注明出处 作者:HinsCoder 博客链接:🔎 作者博客主页

相关文章