网络层关注的是如何将分组从源主机沿着网络路径送达目的主机。为了将分组送达目的主机,有可能沿路要经过许多跳(hop)中间路由器。为此,网络层必须知道整个网络的拓扑结构,并且在拓扑结构中选择适当的转发路径。同时,网络层还必须仔细地选择路由器,以避免发生某些通信链路或路由器负载过重,而其他链路和路由器空闲的情况。因此,网络中的每台主机和路由器都必须具有网络层功能,而网络层最核心的功能就是:分组转发和路由选择。

网络层概述

分组转发和路由选择

网络层的主要任务就是将分组从源主机传送到目的主机,分两部分:

  1. 分组转发。当一个分组到达某路由器的一条输入链路时,该路由器必须将该分组转发到适当的输出链路。每个路由器中需要有一个转发表(forwarding table),路由器根据到达分组首部中的转发标识在转发表中查询链路接口。分组首部中的转发标识可能是该分组的目的地的地址或该分组所属连接的指示,这取决于具体的网络层协议。
  2. 路由选择。当分组从发送方流向接收方时,网络层必须决定这些分组所采用的路由或路径,这就是路由选择(routing)。路由选择的结果就是生成供分组转发使用的转发表。下图揭示了路由选择和分组转发间的重要关系。

image-20210723195711967

路由选择可以是集中式的(例如,在某个网控中心执行,并向每个路由器下载选路信息),也可以是分布式的。路由选择可以是人工的(由人类网络操作员直接配置转发表),也可以是自动的。分布式自动路由选择要求在每台路由器上运行路由选择协议,互相交换路由信息并各自计算路由。实际上,路由选择直接生成的是路由表(routing table),然后再由路由表生成最终的转发表。路由表和转发表在用途和实现细节上有些的不同,但我们在讨论路由选择的原理时不进行区别。

网络层提供的两种服务

网络层提供面向连接服务的计算机网络称为虚电路网络(virtual-circuit network),不是电话网的电路交换。

网络层提供无连接服务的计算机网络称为数据报网络(datagram network)。

有些人认为应当借助于电信网的成功经验,让网络负责可靠交付。而因特网采用的设计思路是这样的:网络层向上只提供简单灵活的、无连接的、尽最大努力(best effort)交付的数据报服务。网络在发送分组时不需要先建立连接。每一个分组(也就是IP数据报)独立发送,与其前后的分组无关(不进行编号)。网络层不提供服务质量(Quality of Service, QoS)的承诺。也就是说,所传送的分组可能出错、丢失、重复和失序(即不按序到达终点),当然也不保证分组交付的时限。

这个特性使网络中的路由器可以做得比较简单,而且价格低廉(与电信网的交换机相比较)。如果主机(即端系统)中的进程之间的通信需要是可靠的,那么就由位于网络边缘的主机中的运输层负责(包括差错处理、流量控制等)。现代网络大流行,充分证明了当初采用这种设计思路的正确性。

下图给出了两种网络的示意图。

image-20210723200550989

因特网是一个数据报网络。然而,许多其他网络体系结构包括ATM、帧中继和X.25 都是虚电路网络,它们在网络层使用连接。这些网络层连接被称为虚电路(virtual circuit, VC),当下这种非主流形式不做深入分析,着重看数据报网络。

网际协议 IP

网际协议IP是TCP/IP体系中两个最主要的协议之一,与IP协议配套使用的还有4个协议:

  1. 地址解析协议(Address Resolution Protocol,ARP);
  2. 逆地址解析协议(Reverse Address Resolution Protocol,RARP);
  3. 网际控制报文协议(Internet Control Message Protocol,ICMP);
  4. 网际组管理协议(Internet Group Management Protocol,IGMP)。

下图画出了这4个协议和网际协议IP的关系。ARP和RARP画在最下面,因为IP经常要使用这两个协议。ICMP和IGMP画在这一层的上部,因为它们要使用IP协议。TCP/IP体系中的网络层常常称为网际层(internet layer),或IP层。

image-20210726103930243

异构网络互连

