# 4. 网络层

本章重点内容
网际协议 IP(即 IPv4)
划分子网和构造超网
互联网的路由选择协议
IPv6
虚拟专用网 VPN 和网络地址转换 NAT

# 4.1 网络层提供的两种服务

在计算机网络领域,网络层应该向运输层提供怎样的服务(“面向连接” 还是 “无连接”)
在计算机通信中,可靠交付应当由谁来负责?是网络还是端系统?

一种观点:让网络负责可靠交付
这种观点认为,应借助于电信网的成功经验,让网络负责可靠交付,计算机网络应模仿电信网络,使用面向连接的通信方式。
通信之前先建立虚电路 (Virtual Circuit),以保证双方通信所需的一切网络资源。
如果再使用可靠传输的网络协议,就可使所发送的分组无差错按序到达终点,不丢失、不重复。
image-20200605165522948
虚电路表示这只是一条逻辑上的连接,分组都沿着这条逻辑连接按照存储转发方式传送,而并不是真正建立了一条物理连接。
请注意,电路交换的电话通信是先建立了一条真正的连接。
因此分组交换的虚连接和电路交换的连接只是类似,但并不完全一样。

另一种观点:网络提供数据报服务
互联网的先驱者提出了一种崭新的网络设计思路。
网络层向上只提供简单灵活的、无连接的、尽最大努力交付的数据报服务
网络在发送分组时不需要先建立连接。每一个分组(即 IP 数据报)独立发送,与其前后的分组无关(不进行编号)。
网络层不提供服务质量的承诺。即所传送的分组可能出错、丢失、重复和失序(不按序到达终点),当然也不保证分组传送的时限。
由于传输网络不提供端到端的可靠传输服务,这就使网络中的路由器可以做得比较简单,而且价格低廉(与电信网的交换机相比较)。
如果主机(即端系统)中的进程之间的通信需要是可靠的,那么就由网络的主机中的运输层负责可靠交付(包括差错处理、流量控制等)。
采用这种设计思路的好处是:网络的造价大大降低,运行方式灵活,能够适应多种应用。
互连网能够发展到今日的规模,充分证明了当初采用这种设计思路的正确性。
image-20200605165656334
image-20200605165741334

# 4.2 网际协议 IP

网际协议 IP 是 TCP/IP 体系中两个最主要的协议之一。
与 IP 协议配套使用的还有三个协议:
地址解析协议 ARP (Address Resolution Protocol)
网际控制报文协议 ICMP (Internet Control Message Protocol)
网际组管理协议 IGMP (Internet Group Management Protocol)
image-20200605165844957

4.2.1 虚拟互连网络
将网络互连并能够互相通信,会遇到许多问题需要解决。
将网络互相连接起来要使用一些中间设备。中间设备又称为中间系统中继 (relay) 系统
有以下五种不同的中间设备:
物理层中继系统:转发器 (repeater)。
数据链路层中继系统:网桥或桥接器 (bridge)
网络层中继系统:路由器 (router)
网桥和路由器的混合物:桥路器 (brouter)
网络层以上的中继系统:网关 (gateway)

当中继系统是转发器或网桥时,一般并不称之为网络互连,因为这仅仅是把一个网络扩大了,而这仍然是一个网络。
网关由于比较复杂,目前使用得较少。
网络互连都是指用路由器进行网络互连和路由选择。
由于历史的原因,许多有关 TCP/IP 的文献将网络层使用的路由器称为网关image-20200605170148441
虚拟互连网络的意义
所谓虚拟互连网络也就是逻辑互连网络,它的意思就是互连起来的各种物理网络的异构性本来是客观存在的,但是我们利用 IP 协议就可以使这些性能各异的网络从用户看起来好像是一个统一的网络
使用 IP 协议的虚拟互连网络可简称为 IP 网
使用虚拟互连网络的好处是:当互联网上的主机进行通信时,就好像在一个网络上通信一样,而看不见互连的各具体的网络异构细节。
如果在这种覆盖全球的 IP 网的上层使用 TCP 协议,那么就是现在的互联网 (Internet)
image-20200605170323300
如果我们只从网络层考虑问题,那么 IP 数据报就可以想象是在网络层中传送
image-20200605170346129

4.2.2 分类的 IP 地址
在 TCP/IP 体系中,IP 地址是一个最基本的概念。

1. IP 地址及其表示方法
我们把整个因特网看成为一个单一的、抽象的网络。
IP 地址就是给每个连接在互联网上的主机(或路由器)分配一个在全世界范围是唯一的 32 位的标识符
IP 地址现在由互联网名字和数字分配机构 ICANN (Internet Corporation for Assigned Names and Numbers) 进行分配。
IP 地址的编址方法
分类的 IP 地址。这是最基本的编址方法,在 1981 年就通过了相应的标准协议。
子网的划分。这是对最基本的编址方法的改进,其标准 [RFC 950] 在 1985 年通过。
构成超网。这是比较新的无分类编址方法。1993 年提出后很快就得到推广应用。

分类 IP 地址
将 IP 地址划分为若干个固定类。
每一类地址都由两个固定长度的字段组成,其中一个字段是网络号 net-id,它标志主机(或路由器)所连接到的网络,而另一个字段则是主机号 host-id,它标志该主机(或路由器)。
主机号在它前面的网络号所指明的网络范围内必须是唯一的。
由此可见,一个 IP 地址在整个互联网范围内是唯一的。
image-20200605170745601
image-20200605170757057
image-20200605170818813
A 类地址的网络号字段 net-id 为 1 字节,A 类地址的主机号字段 host-id 为 3 字节。
B 类地址的网络号字段 net-id 为 2 字节,B 类地址的主机号字段 host-id 为 2 字节。
C 类地址的网络号字段 net-id 为 3 字节,C 类地址的主机号字段 host-id 为 1 字节。
D 类地址是多播地址,E 类地址保留为今后使用。

2. 常用的三种类别的 IP 地址
IP 地址的指派范围
image-20200605171040115
一般不使用的特殊的 IP 地址

