网际协议 IP

2022-12-17 计算机网络 网络层

网际协议(Internet Protocol,IP)是 TCP/IP 体系结构网络层中的核心协议。

# 一、异构网络互联

因特网是由全世界范围内数以百万计的网络通过路由器互联起来的。这些网络的拓扑、性能以及所使用的网络协议都不尽相同,这是由用户需求的多样性造成的,没有一种单一的网络能适应所有用户的需求。

而如果这些异构网络的网络层都使用相同的网际协议 IP,从网络层的角度看,它们好像是一个统一的网络,即 IP 网,如下图。

# 二、IPv4 地址及其编址方法

IPv4 地址是给因特网上的每一个主机(或路由器)的每一个接口分配的一个在全世界范围内唯一的 32 比特的标识符。

IPv4 的编址方法经历了如下图所示的三个历史阶段:

# 2.1 IPv4 地址的表示方法

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

如下图所示,将某个 32 比特 IPv4 地址中每 8 个比特分为一组,写出每组 8 比特所对应的十进制数,每个十进制数之间用 “.” 来分隔,就可以得到该 IPv4 地址的点分十进制形式。

# 2.2 分类编址方法

分类编址方法将 32 比特的 IPv4 地址分为以下两部分:

  • 网络号:标志主机(或路由器)的接口所连接到的网络。
  • 主机号:标志主机(或路由器)的接口。

分类编址的 IPv4 地址分为五类,具体如下图所示。

注意

  • A 类、B 类和 C 类地址都是单播地址,只有单播地址可以分配给网络中的主机(或路由器)的各接口。
  • 主机号为 “全 0” 的地址是网络地址,不能分配给主机(或路由器)的各接口。
  • 主机号为 “全 1” 的地址是广播地址,不能分配给主机(或路由器)的各接口。

下表给出了一般不使用的特殊 IPv4 地址,这些地址只能在特定的情况下使用。

IPv4 分类编址方法最大的缺点就是 容易造成 IPv4 地址的大量浪费。为解决该问题,提出了划分子网的编址改进方法。

# 2.3 划分子网编址方法

划分子网的思想是 从 IPv4 地址的主机号部分借用一些比特作为子网号,来区分不同的子网,这样就可以利用原有网络中剩余的大量 IPv4 地址,而不用申请新的网络地址了。

子网掩码 可以标识主机号中有多少比特被借用作为子网号。

用左起多个连续的比特 1 对应 IPv4 地址中的网络号和子网号,之后的多个连续的比特 0 对应 IPv4 地址中的主机号,如下图所示。

将划分子网的 IPv4 地址与相应的子网掩码进行逐比特的逻辑与运算,就可得到该 IPv4 地址所在子网的网络地址,如下图所示。

默认子网掩码是指在未划分子网的情况下使用的子网掩码,如下图所示。

# 2.4 无分类编址方法

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

CIDR 采用了与 IPv4 地址配合使用的 32 位 地址掩码,与子网掩码类似,用左起多个连续的比特 1 对应 IPv4 地址中的网络前缀,之后的多个连续的比特 0 对应 IPv4 地址中的主机号。

为了简便起见,可以不明确给出配套的地址掩码的点分十进制形式,而是在无分类编址的 IPv4 地址后面加上斜线 “/”,在斜线之后写上网络前缀所占的比特数量(也就是地址掩码中左起连续比特 1 的数量),这种记法称为 斜线记法

CIDR 将网络前缀都相同的、连续的多个无分类 IPv4 地址,组成一个 CIDR 地址块,只要知道 CIDR 地址块中的任何一个地址,就可以知道该地址块的全部细节,包括:

  • 地址块中的最小地址
  • 地址块中的最大地址
  • 地址块中的地址数量
  • 地址块中聚合某类网络(A 类、B 类、C 类)的数量
  • 地址掩码

使用 CIDR 的一个好处是,可以更加有效地分配 IPv4 的地址空间,可根据客户的需要分配适当大小的 CIDR 地址块,如下图所示。

使用 CIDR 的另一个好处是 路由聚合(构造超网),即在路由表中利用 CIDR 地址块来查找目的网络,它使得路由表中的一个项目可以表示原来传统分类地址的很多条路由,这有利于减少路由器之间路由选择信息的交换,从而提高整个因特网的性能。