将网络互相连接起来要使用一些中间设备。根据中间设备所在的层次,可以有以下4种不同的中间设备:

  1. 物理层使用的中间设备叫作转发器(repeater);
  2. 数据链路层使用的中间设备叫作网桥或桥接器(bridge);
  3. 网络层使用的中间设备叫作路由器(router);
  4. 在网络层以上使用的中间设备叫作网关(gateway),用网关连接两个不兼容的系统需要在高层进行协议的转换。

TCP/IP 体系在网络互连上采用的做法是在网络层(即 IP 层)采用了标准化协议,但相互连接的网络则可以是异构的。下图(a)表示有许多计算机网络通过一些路由器进行互连。由于参加互连的计算机网络都使用相同的网际协议(Internet Protocol,IP),因此可以把互连以后的计算机网络看成下图(b)所示的一个虚拟互连网络(internet)。

image-20210726104735244

下图画出了源主机、目的主机及各路由器的协议栈。主机的协议栈共有5层,但路由器的协议栈只有下3层。在 R4和 R5之间使用了卫星链路,而R5所连接的是个无线局域网。在R1到R4之间的3个网络则可以是任意类型的网络。总之,这里强调的是:互联网可以由多种异构网络互连组成。

image-20210726105253131

有了虚拟互连网络的概念后,再讨论在这样的虚拟网络上如何寻址。

地址及编址方式

在TCP/IP体系中,IP地址是一个最基本的概念。有关IP的标准文档是 RFC 791。

IP地址就是给因特网上的每一个主机(或路由器)的每一个接口分配一个在全世界范围是唯一的 32 位的标识符。由因特网名字与号码分配机构(ICANN)进行分配。ICANN 是总部设在美国加利福尼亚州的一个非营利性国际组织,在美国商务部的提议下于1998年10月成立的,负责IP地址的分配、协议标识符的指派、顶级域名的管理及根域名服务器的管理等。美国政府机构于2014年3月14日宣布将放弃对ICANN的管理权,这标志着因特网全球共治时代的到来。

image-20210726112928411

IP地址的编址方式共经过了3个历史阶段:

  1. 分类编址。这是最基本的编址方法,在1981年就通过了相应的标准协议。
  2. 划分子网。这是对最基本的编址方法的改进,其标准 RFC 950 在 1985年通过。
  3. 无分类编址。这是目前因特网所使用的编址方法。1993年提出后很快就得到推广应用。

前两种编址方式已成为历史[RFC 1812]。

1.分类编址

分类编址方式将IP地址划分为若干个固定类,如下图所示:

image-20210726123225978

  • A 类、B 类和 C 类地址的网络号字段(在图中这个字段是灰色的)分别为 1,2 和 3 字节长,而在网络号字段的最前面有1∼3位的类别位,其数值分别规定为0,10和110。
  • A 类、B 类和 C 类地址的主机号字段分别为 3 个、2 个和 1 个字节长。
  • D 类地址(前 4 位是 1110)用于多播(一对多通信)。
  • E 类地址(前 4 位是 1111)保留为以后用。

2.划分子网

但在实际应用中,随着中小规模网络的迅速增长暴露出了明显的问题。一个C类地址空间仅能容纳254台主机(有2个地址用于特殊目的)。因此,很多组织申请B类地址。然而一个B类地址空间又太大了,可容纳65534台主机。IETF提出了划分子网的编址改进方案。该方案从网络的主机号中借用不定长的若干位作为子网号subnet-id,当然主机号也就相应减少了同样的位数。于是两级IP地址就变为三级IP地址:网络号、子网号和主机号。

3.无分类编址

划分子网在一定程度上缓解了因特网在发展中遇到的困难,但因特网的IP地址仍在加速消耗,整个IPv4的地址空间面临全部耗尽的威胁。为此,IETF又提出采用无分类编址的方法,同时还专门成立IPv6工作组。

1993年,IETF 发布了无分类域间路由选择(Classless Inter-Domain Routing,CIDR)(CIDR的读音是“sider”)的 RFC 文档:RFC 1517~1519 和 1520。CIDR 消除了传统的 A 类、B 类和 C类地址,以及划分子网的概念,因而可以更加有效地分配IPv4的地址空间,并且可以在新的IPv6使用之前允许因特网的规模继续增长。

