计算机网络-网络层详细讲解

article/2025/8/24 3:14:35

目录

 网络层概述

网络层提供的两种服务

面向连接的虚电路服务

 无连接的数据报服务

IPv4地址

IPv4地址概述

概述

 表示方法

 分类编址的IPv4

 A类地址

B类地址

 C类地址

练习

划分子网的IPv4地址

子网掩码

32比特的子网掩码可以表明分类IP地址的主机号部分被借用了几个比特作为子网号 

划分子网的细节

 练习

​编辑 默认子网掩码

无分类编址的IPv4地址

CIDR

举例

​编辑 路由聚合(构造超网)

练习

IP地址的应用规划

定长的子网掩码FLSM

变长的子网掩码VLSM

IP数据报的发送和转发过程

主机发送IP数据报

路由器转发IP数据报

 练习

静态路由配置及其可能产生的路由环路问题

静态路由配置

路由环路问题

路由选择

路由选择协议

静态路由选择

动态路由选择

因特网采用的路由选择协议

常见的路由选择协议

路由器的基本结构

路由信息协议RIP的基本工作原理

开放最短路径优先OSPF的基本工作原理

边界网关协议BGP的基本工作原理

IP数据报的首部格式

网际控制报文协议ICMP

 虚拟专用网VPN与网络地址转换NAT

虚拟专用网VPN

 网络地址转换NAT


 

网络层概述

网络层的主要任务是实现网络互连,进而实现数据包在各网络之间的传输。

要实现网络层主要任务,需要解决以下主要问题:

  • 网络层向运输层提供怎样的服务(“可靠传输”还是“不可靠传输‘)
  • 网络层寻址问题
  • 路由选择问题

因特网(Internet)是目前全世界用户数量最多的互联网,它使用TCP/IP协议栈。

由于TCP/IP协议栈的网络层使用网际协议IP,它是整个协议栈的核心协议,因此在TCP/IP协议栈中网络层常称为网际层。

综上所述,我们通过学习TCP/IP协议栈的网际层来学习网络层的理论知识和实践技术。

网络层提供的两种服务

面向连接的虚电路服务

  • 可靠通信由网络自身来保证
  • 当两台计算机进行通信时,必须建立网络层的连接——虚电路VC(Virtual Circuit)
  • 通信双方沿着已建立的虚电路发送分组
  • 目的主机的地址仅在连接建立阶段使用,之后每个分组的首部只需携带一条虚电路的编号(构成虚电路的每一段链路都有一个虚电路编号)
  • 这种通信结束后,需要释放之前所建立的虚电路。
  • 很多广域分组交换网都使用面向连接的虚电路服务。例如,曾经的X.25和主键过时的帧中继FR、异步传输模式ATM等。

e538cecfa74246e9a9efcd1c62c5b9dc.png

 无连接的数据报服务

  • 可靠通信应当由用户主机来保证
  • 不需要建立网络层连接
  • 每个分组可走不同的路径
  • 每个分组的首部必须携带目的主机的完整地址
  • 这种通信方式所传送的分组可能误码、丢失、重复和失序。
  • 由于网络本身不提供端到端的可靠传输服务。这就使网络中的路由可以做的比较简单,而且加个低廉(与电信的交换机相比较)。
  • 因特网采用了这种设计思想,也就是将复杂的网络处理功能置于因特网的边缘(用户主机和其内部的运输层),而将相对简单的尽最大努力和分组交付功能置于因特网的核心。

8b2f46cc51c34cbab6483b9d0c0e4a43.png

 采用这种思想的好处:网络的造价大大降低、运行方式灵活、能够适应多种应用

d09e3a7086e445f0b90ec4d673360820.png

 由于TCP/IP体系结构的因特网的网际层提供的是简单灵活、无连接的、尽最大努力交付的数据服务,因此本博客主要围绕网际层如何传送IP数据报这个主题进行讨论。

IPv4地址

IPv4地址概述

概述

  • IPv4地址就是给因特网上的每一台主机(或路由器)的每一个接口分配一个在全世界范围内是唯一的32比特的标识符。
  • IP地址由因特网名字和数字分配机构ICANN进行分配。                                                                       我国用户可向亚太网络信息中心APNIC申请IP地址,需要缴费。                                               2011年2月3日,互联网号码分配管理局IANA(由ICANN行使职能)宣布,IPv4地址已经             分配完毕。                                                                                                                                    我国在2014年至2015年已逐步停止了向新用户和应用分配IPv4地址。同时全面开展商            用部署IPv6。
  • IPV4地址的编址方法经历了如下三个历史阶段:

30cff45b37d447cc9c2b58e4e1d18d43.png

 表示方法

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

02daf7a8653f42d4ad869aaac75052f3.png

 分类编址的IPv4

83995e2f8571436284f2e751e1f9d238.png

 A类地址

8位网络号第一个固定为0                 

8a4819a414c7494a93135d65f51250cc.png

可指派的网络数量为eq?2%5E%7B%288-1%29%7D-2=126 (减2的原因是除去最小网络号0和最大网络号127)

每个网络中可分配的IP地址数量为eq?2%5E%7B24%7D-2=16777214(减2的原因是除去主机号全0的网络地址和全1的广播地址)

B类地址

16位网络号前两位固定为10

d2483b08b2d84ffe9b3e4618f274c05a.png

可指派的网络数量为eq?2%5E%7B%2816-2%29%7D=16384

每个网络中可分配的IP地址数量为eq?2%5E%7B16%7D-2=65534(减2的原因是除去主机号为全0的网络地址和全1的广播地址)

 C类地址

24位网络号前三位固定为110

7323756c5f0e45088317037e721e73dd.png

可指派的网络数量为eq?2%5E%7B%2824-3%29%7D=2097152

每个网络中可分配的IP地址数量为eq?2%5E%7B8%7D-2=254(减2的原因是除去主机号为全0的网络地址和全1的广播地址)

练习

ff379e6443364fd7a3b9a9eae1794293.png675f2e8b6fc74af99b95225bdd0badd3.png 

4d711816c9a34e8d8d60ebb4ec3d40a2.png

划分子网的IPv4地址

首先我们先来说明以下为什么要将IPv4地址划分子网。