注意

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

# 三、IPv4 地址的应用规划

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

# 3.1 采用定长的子网掩码进行子网划分

使用定长的子网掩码划分子网时,所划分出的每个子网都使用同一个子网掩码,并且每个子网所分配的 IPv4 地址数量相同,容易造成地址资源的浪费。下面来举例说明。

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

首先进行需求分析:

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

一共有 5 个子网需要分配,因此尝试从主机号借用 3 比特作为子网号:

  • 子网数量:23=82^3=8 满足应用需求;
  • 每个子网上的地址数量:283=322^{8-3}=32 满足应用需求。

根据网络地址和子网掩码可得出子网划分细节,如下图所示。

最后进行子网分配,从子网 1 ~ 子网 8 中任选 5 个子网分配给应用需求中的 5 个子网,如下图所示。

通过本例可以看出:采用定长的子网掩码进行子网划分,只能划分出 2n2^n 个子网,其中 nn 是从主机号部分借用的、用来作为子网号的比特数量。每个子网所分配的 IPv4 地址数量相同,容易造成地址资源的浪费。

# 3.2 采用变长的子网掩码进行子网划分

在使用变长的子网掩码划分子网时,所划分出的每个子网可以使用不同的子网掩码,并且每个子网所分配的 IPv4 地址数量可以不同,这样就尽可能地减少了对地址资源的浪费。下面来举例说明。

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

首先进行需求分析:

与定长划分相同,网络 1 需要 IP 地址数为 9,网络 2 需要 IP 地址数为 28,网络 3 需要 IP 地址数为 15,网络 4 需要 IP 地址数为 13,网络 5 需要 IP 地址数为 4。

然后根据需求分析找出用于各子网的地址块前缀,如下图所示。

接下来就是从给定地址块中为各子网选择子块。划分子块的原则是,只能 选取块大小为整数倍的地址作为每个子块的起点位置,同时建议 从大的子块开始划分。划分方案并不唯一,下图就是一个较为合理的划分方案。

# 四、IPv4 地址与 MAC 地址

# 4.1 IPv4 地址与 MAC 地址的封装位置

# 4.2 数据包传送过程中 IPv4 地址与 MAC 地址的变化情况

  • 在数据包的传送过程中,数据包的源 IP 地址和目的 IP 地址保持不变;
  • 在数据包的传送过程中,数据包的源 MAC 地址和目的 MAC 地址逐链路(或逐网络)改变。

# 4.3 IPv4 地址与 MAC 地址的关系

如果仅使用 MAC 地址进行通信,则会出现以下主要问题:

  • 因特网中的每台路由器的路由表中就必须记录因特网上所有主机和路由器各接口的 MAC 地址。
  • 手工给各路由器配置路由表几乎是不可能完成的任务,即使使用路由协议让路由器通过相互交换路由信息来自动构建路由表,也会因为路由信息需要包含海量的 MAC 地址信息而严重占用通信资源。
  • 包含海量 MAC 地址的路由信息需要路由器具备极大的存储空间,并且会给分组的查表转发带来非常大的时延。

因特网的网际层使用 IP 地址进行寻址,就可使因特网中各路由器的路由表中的路由记录的数量大大减少,因为只需记录部分网络的网络地址,而不是记录每个网络中各通信设备的各接口的 MAC 地址。

# 五、地址解析协议 ARP

# 5.1 ARP 的作用

路由器在接收到 IP 数据报后,根据其首部中的目的 IP 地址的网络号部分,基于自己的路由表进行查表转发。这就引出了一个问题:查表转发的结果可以指明 IP 数据报的下一跳路由器的 IP 地址,但无法指明该 IP 地址所对应的 MAC 地址。因此,在数据链路层封装该 IP 数据报成为帧时,帧首部中的目的 MAC 地址字段就无法填写

地址解析协议 ARP 的主要功能就是,通过已知的 IP 地址找到其对应的 MAC 地址

# 5.2 ARP 高速缓存表

每台主机都会维护一个 ARP 高速缓存表,里面记录有 IP 地址和 MAC 地址的对应关系。