CIDR把32位的IP地址划分为两个部分。前面的部分是不定长的“网络前缀”(network-prefix),代替分类编址中的“网络号”来指明网络,后面的部分则用来指明主机。在分类编址中,给定一个IP地址,就确定了它的网络号和主机号。但在无分类编址中,由于网络前缀不定长,IP地址本身并不能确定其网络前缀和主机号。为此,CIDR采用了与IP地址配合使用的32 位地址掩码(address mask)。地址掩码是由前面连续的一串 1 和后面连续的一串 0 组成,而 1的个数就是网络前缀的长度。A 类地址的默认地址掩码是 255.0.0.0,B 类是255.255.0.0,而C类是255.255.255.0。

举个例子:已知IP地址是141.14.72.24,所在网络的子网掩码是255.255.192.0。试求其网络地址:

分析:子网掩码是 11111111 11111111 11000000 00000000。掩码的前两个字节都是全1,因此网络地址的前两个字节可写为141.14。子网掩码的第四字节是全0,因此网络地址的第四字节是0。可见本题仅需对地址中的第三字节进行计算。我们只要把IP地址和子网掩码的第三字节用二进制表示,就可以很容易地得出网络地址(见下图所示)。

image-20210726124725705

4.特殊的IP地址

虽然CIDR废弃了分类编址中的A、B、C类地址,但D类和E类地址仍然用于特殊目的不能分配给主机。D类地址为多播地址,只能作为目的地址使用。而E类地址为保留地址,供日后使用。网络前缀和主机号全为0或全为1的地址也不能分配给主机。通常全0表示“这个(this)”,例如,全网络前缀为全0的IP地址通常表示“本网络”的意思。而全1往往表示“所有的(all)”,例如,全1的主机号字段表示该网络上的所有主机。

网络前缀为 127(即 01111111)保留作为本地软件环回测试(loopback test)本主机的进程之间的通信之用。若主机发送一个目的地址为环回地址(如127.0.0.1)的IP数据报,则本主机中的协议软件就处理数据报中的数据,而不会把数据报发送到任何网络。目的地址为环回地址的IP数据报永远不会出现在任何网络上。

IP 地址与物理地址

在逻辑的互联网层次上主机和路由器使用它们的逻辑地址进行标识,而在具体的物理网络层次上,主机和路由器必须使用它们的物理地址标识。下图说明了这两种地址的区别。从层次的角度看,物理地址是数据链路层和物理层使用的地址,而IP地址是网络层和以上各层使用的地址,是一种逻辑地址(称IP地址是逻辑地址是因为IP地址是用软件实现的)。

image-20210726142746106

使用IP地址的IP数据报一旦交给了数据链路层,就被封装成MAC帧。MAC帧在传送时使用的源地址和目的地址都是物理地址,这两个物理地址都写在MAC帧的首部中。下面这幅图形象的说明了这个传输的过程。

image-20210726142816480

地址解析协议 ARP

知道了一个机器(主机或路由器)的IP地址,需要找出其相应的物理地址;或反过来,已经知道了物理地址,需要找出相应的IP地址。地址解析协议ARP和逆地址解析协议RARP就是用来解决这样的问题的。DHCP协议已经包含了RARP协议的功能,现在已经没有人再使用单独的RARP协议了。

在支持硬件广播的局域网中可以使用地址解析协议(Address Resolution Protocol,ARP)来解决IP地址与物理地址的动态映射问题。 ARP解决这个问题的方法是在主机ARP高速缓存中应存放一个从IP地址到物理地址的映射表,并且这个映射表不断动态更新(新增或超时删除)。

那么主机怎样知道这些地址呢?

  1. 下图(a)主机A中ARP 进程在本局域网上广播一个 ARP 请求分组,分组被直接封装在数据链路层广播帧中。ARP请求:“我的IP地址是209.0.0.5,物理地址是00-00-C0-15-AD-18。我想知道IP地址为209.0.0.6的主机的物理地址。”
  2. 在本局域网上的所有主机上运行的ARP进程都收到此ARP请求分组。
  3. 下图(b)主机B在ARP请求分组中见到自己的IP,就向A发送ARP响应分组。其余主机都不理睬这个ARP请求。ARP响应:“我的IP地址是209.0.0.6,物理地址是08-00-2B-00-EE-0A。”。注意ARP响应分组是普通的数据链路层单播。
  4. 主机A收到主机B的ARP响应分组后,就在其ARP高速缓存中写入主机B的IP地址到物理地址的映射。

