前言
网络层的任务是实现网络互联,进而让数据包能够在不同网络之间传输。本章围绕三个问题展开:网络层向运输层提供什么服务、网络层怎样寻址、路由器怎样选择转发路径。
本文按照网络层中"服务、编址、转发、路由、控制报文、边界技术"的顺序展开。

一、网络层提供的两种服务
网络层可以提供两种服务:
- 面向连接的虚电路服务;
- 无连接的数据报服务。
无连接的数据报服务中,可靠通信应当由用户主机来保证。

虚电路服务与数据报服务的差别,可以从分组在网络中的处理方式理解。虚电路服务需要先建立网络层连接,同一条虚电路上的分组按照同一路由转发;在连接建立阶段使用终点地址,之后分组使用较短的虚电路号。数据报服务不需要预先建立网络层连接,每个分组都带有终点的完整地址,不同分组可以走不同路由。
节点发生故障时,虚电路服务中经过该节点的虚电路不能继续工作;数据报服务中,故障节点可能丢失分组,部分路由也可能随之变化。两种服务对分组顺序的处理也不同:虚电路服务的分组总是按发送顺序到达终点,数据报服务到达终点时不一定仍保持发送顺序。
从服务质量保障看,虚电路服务可以在建立连接时预先为每条虚电路分配通信资源;数据报服务很难完成这样的预分配。这些差别说明,网络层提供的服务方式会直接影响分组携带的信息和路由器的转发方式。
二、IPv4 地址与地址规划
IPv4 地址是主机或路由器每一个接口的唯一 32 比特标识符。
1. 分类编址
分类编址包含 A 类地址、B 类地址和 C 类地址。

分类编址中,A、B、C 类地址分别使用不同长度的网络号和主机号:A 类地址的第 1 位固定为 0,B 类地址的前 2 位固定为 10,C 类地址的前 3 位固定为 110。D 类地址用于多播,E 类地址保留为后续使用。
图中还标注了几个需要区分的特殊情况:只有 A、B、C 类地址能够分配给网络中的主机或路由器接口;主机号全 0 的地址是网络地址,主机号全 1 的地址是广播地址,两者都不能分配给主机或路由器接口。
2. 划分子网
子网掩码用来表明分类 IP 地址中,主机号部分有多少比特被借用作为子网号。
3. 无分类编址与路由聚合
无分类编址使用"/"划分网络前缀和主机号。
路由聚合时,路由表可以写入具有共同前缀的地址,也就是聚合地址块。网络前缀越长,地址块越小,路由越具体。路由表查找遵循最长前缀匹配法则。
例如,地址块 192.168.1.0/24 中的 24 表示网络前缀占 24 位,剩余部分用于主机号。若路由表中同时存在 10.0.0.0/8 和 10.1.0.0/16,目的地址为 10.1.2.3 时,两个条目都能匹配,但 /16 的前缀更长,因此应选择 10.1.0.0/16 对应的路由。这就是最长前缀匹配的实际含义。
4. 应用规划
定长子网掩码使用同一个子网掩码,子网大小只能按 2 的 n 次方变化,容易造成地址浪费。
变长子网掩码使用不同的子网掩码,可以按需分配地址,不易浪费。
地址规划的重点不在于记住某一个固定掩码,而在于根据网络规模选择合适的地址块。定长子网掩码便于统一管理,变长子网掩码更适合主机数量差异较大的网络。路由聚合和最长前缀匹配则保证地址块既能合并表示,又能在转发时选择更具体的目的网络。
三、IP 数据包的发送和转发过程
主机发送 IP 数据包时,先判断目的主机是否与自己处于同一个网络:
- 在同一个网络中,直接交付。
- 不在同一个网络中,间接交付给默认网关,也就是路由器,再由路由器继续转发。
路由器转发 IP 数据包时,先检查 IP 数据包首部是否出错。首部出错时,丢弃数据包并通告源主机;首部无误时,根据目的地址在路由表中查找匹配条目。
找到匹配条目后,路由器将数据包转发给下一跳;找不到匹配条目时,丢弃数据包并通告源主机。
这段过程可以按两台设备分开记忆。主机只需要先判断"目的主机是否在同一个网络";若不在同一个网络,就把数据包交给默认网关。路由器收到数据包后,面对的是"目的地址对应哪一条路由表项",因此需要继续查找匹配项并决定下一跳。前者解决数据包的第一跳,后者负责让数据包在网络之间逐跳前进。
四、静态路由配置与路由条目
静态路由是用户或管理员使用路由器相关命令,人工配置路由表。
静态路由配置可能出现三类问题:配置错误、聚合了不存在的网络、网络故障。
路由表中的路由条目类型包括:
- 直连网络;
- 静态路由;
- 动态路由。
特殊的静态路由条目包括默认路由、特定主机路由和黑洞路由。默认路由的目的网络为 0.0.0.0,地址掩码为 0.0.0.0;黑洞路由的下一跳为 Null0。
三类基本路由条目的来源也不同:直连路由对应路由器直接连接的网络,静态路由由管理员手工指定,动态路由由路由选择协议学习得到。默认路由用于处理没有更具体匹配项的目的地;特定主机路由只匹配一台主机;黑洞路由会让匹配的数据报进入 Null0 并被丢弃。
五、路由选择协议
静态路由选择由人工配置,配置简单、开销小,但不能及时适应网络变化,适合小规模网络。
动态路由选择能够自动配置,较复杂、开销较大,但可以较好适应网络变化,适合大规模网络。
路由选择协议具有三个特点:自适应、分布式、分层次。