特殊地址网络号主机号源地址或目的地址说明
网络地址特定全 0都不是表示某个网段如:123.123.123.0
直接广播地址特定全 1目的地址作为广播地址,分组传给该网络所有节点 123.123.123.255
受限广播地址全 1全 1目的地址分组发给本网络中的所有主机 255.255.255.255
本网络上的特定主机地址全 0特定目的地址本网内部的特定主机地址 0.0.0.123
本网络本主机全 0全 0源地址表示本机地址,仅在系统启动时使用,0.0.0.0
送回地址127任意目的地址用于网络软件测试与本地进程之间的通信。无论发送说明都会送回 127.0.0.1 localhost

专用 IP 地址(私网地址):仅用于组建的专用内部网(局域网),其他地址属于公网地址(Internet 地址),一般不用于局域网地址。

起始地址终止地址说明
10.0.0.010.255.255.2551 个连续的 A 类地址
172.16.0.0172.31.255.25516 个连续的 B 类地址
192.168.0.0192.168.255.255256 个连续的 C 类地址

IP 地址的一些重要特点:
(1) IP 地址是一种分等级的地址结构。分两个等级的好处是:
第一,IP 地址管理机构在分配 IP 地址时只分配网络号,而剩下的主机号则由得到该网络号的单位自行分配。这样就方便了 IP 地址的管理
第二,路由器仅根据目的主机所连接的网络号来转发分组(而不考虑目的主机号),这样就可以使路由表中的项目数大幅度减少,从而减小了路由表所占的存储空间。
(2) 实际上 IP 地址是标志一个主机(或路由器)和一条链路的接口
当一个主机同时连接到两个网络上时,该主机就必须同时具有两个相应的 IP 地址,其网络号 net-id 必须是不同的。这种主机称为多归属主机 (multihomed host)。
由于一个路由器至少应当连接到两个网络(这样它才能将 IP 数据报从一个网络转发到另一个网络),因此一个路由器至少应当有两个不同的 IP 地址。
(3) 用转发器或网桥连接起来的若干个局域网仍为一个网络,因此这些局域网都具有同样的网络号 net-id。
(4) 所有分配到网络号 net-id 的网络,无论是范围很小的局域网,还是可能覆盖很大地理范围的广域网,都是平等的。

4.2.3 IP 地址与硬件地址
IP 地址与硬件地址是不同的地址。
从层次的角度看,
硬件地址(或物理地址)是数据链路层和物理层使用的地址。
IP 地址是网络层和以上各层使用的地址,是一种逻辑地址(称 IP 地址是逻辑地址是因为 IP 地址是用软件实现的)
image-20200609185749398
image-20200609185942877
在 IP 层抽象的互联网上只能看到 IP 数据报。图中的 IP1 → IP2 表示从源地址 IP1 到目的地址 IP2 。
路由器只根据目的站的 IP 地址的网络号进行路由选择。
在具体的物理网络的链路层
只能看见 MAC 帧而看不见 IP 数据报
IP 层抽象的互联网屏蔽了下层很复杂的细节。在抽象的网络层上讨论问题,就能够使用统一的、抽象的 IP 地址研究主机和主机或主机和路由器之间的通信。
image-202006091901136024.2.4 地址解析协议 ARP
通信时使用了两个地址:IP 地址(网络层地址)MAC 地址(数据链路层地址)
每个接口都有这两个地址

地址解析协议 ARP 的作用
已经知道了一个机器(主机或路由器)的 IP 地址,如何找出其相应的硬件地址?
地址解析协议 ARP 就是用来解决这样的问题的。
ARP 作用:从网络层使用的 IP 地址,解析出在数据链路层使用的硬件地址。

不管网络层使用的是什么协议,在实际网络的链路上传送数据帧时,最终还是必须使用硬件地址。
每一个主机都设有一个 ARP 高速缓存 (ARP cache),里面有所在的局域网上的各主机和路由器的 IP 地址到硬件地址的映射表。
< IP address;MAC address;TTL >
TTL (Time To Live):地址映射有效时间。
当主机 A 欲向本局域网上的某个主机 B 发送 IP 数据报时,就先在其 ARP 高速缓存中查看有无主机 B 的 IP 地址。
如有,就可查出其对应的硬件地址,再将此硬件地址写入 MAC 帧,然后通过局域网将该 MAC 帧发往此硬件地址。
如没有, ARP 进程在本局域网上广播发送一个 ARP 请求分组。收到 ARP 响应分组后,将得到的 IP 地址到硬件地址的映射写入 ARP 高速缓存。

ARP 请求分组:包含发送方硬件地址 / 发送方 IP 地址 / 目标方硬件地址 (未知时填 0) / 目标方 IP 地址。
本地广播 ARP 请求(路由器不转发 ARP 请求)。
ARP 响应分组:包含发送方硬件地址 / 发送方 IP 地址 / 目标方硬件地址 / 目标方 IP 地址。
ARP 分组封装在物理网络的帧中传输。
image-20200609190717815
ARP 高速缓存的作用
存放最近获得的 IP 地址到 MAC 地址的绑定,以减少 ARP 广播的数量。
为了减少网络上的通信量,主机 A 在发送其 ARP 请求分组时,就将自己的 IP 地址到硬件地址的映射写入 ARP 请求分组。
当主机 B 收到 A 的 ARP 请求分组时,就将主机 A 的这一地址映射写入主机 B 自己的 ARP 高速缓存中。这对主机 B 以后向 A 发送数据报时就更方便了。

ARP 是解决同一个局域网上的主机或路由器的 IP 地址和硬件地址的映射问题。
如果所要找的主机和源主机不在同一个局域网上,那么就要通过 ARP 找到一个位于本局域网上的某个路由器的硬件地址,然后把分组发送给这个路由器,让这个路由器把分组转发给下一个网络。剩下的工作就由下一个网络来做。
从 IP 地址到硬件地址的解析是自动进行的,主机的用户对这种地址解析过程是不知道的。
只要主机或路由器要和本网络上的另一个已知 IP 地址的主机或路由器进行通信,ARP 协议就会自动地将该 IP 地址解析为链路层所需要的硬件地址

为什么不直接使用硬件地址进行通信?
由于全世界存在着各式各样的网络,它们使用不同的硬件地址。要使这些异构网络能够互相通信就必须进行非常复杂的硬件地址转换工作,因此几乎是不可能的事。
IP 编址把这个复杂问题解决了。连接到互联网的主机只需各自拥有一个唯一的 IP 地址,它们之间的通信就像连接在同一个网络上那样简单方便,因为上述的调用 ARP 的复杂过程都是由计算机软件自动进行的,对用户来说是看不见这种调用过程的。
因此,在虚拟的 IP 网络上用 IP 地址进行通信给广大的计算机用户带来了很大的方便。