image-20210726153051398

主机A在发送其ARP请求分组时,就把自己的IP地址到物理地址的映射写入ARP请求分组。所有接收到ARP广播的主机都会根据接收到的信息刷新自己的ARP高速缓存,记录主机A的映射关系。ARP把保存在高速缓存中的每一个映射地址项目都设置生存时间(例如,10~20min)。

ARP用于解决同一个局域网上的主机或路由器的IP地址和物理地址的映射问题;不同网络需要借助路由器转发来实现,而这对源发送主机是透明的。从IP地址到物理地址的解析是自动进行的,主机的用户对这种地址解析过程是不知道的。只要主机或路由器要和本网络上的另一个已知 IP 地址的主机或路由器进行通信,ARP 协议就会自动地把这个IP地址解析为链路层所需要的物理地址

下面我们归纳出使用ARP的4种典型情况:

  1. 主机发,把IP数据报发送到本网络上的另一个主机。用ARP找到目的主机的物理地址。
  2. 主机发,把IP数据报发送到另一个网络上的一个主机。用ARP找到本网络上的一个路由器的物理地址,交给它。
  3. 路由器发,把IP数据报转发到本网络上的一个主机。用ARP找到目的主机的物理地址。
  4. 路由器发,把IP数据报转发到另一个网络上的一个主机。用ARP找到本网络上的另一个路由器的物理地址,交给它。

在许多情况下需要多次使用ARP;但这只是以上的几种情况的反复使用而已。

IP 数据报的格式

IP数据报的格式能够说明IP协议都具有什么功能。TCP/IP中,各种数据格式常常以32位(即4字节)为单位来描述。如下图:

image-20210726163224317

一个IP数据报由首部和数据两部分组成。首部的前一部分是固定长度,共20字节,是所有IP数据报必须具有的。后面是一些可选字段,长度可变。

1.IP数据报首部的固定部分中的各字段

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

(2)首部长度占4位,单位是32位(即4字节,首部长度只能以4字节为单位增减)。当为1111时(十进制的15),代表首部长度最大是15 x 4 = 60字节。不是4字节的整数倍时必须利用最后的填充字段加以填充。最常用的首部长度就是20字节(即首部长度为0101)。

(3)区分服务占8位,用来获得更好的服务。在一般的情况下都不使用这个字段。

(4)总长度指首部和数据之和的长度,占16位,单位为字节。数据报的最大长度为65535字节(2的16次方减1)。在IP层下的每一种数据链路层都有自己的帧格式,其中包括帧格式中的数据字段最大传送单元MTU。IP数据报总长度一定不能超过MTU。以太网数据报很少超过1500字节。IP协议规定,所有主机和路由器必须能够处理的IP数据报长度不得小于576字节。当超过MTU 时,必须把过长的数据报进行分片后才能在网络上传送(见后面的“片偏移”字段);此时总长度指分片后当前片的长度。

(5)标识(identification) 占 16 位。IP 软件在存储器中维持一个计数器,每产生一个数据报,计数器就加1,并将此值赋给标识字段。但这个“标识”并不是序号,因为IP是无连接服务,数据报不存在按序接收的问题。当数据报由于长度超过网络的 MTU 而必须分片时,这个标识字段的值就被复制到所有的数据报片的标识字段中。最后通过他来合成数据报片。

(6)标志(flag) 占 3 位,但目前只有两位有意义。

  • 最低位记为 MF (More Fragment)。MF=1 表示后面“还有分片”的数据报。MF=0 表示这已是最后一个。
  • 中间的一位记为 DF (Don’t Fragment),意思是“不能分片”。只有当 DF=0 时才允许分片。

(7)片偏移 占 13 位。片偏移指出:较长的分组在分片后,某片在原分组中的相对位置。片偏移以8个字节为偏移单位。这就是说,每个分片的长度一定是8字节(64位)的整数倍。