如图:某单位有一个大型的局域网需要连接到因特网。申请了一个B类的网络地址,因此分配IP地址的数量达到了65534个,给每台计算机和路由器的接口分配一个IP地址后,还有大量IP地址剩余,这些剩余的IP地址只能由该单位的同一个网络使用,而其他单位的网络不能使用。

fd6c0fab3b994aa098174444e32cca52.png

 随着发展需要将原来三个网络划分成三个独立的网络,需要将原来的网络划分成三个独立的网络假设子网1仍然使用原先申请到的B类网络地址,那么就需要为子网2和子网3个字申请一个网络地址。

677e01b092ff4c3c9bb6a9c35e49d7b9.png

 为新增网络申请新的网络号会带来以下弊端:

  • 需要等待时间和花费更多的费用
  • 会增加其他路由器中路由表记录的数量
  • 浪费原有网络中剩余的大量IP地址

为避免这种情况出现,可以从主机号部分借用一部分作为子网号,如图

baec26867d9a41f8a4a6be2376ef51ff.png

子网掩码

32比特的子网掩码可以表明分类IP地址的主机号部分被借用了几个比特作为子网号 

  • 子网掩码使用连续的比特1来对应网络号和子网号
  • 子网掩码使用连续的比特0来对应主机号
  • 将划分子网的IPv4地址与其相应的子网掩码进行逻辑与运算就可以得到IPv4地址所在子网的网络地址

3a08b4f4d746466bb0d1dc7b6f0bc2ab.png

划分子网的细节

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

【解析】

由网络号可知是C类网络地址           30f549a6e30a4f648a6e0b820f414230.png

 

         子网掩码                                             e34798349cb84b53bda7a444d8b55ad0.png

 所以划分出的子网数量eq?2%5E%7B1%7D=2

每个子网可分配的地址数量eq?2%5E%7B%288-1%29%7D-2=126(减2是要去掉主机号为“全0”的网络地址和“全1”的广播地址)

4bece06ba7c943f0aa63cd7a7b9bf9c4.png

735d4a6b3c534c329e6c056b40090ceb.png

 练习

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

49c4ecaa34a5411798bbf78cc8447de1.png

 【2019年 题39】某主机的IP地址为180.80.77.55,子网掩码为255.255.252.0,如该主机向其所在子网发送广播分组,则目的地址可以是

c6a1fcce935d4b33bca318777bc1779f.png

71ab6231541e4b85a58d196b733a19dc.png 默认子网掩码

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

4c387257a7774b9ba7d6deed54f9e7d5.png

无分类编址的IPv4地址

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

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

  • 1993年,IETF发布了无分类域间路由选择CIDR的RFC文档

  • CIDR消除了传统的A类、B类和C类地址,以及划分子网的概念;

  • CIDR可以更加有效地分配IPv4的地址空间,并且可以在新的IPv6使用之前允许因特网的规模继续增长。

CIDR

  • CIDR使用“斜线记法”,或称CIDR记法。即在IPv4地址后面加上斜线“/”,在斜线后面写上网络前缀所占的比特数量。

【举例】44e8812535eb4cb4a109ddb5fac7b5f8.png

  •  CIDR实际上是将网络前缀都相同的连续的IP地址组成一个“CIDR地址块”。
  • 我们只要知道CIDR地址块中的任何一个地址,就可以知道该地址块的全部细节:              
  • 地址块的最小地址
  • 地址块的最大地址
  • 地址块中的地址数量
  • 地址块聚合某类网络(A类、B类和C类)的数量
  • 地址掩码(也可继续称为子网掩码)

举例

【例1】请给出CIDR地址块128.14.35.7/20的全部细节(最小地址,最大地址,地址数量,聚合C类网数量,地址掩码)。

【解析】

f06679e290da42528c633c33c4110d60.png

【练习】请给出CIDR地址块206.0.64.8/18的全部细节(最小地址,最大地址,地址数量,聚合
C类网数量,地址掩码)。

【解析】

377cf24d821546fe81abfa31606afd43.png
 路由聚合(构造超网)

ca7105f8d3934b568bee1a33fceb0ddd.png

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

练习

b69f71ca186f4013a63e03791a71d71b.png

 70731eedfb2f466a8ccbe96a0da3733f.png

IP地址的应用规划

定长的子网掩码FLSM

  • 使用同一个子网掩码来划分子网
  • 子网划分方式不灵活:只能划分出eq?2%5E%7Bn%7D个子网,其中n是从主机号部分借用的用来作为子网号的比特数量
  • 每个子网所分配的IP地址数量相同,造成IP地址浪费

 

举例说明一下定长的子网掩码FLSM

5da43123818946678ef97133415b89bf.png

 

我们先分析一下应用需求

5c8eb32e72b04bea9ea2034be8e4015c.png

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

9608e6df2cd443dab1fba6e93995c4ad.png

由于划分成5个子网,因此可以从主机号借用3个比特作为子网号

子网数量:eq?2%5E%7B3%7D=8

每个子网上的地址数量:eq?2%5E%7B8-3%7D=32

2a5daa38c89e417e8978aadcc8b90eee.png

 我们看一下划分子网的细节

3d90ab9b296244f4bb22bbeec30d4fa2.png

f6ce323f2daa4ebfb1917e28151a6f94.png

通过本例可以看出,采用定长的子网掩码进行子网划分,只能划分出eq?2%5E%7Bn%7D个子网,其中n是从主机号部分借用的用来作为子网号的比特数量。每个子网所分配的IP数量相同,例如图中的网络5只需要4个IP地址 ,但是我们给它分配了32个IP地址,这样就造成了IP地址的严重浪费。

变长的子网掩码VLSM

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

示例:同样用上面的例子这次采用变长的子网掩码VLSM,首先我们分析每个子网的主机号位数、网络前缀位数、地址块、地址数量,如下:

750a4099d60f4dd1a39c4388a908e775.png

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

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

118d7dd637294bf08b5ca0497a2b052d.png

 每个子网块中最小地址位网络地址,最大地址位广播地址

IP数据报的发送和转发过程

IP数据报的发送和转发过程包含以下两部分:

  • 主机发送IP数据报
  • 路由器转发IP数据报

主机发送IP数据报

举例说明:

在下图所示的小型互联网中,路由器的接口0直连了一个交换式以太网,接口1也直连了一个交换式以太网。我们给该网络分配了这样的网络地址和子网掩码,给网络中的各主机和路由器的接口配置了相应的IP地址和子网掩码。