自治系统之间的路由选择称为域间路由选择,域内的路由选择称为域内路由选择。域间路由选择使用外部网关协议 EGP,域内路由选择使用内部网关协议 IGP。
一个自治系统内部采用的协议与外部采用的协议无关。例如,AS1 内部可以使用路由信息协议 RIP,AS2 内部可以使用开放最短路径优先 OSPF,两个自治系统之间使用边界网关协议 BGP。

分层次的划分让自治系统内部和自治系统之间可以分别处理路由选择问题。图中以两个自治系统为例:左侧 AS 内使用 IGP,右侧 AS 内也使用 IGP,但两侧的内部协议可以不同;当路由信息需要跨越自治系统边界时,则由 EGP 中的 BGP 负责交换。
1. 路由信息协议 RIP
RIP 是最先得到广泛使用的协议之一,属于距离向量路由选择协议。在自治系统 AS 内,每一个路由器都维护从自身到 AS 内其他每一个网络的距离记录。
RIP 使用跳数衡量到达目的网络的距离,距离不能大于 16,因此只适用于小型互联网,判断标准是距离越短越好。
RIP 的基本工作围绕三个问题展开:
- 和谁交换:仅和相邻路由器交换信息;
- 交换什么:交换自己的路由表信息;
- 什么时候交换:周期性交换信息。
路由器通过相邻路由器的路由表更新自身信息。RIP 的问题是坏消息传播慢。

RIP 的基本工作过程可以继续拆开理解。路由器刚开始工作时,只知道自己到直连网络的距离为 1;之后只与相邻路由器周期性交换和更新路由信息。多次交换后,各路由器获得到达本 AS 内各网络的最短距离与下一跳信息,这个状态称为收敛。
路由表更新时,发现新的网络就添加条目;到达同一目的网络但下一跳不同,新的路由更优时更新,等价时可以进行等价负载均衡;同一下一跳带来的最新信息也要更新。RIP 把"距离等于 16"视为不可达,因此最多只能经过 15 台路由器。
坏消息传播慢也称为路由环路或距离无穷计数问题。常见的缓解思路包括限制最大路径距离为 15、路由表变化时触发更新而不只等待周期发送,以及让路由器记录收到某条路由信息的接口。
2. 开放最短路径优先 OSPF
OSPF 使用最短路径优先 SPF 算法,基于链路状态进行路由选择。它不会产生路由环路,不限制网络规模,更新效率高,收敛速度快。
链路代价 L 的计算为:100 Mbps/链路带宽。
OSPF 通过 Hello 分组建立和维护邻居关系。Hello 分组的发送周期为 10 秒,40 秒未收到相应分组时,认为邻居不可达。
每个路由器产生链路状态通告 LSA,其中包括直连网络的链路状态信息和邻居路由器的链路状态信息。LSA 被封装到链路状态更新分组 LSU 中,采用洪泛法发送。链路状态数据库 LSDB 用于存储 LSA,路由器再使用 LSDB 进行最短路径优先计算。
OSPF 有五种分组类型:Hello 分组、数据库描述分组、链路状态请求分组、链路状态更新分组、链路状态确认分组。
当路由器较多时,可以选举 DR 和 BDR,也可以划分区域。相关角色包括区域内路由器 IR、区域边界路由器 ABR、主干路由器 BBR、自治系统边界路由器 ASBR。

OSPF 的工作过程可以按"建立邻居、通告链路状态、保存数据库、计算路由"理解。Hello 分组用于建立和维护邻居关系;每台路由器产生 LSA,并将其封装在 LSU 中洪泛发送;路由器把收到的 LSA 保存到 LSDB;最后基于 LSDB 进行 SPF 计算,形成到其他路由器的最短路径并构建路由表。
链路状态体现的是路由器和哪些邻居相邻,以及相应链路的代价。代价可以表示费用、距离、时延、带宽等,由网络管理人员决定。常见计算方式为 100 Mbps/链路带宽。
在多点接入网络中,选举 DR 和 BDR 后,非 DR/BDR 路由器与 DR/BDR 建立邻居关系,非 DR/BDR 之间通过 DR/BDR 交换信息。网络规模继续扩大时,划分区域可以把洪泛法交换链路状态信息的范围限制在每个区域内。
3. 边界网关协议 BGP
BGP 是外部网关协议 EGP。它通过建立会话、交换信息,寻找较好的线路。
BGP-4 的报文包括:OPEN 打开报文、UPDATE 更新报文、KEEPALIVE 保活报文、NOTIFICATION 通知报文。

