网络层是计算机网络学习中的重点,在网络层我们主要学习以下内容:
网络层要学习的内容较多,博主会逐步将内容整理并更新…
网络层处于五层结构中的第三层,网络层的最主要的任务就是将分组从源端传送到目的端,为分组交换网络上的不同主机提供数据通信服务。
其表现形式就是,向上层提供简单灵活的、无连接的、尽最大努力交付的数据报服务,主要使用的协议是IP协议。
网络层主要的功能包括:实现异构网络互联、实现路由选择与分组转发、实现拥塞控制。
异构网络是指,网络接入机制、路由选择机制、寻址方案等不同的网络。
由于用户的需求的多样性(不同的网络接入机制、路由选择机制等),并不存在一种单一的网络可以满足所有用户的需求,因此世界上存在着各种各样的异构网络。
网络互联是指将两个及两个以上的计算机网络,通过中间设备(中继系统)相互连接起来,构成一个更大的网络。
根据所在的层次,中继系统分为四个类型:
通过之前章节的学习,我们可以知道,在物理层和数据链路层,通过中继系统将两个不同的网络连接起来,只是把一个网络扩大了,并不是真正意义上的网络互联。
因此网络互联一般指在网络层通过路由器进行的网络互联。
使用TCP/IP体系的互联网,采用了标准化协议的方法来实现网络互联,各个互联的网络可以使异构的。即,通过路由器,构建一个虚拟的IP网络,通过IP协议使这些异构网络看起来就像是一个统一的网络。
构建虚拟IP网络的好处在于:当这个虚拟IP网络上的主机相互通信时,仿佛处于同一个网络,不需要关心各个异构网络的具体差异细节。
路由选择与分组转发是路由器的最主要的两个功能。
路由选择
按照复杂的分布式算法,根据从各个相邻的路由器所得到的关于整个网络拓扑的变化情况,动态地改变所选择的路由
路由器根据特定的路由选择协议构造路由表,定期地和相邻路由器交互路由信息,不断更新路由表。
分组转发
路由器根据转发表将用户的IP数据报从正确的端口转发出去。
路由器处理相关的数据流,相关的功能是查询转发表、转发数据报、进行队列管理和任务调度等。
路由表是根据路由算法计算得出的,转发表是通过路由表得出的,在讨论路由选择的原理时,一般不会专门区分转发表和路由表,而是笼统地使用路由表
在通信子网中,因出现过量的分组导致网络性能下降的现象被称为拥塞。
举例说明:
假设由一个路由器A,该路由器所在的链路的带宽是R(B/s),且只有一个接收端口用于接收IP分组,IP分组发送速率是r(B/s),如果此时r=R,是不是就代表了该链路的带宽被充分利用了,就是一个十分完美的状态呢?答案是否定的,因为路由器的接收端口的缓冲区是有限的,如果分组到达路由器的速率接近R,就会导致由大量的分组被丢弃,从而导致发送端到接收端的平均时延接近无穷大。
下图表示了分组的发送速率与时延的关系图
那么我们该如何判断一个网络是否处于拥塞状态呢?
我们可以通过观察网络吞吐量和网络负载这两个指标,如果随着网络负载的增加,网络的吞吐量明显小于正常的吞吐量,那么网络可能进入了“轻度拥塞”状态,如果随着网络负载的增加,网络的吞吐量急剧下降,那么网络可能进入了“重度拥塞”状态,如果随着网络负载的增加,网络的吞吐量下降为0,那么网络就进入了死锁状态。
拥塞控制主要是为了解决如何获取网络中发生的拥塞信息,并且通过这些信息进行控制避免发生分组的丢失以及死锁的产生。
拥塞控制的作用在于确保网络由足够的能力承载接收到的流量。
流量控制指在发送端和接收端之间点对点通信量的控制,它会抑制发送端发送数据的速率,从而使接收端由足够的时间来接收、处理发送端发送的数据。
拥塞控制是确保通信子网能够传送待传送的数据,是一个全局性的问题,涉及网络中的所有主机、路由器以及导致网络传输能力下降的所有因素。
即,流量控制只需要考虑点对点的通信双方,而拥塞控制需要考虑整个通信子网中与传输能力相关的所有因素。
拥塞控制常见的方法由两种:开环控制与闭环控制。
开环控制
在设计网络的架构时就需要事先由网络设计者将可能发生拥塞的所有因素都考虑周全,力求网络在运行时不会发生拥塞。这是一种静态的方法,一旦系统运行起来,就无法再进行修改。
闭环控制
在设计网络时不需要网络设计者考虑与拥塞相关的因素,而是采用网络检测系统在网络运行时进行检测。这是一种静态的方法,在系统运行时,收集发生拥塞的信息,并进行相应的处理。
网络层的主要任务就是转发和路由选择,我们将网络层抽象为了两个层面:控制层面和数据层面。
其中,控制层面实现了路由选择功能,数据层面实现了转发功能。
近几年出现了一种新型的网络架构——软件定义网络(SDN),它采用了集中式的控制层面和分布式的数据层面,将控制层面和数据层面进行了分离,控制层面利用接口对数据层面上的路由器进行集中控制。
传统互联网中路由器既有转发表又有路由选择软件,各个路由器会相互交换路由信息。
在SDN架构中,各个路由器之间不再相互交换路由信息,在控制层面有一个逻辑上的远程控制器,它掌握了各个主机和整个网络的状态,为每个分组计算出最佳路由,通过Openflow协议将转发表下发给每个路由器,路由器就只是单纯的负责接收分组、查找转发表、转发分组。
在网络层,路由器转发分组的依据是路由表,而路由表是控制层面根据网络的拓扑状态计算得到的。在这个计算的过程中所使用的算法就被称为路由算法。
路由算法被分为两类:静态路由算法和动态路由算法。
静态路由算法(非自适应路由算法)
静态路由算法指由网络管理员手工配置的路由信息。
优点:简单可靠,在负荷稳定、拓扑变化不大的网络中运行效果很好,可以广泛用于高度安全性的军事网络和较小的商业网络。
缺点:路由更新慢,不适用于大型网络。
动态路由算法(自适应路由算法)
动态路由算法指路由器的路由表的表项是通过路由器间彼此交换信息,按照一定的算法优化得出的。
优点:路由更新快,适用于大型网络,可以及时响应链路费用或网络拓扑的变化。
缺点:算法复杂,增加了网络的负担。
动态路由算法可以进一步细分为两类:距离-向量路由算法和链路状态路由算法
在距离-向量路由算法中,所有的结点都会定期地与其直接相连的路由器交换整个路由选择表信息。
路由选择表包含两种信息:每条路径的目的地和该路径的代价(距离)。
在该算法中的各个结点,在下述情况下会更新自己的路由表
距离-向量路由算法的本质在于不断的迭代到某个目的结点的路由信息,从而获得到该目的结点的最短(代价最小)路由信息。最常见的距离-向量路由算法是RIP算法,这个算法会在后面的小节中详细介绍。
在链路状态路由算法中,所有的结点都具有整个网络的拓扑信息,各个结点都会主动的测试所有的邻接结点的状态(是否还可以连通),并定期地将这些链路状态传播给所有的其他结点。
每当链路状态报文到达结点后,该结点就会使用这些状态信息更新自己的网络拓扑和状态表,一旦链路状态发生变化,该结点就是用Dijkstra最短路径算法重新计算出到达其他所有结点的最短路径。
链路状态路由算法的主要特点:
使用洪泛法向当前自治系统中的所有其他路由器发送链路状态信息。
某路由器A向其所有相邻的路由器发送信息,然后其相邻的所有路由器再向它们相邻的所有路由器(除了路由器A)继续发送该信息。
每个结点发送的信息是与该结点相邻的路由器的链路状态。
只有当链路状态发生变化时,路由器才会向所有其他路由器发送此信息。
有上述的特点可以看出,链路状态路由算法交换的报文只与其相邻的路由器个数有关,与整个网络的结点个数无关,因此链路状态路由算法适用于大型网络。最常见的链路状态路由算法是OSPF算法,这个算法会在后面的小节中详细介绍。
与距离-向量路由算法的区别
IPv4协议是现在被广泛使用的IP协议(版本4)
一个IP数据报由首部和数据部分组成,首部在前,数据部分在首部后面,首部分为两部分,前一部分是固定的20B,后一部分是可变部分,所有的IP数据报都必须包含首部的固定部分。IP数据报的格式如下图所示。
上图的各个字段含义如下:
为什么需要分片?
通过前面的学习,我们已经知道,网络层的IP数据报中的数据,需要封装在链路层的帧中进行传递。链路层有着严格的MTU限制,因此如果IP数据报的长度唱过了链路层的MTU,那么就必须要将IP数据报中的数据分装在多个较小的IP数据报中,这些较小的数据报叫做分片。
分片后如何在目标主机进行正确重装?
在目的主机中,通过每个IP数据报中的首部的标识、标志以及片偏移字段进行重组。
当网络层创建一个IP数据报时,源主机会为该数据报加上一个标识号,如果路由器需要将该数据报进行分片时,形成的每个小的数据报都会复制原始数据报的标识号。当目标主机收到来自同一个主机发送的同一批数据报时,它可以通过这些数据报的标识号来进行分组。
IP首部的标志位有3位,但是只有后两位有意义,分别是MF位和DF位,只有当DF为0时,该IP数据报才能被分片。MF位用于告诉目标主机这个IP数据报是否是原始数据报的最后一个分片,为0时表示是最后一个分片,为1时表示后面还有后续的分片。
注:这个章节用IP地址代指IPv4地址
IP 地址就是给每个连接在互联网上的主机(或路由器)分配一个在全世界范围是唯一的 32 位的标识符。IP 地址现在由互联网名字和数字分配机构ICANN进行分配。
互联网中的IP地址的发展历史分为以下三个阶段:
在早期的互联网中,使用的IP编址方式就是将IP地址进行分类,它将IP地址分为了5类(A|B|C|D|E)。用该方法编址的IP地址由网络号和主机号两部分组成。其中网络号表示主机(或路由器)所连接到的网络,每个主机号在整个互联网中必须是唯一的,主机号表示该主机(或路由器)。因此IP地址在整个因特网中是唯一的。
下图表示了五类地址以及各类的主机号和网络号的位数。
在分类的IP地址中,有一些IP地址是比较特殊的,这些IP地址不会被用做主机的IP地址。具体如下表所示。
网络号 | 主机号 | 作为源地址 | 作为目的地址 | 含义 |
---|---|---|---|---|
全0 | 全0 | 可以 | 不可以 | (0.0.0.0)表示本网络上的本主机 |
全0 | host-id | 可以 | 不可以 | 本网络上的某台主机 host-id |
全1 | 全1 | 不可以 | 可以 | 表示整个TCP/IP网络的广播地址 |
net-id | 全1 | 不可以 | 可以 | 表示net-id网络上的广播地址 |
127 | 非全0或全1的任何数 | 可以 | 可以 | 环回自检地址,表示任意主机本身 |
注:
网络号与主机号全1时(255.255.255.255),虽然是表示了整个TCP/IP网络的广播地址,但是由于路由器对于广播域的隔离,该地址基本等效于本网络的广播地址。
目的地址为环回自检地址127.x.x.x的IP数据报永远不会出现在任何网络上,只用于本地软件的测试。
分类的IP地址的特点:
每个IP地址都是由网络号和主机号两部分组成,这种IP地址是一种分等级的地址结构。
分等级的优点:
- IP 地址管理机构在分配 IP 地址时只分配网络号,而剩下的主机号则由得到该网络号的单位自行分配。这样就方便了 IP 地址的管理
- 路由器仅根据目的主机所连接的网络号来转发分组(而不考虑目的主机号),这样就可以使路由表中的项目数大幅度减少,从而减小了路由表所占的存储空间。
IP地址标志了一台主机(或路由器)和一条链路的接口。当一台主机同时连接两个网络时,这个主机就必须同时具有两个IP地址,这两个IP地址的网络号必须与所在的网络的网络号相同,且这两个IP地址的网络号互不相同。
IP地址中分配的网络号的网络是平等的。
在同一个局域网上的主机的IP地址中的网络号必须一样。
为什么要进行子网划分?
两级IP地址有着两个显著的缺点:IP地址的空间的利用率有时很低和不够灵活。
例如一个企业X申请了一个B类的网络,该网络的每一个网络号后面可以分配的主机数为(2^16 - 2),这是一个相当大的数量,很多机构下是没有这么多主机的。因此此时就产生了空间的浪费。(为啥这个企业不能直接申请一个C类的网络呢?这个就可能因为该企业想的是未来可能发展的规模更大,如果申请C类网络,后面发展更大后,C类网络不够用,想升级成B类网络比较复杂,于是该企业在申请时就申请了B类网络)。
由此可以看出,IP地址的空间利用率有时很低,且不够灵活。
因此,为了解决这个问题,从1985年起,在IP地址中只能加了一个“子网号字段”,使两级IP地址变为了三级IP地址,即子网划分。
子网划分的基本思想
子网划分是某个单位内部的事情,单位对外仍然表现为没有划分子网的网络。
从主机号借用若干比特作为子网号,即三级IP地址的结构为:{<网络号>,<子网号>,<主机号>}
凡是从其他网络发送给本单位某台主机的数据,仍然是根据数据的目的网络号,先找到连接到本单位网络上的路由器,然后由该路由器按照目的网络号和子网号找到目的子网,最终把该数据报转交给该目的主机。
注意:
划分子网只是将IP地址的主机号进行了进一步的划分,并没有改变IP地址的网络号。因此,从一个IP地址本身是无法看出是否进行了子网划分的。
疑问解答:
在此,我们来回答一下为什么划分子网就能解决之前提到的企业X申请网络号浪费IP地址空间利用率的问题,其原因是,该企业X可以向上层机构申请一个B类网络中的某一个子网段的网络号,上层机构可以根据该企业的实际主机数量对一个B类的网络号进行进一步的划分,划分出若干个更小规模的子网。这些子网可以分配给若干个类似企业X这种规模的企业使用,由此就可以提高IP地址的空间利用率了。
子网掩码
子网掩码是用于告知主机或路由器,该网络进行了子网划分。
子网掩码是一个长32bit的二进制串,与IP地址相对应,由一串1和跟随的一串0组成。其中1对应于IP地址中的网络号以及子网号,0对应于主机号。只需要将IP地址和其对应的子网掩码逐位进行"与"运算,就可以得出对应的子网的网络地址。
例如:某个主机的IP地址是192.168.5.56,子网掩码是255.255.255.0,通过逐位“与”运算后,就可以得出该主机所述的网络的网络号为192.168.5.0
值得一提的是,现在的因特网标准规定,所有的网络都必须使用子网掩码,即子网掩码已经成为因特网的标准规范了。
如果一个网络没有进行子网划分,那么就会采用默认的子网掩码。
A类网络的默认子网掩码是255.0.0.0
B类网络的默认子网掩码是255.255.0.0
C类网络的默认子网掩码是255.255.255.0
由于所有的网络都有子网掩码,因此在互联网中的路由器在相互之间交换路由信息的时候必须要把自己所属的网络的子网掩码告知对方,即,路由表中的每一项,除了由目的网络和下一跳地址外,还包含了该目的网络的子网掩码。
综上所述,当一个网络使用了子网掩码后,根据约定,会出现以下的情况:
什么是CIDR
CIDR是无分类域间路由选择的英文简称,它是在变长子网掩码的基础上提出的一种消除传统A、B、C类网络划分,并且可以在软件的支持下实现超网构造的一种IP地址划分方法。
CIDR使用了“网络前缀”的概念代替子网的概念,其与传统分类IP地址的最大区别就是,网络前缀的位数是不固定的,可以任意选取,即使用CIDR的IP地址被记为**{<网络前缀>,<主机号>}**。
CIDR 使用“斜线记法”(slash notation),它又称为 CIDR 记法,即在 IP 地址面加上一个斜线“/”,然后写上网络前缀所占的位数(这个数值对应于三级编址中子网掩码中 1 的个数)。CIDR 把网络前缀都相同的连续的 IP 地址组成“CIDR 地址块”。一个CIDR地址块可以表示很多地址,这种地址的聚合称为路由聚合,或构成超网。
例如128.14.32.0/20 表示的地址块共有 212 个地址(因为斜线后面的 20 是网络前缀的位数,所以这个地址的主机号是 12 位)。由此地址可以得出下列结论:
- 这个地址块的起始地址是 128.14.32.0。
- 在不需要指出地址块的起始地址时,也可将这样的地址块简称为“/20 地址块”。
- 128.14.32.0/20 地址块的最小地址:128.14.32.0
- 128.14.32.0/20 地址块的最大地址:128.14.47.255
- 全 0 和全 1 的主机号地址一般不使用。
为什么要使用CIDR
随着互联网的发展,世界上有越来越多的网络设备接入因特网中,在1992年的时候B类地址就已经快被分配完了,且此时的B类地址的路由表的表项也十分的庞大,维护起来十分困难。因此,人们开始使用CIDR进行IP编址,企图进一步解决IP地址不够用的情况。
CIDR的最长匹配规则
在使用CIDR时,路由表中的每个项目由“网络前缀”和“下一跳地址”组成,在路由器查找路由表时可能会得到不止一个匹配结果(与路由表中的网络掩码逐位"与"运算),此时,应当从匹配结果中选择具有最长网络前缀的路由,因为网络前缀越长,其地址块就越小,因此路由就越具体。
例如当路由器收到的分组的目的地址为:206.0.71.130,此时路由表中由两个表项分别为206.0.68.0/22与206.0.71.128/25
206.0.71.130转换为点分十进制=11001110 00000000 01000111 10000010(记为D)
206.0.68.0/22的地址掩码转换为点分十进制=11111111 11111111 11111100 00000000(记为A)
206.0.71.128/25的地址掩码转换为点分十进制=11111111 11111111 11111111 10000000(记为B)
将D分别与A和B进行逐位"与"运算
D AND A = 11001110 00000000 01000100 00000000 = 206.0.68.0/22(与地址块A进行匹配,网络前缀位数与A保持一致,也记为22),此时目标地址与206.0.68.0/22匹配上了。
D AND B = 11001110 00000000 01000111 10000000 = 206.0.71.128/25,此时目的地址与206.0.71.128/25也匹配上了。
由于第二个表项的前缀比第一个表项的前缀更长,因此路由器会选择第二个表项。
CIDR的二叉搜索
当路由表的项目数很大时,怎样设法减小路由表的查找时间就成为一个非常重要的问题,为了进行更加有效的查找,通常是将无分类编址的路由表存放在一种层次的数据结构中,然后自上而下地按层次进行查找。这里最常用的就是二叉线索。
IP 地址中从左到右的比特值决定了从根结点逐层向下层延伸的路径,而二叉线索中的各个路径就代表路由表中存放的各个地址。为了提高二叉线索的查找速度,广泛使用了各种压缩技术。
学习完了IP地址的各种编址方法,接下来我们就该学习在网络层分组到底是如何进行转发的了。
在数据链路层,数据的转发是通过交换机,将数据链路层的帧,根据MAC地址转发到具体的接口,而在网络层,由于互联网上的网络数远小于主机数,因此,网络层的分组转发都是基于目的主机所在网络的。当分组到达路由器后,路由器根据目的IP地址的网络前缀来查找转发表,确定下一跳应当到哪一个路由器。当IP数据报到达最后一个路由器后,该路由器才会试图向目的主机进行直接交付。
如果采用了CIDR编址,路由器为了加快查询转发表的速度,会按照前缀的长短,将前缀最长的放在第一个,如果匹配成功,就不用匹配后面的表项了。(因为是最长前缀匹配规则)
在转发表中,会存在这两种特殊的路由:
主机路由
对特定目的主机的IP地址专门指明一个路由,可以方便管理员控制和测试网络。
默认路由
用特殊前缀0.0.0.0/0表示默认路由,全0掩码和任何目的地址进行逐位"与"运算,结果必然为0,即所有的目的地址必然会与转发表中的该默认路由匹配上,只要目的网络不在该转发表中,就会选择默认路由。
由上面几个小节的介绍,可以总结出路由器执行的分组转发算法如下:
注意:
- 转发表并未指明到某个网络的完整路径,只是指明了到目的网络的下一跳地址,当分组到达下一跳的路由器后,再通过查找转发表继续寻找下一跳的地址,通过这样不断重复的一步一步的转发,最终到达才能到达目的网络。
- 当路由器得到下一跳路由的IP地址后,并不会直接将该地址填入待发送的数据报,而是将该IP地址转换成MAC地址,将此MAC地址放到MAC帧首部中,然后根据这个MAC地址找到下一跳路由器。(即,网络层查找出下一跳的路由器后,交由链路层进行转发数据)
未完待续…
参考文献
《计算机网络:自顶向下方法第七版》- Kurose
《计算机网络(第7版)》-谢希仁
《2023年计算机网络考研复习指导》-王道论坛
如果这篇文章有帮助到你,不妨点赞、转发、收藏一下喽~