例子:一数据报的总长度为 3820 字节,其数据部分为 3800 字节长(使用固定首部),需要分片为长度不超过1420字节的数据报片。因固定首部为20字节,因此每个数据报片的数据部分长度不能超过 1400 字节。于是分为 3 个数据报片,其数据部分的长度分别为 1400, 1400和 1000 字节。原始数据报首部被复制为各数据报片的首部,但必须修改有关字段的值。下图给出分片后得出的结果(请注意片偏移的数值)。

image-20210726175344028

假定数据报片 2 经过某个网络时还需要再进行分片,即划分为数据报片 2-1(携带800字节)和数据报片2-2(携带600字节)。那么这两个数据报片的[总长度、标识、MF、DF和片偏移]分别为:[820, 12345, 1, 0, 175], [620, 12345, 1, 0, 275]

IP数据报在传送中可能被多次分片,但分片的数据报仅在目的主机才被重装回原来的数据报。

(8)生存时间占8位。英文缩写是 TTL (Time To Live),起初表示时间寿命,单位秒;后来改为“跳数限制”。指明数据报在因特网中至多可经过多少个路由器。路由器在转发之前就把TTL值减1,若减小到零,就丢弃这个数据报。TTL最大是255。若初始值设置为1,表示这个数据报只能在本局域网中传送。

(9)协议占8位。指出此数据报携带的数据是使用何种协议,以便使目的主机的IP层知道应将数据部分上交给哪个处理过程。 常用的协议如下:

image-20210727155240152

(10)首部检验和 占 16 位。只检验数据报的首部,但不包括数据部分(经过不同路由器,首部变化,数据不变,每次只校验首部即可)。为了进一步减小计算检验和的工作量,IP 首部的检验和不采用复杂的 CRC 检验码而采用下面的简单计算方法。

发送方,先把IP数据报首部划分为许多16位字的序列,并把检验和字段置零。用反码算术运算把所有16位字相加后,将得到的和的反码写入检验和字段。

接收方,将首部的所有16位字再使用反码算术运算相加一次。将得到的和取反码,即得出接收方检验和的计算结果。若首部未发生任何变化,则此结果必为0,如下图:

image-20210726163624633

该检验和的计算方法不仅用于IP,还用于后面将要介绍的UDP和TCP等协议,常被称为因特网检验和(Internet checksum)。这种检验和的检错性能虽然不如 CRC,但更易用软件实现。下图是一个计算因特网检验和的具体例子:

image-20210727155858000

(11)源地址 占 32 位。

(12)目的地址 占 32 位。

2.IP数据报首部的可变部分

IP首部的可变部分就是一个选项字段。选项字段用来支持排错、测量及安全等措施。此字段从1个字节到40个字节不等。但还有些选项需要多个字节,这些选项一个个拼接起来,中间不需要有分隔符,最后用全0的填充字段补齐成为4字节的整数倍。

IP 数据报的转发

1.路由表

下图是路由器中路由表的简单例子:

以路由器R2的路由表为例,由于R2同时连接在网络2和网络3上,因此只要目的主机在这两个网络上,都可通过接口0或1由路由器R2直接交付(当然还要利用地址解析协议ARP才能找到这些主机相应的物理地址),因此不需要下一跳路由器的地址。

image-20210727162851845

由于路由器是根据路由表中的目的网络地址来确定下一跳路由器的,因此:

  • IP数据报最终一定可以找到目的主机所在目的网络上的路由器(可能要通过多次的间接交付);
  • 只有到达最后一个路由器时,才试图向目的主机进行直接交付。

路由器还可采用默认路由(default route)以减少路由表所占用的空间和搜索路由表所用的时间。尤其适合简单网络,比如下图场景:只要目的网络不是 N1和 N2,主机H就一律选择默认路由,把数据报先间接交付路由器 R1,让R1再转发给下一个路由器,一直转发到目的网络上的路由器,最后进行直接交付。

image-20210727171933953

2.IP数据报的转发流程

已知下图所示的互联网,以及路由器R1的路由表。现在主机H1发送一IP数据报,目的地址是128.30.33.138