不同自治系统中,度量路由代价的方法可能不同,因此不能只凭某一个"代价"寻找最佳路由。自治系统之间的路由选择还需要考虑相关策略,例如政治、经济和安全等因素。BGP 的目标是寻找一条能到达目的网络、并且较好的路由。
配置 BGP 时,每个自治系统至少选择一个路由器作为 BGP 发言人。不同自治系统的 BGP 发言人先建立 TCP 连接,端口号为 179,再利用这个连接建立 BGP 会话并交换网络可达性信息。互相交换路由信息的两个 BGP 发言人彼此称为邻站或对等站。
四类 BGP-4 报文各自承担不同作用:OPEN 用于与相邻 BGP 发言人建立关系并初始化通信;UPDATE 用于通告某一路由的信息或列出要撤销的路由;KEEPALIVE 用于周期性证实邻站连通性;NOTIFICATION 用于发送检测到的差错。
六、IPv4 数据报的首部格式
IPv4 数据报的首部格式如下图所示。

首部由固定部分和可变部分组成。图中给出了版本、首部长度、区分服务、总长度、标识、标志、片偏移、生存时间、协议、首部检验和、源 IP 地址、目的 IP 地址等字段;可选字段和填充构成可变部分。
其中,版本字段表示 IP 协议版本;首部长度以 4 字节为单位,最小值为 5,表示固定部分为 20 字节;总长度表示首部和数据载荷的总长度。生存时间 TTL 以跳数为单位,路由器每转发一次数据报就将其值减 1,减为 0 时丢弃数据报。源 IP 地址和目的 IP 地址各占 32 比特,分别填写发送该数据报的源主机与接收该数据报的目的主机地址。
协议字段用于指出数据部分属于何种协议数据单元,例如 ICMP、IGMP、TCP、UDP、IPv6、OSPF 等。首部检验和用于检测首部在传输过程中是否出现差错。
七、网际控制报文协议 ICMP
主机或路由器使用 ICMP 发送差错报告报文和询问报文。
常见的五种 ICMP 差错报告报文为:
- 终点不可达;
- 源点抑制;
- 时间超过;
- 参数问题;
- 改变路由。
常见的两种 ICMP 询问报文为:
- 回送请求和回答:测试目的地址是否可达;
- 时间戳请求和回答:进行时钟同步和测量时间。
ICMP 的应用举例包括分组网间探测 PING 和跟踪路由 traceroute。
ICMP 的两类报文分别承担不同任务。差错报告报文用于反馈转发或处理过程中出现的问题;询问报文用于获取必要的信息。回送请求和回答对应 PING,可用于测试目的地址是否可达;跟踪路由 traceroute 则是另一个常见应用。
PING 的结果只能说明回送请求与回答能否完成,不能单独说明整条业务链路已经正常。traceroute 则通过逐步增大探测报文的 TTL,让中间路由器在 TTL 用尽时返回"时间超过"报文,从而观察数据报经过的路由节点。这两种工具分别对应"是否可达"和"经过哪些路由"两个问题。
八、虚拟专用网 VPN 和网络地址转换 NAT
虚拟专用网 VPN 和网络地址转换 NAT 的场景如下图所示。

VPN 利用公用的因特网作为本机构各专用网之间的通信载体。为了保证传输数据的安全性,内部数据报会先加密,再封装为可在因特网上发送的外部数据报。按使用范围,可以分为由同一机构不同部门内部网络组成的内部网 VPN、外部机构参与的外联网 VPN,以及员工从外地访问公司专用网络的远程接入 VPN。
NAT 面向 IPv4 地址空间紧张的问题。专用网络中的主机可以使用本机构自由分配的专用地址,而不必为每台主机申请因特网上使用的公网地址。专用地址范围为 10.0.0.0 至 10.255.255.255、172.16.0.0 至 172.31.255.255、192.168.0.0 至 192.168.255.255。
NAT 可以让大量使用内部专用地址的专用网络用户共享少量外部全球地址访问因特网。网络地址与端口号转换 NAPT 会把运输层端口号和 IP 地址一起转换,因此一个全球 IP 地址可以让多个拥有本地地址的主机同时与因特网上的主机通信。
总结
本章围绕网络层的服务、IPv4 编址、IP 数据包发送与转发、静态路由和动态路由选择、RIP、OSPF、BGP、IPv4 数据报首部、ICMP、VPN 和 NAT 展开。复习时可以按"地址如何划分、数据包如何转发、路由信息如何获得、异常如何报告"的顺序梳理。
参考资料
- 湖科大计算机网络第四层网络层