如下图中,当主机 A 要给主机 B 发送分组时,会首先在自己的 ARP 高速缓存表中查找主机 B 的 IP 地址所对应的 MAC 地址,但未找到,此时需要发送 ARP 广播请求。

# 5.3 ARP 广播请求

主机 A 发送 ARP 请求报文来获取主机 B 的 MAC 地址,如下图所示。

注意

ARP 请求报文被封装在 MAC 帧中发送,MAC 帧的目的地址为广播地址(FF-FF-FF-FF-FF-FF)。

# 5.4 ARP 单播响应

主机 B 的网卡在收到该广播帧后,将其所封装的 ARP 请求报文送交上层处理。上层的 ARP 进程解析该 ARP 请求报文,发现所询问的 IP 地址正是自己的 IP 地址,需要进行响应,如下图所示。

注意

ARP 响应报文被封装在 MAC 帧中发送,MAC 帧的目的地址为主机 A 的 MAC 地址(即单播地址)。

# 5.5 ARP 高速缓存表中的记录类型和生命周期

ARP 高速缓存表中的每一条记录都有其类型,分为动态和静态两种:

  • 动态类型:记录由主机通过 ARP 协议自动获取,生命周期默认 2 分钟,到期自动删除。
  • 静态类型:记录由用户或网络维护人员手工配置,生命周期没有统一标准。

# 5.6 ARP 相关注意事项

ARP 协议解决同一个局域网上的主机或路由器的 IP 地址和 MAC 地址的映射问题,不能跨网络使用,如下图所示。

# 六、IP 数据报的发送和转发过程

# 6.1 主机发送 IP 数据报

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

源主机可以比较自身与目的主机的网络地址,如果相同就采用直接交付方式,否则采用间接交付方式。

# 6.2 路由器转发 IP 数据报

路由器收到某个正确的 IP 数据报(IP 数据报生存时间未结束且首部无误码)后,会基于 IP 数据报首部中的目的 IP 地址在自己的路由表中查询。

  • 如果查询到匹配的路由条目,就按照该路由条目的指示进行转发。
  • 如果查询不到匹配的路由条目,就丢弃该 IP 数据报,并向发送该 IP 数据报的源主机发送 ICMP 差错报文。

注意

路由器是隔离广播域的,即当路由器收到的是目的地址为广播地址的 IP 数据报时,则不会对这种 IP 数据报进行转发。

# 七、IPv4 数据报的首部格式

# 7.1 版本

  • 长度为 4 个比特,用来表示 IP 协议的版本。
  • 通信双方使用的 IP 协议的版本必须一致。目前广泛使用的 IP 协议的版本号为 4(即 IPv4)。

# 7.2 首部长度、可选字段和填充

首部长度

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

  • 该字段最小取值为二进制的 0101,即十进制的 5,再乘以 4 字节单位,表示 IPv4 数据报首部只有 20 字节固定部分。
  • 该字段最大取值为二进制的 1111,即十进制的 15,再乘以 4 字节单位,表示 IPv4 数据报首部包含 20 字节固定部分和最大 40 字节可变部分。

可选字段(很少使用)

可选字段的长度从 1 字节到 40 字节不等,用来支持排错、测量以及安全措施等功能。

虽然可选字段增加了 IPv4 数据报的功能,但这同时也使得 IPv4 数据报的首部长度成为可变的,这就增加了因特网中每一个路由器处理 IPv4 数据报的开销。

填充

填充字段用来确保 IPv4 数据报的首部长度是 4 字节的整数倍,使用全 0 进行填充。

# 7.3 区分服务(很少使用)

区分服务字段的长度为 8 个比特,利用该字段的不同取值可提供不同等级的服务质量。

# 7.4 总长度

总长度字段的长度为 16 个比特,该字段的取值以字节为单位,用来表示 IPv4 数据报的长度(首部长度 + 数据载荷长度)。

该字段最大取值为二进制的 16 个比特 1,即十进制的 65535(实际应用中很少传输这么长的 IPv4 数据报)。

# 7.5 标识、标志和片偏移

标识、标志和片偏移这三个字段共同用于 IPv4 数据报分片。首先介绍 IPv4 数据报分片的概念。

如下图所示,由于数据链路层规定了最大传送单元 MTU,当 IPv4 数据报的总长度超过了 MTU 时,将无法封装成帧。需要将原 IPv4 数据报分片为更小的 IPv4 数据报,再将各分片 IPv4 数据报封装成帧。