【解】主机H1发送数据报的目的地址是H2的IP地址128.30.33.138。主机H1首先把本网络的子网掩码255.255.255.128与该数据报的目的地址128.30.33.138逐位相与,得出网络号128.30.33.128,它不等于 H1的网络号128.30.33.0;这说明H2与H1不在同一个网络上。因此H1不能把数据报直接交付H2,而必须先传送给网络上的默认路由器R1,由R1来转发。注意,在主机H1的网络配置信息中有IP地址、子网掩码和默认路由器等信息。

路由器R1收到此数据报后,先找路由表中的第一行;用这一行(网 1)的子网掩码 255.255.255.128和收到分组的目的地址128.30.33.138逐位相“与”,得出128.30.33.128。再和这一行给出的目的网络地址进行比较。结果不一致(即不匹配)。

image-20210727163025939

用同样方法继续往下找第二行。用第二行的子网掩码255.255.255.128和该分组的目的地址128.30.33.138逐位相 ,结果也是 128.30.33.128。这个结果和第二行的目的网络地址相匹配,于是不需要再找下一个路由器。R1把分组从接口1直接交付主机H2(它们都在一个网络上)。

总结一下路由器转发IP数据报的基本过程:

  1. 从收到的数据报首部提取目的IP地址D。
  2. 先判断是否为直接交付。对路由器直接相连的网络逐个检查:用各网络的掩码和D逐位相“与”,结果与目的网络匹配,则把分组直接交付(需要把D转换成物理地址,把数据报封装成帧发送出去);不匹配就是间接交付,执行3。
  3. 对路由表中的每一行,用其中的掩码和D逐位相“与”,结果为N。若N与该行的网络地址匹配,则把数据报传送给该行指明的下一跳路由器;否则,执行4。
  4. 若路由表中有一个默认路由,则把数据报传送给路由表中所指明的默认路由器;否则,执行5。
  5. 报告转发数据报出错。

强调:IP 数据报的首部是源IP地址和目的IP地址,没有中间经过的路由器IP地址。当路由器收到一个待转发的数据报,并从路由表得出下一跳路由器的IP地址后,不是把这个地址填入IP数据报,而是送交下层的网络接口软件。网络接口软件负责把下一跳路由器的IP地址转换成物理地址(使用ARP),并将此物理地址放在链路层的MAC帧的首部,然后根据这个物理地址找到下一跳路由器。

由此可见,当发送一连串的数据报时,上述的这种查找路由表、计算物理地址、写入MAC帧的首部等过程,将不断地重复进行,造成了一定的开销。能不能在路由表中不使用IP地址而直接使用物理地址呢(网桥,二层交换机)?不行。使用逻辑的IP地址,本来就是为了隐蔽各种底层网络的复杂性,不可避免地要付出些代价。

3.路由聚合

越来越多的网络连接到因特网,路由表的表项将会越来越多,查找路由表的时间也会越来越长。采用路由聚合(route aggregation)可有效缓解这个问题。路由聚合又称为地址聚合,可以将路由表中的某些路由相同的表项合并为一个。

下图所示,路由表中完全可以用一个网络前缀140.23.7.0/24来指示4个不同的子网。

image-20210727163105227

利用CIDR地址特性,通过不断的分级聚合路由表项,极大的提高了核心网路由效率。

4.最长前缀匹配

由于采用了路由聚合功能,路由表中可能存在多个有包含关系的地址块前缀,在查找路由表时可能会得到不止一个匹配结果;应当从匹配结果中选择具有最长网络前缀的路由。这叫作最长前缀匹配(longest-prefix matching),这是因为网络前缀越长,其地址块就越小,因而路由就越具体。

另外通过最长前缀匹配可以很方便地实现特定主机路由默认路由

特定主机路由可使网络管理人员能更方便地控制网络和测试网络,采用最长前缀匹配很容易实现特定主机路由,只需要在路由表中加入一条前缀为“特定主机 IP 地址/32”的表项即可,因为只有目的地址为该特定主机的数据报才能与该表项最长前缀匹配,因而不会影响任何其他数据报的转发。

默认路由可以用网络前缀0.0.0.0/0来表示,因为该网络前缀的长度为0,任何IP地址都能和它匹配,但只有在路由表中没有任何其他项目可以匹配的情况下才能与它匹配。

但最长前缀匹配算法也存在一个缺点,就是查找路由表花费的时间变长了,因为要遍历整个路由表才能找到最长匹配的前缀项

(完)