ff695f42559f46beaea17df596eb41ab.png

同一网络中的主机之间可以直接通信,不同网络中的主机之间的通信,需要通过路由器来中转,这属于间接交付。

f56e30095b4d4fb8bdc0693a6fa4fbb7.png

 源主机如何判断出目的主机是否与自己在同一个网络中:

举例说明,假设主机要给主机F发送IP数据报。主机C将自己的IP地址和子网掩码相与,就可以得到主机C所在网络的网络地址。既然主机C要给主机F发送IP数据报,那主机C肯定知道主机F的IP地址,主机C将主机F的IP地址与自己的子网掩码相与,就可以得到目的网络地址,发现不相等因此主机C就知道了主机F与自己不在同一网络。它们之间的通信属于间接交付。

c29f5a363ec54fd186fcf8b381842b29.png

 主机C如何知道路由器R的存在?主机C应该把IP数据报交给哪个路由器进行转发呢?用户俄日了让本网络中的主机就必须给其指定本网络中的一个路由器,所指定的路由器,也被称为默认网关。我们可以将路由器接口0的IP地址指定给该接口所直连网络中的各个主机作为默认网关。同理,可将路由器接口1的IP地址指定给该接口所直连网络中的各个主机作为默认网关

a43975b49d16413ea952f277095d3025.png

 当本网络中的主机要和其他网络中的主机进行通信时,会将数据报传输给默认网关,由默认网关帮主机将IP数据报转发出去。

假设本例中的主机A要给主机D发送IP数据报,这属于间接交付。主机A会将该IP数据报传输给自己的默认网关,

16af6a72d19049ca86e28716d8da9124.png

 路由器收到IP数据报后如何转发?

路由器转发IP数据报

 路由器收到IP数据报后如何转发?

  1. 检查IP数据报首部是否出错:若出错,则直接丢弃该IP数据报并通告源主机,若没有出错继续进行转发
  2. 根据IP数据报的目的地址在路由表中查找匹配的条目:若找到匹配的条目,则转发给条目中指示的下一跳,若找不到,则丢弃该IP数据报并通告源主机

我们假设本例中的IP数据报首部没有出现差错。路由器取出IP数据报首部各地址字段的值。源地址字段的值位主机A的IP地址,目的地址字段的值为主机D的IP地址。路由器就要对该IP数据报继续宁查表转发。当我们给路由器的接口配置IP地址和子网掩码时,路由器表中就存储了相关信息

9c39e9dbc0ae4554bc8f1027a6e5a172.png

 路由器根据IP数据报的目的地址在自己的路由表中查找匹配的路由条目。将目的地址与路由条目中的地址掩码相与得到目的网络地址,该目的网络地址与路由条目中的目的网络地址相同,则这条 路由条目就是匹配的路由条目,也就是从接口1转发该IP数据报。这样主机D就可以收到路由器转发来的该IP数据报。

0232ec6f1a57412aa12116b824c768c8.png

545d2261dc834e34b69a260dc1575a12.png

假设主机A给本网络上的各设备发送一个广播IP数据报。在数据报首部的目的地址字段可以填写的目的地址为192.168.0.127,这就是本网络的广播地址;也可以填写255.255.255.255,这就是受限的广播地址,该网络中的各设备都会收到该广播IP数据报。但是路由器收到后不会转发该数据报,路由器是隔离广播域的 

dd3f364b7cfc4829b070f5a81c015e9d.png

 练习

5668aa2c4c0549768499d1edb2dd2b97.png

 4865c71fcbd349d38c1e9a2459bd202c.png

 55410f42b4104beda20064b689ae3106.png

静态路由配置及其可能产生的路由环路问题

静态路由配置

静态路由配置是指用户或网络管理员使用路由器的相关命令给路由器人工配置路由表。

  • 这种人工配置方式简单、开销小。但不能及时适应网络状态(流量、拓扑等)的变化。
  • 一般只在小规模网络中采用。

【举例】说明静态路由配置

我们采用如图所示的网络拓扑和相应的IP地址配置,路由器R1和R2的路由表如下

9c73eb85e23d4cb8b6342d78835d2618.png

 现在假设R1要转发一个IP数据报给该网络中的某个主机。R1应该把该IP数据报转发给路由器R2的接口2。但R1的路由表中并没有关于该网络的路由条目。R1并不知道目的网络的存在。因此我们可以使用路由器的相关配置命令,给R1添加一条到达该目的网络的路由条目。

198df53ca2e84b99bdf0a4d67057717d.png

 该路由条目是我们人工配置的静态路由。所以类型是静态,同理R2要给左边网络的某主机转发一个IP数据报,也需要使用路由器的相关配置命令,给R2添加一条到达该目的网络的路由条目。

0f78bd6cacae485db6741021b02e0522.png

以上就是我们举例说明的静态路由配置。 

【举例】默认路由举例

还是这个例子,现在假设路由器R2的接口连接到了因特网。

7efe11a7463c45d9a5ebd7b5ce990f9a.png

假设R1要转发一个IP数据报给因特网某个网络中某个主机。R1应该把该IP数据报转发给路由器R2的接口0。由于因特网中包含众多网络,如果我们给R1添加针对这些网络的每一条路由条目,则会给人工配置带来巨大的工作量,并且使R1路由表变的非常大,降低查表转发的速度。实际上对于具有相同下一跳的不同目的网络的路由条目,我们可以使用一条默认路由条目来代替。默认路由中的目的地址为0.0.0.0,地址掩码也为0.0.0.0,其CIDR形式为0.0.0.0/0。如图

052059ad8f344a2799a0c921bd8f7d1e.png

 【举例】特定主机路由举例 

特定主机路由一般用于网络管理人员对网络的管理和测试。另外在需要考虑某种安全问题时也可以采用特定主机路由。

15453daec90242bd8696c93aa1a6cb50.png

假设这是该网络中的某台特定主机。我们可以在R1的路由表中添加一条到达该主机的特定主机路由条目。

4d778a80c9ff419c9f86f9f140c1fc98.png

 

路由环路问题

使用静态路由配置可能出现以下导致产生路由环路的错误

  • 配置错误
  • 聚合了不存在的网络
  • 网络故障

【举例】静态路由配置错误导致路由环路

如图这是各路由器自动得出的直连网络和我们给各路由器人工配置的静态路由。

