第四章 网络层
网络层负责为分组交换网上的不同主机提供通信服务,即网络互连问题。
4.1 网络层的重要概念
4.1.1 网络层提供的两种服务
借助于电信网的经验,过去有人认为计算机的网络应使用面向连接的通信方式,即在分组交换中建立一条虚电路,以预留双方通信所需的一切网络资源,使用完后再释放连接即可。
但计算机网络的终端不是电信网的电话而是拥有很强的差错处理能力的计算机。最后决定了网络层向上只提供简单灵活的、无连接的、尽最大努力交付的数据报服务,即网络在发送分组时不需要先建立连接,每个分组不进行编号,独立发送,独立寻径,不保证时效。即网络层不提供服务质量的承诺,由主机中的运输层负责差错处理、流量控制等可靠性业务。
网络层提供的两种服务的示意图如下:
两种服务的主要区别如下:
鉴于主流的 TCP/IP 体系的网络层提供的是数据报服务,可简单认为目前网络层提供无连接服务,由端系统提供可靠服务。
4.1.2 网络层的两个层面
我们知道,不同网络中的两个主机之间的通信,要经过若干个路由器转发分组来完成,分组查找路由器中的转发表,从指明的接口转发到下一个路由器。**但转发表是怎样得出的呢?**是从路由表导出的,而路由表又是由互联网中许多的路由器,按照共同选定的路由选择协议,通过许多次的相互交换路由信息而产生的。由此可见,在路由器之间传送的信息有以下两类:
第一类是转发源主机和目的主机之间所传送的数据,把源主机所发送的分组,像接力赛跑一样,从一个路由器转发到下一个路由器,最后把分组传到目的主机。
第二类是传送路由信息,是根据路由选择协议所使用的路由算法,彼此不断地交换的路由信息分组。此类信息为第一类信息的传送提供服务。
由上即可把网络层抽象为数据层面和控制层面,抽象如下:
必须说明,在路由器的实体中,看不到这种抽象的层面。但其实是和路由器的转发分组(用硬件)和路由选择(用软件)的两大功能相对应。
补充说明:路由表与转发表。
路由表是指明了路由信息,可以知道下一跳的IP和接口等,但实际传送在数据链路,故还需要利用ARP来获取MAC地址。
转发表由路由表导出,内容还包括了提前准备的转发需要的其他信息,如IP对应的MAC地址,便于硬件转发等等,这样在接到分组后可以更快反应。
本文中的路由表与转发表不做区分。
4.2 网际协议IP
网际协议 IP 是TCP/IP体系中两个最主要的协议之一,用来使互连起来的许多计算机网络能够进行通信的,因此 TCP/IP 体系中的网络层常常被称为网际层(internet layer)或 IP 层。与IP 协议配套使用的还有三个协议:
- 地址解析协议 ARP (Address Resolution Protocol)
- 网际控制报文协议 ICMP (Internet Control Message Protocol)
- 网际组管理协议 IGMP (Internet Group Management Protocol)
注:互联网标准中,ARP被列入数据链路层协议。其他两个在网络层。
还有个旧的协议叫逆地址解析协议 RARP (Reverse Address Resolution Protocol) ,可以使知道自己MAC地址的主机找出其IP地址,但现在的协议DHCP已包含其功能,所以RARP已不使用了。下图画出了这三个协议和网际协议 IP 的关系。 ICMP 和 IGMP要使用 IP 协议,而 IP 经常要使用ARP。
4.2.1 虚拟互连网络
因为用户的需求是多种多样的,导致全世界有很多种不同性能、不同网络协议的网络(即多种异构网络),而不同的网络之间需要进行通信,故需要互连起来。将网络互相连接起来需要使用一些中间设备,根据其所在的层次,有以下四种:
- 物理层的转发器(repeater)
- 数据链路层的网桥、桥接器**(bridge)** 和交换机(switch)
- 网络层的路由器(router)
- 在网络层以上使用的网关(gateway) 。用网关连接两个不兼容的系统需要在高层进行协议的转换。
当中间设备是转发器或网桥时,仅仅是把一个网络扩大了,不能称之为网络互连。而网关由于比较复杂,目前使用得较少。故讨论网络互连时,都是指用路由器进行网络互连。路由器其实就是一台专用计算机,用来在互联网中进行路由选择。
下图(a)表示有许多计算机网络通过一些路由器进行互连。由于参加互连的网络都使用相同的网际协议 IP ,因此可以把互连以后的网络看成如下图(b)所示的一个虚拟互连网络 。即逻辑互连网络,就是互连起来的各种物理网络的异构性本来是客观存在的,但是利用 IP 协议就可以使这些性能各异的网络在网络层上看起来好像是一个统一的网络, 简称IP网。如果在这种覆盖全球的 IP 网的上层使用 TCP 协议,那就是现在的互联网(Internet)
在下图所示的互联网中的源主机H1要把一个 IP 数据报发送给目的主机H2。首先主机H1会通过ARP协议查看目的主机H2是否就在本网络上(即局域网)。如是,则不需要经过任何路由器而是直接交付,任务就完成了。如不是,则必须把 IP 数据报发送给某个路由器(图中的R1)。R1在查找了自己的转发表后,知道应当把数据报转发给R2进行间接交付。这样一直转发下去,最后路由器 R5 知道自己是和目的主机H2接在同一个网络上,就把数据报直接交付目的主机H2。通过下图还可以知道R5所在的网络是无线局域网,R4和R5之间是卫星链路,主要强调的是:互联网可以由多种异构网络互连组成。
在互联网词汇中,分组在途中的每一次转发都称为一“跳(hop)”,路由器转发分组时常用“下一跳(next hop)”
4.2.2 IP 地址
1)IP 地址及其表示方法
整个的互联网就是一个单一的、抽象的网络。 IP 地址就是给互联网上的每一台主机 (或路由器)的每一个接口分配一个在全世界范围内是唯一的 32 位的标识符。如果互联网上的设备没有IP地址,就无法和网上的其他设备进行通信。IP 地址现在由互联网名字和数字分配机构 ICANN进行分配。
IP 地址都是连续的32 位二进制代码。但我们为了便于记忆,常用点分十进制记法。如下图所示:
32位IP地址采用二级结构,由两个字段组成,即 IP 地址定义为{<网络号>,<主机号>}。第一个字段网络号,它标志主机(或路由器)所连接到的网络;第二个字段是主机号,它标志着该主机。在互联网中,一个网络号在整个互联网范围内是唯一的,而主机号在所在的网络中也是唯一的,即一个 IP 地址在整个互联网范围内是唯一的。
IP 地址中包含网络号就表明了,不连网的设备是没有 IP 地址的。再次强调,IP 地址指明了连接到某个网络上的一个主机(通过某接口连接到主机上)。下图表示IP地址中的网络号和主机号的位置。IP 地址的前 n 位为主机所连接的网络号,后面的 (32-n) 位是主机号。
2)分类的IP地址
互联网早期使用的是分类的IP地址。就是按照固定的网络号位数 n 来划分,其中A类(n=8),B类(n=16),C类(n=24)均为单播地址,还有D类是多播地址,E类为保留地址,具体划分可观看下图:
下面列出了一般不使用的特殊 IP 地址,这些地址只能在特定的情况下使用,需要了解。
分类的 IP 地址由于网络号的位数是固定的,因此管理简单,使用方便,转发分组迅速,完全满足早期网络需求。但是,随着用户数的猛增,就发现了分类IP地址的不合理之处,如A类的网络地址上主机有1677万个,B类的地址上可指派的主机有65534个,而C类只有254个,当某机构的主机需求刚好大于C或B时,只能向上申请B或A的,造成了地址资源浪费。而IPv4地址总数只有43亿,可以预见会在不久的将来枯竭。
后面虽然使用过划分子网的方式,即IP地址定义为{<网络号>,<子网号>,<主机号>},使用子网掩码,将原来的二级结构改成了三层结构,虽然可以提高IP地址空间的利用率,增加了灵活性,但因为子网号不能为全0或全1,实际上还减少了能够连接在网络上的主机总数。然后,一种新的无分类编址方法问世了,它可以推迟 IP 地址用尽的日子,并且现已普遍采用此方法。
3)无分类编址CIDR
这种编址方法的全称是无分类域间路由选择CIDR,有的文献也称为构造超网。他把 IP 地址定义的网络号改称为网络前缀,所以在CIDR的 IP 地址定义为{<网络前缀>,<主机>},如下所示。和之前最大区别是,网络前缀的位数n不是固定的数,而是可以是0~32之间任意选值。当然,网络前缀越短的地址块所包含的地址数越多。
CIDR采用斜线记法来标志网络前缀的位数,即在IP地址后面加上斜线“/”,斜线后面是网络前缀所占的位数。如128.14.35.7/20 = **10000000 00001110 0010**0011 00000111,就说明前20位为网络前缀,即网络地址128.14.32.0/20,后12位是主机号。里面最小地址为128.14.32.0,最大地址为128.14.47.255。
128.14.32.7 是IP地址,但未指明网络前缀长度,故不知道网络地址是什么。
128.14.32.7/20,是IP地址,也指明了网络前缀为20位,可以知道网络地址。
128.14.32.0/20,是包含多个IP地址的地址块或网络前缀,也是这个地址块里主机号为全0的地址
计算机是看不见斜线记法的,而是将32位二进制的 IP 地址和32位二进制的地址掩码(子网掩码)进行按位AND预算,来得出网络地址。地址掩码就是由一连串的 1 和一连串的 0 组成,1 的个数就是网络前缀的位数。而AND运算就是逻辑与运算,1 AND 1=1,1 AND 0 =0,0 AND 0 = 0。从IP地址中算出网络地址举例如下:
一个大的CIDR地址中往往包含了许多较小的地址块,所以在路由器的转发表中就利用较大的地址来代替许多较小的地址块,这个方法叫做路由聚合。就是先转发到较大地址的网络,再在该网络内经路由器查找较小的网络,举例如下图:
4)IP地址的特点
- 每一个IP地址都有网络前缀和主机号两部分组成。好处是,管理机构分配IP地址时只分配网络地址,主机号由得到的单位自行分配;还有,路由器根据目的主机所连接的网络前缀来转发分组,可以减少路转发表的空间和查找时间。
- 实际上 IP 地址是标志一台主机(或路由器)和一条链路的接口,即IP地址是标志主机连接在网络上的接口。当一台主机同时连接到两个网络上时,该主机就必须同时具备两个对应的IP地址,其网络前缀必须是不同的。
- 按照互联网的观点,一个网络是指具有相同网络前缀的主机集合,用转发器或交换机连接起来的多个局域网还属于同一个网络,具有不同网络前缀的局域网必须使用路由器进行互连。
- 在IP地址中,所有分配到网络前缀的网络都是平等的,也即互联网平等对待每一个IP地址。
下图画出了三个局域网通过三个路由器互连构成的互连网络。每个小圆圈代表需要一个IP地址。
从上可以观察到,同一个局域网上的主机或路由器的IP地址中的网络前缀必须是相同的,即必须是同样的网络号。网络地址里面的主机号是全0。交换机是是数据链路层设备,只有MAC地址。路由器总是由两个以上的IP地址。图中,两个路由器之间通过一条链路直接相连,称为点对点链路。是使用了前缀n=31的特殊地址块,上面只有2个IP地址,主机号分别为0和1,互相之间处可以通信,这种特殊网络也称为无编号网络或者匿名网络。
4.2.3 IP地址和MAC地址
MAC地址已经固化在适配器的ROM中,也称为硬件地址和物理地址,是数据链路层及以下使用的地址,而 IP 地址是网络层和以上各层使用的地址,是一种逻辑地址(用软件实现的)。区别如下图所示:
在发送数据时,数据从高层下到低层,然后才到通信链路上传输。使用 IP 地址的 IP数据报一旦交给了数据链路层,就被封装成 MAC 帧了。 MAC 帧在传送时使用的源地址和日的地址都是硬件地址。连接在通信链路上的设备(主机或路由器)在收到 MAC 帧时,根据 MAC 帧首部中的硬件地址决定收下或丢弃。只有在剥去 MAC 帧的首部和尾部后把 MAC 层的数据上交给网络层后,网络层才能在 IP 数据报的首部中找到源 IP 地址和目的地址。
下图展示了三个局域网用两个路由器连接起来,现主机H1要和主机H2通信。途径是H1→经过 R1转发→再经过R2转发→H2 。
从上面可以观察到,
(1)**在IP 层抽象的互联网上只能看到 IP 数据报。**数据报中间经过的两个路由器的 IP 地址并不出现在 IP 数据报的首部中,首部中的源地址和目的地址始终分别是 IP1和 IP2 。
(2)实际网络中,一个路由器有多个接口分别连接多个网络,但路由器只根据目的站的 IP 地址的网络号进行路由选择,即由路由表决定转发出去的接口。
(3)在局域网的链路层,只能看见 MAC 帧。 MAC 在不同网络上传送时,其 MAC 帧首部中的源地址和目的地址要发生变化。
(4)尽管互连在一起的网络的硬件地址体系各不相同,但 IP 层抽象的互联网却屏蔽了下层这些很复杂的细节。只要我们在网络层上讨论问题,就能够使用统一的、抽象的 IP 地址研究主机和主机或路由器之间的通信。
以上四点是计算机网络的精髓,但是还有两个重要问题没有解决。第一个问题是,主机或路由器怎样知道应当在 MAC 帧的首部填入什么样的硬件地址?在4.2.4 解决。第二个是,路由器中的路由表是怎样得出的?在4.5解决。
4.2.4 地址解析协议ARP
主机或路由器怎样知道应当在 MAC 帧的首部填入什么样的硬件地址?首先,应当知道主机H1和路由器R1,R1和R2,R2和H2分别都在同一个局域网中,路由器通过转发表知道了下一跳的IP地址,从自身接口的网卡处获得源MAC地址,但是目的MAC地址呢?地址解析协议 ARP在每一台主机都设有一个ARP高速缓存(ARP cache) ,里面有本局域网上的各主机和路由器的 IP 地址到硬件地址的映射表,通过查看该表即可获得目的MAC地址。
但是 ARP 高速缓存是如何建立的,大致如下:
(1) ARP 进程在本局域网上广播发送一个 ARP 请求分组(ARP分组封装在以太网中),内容包含自身MAC地址与IP地址,和请求的IP地址。
(2) 在本局域网上的所有主机上运行的 ARP 进程都收到此 ARP 请求分组。
(3) 主机B的 IP 地址与 ARP 请求分组中要查询的 IP 地址一致,就收下这个 ARP 请求 分组,并向主机 A 发送已写入自己的MAC地址ARP 响应分组,同时把主机A的这一地址映射写入主机自己的 ARP 高速缓存中。而其余的所有主机的 IP 地址都与 ARP 请求分组中要查询的地址不一致,因此都不理睬这个 ARP 请求分组。
(4) 主机A收到主机 ARP 响应分组后,就在其 ARP 高速缓存中写入主机 IP 地址到硬件地址的映射。
ARP 对保存在高速缓存中的每一个映射地址项目都设置生存时间(例如,10 ~20 钟)。凡超过生存时间的项目就从高速缓存中删除掉。
必须记得, ARP 是解决同一个局域网上的主机或路由器的 IP 地址和硬件地址的映射问题。无法解析出另一个局域网上主机的硬件地址(实际上也不需要知道远程主机的硬件地址),利用一个个局域网不断转发即可。从IP 地址到硬件地址的解析是自动进行的,主机的用户对这种地址解析过程是不知道的。
4.2.5 IP数据报的格式
在IP协议的标准中,描述首部格式的宽度是32位(4字节)。下图是IP数据报的完整格式。
由上图可看出,一个 IP 数据报由首部和数据两部分组成。首部的前一部分的长度是固定的,共 20 字节,是所有数据报必须具有的。在首部的固定部分的后面是一些可选字段, 其长度是可变的。下面介绍首部各字段的意义。
(1)版本 占4位,指 IP 协议的版本。通信双方使用的 IP 协议的版本必须一致。这里讨论的 IP 协议版本号为 4(即 IPv4) ,关于IPv6 (即版本6的IP协议)将在后面的 4.5 节讨论。
(2) 首部长度 占4位,可表示的最大十进制数值是 15 ,单位是首部的宽度即 32 位(4字节)。因为 IP 首部的固定长度是 20 字节,所以最小值是 5(即0101) 。而最大值只能是15(即1111) ,表明首部长度最大值为60 字节。
(3) 区分服务 占8位,用来获得更好的服务。在旧标准中叫服务类型, 一般不使用。
(4) 总长度 占16位,指首部和数据之和的长度,单位为字节。数据报的最大长度为 216 = 65535 字节,而实际上不传送这样长的数据报。因为数据链路层的协议规定了数据帧中数据字段的的最大长度,即最大传送单元MTU,如以太网是1500字节。
虽然使用尽可能长的 IP 数据报会使传输效率得到提高(每个 IP 数据报中首部长度占数据报总长度的比例会小些),但每一个 IP 数据报越短,路由器转发的速度就越快。 IP 协议规定,在互联网中所有的主机和路由器,必须能够接受长度不超过 576 字节(512数据+60最大首部长度+4富余量)的数据报。若数据报长度超过主机所能接收的长度,就要进行分片。 在进行分片时(见后面的"片偏移"宇段),数据报首部中的"总长度"字段是指分片后的每一个分片的首部长度与该分片的数据长度的总和。
(5) 标识 占16 位。 标识每一个数据报,但并不是序号,而是用于分片后的各数据报片最后能正确地重装成为原来的数据报。
(6) 标志(flag) 占3位,但目前只有2位有意义。
- 最低位记为 MF (More Fragment)。MF =1, 即表示后面"还有分片" 的数据报。 MF=0 表示这己是若干数据报片中的最后一个。
- 中间的记为 DF (Don’t Fragment) ,意思是"不能分片"。只有当 DF = 0 时才允许分片。
(7) 片偏移 占13 位。指出在分片后,某分片在原分组中的相对位置。片偏移以 8个字节为偏移单位。故每个分片的长度一定是 8字节 (64 位)的整数倍。分片举例如下:
(8) 生存时间(TTL) 占8位,由发出数据报的源点设置,指明数据报在互联网中至多可经过多少个路由器。其目的是防止无法交付的数据报无限制地在互联网中兜圈子。最初以秒作为 TTL 值的单位,但现在的单位是跳数。路由器会在每次转发数据报之前把 TTL 值减 1,若 TTL 值减小到 0 ,就丢弃这个数据报。 若把 TTL 的初始值设置为1,就表示这个数据报只能在本局域网中传送。
(9) 协议 占8位,协议字段指出此数据报携带的数据是使用何种协议,以便使目的主机的 IP 层知道应将数据部分上交给哪个协议进行处理。常用的一些协议和相应的协议字段值如下:
(10) 首部检验和 占16 位。只检验数据报的首部,但不包括数据部分。数据报每经过一个路由器,路由器都要重新计算一下首部检验和(因为一些字段,如生存时间、标志、片偏移等都可能发生变化)。下图展示了数据报首部检验和的计算过程。
(11)源地址 占32位
(12)目的地址 占32位
**IP 数据报首部的可变部分:**是一个选项字段。用来支持排错、测量以及安全等措施。长度从 0 个字节到 40 个字节不等,取决于所选择的项目,多个项目直接拼接。最后用全 0 的填充字段补齐成为 4 字节的整数倍。增加首部的可变部分同时会增加开销,实际上很少被使用。
4.3 IP层转发分组的过层
在前面已经介绍过,分组在互联网上借助路由器不断接力传送和转发是基于分组首部中的目的IP地址的,这种转发方式称为基于终点的转发。
(1)首先,必须预先知道的是每个主机或路由器内部都有转发表,主机的转发表设置了默认路由器的IP地址,这个路由器知道主机到每一个网络的最佳路径(通过与其他路由器交换路由信息得来),主机与其他目的网络通信时,一般需要先将数据报传送给这个默认路由器,由默认路由器去工作。
(2)当源主机A向目的主机B发送报文时,首先要确定目的主机B是否在本网络上,把要发送分组的目的IP地址和本网络的子网掩码(也即网络前缀)按位进行AND运算。若运算结果等于本网络的前缀,表明目的主机在本网络上,则可以进行直接交付;否则,就将主机A就根据转发表将分组转发给路由器。
(3)分组每到达一个路由器,路由器就根据分组中的终点查找转发表,(得知下一跳路由器的IP地址,然后把分组送交数据链路层的网络接口软件,网络接口软件调用ARP解析出下一跳路由器的MAC地址),把MAC地址写入MAC帧的首部,再把MAC帧传送给下一跳路由器的数据链路层,该路由器取出MAC帧的数据部分,交给网络层。
(4)重复(3)直到找到目的主机所在的网络,最后就在这个网络上把分组直接交付给目的主机。
直接交付:当确定目的主机与路由器在同一网络后,通过ARP获取目的主机的MAC地址,通过交换机转发给目的主机,而无需再利用路由器转发。
简化的路由表模拟如下所示(前缀匹配即为网络地址)
前缀匹配 | 接口 | 下一跳 |
---|
128.1.1.1/32 | A | 127.0.0.1 | 128.1.24.0/22 | B | 直接交付 | 128.1.24.0/24 | C | 直接交付 | 0.0.0.0/0 | D | 192.168.1.1 |
当路由器收到目的地址为128.1.24.1分组后,将他与路由表第一行的子网掩码按位与AND求得目的网络地址为128.1.24.1/32,与路由表第一行不匹配,然后与路由表第二行的子网掩码按位与AND求得目的网络地址为128.1.24.0/24,与第二行匹配。但是与第三行128.1.24.0/22,同样匹配。
因为CIDR可以使用路由聚合,即转发表中的128.1.24/22可能是128.1.25.0/24和128.1.26.0/24聚合而成,这就说明路由表中的第二行,实际上并不是目的主机所在的网络,为了解决这一问题,采用了最长匹配原则。因为前缀越长,地址块越小,路由就越具体。如果分组在转发表中可以找到多个匹配的前缀,就应当选择前缀最长的作为匹配的前缀。在路由表中,应当按前缀长短的顺序往下排列。
路由表中第一行为主机路由如a.b.c.d/32,即对特定的目的主机指明一个路由。最后一行为默认路由0.0.0.0/0,即不管分组的最终目的网络在哪,都由指定的路由器来处理。此二者都是特殊的网络路由。
因为减少查找转发表的时间,通常会把转发表放在二叉线索的数据结构中,然后自上而下地按层次进行查找,先找出对应每个IP地址的唯一前缀构建的二叉结构,如下所示。
但必须知道,二叉线索只是提供了一种可以快速在转发表中找到匹配的叶节点的机制。最后是否和网络前缀匹配,还要和子网掩码进行一次逻辑与AND运算。
网络层的其他部分,后续会继续更新。
本文参考 计算机网络(第8版) / 谢希仁编著. ----北京:电子工业出版社,2021.6
若对你有所帮助,请点个赞,欢迎交流。
|