标识

标识字段的长度为 16 个比特,属于同一个 IPv4 数据报的各分片数据报应该具有相同的标识。

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

标志

标志字段的长度为 3 个比特,各比特含义如下:

  • 最低位(More Fragment,MF),1:表示本分片后面还有分片,0:表示本分片后面没有分片。
  • 中间位(Don’t Fragment,DF),1:表示不允许分片,0:表示允许分片。
  • 最高位为保留位,必须设置为 0。

片偏移

片偏移字段的长度为 13 个比特,该字段的取值以 8 字节为单位,用来指出分片 IPv4 数据报的数据载荷偏移其在原 IPv4 数据报的位置有多远。

下面来举例说明 IPv4 数据报如何进行分片。

假设需要分片的 IPv4 数据报总长度为 3820 字节,其中固定首部长 20 字节,数据载荷长 3800 字节。根据数据链路层要求,需要将该 IPv4 数据报分片为长度不超过 1420 字节的数据报片。

由于原 IPv4 数据报采用 20 字节固定首部,因此分片后的各 IPv4 数据报片也采用 20 字节的固定首部,这样每个数据报片的数据载荷长度不能超过 1400 字节,如下图所示。

下表给出本例中 IPv4 数据报首部中与分片相关的各字段取值,其中标识字段的值 23333 是任意给定的。

# 7.6 生存时间

生存时间字段的长度为 8 个比特,最大取值为二进制的 11111111,即十进制的 255。该字段的取值最初以秒为单位。因此,IPv4 数据报的最大生存时间最初为 255 秒。路由器转发 IPv4 数据报时,将其首部中该字段的值减去该数据报在路由器上所耗费的时间,若结果不为 0 就转发,否则就丢弃。

生存时间字段后来改为以 “跳数” 为单位,路由器收到待转发的 IPv4 数据报时,将其首部中的该字段的值减 1,若结果不为 0 就转发,否则就丢弃。

该字段的作用是防止被错误路由的 IPv4 数据报无限制地在因特网中兜圈,如下图所示。

# 7.7 协议

协议字段的长度为 8 个比特,用来指明 IPv4 数据报的数据载荷是何种协议数据单元 PDU。

下表给出常用的一些协议和相应的协议字段值。

# 7.8 首部检验和

首部检验和字段的长度为 16 个比特,用于检测 IPv4 数据报在传输过程中其首部是否出现了差错。

IPv4 数据报每经过一个路由器,其首部中的某些字段的值(例如生存时间、标志以及片偏移等)都可能发生变化,因此路由器都要重新计算一下首部检验和。之所以不检验数据载荷,是为了减少计算量。

发送方计算

发送方先把 IPv4 数据报首部划分为若干个 16 比特字的序列,并把首部检验和字段的值置为全 0。用反码算术运算把所有 16 比特字相加后,将得到的和的反码写入首部检验和字段,具体如下图所示。

接收方校验

接收方收到 IPv4 数据报后,将首部的所有 16 比特字再使用反码算术运算相加一次,将得到的和取反码,即得出接收方检验和的计算结果。若没有出错,则结果必为 0。

上述检验和的计算方法不仅用于 IP 协议,还用于运输层的用户数据报协议和传输控制协议等,常被称为 因特网检验和(Internet Checksum)

检验和计算的重点在于二进制反码求和的运算,两个数进行二进制反码求和的运算规则是从低位到高位逐列进行计算,具体如下:

  • 0 和 0 相加是 0;
  • 0 和 1 相加是 1;
  • 1 和 1 相加是 0,但要产生一个进位 1,加到下一列;
  • 若最高位相加后产生进位,则最后得到的结果要加 1

下图是一个计算因特网检验和的具体例子。

注意

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

# 7.9 源 IP 地址和目的 IP 地址

  • 源 IP 地址字段:长度为 32 个比特,用来填写发送 IPv4 数据报的源主机的 IPv4 地址。
  • 目的 IP 地址字段:长度为 32 个比特,用来填写接收 IPv4 数据报的目的主机的 IPv4 地址。

# 八、参考资料

Last Updated: 2023-01-28 4:31:25