de54fd69e19147f6bcaf2f19a2694c86.png

假设我们将R2第一条人工配置的静态路由条目错误的配置成10.0.1.2。下一条就从R1的接口1错误的指向了R3的接口0。该IP数据报发送后,经过R3查表会回到R2查表又会到R3就导致了路由环路。

494681c71d5d484fb0c207ad2a209910.png 为了防止IP数据报在路由环路中永久兜圈,可以在IP数据报首部设有生存时间TTL字段。IP收报进入路由器后,TTL字段的值减1。若TTL的值不等于0,则被路由器转发,否则被丢弃。

【举例】聚合了不存在的网络而导致路由环路

 如图这是各路由器自动得出的直连网络和我们给各路由器人工配置的默认路由和聚合路由。

80148ff3deea40aaa83cbf3243e70f01.png

 假设R2要转发IP数据报到该网络。进行查表转发到R1,R1查表下一跳是通过接口2直接交付。就转发给了目的网络

e61a9002de1a43d3b8e6514c8fe6b8a5.png

实际上聚合路由的目的网络包含了以下四个地址

6bc9f5b04d534066add25c36086d2254.png

18b070f3d24f4e63ac4abf7068400396.png

 假设当R2要转发IP数据报到这个不存在的网络时,R1查表找到了匹配的路由条目,转发给R1,但对于这个不存在的网络,却错把它转发给了路由器R1。R1进行查表发现没有匹配的路由条目,只能走默认路由,就又回到了R2,就导致了路由环路

92c2792cdaac48c8884f16d46dad99c7.png

针对这个问题,我们可以在R2的路由表中添加针对所聚合的、不存在的网络黑洞路由。下一跳为null0也就是丢弃。假设R2要转发IP数据报到这个不存在的网络,找到了两条可选的路由条目,根据最长前缀匹配原则,将会选择黑洞路由,进而丢弃

 【举例】网络故障导致路由环路

假设路由器R1检测到其接口0所直接的网络出现了故障而不可达,就会自动在其路由表中删除该直连网络的路由条目。

b7307c3e2f5340cdbdb156d806c87cc6.png

R2要转发IP数据报到该网络,会进行查表,转发到R1查表后没有找到匹配的路由条目,就只能走默认路由,默认路由下一跳又回到了R2就导致了路由环路。

a93b05ae35e34c859b81a3cfbe0bf8f6.png

针对这个问题,我们可以在R1的路由表中添加针对该直连网络的黑洞路由。R1查表后丢弃该IP数据报,故障恢复后会自动调价该路由条目并且自动使黑洞路由失效,当故障再次出现后,黑洞路由再次自动生效。

f4b4b86fa86b48acbe573dc1e619a34d.png

路由选择

路由选择协议

静态路由选择

  • 由人工配置的网络路由、默认路由、特定主机路由、黑洞路由等都属于静态路由。
  • 这种人工配置方式简单、开销小。但不能及时适应网络状态(流量、拓扑等)的变化。
  • 一般只在小规模网络中采用。

动态路由选择

  • 路由器通过路由选择协议自动获取路由信息。
  • 比较复杂、开销比较大。能较好地适应网络状态的变化。
  • 适用于大规模网络

因特网采用的路由选择协议

因特网所采用的路由选择协议的主要特点:

  • 自适应:动态路由选择,能较好地适应网络状态的变化。
  • 分布式:路由器之间交换路由信息。
  • 分层次:将整个因特网划分为许多较小的自治系统AS(Autonomous System)

【举例】说明因特网分层次的路由选择协议

如图是因特网中的一部分,左边网络和路由器划归为一个自治系统,右边划分为另一个自治系统。

84860a7eed0d4773be71914636c04702.png

  •  自治系统之间的路由选择简称为域间路由选择。
  • 自治系统内部的路由选择简称为域内路由选择。
  • 域间路由选择使用外部网关(路由)协议EG这个类别的路由选择协议。
  • 域内路由选择使用内部网关(路由)协议IGP这个类别的路由选择协议。
  • 在一个自治系统内部使用的具体的内部网关协议与因特网中其他自治系统中选用何种内部网关协议无关。左边的使用的内部网关协议为路由信息协议RIP。右边的为开放式最短路径优先OSPF协议。自治系统之间使用的外部网关协议为边界网关协议BGP。

常见的路由选择协议

397c92967ebe418380d5290a57e67de3.png

 路由选择协议是在路由器上运行的

路由器的基本结构

路由器是一种具有多个输入端口和多个输出端口的专用计算机,其任务是转发分组。 

6e07daa3cd574d7fb3075390049a997c.png

3aed458c2e9745b2810cf02560b4448a.png

 

 路由选择部分也叫做控制部分,或控制层面,其核心构件是路由选择处理机路由选择处理机的任务是根据所选定的路由选择协议构造出路由表,同时经常或定期地和相邻路由器交换路由信息而不断地更新和维护路由表。

分组转发部分,也就是数据层面,它是三部分组成:交换结构、一组输入端口和一组输出端口

交换结构又称为交换组织,它的作用就是根据转发表对分组进行处理,将某个输入端口进入的分组从一个合适的输出端口转发出去。

物理层进行比特的接收。数据链路层按照链路层协议接收转发分组的帧。在把帧的首部和尾部剥去之后,分组就被送入网络层的处理模块。若接收到的分组是路由器之间交换路由信息的分组(如RIP或OSPF分组等),则把这种分组送交路由器的路由选择部分中的路由选择处理机。若接收到的是数据分组,则按照分组首部中的目的地址查找转发表,根据得出的结果,分组就经过交换结构到达合适的输出端口

路由信息协议RIP的基本工作原理

  • 路由信息协议RIP(Routing nformation Protoco)是内部网关协议IGP中最先得到广泛使用的协议之一,其相关标准文档为RFC 1058。
  • RIP要求自治系统AS内的每一个路由器都要维护从它自己到AS内其他每一个网络的距离记录。这是一组距离,称为“距离向量D-V(Distance-Vector)”。
  • RIP使用跳数(Hop Count)作为度量(Metric)来衡量到达目的网络的距离。路由器到直连网络的距离定义为1、路由器到非直连网络的距离定义为所经过的路由器数加1。
  • 允许一条路径最多只能包含15个路由器。“距离”等于16时相当于不可达。因此,RIP只适用于小型互联网