4.2.5 IP 数据报的格式
一个 IP 数据报由首部数据两部分组成。
首部的前一部分是固定长度,共 20 字节,是所有 IP 数据报必须具有的。
在首部的固定部分的后面是一些可选字段,其长度是可变的。
image-20200609214001565
首部的前一部分是固定长度,共 20 字节,是所有 IP 数据报必须具有的。可选字段,其长度是可变的
IP 数据报首部的固定部分中的各字段:
版本 —— 占 4 位,指 IP 协议的版本。目前的 IP 协议版本号为 4 (即 IPv4)。
首部长度 —— 占 4 位,可表示的最大数值是 15 个单位 (一个单位为 4 字节),因此 IP 的首部长度的最大值是 60 字节。
区分服务 —— 占 8 位,用来获得更好的服务。在一般的情况下都不使用这个字段
总长度 —— 占 16 位,指首部和数据之和的长度,单位为字节,因此数据报的最大长度为 65535 字节。总长度必须不超过最大传送单元 MTU。
标识 (identification)—— 占 16 位,它是一个计数器,用来产生 IP 数据报的标识
标志 (flag)—— 占 3 位,目前只有前两位有意义。
标志字段的最低位是 MF (More Fragment)。MF=1 表示后面 “还有分片”。MF=0 表示最后一个分片。
标志字段中间的一位是 DF (Don't Fragment)。只有当 DF=0 时才允许分片。
片偏移 —— 占 13 位,指出:较长的分组在分片后,某片在原分组中的相对位置。片偏移以 8 个字节为偏移单位。
生存时间 —— 占 8 位,记为 TTL (Time To Live),指示数据报在网络中可通过的路由器数的最大值。
协议 —— 占 8 位,指出此数据报携带的数据使用何种协议,以便目的主机的 IP 层将数据部分上交给那个处理过程
首部检验和 —— 占 16 位,只检验数据报的首部,不检验数据部分。这里不采用 CRC 检验码而采用简单的计算方法。
源地址和目的地址都各占 4 字节

【例】IP 数据报分片
一数据报的总长度为 3820 字节,其数据部分的长度为 3800 字节(使用固定首部),需要分片为长度不超过 1420 字节的数据报片。
因固定首部长度为 20 字节,因此每个数据报片的数据部分长度不能超过 1400 字节。
于是分为 3 个数据报片,其数据部分的长度分别为 1400、1400 和 1000 字节。
原始数据报首部被复制为各数据报片的首部,但必须修改有关字段的值。
image-20200609214911225
image-20200609214920402

首部检验和
image-20200609214952129

IP 数据报首部的可变部分
IP 首部的可变部分就是一个选项字段,用来支持排错、测量以及安全等措施,内容很丰富。
选项字段的长度可变,从 1 个字节到 40 个字节不等,取决于所选择的项目。
增加首部的可变部分是为了增加 IP 数据报的功能,但这同时也使得 IP 数据报的首部长度成为可变的。这就增加了每一个路由器处理数据报的开销。
实际上这些选项很少被使用。

4.2.6 IP 层转发分组的流程
假设:有四个 A 类网络通过三个路由器连接在一起。每一个网络上都可能有成千上万个主机。
可以想像,若按目的主机号来制作路由表,每一个路由表就有 4 万个项目,即 4 万行(每一行对应于一台主机),则所得出的路由表就会过于庞大。
但若按主机所在的网络地址来制作路由表,那么每一个路由器中的路由表就只包含 4 个项目(每一行对应于一个网络),这样就可使路由表大大简化。

在路由表中,对每一条路由,最主要的是,目的网络地址,下一跳地址
image-20200609215341605
根据目的网络地址就能确定下一跳路由器,这样做的结果是:
IP 数据报最终一定可以找到目的主机所在目的网络上的路由器(可能要通过多次的间接交付)。只有到达最后一个路由器时,才试图向目的主机进行直接交付。
虽然互联网所有的分组转发都是基于目的主机所在的网络,但在大多数情况下都允许有这样的特例,即为特定的目的主机指明一个路由。
采用特定主机路由可使网络管理人员能更方便地控制网络和测试网络,同时也可在需要考虑某种安全问题时采用这种特定主机路由。
路由器还可采用默认路由 (default route) 以减少路由表所占用的空间和搜索路由表所用的时间。
这种转发方式在一个网络只有很少的对外连接时是很有用的。
默认路由在主机发送 IP 数据报时往往更能显示出它的好处。
如果一个主机连接在一个小网络上,而这个网络只用一个路由器和互联网连接,那么在这种情况下使用默认路由是非常合适的。
image-20200609215555145
IP 数据报的首部中没有地方可以用来指明 “下一跳路由器的 IP 地址”。
当路由器收到待转发的数据报,不是将下一跳路由器的 IP 地址填入 IP 数据报,而是送交下层的网络接口软件。
网络接口软件使用 ARP 负责将下一跳路由器的 IP 地址转换成硬件地址,并将此硬件地址放在链路层的 MAC 帧的首部,然后根据这个硬件地址找到下一跳路由器。

路由器分组转发算法
(1) 从数据报的首部提取目的主机的 IP 地址 D, 得出目的网络地址为 N。
(2) 若网络 N 与此路由器直接相连,则把数据报直接交付目的主机 D;否则是间接交付,执行 (3)。
(3) 若路由表中有目的地址为 D 的特定主机路由,则把数据报传送给路由表中所指明的下一跳路由器;否则,执行 (4)。
(4) 若路由表中有到达网络 N 的路由,则把数据报传送给路由表指明的下一跳路由器;否则,执行 (5)。
(5) 若路由表中有一个默认路由,则把数据报传送给路由表中所指明的默认路由器;否则,执行 (6)。
(6) 报告转发分组出错。

# 4.3 划分子网和构造超网

4.3.1 划分子网
1. 从两级 IP 地址到三级 IP 地址
在 ARPANET 的早期,IP 地址的设计确实不够合理:
(1) IP 地址空间的利用率有时很低。
(2) 给每一个物理网络分配一个网络号会使路由表变得太大因而使网络性能变坏。
(3) 两级的 IP 地址不够灵活。
三级 IP 地址
从 1985 年起在 IP 地址中又增加了一个 “子网号字段”,使两级的 IP 地址变成为三级的 IP 地址
这种做法叫做划分子网 (subnetting)。划分子网已成为互联网的正式标准协议。

划分子网的基本思路
划分子网纯属一个单位内部的事情。单位对外仍然表现为没有划分子网的网络。
从主机号借用若干个位作为子网号 subnet-id,而主机号 host-id 也就相应减少了若干个位。
凡是从其他网络发送给本单位某个主机的 IP 数据报,仍然是根据 IP 数据报的目的网络号 net-id,先找到连接在本单位网络上的路由器。
然后此路由器在收到 IP 数据报后,再按目的网络号 net-id 和子网号 subnet-id 找到目的子网。
最后就将 IP 数据报直接交付目的主机。
image-20200609215921622

image-20200609220143665
当没有划分子网时,IP 地址是两级结构。
划分子网后 IP 地址就变成了三级结构。
划分子网只是把 IP 地址的主机号 host-id 这部分进行再划分,而不改变 IP 地址原来的网络号 net-id。
优点:减少了 IP 地址的浪费使网络的组织更加灵活更便于维护和管理。
划分子网纯属一个单位内部的事情,对外部网络透明,对外仍然表现为没有划分子网的一个网络。

2. 子网掩码
从一个 IP 数据报的首部并无法判断源主机或目的主机所连接的网络是否进行了子网划分。
使用 ** 子网掩码 (subnet mask)** 可以找出 IP 地址中的子网部分。
规则:
子网掩码长度=32 位
某位=1:IP 地址中的对应位为网络号和子网号
某位=0:IP 地址中的对应位为主机号

(IP 地址) AND (子网掩码)= 网络地址
image-20200609221115213
image-20200609221130615
子网掩码是一个网络或一个子网的重要属性
路由器在和相邻路由器交换路由信息时,必须把自己所在网络(或子网)的子网掩码告诉相邻路由器。
路由器的路由表中的每一个项目,除了要给出目的网络地址外,还必须同时给出该网络的子网掩码。
若一个路由器连接在两个子网上就拥有两个网络地址和两个子网掩码。

子网划分方法
固定长度子网变长子网两种子网划分方法。
在采用固定长度子网时,所划分的所有子网的子网掩码都是相同的。
虽然根据已成为互联网标准协议的 RFC 950 文档,子网号不能为全 1 或全 0,但随着无分类域间路由选择 CIDR 的广泛使用,现在全 1 和全 0 的子网号也可以使用了,但一定要谨慎使用,确认你的路由器所用的路由选择软件是否支持全 0 或全 1 的子网号这种较新的用法。
划分子网增加了灵活性,但却减少了能够连接在网络上的主机总数。
image-20200609222126763
image-20200609222138969
image-20200609222151416
以二进制看子网掩码,B 类地址的子网划分,如果子网掩码为 255.0=(11111111.00000000)8 个 1,那么有 (2^8)-2 个子网
如果有子网掩码为 252.0=(11111100.00000000)6 个 1,那么有 (26)-2 个子网,有几个 0 就是每个子网的主机数 (2 零数)-2

4.3.2 使用子网时分组的转发
在不划分子网的两级 IP 地址下,从 IP 地址得出网络地址是个很简单的事。
但在划分子网的情况下,从 IP 地址却不能唯一地得出网络地址来,这是因为网络地址取决于那个网络所采用的子网掩码,但数据报的首部并没有提供子网掩码的信息。
因此分组转发的算法也必须做相应的改动。

在划分子网情况下路由器转发分组的算法
(1) 从收到的分组的首部提取目的 IP 地址 D。
(2) 先用各网络的子网掩码和 D 逐位相 “与”,看是否和相应的网络地址匹配。若匹配,则将分组直接交付。否则就是间接交付,执行 (3)。
(3) 若路由表中有目的地址为 D 的特定主机路由,则将分组传送给指明的下一跳路由器;否则,执行 (4)。
(4) 对路由表中的每一行,将子网掩码和 D 逐位相 “与”。若结果与该行的目的网络地址匹配,则将分组传送给该行指明的下一跳路由器;否则,执行 (5)。
(5) 若路由表中有一个默认路由,则将分组传送给路由表中所指明的默认路由器;否则,执行 (6)。
(6) 报告转发分组出错。

【例 4-4】已知互联网和路由器 R1 中的路由表。主机 H1 向 H2 发送分组。试讨论 R1 收到 H1 向 H2 发送的分组后查找路由表的过程。
要发送的分组的目的 IP 地址:128.30.33.138image-20200609224640949
因此 H1 首先检查主机 128.30.33.138 是否连接在本网络上如果是,则直接交付;否则,就送交路由器 R1,并逐项查找路由表。
image-20200609224739304
因此 H1 必须把分组传送到路由器 R1 然后逐项查找路由表
255.255.255.128 AND 128.30.33.138 = 128.30.33.128 匹配
这表明子网 2 就是收到的分组所要寻找的目的网络。
符合目标网络地址 128.30.33.128 子网掩码 255.255.255.128,下一跳,接口 1。

4.3.3 无分类编址 CIDR(构造超网)
1. 网络前缀
划分子网在一定程度上缓解了互联网在发展中遇到的困难。然而在 1992 年互联网仍然面临三个必须尽早解决的问题:
(1) B 类地址在 1992 年已分配了近一半,眼看就要在 1994 年 3 月全部分配完毕!
(2) 互联网主干网上的路由表中的项目数急剧增长(从几千个增长到几万个)。
(3) 整个 IPv4 的地址空间最终将全部耗尽。
1987 年,RFC 1009 就指明了在一个划分子网的网络中可同时使用几个不同的子网掩码。
使用变长子网掩码 VLSM (Variable Length Subnet Mask) 可进一步提高 IP 地址资源的利用率。
在 VLSM 的基础上又进一步研究出无分类编址方法,它的正式名字是无分类域间路由选择 CIDR(Classless Inter-Domain Routing)。
CIDR 消除了传统的 A 类、B 类和 C 类地址以及划分子网的概念,因而可以更加有效地分配 IPv4 的地址空间。
CIDR 最主要的特点:
CIDR 使用各种长度的 “网络前缀”(network-prefix) 来代替分类地址中的网络号和子网号。
IP 地址从三级编址(使用子网掩码)又回到了两级编址。

无分类的两级编址的记法是:
image-20200609225333951
CIDR 使用 “斜线记法”(slash notation),它又称为 CIDR 记法,即在 IP 地址面加上一个斜线 “/”,然后写上网络前缀所占的位数(这个数值对应于三级编址中子网掩码中 1 的个数)。例如:220.78.168.0/24

CIDR 把网络前缀都相同的连续的 IP 地址组成 “CIDR 地址块”。
128.14.32.0/20 表示的地址块共有 2^12 个地址(因为斜线后面的 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 的主机号地址一般不使用。

路由聚合 (route aggregation)
一个 CIDR 地址块可以表示很多地址,这种地址的聚合常称为
路由聚合
,它使得路由表中的一个项目可以表示很多个(例如上千个)原来传统分类地址的路由。
路由聚合有利于减少路由器之间的路由选择信息的交换,从而提高了整个互联网的性能。
路由聚合也称为构成超网 (supernetting)
CIDR 虽然不使用子网了,但仍然使用 “** 掩码”** 这一名词(但不叫子网掩码)。
对于 / 20 地址块,它的掩码是 20 个连续的 1。斜线记法中的数字就是掩码中 1 的个数。

CIDR 记法的其他形式
10.0.0.0/10 可简写为 10/10,也就是把点分十进制中低位连续的 0 省略。
10.0.0.0/10 隐含地指出 IP 地址 10.0.0.0 的掩码是 255.192.0.0。此掩码可表示为:11111111 11000000 00000000 00000000 有 10 个连续的 1
网络前缀的后面加一个星号的表示方法,如 00001010 00,在星号之前是网络前缀,而星号表示 IP 地址中的主机号,可以是任意值。
image-20200609231034741
构成超网
前缀长度不超过 23 位的 CIDR 地址块都包含了多个 C 类地址。
这些 C 类地址合起来就构成了超网。
CIDR 地址块中的地址数一定是 2 的整数次幂。
网络前缀越短,其地址块所包含的地址数就越多。而在三级结构的 IP 地址中,划分子网是使网络前缀变长。
CIDR 的一个好处是:可以更加有效地分配 IPv4 的地址空间,可根据客户的需要分配适当大小的 CIDR 地址块。
image-20200609232555060
这个 ISP 共有 64 个 C 类网络。如果不采用 CIDR 技术,则在与该 ISP 的路由器交换路由信息的每一个路由器的路由表中,就需要有 64 个项目。但采用地址聚合后,只需用路由聚合后的 1 个项目 206.0.64.0/18 就能找到该 ISP。

2. 最长前缀匹配
使用 CIDR 时,路由表中的每个项目由 “网络前缀” 和 “下一跳地址” 组成。在查找路由表时可能会得到不止一个匹配结果。
应当从匹配结果中选择具有最长网络前缀的路由:最长前缀匹配 (longest-prefix matching)。
网络前缀越长,其地址块就越小,因而路由就越具体 (more specific)。
最长前缀匹配又称为最长匹配或最佳匹配
【例】收到的分组的目的地址 D = 206.0.71.130
路由表中的项目:206.0.68.0/22 206.0.71.128/25
查找路由表中的第 1 个项目:
第 1 个项目 206.0.68.0/22 的掩码 M 有 22 个连续的 1。
M = 11111111 11111111 11111111 10000000
D = 206. 0. 01000111 . 130
= 206.0.68.0/22
第 2 个项目 206.0.71.128/25 的掩码 M 有 25 个连续的 1。
M = 11111111 11111111 11111111 10000000
D = 206. 0. 71. 10000010
=206.0.71.128/25
选择两个匹配的地址中更具体的一个,即选择最长前缀的地址。选第二个

3. 使用二叉线索查找路由表
当路由表的项目数很大时,怎样设法减小路由表的查找时间就成为一个非常重要的问题。
为了进行更加有效的查找,通常是将无分类编址的路由表存放在一种层次的数据结构中,然后自上而下地按层次进行查找。这里最常用的就是二叉线索 (binary trie)。
IP 地址中从左到右的比特值决定了从根结点逐层向下层延伸的路径,而二叉线索中的各个路径就代表路由表中存放的各个地址。
为了提高二叉线索的查找速度,广泛使用了各种压缩技术。
image-20200609233730698

# 4.4 网际控制报文协议 ICMP

为了更有效地转发 IP 数据报和提高交付成功的机会,在网际层使用了网际控制报文协议 ICMP (Internet Control Message Protocol)。
ICMP 是互联网的标准协议。
ICMP 允许主机或路由器报告差错情况和提供有关异常情况的报告。
但 ICMP 不是高层协议(看起来好像是高层协议,因为 ICMP 报文是装在 IP 数据报中,作为其中的数据部分),而是 IP 层的协议。
ICMP 报文的格式
image-20200610163932999
4.4.1 ICMP 报文的种类
ICMP 报文的种类有两种,即 ICMP 差错报告报文和 ICMP 询问报文
ICMP 报文的前 4 个字节是统一的格式,共有三个字段:即类型代码检验和。接着的 4 个字节的内容与 ICMP 的类型有关。

ICMP 差错报告报文共有 4 种 :终点不可达 、时间超过、参数问题 、改变路由(重定向)(Redirect)
image-20200610164213365
不应发送 ICMP 差错报告报文的几种情况
对 ICMP 差错报告报文不再发送 ICMP 差错报告报文。
对第一个分片的数据报片的所有后续数据报片都不发送 ICMP 差错报告报文。
对具有多播地址的数据报都不发送 ICMP 差错报告报文。
对具有特殊地址(如 127.0.0.0 或 0.0.0.0)的数据报不发送 ICMP 差错报告报文。

ICMP 询问报文有两种 :回送请求和回答报文、时间戳请求和回答报文
几种 ICMP 报文不再使用:信息请求与回答报文、掩码地址请求和回答报文、路由器询问和通告报文 、源点抑制报文

4.4.2 ICMP 的应用举例
PING (Packet InterNet Groper)
PING 用来测试两个主机之间的连通性。
PING 使用了 ICMP 回送请求与回送回答报文。
PING 是应用层直接使用网络层 ICMP 的例子,它没有通过运输层的 TCP 或 UDP。

Traceroute 的应用举例
在 Windows 操作系统中这个命令是 tracert。
用来跟踪一个分组从源点到终点的路径。
它利用 IP 数据报中的 TTL 字段和 ICMP 时间超过差错报告报文实现对从源点到终点的路径的跟踪。

# 4.5 互联网的路由选择协议

4.5.1 有关路由选择协议的几个基本概念

1. 理想的路由算法:
算法必须是正确的和完整的。 算法在计算上应简单。
算法应能适应通信量和网络拓扑的变化,这就是说,要有自适应性。
算法应具有稳定性。 算法应是公平的。 算法应是最佳的。

不存在一种绝对的最佳路由算法。
所谓 “最佳” 只能是相对于某一种特定要求下得出的较为合理的选择而已。
实际的路由选择算法,应尽可能接近于理想的算法。
路由选择是个非常复杂的问题

静态路由选择策略 —— 即非自适应路由选择,其特点是简单和开销较小,但不能及时适应网络状态的变化。
动态路由选择策略 —— 即自适应路由选择,其特点是能较好地适应网络状态的变化,但实现起来较为复杂,开销也比较大。

2. 分层次的路由选择协议
** 互联网采用分层次的路由选择协议。** 这是因为:
(1) 互联网的规模非常大。如果让所有的路由器知道所有的网络应怎样到达,则这种路由表将非常大,处理起来也太花时间。而所有这些路由器之间交换路由信息所需的带宽就会使互联网的通信链路饱和。
(2) 许多单位不愿意外界了解自己单位网络的布局细节和本部门所采用的路由选择协议(这属于本部门内部的事情),但同时还希望连接到互联网上。

自治系统 AS (Autonomous System)
自治系统 AS 的定义:在单一的技术管理下的一组路由器,而这些路由器使用一种 AS 内部的路由选择协议和共同的度量以确定分组在该 AS 内的路由,同时还使用一种 AS 之间的路由选择协议用以确定分组在 AS 之间的路由。
现在对自治系统 AS 的定义是强调下面的事实:尽管一个 AS 使用了多种内部路由选择协议和度量,但重要的是一个 AS 对其他 AS 表现出的是一个单一的和一致的路由选择策略。

互联网有两大类路由选择协议
内部网关协议 IGP (Interior Gateway Protocol)
在一个自治系统内部使用的路由选择协议。
目前这类路由选择协议使用得最多,如 RIP 和 OSPF 协议。
外部网关协议 EGP (External Gateway Protocol)
若源站和目的站处在不同的自治系统中,当数据报传到一个自治系统的边界时,就需要使用一种协议将路由选择信息传递到另一个自治系统中。这样的协议就是外部网关协议 EGP。
在外部网关协议中目前使用最多的是 BGP-4。

自治系统之间的路由选择也叫做域间路由选择 (interdomain routing),在自治系统内部的路由选择叫做域内路由选择 (intradomain routing)

#4.5.2 内部网关协议 RIP

1. 工作原理:
路由信息协议 RIP (Routing Information Protocol) 是内部网关协议 IGP 中最先得到广泛使用的协议。
RIP 是一种分布式的、基于距离向量的路由选择协议。
RIP 协议要求网络中的每一个路由器都要维护从它自己到其他每一个目的网络的距离记录。
RIP 协议中的 “距离” 也称为 “跳数”(hop count),因为每经过一个路由器,跳数就加 1。
这里的 “距离” 实际上指的是 “最短距离”。
RIP 允许一条路径最多只能包含 15 个路由器。
RIP 不能在两个网络之间同时使用多条路由。
RIP 选择一个具有最少路由器的路由(即最短路由),哪怕还存在另一条高速 (低时延) 但路由器较多的路由。

RIP 协议的三个特点 :
(1) 仅和相邻路由器交换信息。
(2) 交换的信息是当前本路由器所知道的全部信息,即自己的路由表。
(3) 按固定的时间间隔交换路由信息,例如,每隔 30 秒。当网络拓扑发生变化时,路由器也及时向相邻路由器通告拓扑变化后的路由信息。

路由表的建立
路由器在刚刚开始工作时,只知道到直接连接的网络的距离(此距离定义为 1)。它的路由表是空的。
以后,每一个路由器也只和数目非常有限的相邻路由器交换并更新路由信息。
经过若干次更新后,所有的路由器最终都会知道到达本自治系统中任何一个网络的最短距离和下一跳路由器的地址。
RIP 协议的收敛 (convergence) 过程较快。“收敛” 就是在自治系统中所有的结点都得到正确的路由选择信息的过程。

2. 距离向量算法:路由器收到相邻路由器(其地址为 X)的一个 RIP 报文:
(1) 先修改此 RIP 报文中的所有项目:把 “下一跳” 字段中的地址都改为 X,并把所有的 “距离” 字段的值加 1。
(2) 对修改后的 RIP 报文中的每一个项目,重复以下步骤:
(先比对网络)
若项目中的目的网络不在路由表中,则把该项目加到路由表中。
否则(接着比对网下一跳地址)
若下一跳字段给出的路由器地址是同样的,则把收到的项目替换原路由表中的项目。
否则(再比对距离)
若收到项目中的距离小于路由表中的距离,则进行更新,
否则,什么也不做。
(3) 若 3 分钟还没有收到相邻路由器的更新路由表,则把此相邻路由器记为不可达路由器,即将距离置为 16(表示不可达)。
(4) 返回。
image-20200610182152726
3 .RIP2 协议的报文格式
image-20200610182339973
RIP2 报文由首部和路由部分组成。
RIP2 报文中的路由部分由若干个路由信息组成。每个路由信息需要用 20 个字节。地址族标识符(又称为地址类别)字段用来标志所使用的地址协议。
路由标记填入自治系统的号码,这是考虑使 RIP 有可能收到本自治系统以外的路由选择信息。
再后面指出某个网络地址、该网络的子网掩码、下一跳路由器地址以及到此网络的距离。
一个 RIP 报文最多可包括 25 个路由,因而 RIP 报文的最大长度是 4 + 20 x 25 = 504 字节。如超过,必须再用一个 RIP 报文来传送。
RIP2 具有简单的鉴别功能。
若使用鉴别功能,则将原来写入第一个路由信息(20 个字节)的位置用作鉴别。
在鉴别数据之后才写入路由信息,但这时最多只能再放入 24 个路由信息。
RIP 协议特点:好消息传播得快,坏消息传播得慢。
RIP 存在的一个问题:当网络出现故障时,要经过比较长的时间 (例如数分钟) 才能将此信息传送到所有的路由器。

#4.5.3 内部网关协议 OSPF
开放最短路径优先 OSPF (Open Shortest Path First) 是为克服 RIP 的缺点在 1989 年开发出来的。
OSPF 的原理很简单,但实现起来却较复杂。
1**.OSPF 协议的基本特点 **:
开放” 表明 OSPF 协议不是受某一家厂商控制,而是公开发表的。
最短路径优先” 是因为使用了 Dijkstra 提出的最短路径算法 SPF
采用分布式的链路状态协议 (link state protocol)
注意:OSPF 只是一个协议的名字,它并不表示其他的路由选择协议不是 “最短路径优先”。
向本自治系统中所有路由器发送信息,这里使用的方法是洪泛法
发送的信息就是与本路由器相邻的所有路由器的链路状态,但这只是路由器所知道的部分信息。
“链路状态” 就是说明本路由器都和哪些路由器相邻,以及该链路的 “度量”(metric)。
只有当链路状态发生变化时,路由器才用洪泛法向所有路由器发送此信息。

由于各路由器之间频繁地交换链路状态信息,因此所有的路由器最终都能建立一个链路状态数据库 (link-state database)
这个数据库实际上就是全网的拓扑结构图,它在全网范围内是一致的(这称为链路状态数据库的同步)。
OSPF 的链路状态数据库能较快地进行更新,使各个路由器能及时更新其路由表。
OSPF 的更新过程收敛得快是其重要优点。

为了使 OSPF 能够用于规模很大的网络,OSPF 将一个自治系统再划分为若干个更小的范围,叫做区域 (area) 。
每一个区域都有一个 32 位的区域标识符(用点分十进制表示)。
区域也不能太大,在一个区域内的路由器最好不超过 200 个。
OSPF 划分为两种不同的区域
image-20200610184613304
划分区域的好处就是将利用洪泛法交换链路状态信息的范围局限于每一个区域而不是整个的自治系统,这就减少了整个网络上的通信量。
在一个区域内部的路由器只知道本区域的完整网络拓扑,而不知道其他区域的网络拓扑的情况。
OSPF 使用层次结构的区域划分。在上层的区域叫做主干区域 (backbone area)。
主干区域的标识符规定为 0.0.0.0。主干区域的作用是用来连通其他在下层的区域。

OSPF 不用 UDP 而是直接用 IP 数据报传送。
OSPF 构成的数据报很短。这样做可减少路由信息的通信量。
数据报很短的另一好处是可以不必将长的数据报分片传送。
但分片传送的数据报只要丢失一个,就无法组装成原来的数据报,而整个数据报就必须重传。

OSPF 的其他特点
OSPF 对不同的链路可根据 IP 分组的不同服务类型 TOS 而设置成不同的代价。因此,OSPF 对于不同类型的业务可计算出不同的路由
如果到同一个目的网络有多条相同代价的路径,那么可以将通信量分配给这几条路径。这叫做多路径间的负载平衡
所有在 OSPF 路由器之间交换的分组都具有鉴别的功能。
支持可变长度的子网划分和无分类编址 CIDR。
每一个链路状态都带上一个 32 位的序号,序号越大状态就越新。
image-20200610190203358

2.OSPF 的五种分组类型
类型 1,问候 (Hello) 分组。
类型 2,数据库描述 (Database Description) 分组。
类型 3,链路状态请求 (Link State Request) 分组。
类型 4,链路状态更新 (Link State Update) 分组,用洪泛法对全网更新链路状态。
类型 5,链路状态确认 (Link State Acknowledgment) 分组。
image-20200610190322547
image-20200610190339804
OSPF 还规定每隔一段时间,如 30 分钟,要刷新一次数据库中的链路状态。
由于一个路由器的链路状态只涉及到与相邻路由器的连通状态,因而与整个互联网的规模并无直接关系。因此互联网规模很大,OSPF 协议要比距离向量协议 RIP 好得多。
OSPF 没有 “坏消息传播得慢” 的问题,据统计,其响应网络变化的时间小于 100 ms。

多点接入的局域网采用了指定的路由器 (designated router) 的方法,使广播的信息量大大减少。
指定的路由器代表该局域网上所有的链路向连接到该网络上的各路由器发送状态信息。

4.5.4 外部网关协议 BGP
BGP 是不同自治系统的路由器之间交换路由信息的协议。
BGP 较新版本是 2006 年 1 月发表的 BGP-4(BGP 第 4 个版本),即 RFC 4271 ~ 4278。
可以将 BGP-4 简写为 BGP。

互联网的规模太大,使得自治系统之间路由选择非常困难。对于自治系统之间的路由选择,要寻找最佳路由是很不现实的。
当一条路径通过几个不同 AS 时,要想对这样的路径计算出有意义的代价是不太可能的。
比较合理的做法是在 AS 之间交换 “可达性” 信息。
自治系统之间的路由选择必须考虑有关策略。
因此,边界网关协议 BGP 只能是力求寻找一条能够到达目的网络且比较好的路由(不能兜圈子),而并非要寻找一条最佳路由。

每一个自治系统的管理员要选择至少一个路由器作为该自治系统的 “ BGP 发言人” (BGP speaker) 。
一般说来,两个 BGP 发言人都是通过一个共享网络连接在一起的,而 BGP 发言人往往就是 BGP 边界路由器,但也可以不是 BGP 边界路由器。
一个 BGP 发言人与其他自治系统中的 BGP 发言人要交换路由信息,就要先建立 TCP 连接,然后在此连接上交换 BGP 报文以建立 BGP 会话 (session),利用 BGP 会话交换路由信息。
使用 TCP 连接能提供可靠的服务,也简化了路由选择协议。
使用 TCP 连接交换路由信息的两个 BGP 发言人,彼此成为对方的邻站 (neighbor) 或对等站 (peer) 。

BGP 所交换的网络可达性的信息就是要到达某个网络所要经过的一系列 AS。
当 BGP 发言人互相交换了网络可达性的信息后,各 BGP 发言人就根据所采用的策略从收到的路由信息中找出到达各 AS 的较好路由。

BGP 协议的特点
BGP 协议交换路由信息的结点数量级是自治系统数的量级,这要比这些自治系统中的网络数少很多。
每一个自治系统中 BGP 发言人(或边界路由器)的数目是很少的。这样就使得自治系统之间的路由选择不致过分复杂。
BGP-4 共使用四种报文 :
(1) 打开 (OPEN) 报文,用来与相邻的另一个 BGP 发言人建立关系。
(2) 更新 (UPDATE) 报文,用来发送某一路由的信息,以及列出要撤消的多条路由。
(3) 保活 (KEEPALIVE) 报文,用来确认打开报文和周期性地证实邻站关系。
(4) 通知 (NOTIFICATION) 报文,用来发送检测到的差错。
image-20200610201742842

4.5.5 路由器的构成
路由器是一种典型的网络层设备。
路由器是互联网中的关键设备。
路由器的主要作用是:连通不同的网络。选择信息传送的线路。选择通畅快捷的近路,能大大提高通信速度,减轻网络系统通信负荷,节约网络系统资源,提高网络系统畅通率,从而让网络系统发挥出更大的效益来。

1. 路由器的结构
路由器是一种具有多个输入端口和多个输出端口的专用计算机,其任务是转发分组。也就是说,将路由器某个输入端口收到的分组,按照分组要去的目的地(即目的网络),把该分组从路由器的某个合适的输出端口转发给下一跳路由器。
下一跳路由器也按照这种方法处理分组,直到该分组到达终点为止。
路由器的转发分组正是网络层的主要工作。
image-20200610201909551
整个的路由器结构可划分为两大部分:路由选择部分、分组转发部分。
路由选择部分
也叫做控制部分,其核心构件是路由选择处理机。
路由选择处理机的任务是根据所选定的路由选择协议构造出路由表,同时经常或定期地和相邻路由器交换路由信息而不断地更新和维护路由表。
分组转发部分由三部分组成:
交换结构 (switching fabric):又称为交换组织,其作用是根据转发表 (forwarding table) 对分组进行处理。
一组输入端口
一组输出端口
(请注意:这里的端口就是硬件接口)

“转发” 和 “路由选择” 的区别
转发”(forwarding) 就是路由器根据转发表将用户的 IP 数据报从合适的端口转发出去。
路由选择”(routing) 则是按照分布式算法,根据从各相邻路由器得到的关于网络拓扑的变化情况,动态地改变所选择的路由。
路由表是根据路由选择算法得出的。而转发表是从路由表得出的。
在讨论路由选择的原理时,往往不去区分转发表和路由表的区别。

输入端口中的查找和转发功能在路由器的交换功能中是最重要的。
image-20200610202215505
image-20200610202222726
分组丢弃
若路由器处理分组的速率赶不上分组进入队列的速率,则队列的存储空间最终必定减少到零,这就使后面再进入队列的分组由于没有存储空间而只能被丢弃。
路由器中的输入或输出队列产生溢出是造成分组丢失的重要原因。

2. 交换结构
交换结构是路由器的关键构件。
正是这个交换结构把分组从一个输入端口转移到某个合适的输出端口。
实现交换有多种方法。常用交换方法有三种:通过存储器、通过总线、通过纵横交换结构

通过存储器
当路由器的某个输入端口收到一个分组时,就用中断方式通知路由选择处理机。然后分组就从输入端口复制到存储器中。
路由器处理机从分组首部提取目的地址,查找路由表,再将分组复制到合适的输出端口的缓存中。
若存储器的带宽(读或写)为每秒 M 个分组,那么路由器的交换速率(即分组从输入端口传送到输出端口的速率)一定小于 M/2。
通过总线
数据报从输入端口通过共享的总线直接传送到合适的输出端口,而不需要路由选择处理机的干预。
因为每一个要转发的分组都要通过这一条总线,因此路由器的转发带宽就受总线速率的限制。
现代的技术已经可以将总线的带宽提高到每秒吉比特的速率,因此许多的路由器产品都采用这种通过总线的交换方式。
通过纵横交换结构 (crossbar switch fabric)
这种交换结构常称为互连网络 (interconnection network)。
它有 2N 条总线,可以使 N 个输入端口和 N 个输出端口相连接。
当输入端口收到一个分组时,就将它发送到与该输入端口相连的水平总线上。
若通向所要转发的输出端口的垂直总线是空闲的,则在这个结点将垂直总线与水平总线接通,然后将该分组转发到这个输出端口。
但若该垂直总线已被占用(有另一个分组正在转发到同一个输出端口),则后到达的分组就被阻塞,必须在输入端口排队。
image-20200610202514920

# 4.6 IPv6

IP 是互联网的核心协议。
互联网经过几十年的飞速发展,到 2011 年 2 月,IPv4 的 32 位地址已经耗尽。
ISP 已经不能再申请到新的 IP 地址块了。
我国在 2014 – 2015 年也逐步停止了向新用户和应用分配 IPv4 地址。
解决 IP 地址耗尽的根本措施就是采用具有更大地址空间的新版本的 IP,即 IPv6。

4.6.1 IPv6 的基本首部
IPv6 仍支持无连接的传送,但将协议数据单元 PDU 称为分组。为方便起见,本书仍采用数据报这一名词。
所引进的主要变化如下:
更大的地址空间。IPv6 将地址从 IPv4 的 32 位 增大到了 128 位。
扩展的地址层次结构。
灵活的首部格式。 IPv6 定义了许多可选的扩展首部。
改进的选项。 IPv6 允许数据报包含有选项的控制信息,其选项放在有效载荷中。

所引进的主要变化如下(续):
允许协议继续扩充。
支持即插即用(即自动配置)。因此 IPv6 不需要使用 DHCP。
支持资源的预分配。 IPv6 支持实时视像等要求,保证一定的带宽和时延的应用。
IPv6 首部改为 8 字节对齐。首部长度必须是 8 字节的整数倍。原来的 IPv4 首部是 4 字节对齐。

4.6.2 IPv6 的地址
4.6.3 从 IPv4 向 IPv6 过渡
4.6.4 ICMPv6

4.7 IP 多播

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

# 4.9 多协议标记交换 MPLS

-->