6c2be77280794f778ab83a8b7e7c6f60.png

  •  RIP认为好的路由就是“距离短”的路由,也就是所通过路由器数量最少的路由

3be61fe285284e8d85d894b2e5dec4aa.png

  •  当到达同一目的网络有多条“距离相等”的路由时,可以进行等价负载均衡

1beaba7f44cd4b9abb53b6d9b1724c95.png

RIP包含以下三个要点:

  • 和谁交换信息   仅和相邻路由器交换信息
  • 交换什么信息    自己的路由表
  • 何时交换信息    周期性交换 (例如每30秒)

53156d89da894ece8f9f9d2abf776867.png

【举例】RIP的基本工作过程 

2e88cad3290048b29a0621e401ba8e4e.png

  1.  路由器刚开始工作时,只知道自己到直连网络的距离为1
  2. 每个路由器仅和相邻路由器周期性地交换并更新路由信息
  3. 若干次交换和更新后,每个路由器都知道到达本AS内各网络的最短距离和下一跳地址,称为收敛。

c29106b95bb34252a91f25c92cc638e2.png

 【举例】RIP的路由条目的更新规则

假设C、D原来路由表信息如下974cec9e85cc44378ce8cb947eff275a.png

 

假设现在路由器C的RIP更新报文周期到了,C就发送封装有路由信息的RIP更新报文给D。

37edad7bbd8a4cf88610e8f12fb46cc2.png

 路由器D收到之后对其进行改造。距离+1,下一跳改为C

df45b9fdcad24244b3e3316611032535.png

 路由器D再对照自己的路由条目进行更新

06bf11b41d414ec89a47895de12ec737.png

  • RIP存在“坏消息传播得慢”的问题 
  • “坏消息传播得慢”又称为路由环路或距离无穷计数问题,这是距离向量算法的一个固有问题“坏消息传播得慢”可以采取多种措施减少出现该问题的概率或减小该问题带来的危害。
     
  1. 限制最大路径距离为15(16表示不可达)
  2. 当路由表发生变化时就立即发送更新报文 (即“触发更新”),而不仅是周期性发送
  3. 让路由器记录收到某特定路由信息的接口,而不让同一路由信息再通过此接口向反方向传送 (即“水平分割")

d1d77da3f01a4cbdb0788eaa34303568.png

开放最短路径优先OSPF的基本工作原理

  • 开放最短路径优先OSPF(Open Shortest Path First),是为克服RIP的缺点在1989年开发出来的。                                                                                                                                                   “开放”表明OSPF协议不是受某一家厂商控制,而是公开发表的。                                                  “最短路径优先”是因为使用了Dijkstra提出的最短路径算法SPF。
  • OSPF是基于链路状态的,而不像RIP那样是基于距离向量的。
  • OSPF采用SPF算法计算路由,从算法上保证了不会产生路由环路。
  • OSPF不限制网络规模,更新效率高,收敛速度快。
  • 链路状态是指本路由器都和哪些路由器相邻,以及相应链路的“代价”(cost)。                                 “代价”用来表示费用、距离、时延、带宽,等等。这些都由网络管理人员来决定。

 【举例】

思科路由器中OSPF计算代价的方法:100Mbps/链路带宽,计算结果小于1的值仍记为1;大于1且有小数的,舍去小数。

8a5b03bd1b1a44388f084c9b05f9d280.png

OSPF相邻路由器之间通过交互问候(Hello)分组,建立和维护邻居关系。

  • Hello分组封装在IP数据报中,发往组播地址224.0.0.5; 8d7ac822b63e4c06978c14bce2f3a42c.png
  •  发送周期为10秒
  • 40秒未收到来自邻居路由器的Hello分组,则认为该邻居路由器不可达。
  • 每个路由器都会建立一张邻居表。

90397801e56c4d018ea34715503f65bd.png

 使用OSPF的每个路由器都会产生链路状态通告LSA(Link State Advertisement)。LSA中包含以下内容:

  • 直连网络的链路状态信息
  • 邻居路由器的链路状态信息

LSA被封装在链路状态更新分组LSU中,采用洪泛法发送(将自己其他所有接口转发该分组)。

ff50fe4afef34d46b358b579675c338c.png

 使用OSPF的每个路由器都有一个链路状态数据库LSDB,用于存储LSA。

通过各路由器洪泛发送封装有自己LSA的LSU分组,各路由器的LSDB最终将达到一致。

3a4ad93152124ed4847e71f2d93d2105.png

 使用OSPF的各路由器基于LSDB进行最短路径优先SPF计算,构建出各自到达其他各路由器的最短路径,即构建各自的路由表。

f0f51d97380647439c87a8261796b4c3.png

 OSPF有以下五种分组类型

  • 类型1,问候(Hello)分组      用来发现和维护邻居路由器的可达性。
  • 类型2,数据库描述(Database Description)分组    向邻居路由器给出自己的链路状态数据库中的所有链路状态项目的摘要信息
  • 类型3,链路状态请求(Link State Request)分组     向邻居路由器请求发送某些链路状态项目的详细信息。
  • 类型4,链路状态更新(Link State Update)分组      路由器使用这种分组将其链路状态进行洪泛发送,即用洪泛法对全网更新链路状态。
  • 类型5,链路状态确认(Link State Acknowledgement)分组    这是对链路状态更新分组的确认分组

OSPF的基本工作原理

90d99e7651cb4084948762a341513af3.png

 OSPF在多点接入网络中路由器邻居关系的建立

  • 选举指定路由器DR和备用的指定路由器BDR
  • 所有的非DR/BDR只与DR/BDR建立邻居关系
  • 非DR/BDR之间通过DR/BDR交换信息

8a00d199662b4345ae5318385ec68895.png

 为了使OSPF能够用于规模很大的网络,OSPF把一个自治系统再划分为若干个更小的范围,叫做区域(Area)

41d50e8216964360912a6579022b06cc.png

区域内路由器IR(internal router): R1,R2,R8,R9 

主干路由器BBR(backbone router): R3,R4,R5,R6,R7

区域边界路由器ABR(area border router): R3,R4,R7

自治系统边界路由器ASBR(AS border router): R6

边界网关协议BGP的基本工作原理

外部网关协议EGP(例如边界网关协议BGP)

  • 在不同自治系统内,度量路由的“代价”(距离,带宽,费用等)可能不同。因此,对于自治系统之间的路由选择,使用“代价”作为度量来寻找最佳路由是不行的。
  • 自治系统之间的路由选择必须考虑相关策略(政治,经济,安全等)
  • BGP只能是力求寻找一条能够到达目的网络且比较好的路由(不能兜圈子),而并非要寻找一条最佳路由。

a1c7755cc100426a816a8c745ab1baf6.png

在配置BGP时,每个自治系统的管理员要选择至少一个路由器作为该自治系统的“BGP发言人“

不同自治系统的BGP发言人要交换路由信息,首先必须建立TCP连接,端口号为179

  • 在此TCP连接上交换BGP报文以建立BGP会话
  • 利用BGP会话交换路由信息 (例如,增加新的路由,或撤销过时的路由,以及报告出错的情况等)
  • 使用TCP连接交换路由信息的两个BGP发言人,彼此称为对方的邻站 (neighbor)或对等站(peer) 

BGP发言人除了运行BGP外,还必须运行自己所在自治系统所使用的内部网关协议IGP,例如OSPF或RIP

838799c153864a92852047610fccdce3.png

BGP发言人交换网络可达性的信息(要到达某个网络所要经过的一系列自治系统) 

当BGP发言人互相交换了网络可达性的信息后,各BGP发言人就根据所采用的策略从收到的路由信息中找出到达各自治系统的较好的路由。也就是构造出树形结构、不存在回路的自治系统连通图。

fb4ba982a4b945a7adfbdc91c770aa22.png

 BGP适用于多级结构的因特网

f075fd41a8cc444dbef0e54f1b927784.png

 

 BGP-4有以下四种报文

  • OPEN(打开)报文:用来与相邻的另一个BGP发言人建立关系,使通信初始化。
  • UPDATE(更新)报文:用来通告某一路由器的信息,以及列出要撤销的多条路由。
  • KEEPALIVE(保活)报文:用来周期性地证实邻站的连通性。
  • NOTIFICATION(通知)报文:用来发送检测到的差错。

例题

416f4b81eb164d4ba0afcff41c00e013.png

 8e93b1f4c26643f6b2350fde64f6bd4f.png

IP数据报的首部格式

35db3bfff0a74affb73c9442f2d8dd5c.png

 版本:

占4比特,表示IP协议的版本。

通信双方使用的IP协议的版本必须一致。目前广泛使用的IP协议版本号为4(即IPv4)。

首部长度:

占4比特,表示IP数据报首部的长度。该字段的取值以4字节为单位。

最小十进制取值为5,表示IP数据报首部只有20字节固定部分;

最大十进制取值为15,表示IP数据报首部包含20字节固定部分和最大40字节可变部分。

可选字段:

长度从1个字节到40个字节不等。用来支持排错、测量及安全等措施。

可选字段增加了IP数据报的功能,但这同时也使得IP数据报的首部长度成为可变的。这就增加了每一个路由器处理IP数据报的开销。实际上可选字段很少被使用。

填充字段:

确保首部长度为4字节的整数倍,使用全0进行填充。

区分服务:

占8比特,用来获得更好的服务。

该字段在旧标准中叫作服务类型,但实际上一直没有被使用过。1998年,因特网工程任务组IETF把这个字段改名为区分服务。利用该字段的不同数值可提供不同等级的服务质量。

只有在使用区分服务时,该字段才起作用。一般情况下都不使用该字段。

总长度:

占16比特,表示IP数据报的总长度(首部+数据载荷)。

最大取值为十进制的65535,以字节为单位。

ece62bd10e95493cb1761bd28e97fe52.png

 标识、标志、片偏移这三个字段共同用于IP数据报分片

标识:

占16比特,属于同一个数据报的各分片数据报应该具有相同的标识。

IP软件维持一个计数器,每产生一个数据报,计数器值加1,并将此值赋给标识字段。

标志:

占3比特,各比特含义如下:

  • DF位:1表示不允许分片;0表示允许分片
  • MF位:1表示”后面还有分片“;0表示”这是最后一个分片“
  • 保留位:必须为0

片偏移:

占13比特,指出分片数据报的数据载荷部分偏移其在原数据报的位置有多少个单位。片偏移以8个字节为单位。

【举例】对IPv4数据报进行分片

301d44a133eb46f69854046c5f21b84a.png

71b271fa21864ed190298a078b11d989.png

 生存时间TTL:

占8比特,最初以秒为单位,最大生存周期为255秒;路由器转发IP数据报时,将IP数据报首部中的该字段的值减去IP数据报在本路由上所耗费的时间,若不为0就转发,否则就丢弃。

现在以”跳数“为单位,路由器转发IP数据报时,将IP数据报首部中的该字段的值减1,若不为0就转发,否则就丢弃。

【举例】生存时间TTL字段的作用——防止IP数据报在网络中永久兜圈

213d81c10036418392cd3c4f434eefe6.png

 协议:

占8比特,指明IPv4数据报的数据部分时何种协议数据单元。常用的一些协议和相应的协议字段值如下。

74adb60b5fa940c499dcc87a10914832.png

 【举例】

e69894e340a8413d9d74a327b9a47405.png

 首部检验和:

占16比特,用来检验首部在传输过程中是否出现差错。比CRC检验码简单,称为因特网检验和。IP数据报没经过一个路由器,路由器都要重新计算首部检验和,因为某些字段(生存时间、标志、片偏移等)的取值可能发生变化。

由于IP层本身并不提供可靠传输的服务,并且计算首部检验和是一项耗时的操作,因此在IPv6中,路由器不再计算首部检验和,从而更快转发IP数据报。

源IP地址和目的IP地址:

各占32比特,用来填写发送该IP数据报的源主机的IP地址和接收该IP数据报的目的主机的IP地址。

【题1】

e5b28b3426d04d208f9d879705f6e4d7.png

57d4d60b3bfb4745b3bff5777e9e987e.png

【题2】

d6051c1f9d4f438da67435a669878706.png

 6aab64cb37a2422b88e6d4a8cd0307ce.png

 b89807b5e590419d9f7de3c9bff3cb4e.png

2452129a764f42718047c008ed7143ca.png

网际控制报文协议ICMP

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

ICMP差错报文报文共有以下五种:

1.终点不可达

当路由器或主机不能交付数据报时,就向源点发送终点不可达报文。具体可再根据ICMP的代码字段细分为目的网络不可达、目的主机不可达、目的协议不可达、目的端口不可达、目的网络未知、目的主机未知等13种错误。

8d547dbd28b441ab81d0f92b10d99f50.png

 2.源点抑制

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

0c44dd2992a741fa935a41e6fc7e697c.png

3.时间超过

  • 当路由器收到一个目的IP地址不是自己的IP数据报,会将其生存时间TTL字段的值减1。若结果不为0,则将该IP数据报转发出去;若结果为0,除丢弃该IP数据报外,还要向源点发送时间超过报文。

296c2d2ed77049b390db612bcc70ab3a.png

 

  • 另外,当终点在预先规定的时间内不能收到一个数据报的全部数据片时,就把已收到的数据报片都丢弃,也会向源点发送时间超过报文。

 

4.参数问题

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

c68fcac9daa24807b67ef08c68aae45c.png 5.改变路由(重定向)

 路由器把改变路由报文发送给主机,让主机知道下次应把数据报发送给另外的路由器(可通过更好的路由)。

bb196ffbde374589ac81790fe828f8ed.png

 以下情况不应发送ICMP差错报告报文:

  • 对ICMP差错报告报文不再发送ICMP差错报告报文。
  • 对第一个分片的数据报片的所有后续数据报片都不发送ICMP差错报告报文。
  • 对具有多播地址的数据报都不发送ICMP差错报告报文。
  • 对具有特殊地址(如127.0.0.0或0.0.0.0)的数据报不发送ICMP差错报告报文。

f062547b7a5a47cd85591632cea57f91.png

 常用的ICMP询问报文有以下两种:

1.回送请求和回答

ICMP回送请求报文是由主机或路由器向一个特定的目的主机发出的询问。

收到此报文的数据必须给源主机或路由器发送ICMP回送回答报文。

这种询问报文用来测试目的站是否可达及了解其有关状态。

2.时间戳请求和回答

ICMP时间戳请求报文是请某个主机或路由器回答当前的日期和时间。

在ICMP时间戳回答报文中有一个32位的字段,其中写入的整数代表从1900年1月1日起到当前时刻一共有多少秒。

这种询问报文用来进行时钟同步和测量时间。

ICMP应用举例

分组网间探测PING

  • 用来测试主机或路由器间的连通性
  • 应用层直接使用网际层的ICMP(没有通过运输层的TCP或UDP)
  • 使用ICMP回送请求和回答报文

跟踪路由

  • 用来测试IP数据报从源主机到达目的主机要经过哪些路由器
  • Window版本(tracert命令、应用层直接使用网际层ICMP、使用了ICMP回送请求和回答报文以及差错报告报文)
  • Unix版本(tracertoute命令、在运输层使用UDP协议、仅使用ICMP差错报告报文)

 虚拟专用网VPN与网络地址转换NAT

虚拟专用网VPN

利用公用的因特网作为本机构各专用网之间的通信载体,这样的专用网又称为虚拟专用网。

由于IPv4地址的紧缺,一个机构能够申请到的IPv4地址数量往往小于本机构所拥有的主机数量。因此,虚拟专用网中的各主机所分配的地址应该是本机构可自由分配的专用地址,而不是需要申请的、在因特网上使用的公有地址。

原理

dfa05ba134e64d8fb731c452ea9e071a.png

如下图所示,同一机构内不同部门的内部网络所构成的虚拟专用网VPN又称为内联网VPN。

有时一个机构的VPN需要有某些外部机构(通常就是合作伙伴)参加进来。这样的VPN就称为外联网VPN。

在外地工作的员工需要访问公司内部的专用网络时,只有要在任何地点接入到因特网,运行驻留在员工PC中的VPN软件,在员工的PC和公司的主机之间建立VPN隧道,既可访问专用网络中的资源。这种VPN称为远程接入VPN。

d6c269da163c48acbaf50c4285f9e91d.png

 网络地址转换NAT

  • 由于IP地址的紧缺,一个机构能够申请到的IP地址数量往往远小于本机构所拥有的主机数量。因此,虚拟专用网中的各主机所分配的地址应该是本机构可自由分配的专用地址,而不是需要申请的、在因特网上使用的公用地址。
  • 虽然因特网采用了无分类编址方式来减缓IP空间耗尽的速度,但由于因特网用户数目的激增,特别是大量小型办公室网络和家庭网络接入因特网的需求不断增加,IPv4地址空间即将面临耗尽的危险仍然没有被解除。
  • 1994年提出了一种网络地址转换NAT的方法再次缓解了IP地址空间耗尽的问题。
  • NAT能使大量使用内部专用地址的专用网络用户共享少量外部全球地址来访问因特网上的主机和资源。

d392c8ef184d4ee3b6d563e60b3fce55.png

3cc20ff55bff42c5b86afe0799e8f5cb.png

 3a8c45dcc9f84ee5aeeca0873deefe93.png

 

  • 由于绝大多数的网络应用都是使用运输层协议TCP或UDP来传输数据,因此可以利用运输层的端口号和IP地址一起进行转换。这样,用一个全球IP地址就可以使多个拥有本地地址的主机同时和因特网上的主机进行通信。这种端口号和IP地址一起进行转换的技术叫作网络地址与端口号转换NAPT

8cb5c99ea2ad447c80f6291fe6f29894.png

 

  • 对于一些P2P网络应用,需要外网主机与内网主机进行通信,在通过NAT时会遇到问题,需要网络应用自己使用一些特殊的NAT穿越技术来解决问题。

86607955e8fa449dbcd42161356643f5.png

 

  • 由于NAT对外网屏蔽了内网主机的网络地址,能为内网的主机提供一定的安全保护

 

 


http://chatgpt.dhexx.cn/article/Sp35Ydud.shtml

相关文章

网络层

一、概述 1、网络层是OSI参考模型中的第三层,介于传输层和数据链路层之间,它在数据链路层提供的两个相邻端点之间的数据帧的传送功能上,进一步管理网络中的数据通信,将数据设法从源端经过若干个中间节点传送到目的端,从…

网络五大层介绍,看完你就懂

当前的网络协议是分层的:应用层,传输层,网络层,数据链路层,物理层 目录 应用层 传输层 UDP协议 数据报格式 TCP(传输控制协议) 报文格式 1.确认应答(核心) 2.超时重传 3.连接…

Android 4.4 沉浸式状态栏的实现

Android 4.4(kitkat)之后,Android Window 提供一个新的属性: WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS从名字上可以看出,这个属性可以用来设置状态栏是否透明,我们就可以利用这个属性来实现沉浸…

总结系列-一文搞懂沉浸式状态栏

近期做到与状态栏相关一些需求,网上关于沉浸式状态栏的文章有很多,基本上都先讲一堆概念,然后接着推出一个自己写的轮子,这类轮子面对很多不同场景的情况不能百分之百满足使用需求,过度地使用轮子也往往会让开发者不了解代码到底是怎么实现沉浸式的,基于…

安卓沉浸式状态栏

安卓沉浸式状态栏 前言安卓版本Android4.4之前Android4.4(API 19) - Android 5.0(API 21)1.图片沉浸1.1 xml实现1.2代码实现 2.ToolBar沉浸2.1xml实现2.1.1 设置 fitsSystemWindows 属性2.1.2 布局里添加占位状态栏 2.2代码实现2.…

Android-StatusBarUtil沉浸式状态栏

文章目录 一、前言二、去掉标题栏三、StatusBarUtil属性四、沉浸状态栏颜色五、沉浸状态栏图片 一、前言 大家再开发过程中会遇到上面这种情况,它不影响使用但是在美观上面差点意思,接下来教给大家一种方式来使它美观 二、去掉标题栏 只需要改变NoAction…

沉浸式状态栏(一)

我们知道IOS上的应用,状态栏的颜色总能与应用标题栏颜色保持一致,用户体验很不错,那安卓是否可以呢?若是在安卓4.4之前,答案是否定的,但在4.4之后,谷歌允许开发者自定义状态栏背景颜色啦&#x…

安卓沉浸式状态栏,android沉浸式状态栏工具类封装

文章目录 前言二、使用步骤1.定义2.使用3.效果 前言 沉浸式状态栏对安卓6.0以上版本很简单,今天分享一个封装好的工具,供大家参考 二、使用步骤 1.定义 代码如下: package com.example.mystudy_kotlin.utilsimport android.app.Activity …

沉浸式状态栏实现

文章目录 郭霖的博客这样实现透明状态栏隐藏导航栏真正的沉浸式模式 轮子 郭霖的博客这样实现 Android状态栏微技巧,带你真正理解沉浸式模式 透明状态栏 新建一个项目,只放一张图片 可以看到 状态栏、ActionBar、底部导航栏都显示,现在修…

flutter沉浸式状态栏

方法1:修改MainActivity 在MainActivity.kt或MainActivity.java,判断一下版本号然后将状态栏颜色修改设置成透明,因为他本身是黑色半透明: Kotlin: class MainActivity: FlutterActivity() {override fun configure…

uniapp 沉浸式状态栏

uniapp 沉浸式状态栏 1.page.json 中设置 :“navigationStyle”:"custom" "globalStyle": {"navigationBarTextStyle": "black","navigationBarTitleText": "uni-app","navigationStyle":…

Android使用沉浸式状态栏

Android使用沉浸式状态栏 为什么使用? 我们App里面目前都没有做沉浸式状态栏,会导致状态栏呈黑色条状,而且下面这个的黑色条状与App红色主界面有很明显的区别。这样在一定程度上牺牲了视觉高度,界面面积变小。 可以对照比较这三张图 代码…

【Android实战】沉浸式状态栏实现(上)

传统的手机状态栏是呈现出黑色条状的,有的和手机主界面有很明显的区别。这样就在一定程度上牺牲了视觉宽度,界面面积变小。 沉浸模式的状态栏和主界面完全融为了一体,在设计上有不同的视觉感受。 我们先上两张图,很容易看出区别&a…

Android 沉浸式状态栏

文章目录 Android 沉浸式状态栏前提情况一:使用FrameLayout情况二:使用CoordinatorLayoutfitsSystemWindows属性原理情况三:在CoordinatorLayout中添加子控件问题:解决: 情况四:使用FrameLayout实现沉浸式效…

Android实现沉浸式状态栏效果

关于沉浸式状态栏,给大家推荐一个非常好的博文android标题栏、状态栏图标文字颜色及背景动态变化 另外说明下,沉浸式状态栏的实现仅适用于 android 4.4及以上版本,4.4以下的就不要想了。 1. 实现秀明状态栏常规方法 //是否使用特殊的标题栏背…

适配“沉浸式”状态栏

传送门: fitSystemWindow属性的作用 http://blog.csdn.net/wangxp423/article/details/79564244 fitSystemWindow属性实战 http://blog.csdn.net/wangxp423/article/details/79566465 上两篇我们讲了fitSystemWindows实现沉浸式状态栏,本篇主要讲解适…

Android 实现沉浸式状态栏(包含顶部栏吸顶Layout CoordinatorLayout实现沉浸式状态栏)

前言 Android状态栏默认是固定的黑底白字,这肯定是不被伟大的设计师所喜爱的,更有甚者,某些时候设计希望内容能够延伸到状态栏上部(例如顶部是大图的情况)。所幸的是随着Android版本的迭代,开发者对状态栏…

Android实现ImmersionBar沉浸式状态栏

&#xff08;一&#xff09;效果图 &#xff08;二&#xff09;实现步骤&#xff1a; 1、在build.gradle中加上 implementation com.gyf.barlibrary:barlibrary:2.3.0 2、设置页面为全屏 将上图中的 <style name"AppTheme" parent"Theme.AppCompat.Light.…

Android沉浸式状态栏实现

首先创建一个BaseActivity或者BaseFragment&#xff0c; 后面需要沉浸式状态的继承BaseActivity或BaseFragment, 然后在XML文件中添加想设置的状态栏背景颜色&#xff0c;以下两句代码 android:background"#1677FE" android:fitsSystemWindows“true” BaseActivity代…

一个Android沉浸式状态栏上的黑科技

本文同步发表于我的微信公众号&#xff0c;扫一扫文章底部的二维码或在微信搜索 郭霖 即可关注&#xff0c;每个工作日都有文章更新。 说起来&#xff0c;在不知不觉中&#xff0c;我竟然凑成了这沉浸式状态栏三部曲。 其实最开始的时候&#xff0c;我主要是因为工作上的原因想…