《计算机网络》第四章:网络层 学习总结
网络层是OSI模型中的第三层,TCP/IP体系结构中的网际层。它的核心功能是实现数据包从源主机到目的主机的端到端 传输,即分组交付。这包括了寻址、路由选择和转发等关键任务。
1. 核心功能
网络层主要提供两种服务模型,并区分了转发与路由这两个核心概念。
1.1 虚电路服务 (Virtual Circuit Service) vs 数据报服务 (Datagram Service)
| 特性 | 虚电路服务 (面向连接) | 数据报服务 (无连接) |
|---|---|---|
| 连接性 | 面向连接,通信前需建立虚电路,通信结束后需释放。 | 无连接,每个数据报独立发送,无需事先建立连接。 |
| 路径 | 一旦建立,所有数据包沿相同路径传输。 | 每个数据报可能沿不同路径传输。 |
| 状态 | 网络设备(路由器)需要维护虚电路状态信息。 | 网络设备不维护任何连接状态信息。 |
| 可靠性 | 通常能保证数据包的顺序交付,甚至提供流量控制和差错控制。 | 不保证数据包的顺序、可靠性,由上层协议(如TCP)负责。 |
| 开销 | 建立和拆除连接有开销,但数据传输阶段开销相对较小。 | 无连接建立开销,但每个数据报需携带完整地址信息。 |
| 应用 | 早期电话网络、ATM网络。 | 互联网(IP协议)。 |
互联网的IP协议采用的是数据报服务 ,它提供的是一种尽力而为 (best-effort) 的服务,不保证可靠性、顺序性或无重复。
1.2 转发 (Forwarding) vs 路由 (Routing)
-
转发 (Forwarding):
- 局部动作 。指路由器根据其转发表(或称查找表、FIB),将到达输入端口的数据报快速地从一个合适的输出端口转发出去的动作。
- 这是一个硬件实现的、高速的、逐跳(hop-by-hop)的数据包处理过程。
- 它关注的是"下一个跳(next hop)"在哪里。
-
路由 (Routing):
- 全局过程 。指网络中的所有路由器通过运行路由算法 ,共同决定数据报从源到目的地的最佳路径,并构建和维护各自的转发表的过程。
- 这是一个软件实现的、相对较慢的、分布式或集中式的决策过程。
- 它关注的是"如何到达目的地"。
总结:路由是为转发提供决策依据,转发是路由决策的执行者。
2. 网际协议 IPv4
IPv4是互联网的核心协议,它定义了数据报的格式、寻址方式和分片机制。
2.1 IPv4 数据报格式
IPv4数据报由首部 和数据部分组成。首部固定部分为20字节,可选部分最长40字节。
0 1 2 3
0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|版本 |首部长度|服务类型(TOS)| 总长度 (Total Length) |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| 标识 (Identification) |标志(Flags)| 片偏移 (Fragment Offset) |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| 生存时间(TTL) | 协议(Protocol) | 首部校验和 (Header Checksum) |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| 源IP地址 (Source IP Address) |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| 目的IP地址 (Destination IP Address) |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| 选项 (Options) (可选) |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| 数据 (Data) |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
重点关注字段:
- 总长度 (Total Length) :16位,表示整个IP数据报的长度(首部 + 数据),单位是字节。最大长度为 216−1=655352^{16}-1 = 65535216−1=65535 字节。
- 标识 (Identification):16位,用于唯一标识一个IP数据报。当数据报分片时,所有分片都使用相同的标识字段,以便在目的主机重组。
- 标志 (Flags) :3位。
- 第一位:保留,必须为0。
- 第二位 (DF - Don't Fragment):不分片位 。
- DF = 0:允许分片。
- DF = 1:不允许分片。如果数据报太大无法通过某个网络,且DF=1,则路由器会丢弃该数据报并发送ICMP差错报文。
- 第三位 (MF - More Fragments):更多分片位 。
- MF = 1:表示后面还有分片。
- MF = 0:表示这是最后一个分片,或者数据报未分片。
- 片偏移 (Fragment Offset) :13位,表示当前分片在原数据报数据部分的相对位置。单位是8字节。除了最后一个分片,所有分片的数据部分长度必须是8字节的整数倍。
- 生存时间 (TTL - Time To Live) :8位,数据报在网络中可以经过的最大跳数(路由器数量)。每经过一个路由器,TTL值减1。当TTL减到0时,路由器会丢弃该数据报,并发送ICMP时间超过差错报文给源主机。防止数据报在网络中无限循环。
- 协议 (Protocol):8位,指示IP数据报数据部分所承载的上层协议类型。例如,ICMP为1,IGMP为2,TCP为6,UDP为17。
- 首部校验和 (Header Checksum) :16位,只校验IP数据报的首部 。每当数据报经过一个路由器时,TTL字段会减1,因此首部校验和必须重新计算。
2.2 IP 分片 (IP Fragmentation)
当IP数据报的总长度超过链路层的最大传输单元 (MTU - Maximum Transmission Unit) 时,就需要进行分片。
- MTU 限制:不同的数据链路层协议有不同的MTU。例如,以太网的MTU通常是1500字节。
- 分片过程 :
- 路由器接收到一个IP数据报。
- 检查数据报的总长度是否大于出接口的MTU。
- 如果大于,且DF=0,则将数据报分成若干个小片。
- 每个分片都拥有原始IP数据报首部的大部分信息,但会更新总长度、标识、标志、片偏移 和首部校验和字段。
- 除了最后一个分片,所有分片的MF标志位都设置为1。最后一个分片的MF设置为0。
- 片偏移字段根据分片在原始数据报中的位置进行计算,单位是8字节。
- 分片只在目的主机进行重组。
3. IP 编址
IP地址是网络层用于标识主机和路由器的逻辑地址。
3.1 分类 IP 地址 (Classful IP Addressing)
将IP地址分为网络号和主机号两部分,并根据网络号的第一个字节范围划分为A、B、C、D、E五类。
- A类地址 :
0.0.0.0到127.255.255.255。网络号占1字节,主机号占3字节。- 网络号范围:
0到127(第一个字节)。 - 默认子网掩码:
255.0.0.0。 - 可用的网络数少,每个网络可容纳的主机数多。
- 网络号范围:
- B类地址 :
128.0.0.0到191.255.255.255。网络号占2字节,主机号占2字节。- 网络号范围:
128.0到191.255(前两个字节)。 - 默认子网掩码:
255.255.0.0。 - 适用于中等规模网络。
- 网络号范围:
- C类地址 :
192.0.0.0到223.255.255.255。网络号占3字节,主机号占1字节。- 网络号范围:
192.0.0到223.255.255(前三个字节)。 - 默认子网掩码:
255.255.255.0。 - 适用于小型网络。
- 网络号范围:
- D类地址 :
224.0.0.0到239.255.255.255。用于多播 (Multicast)。 - E类地址 :
240.0.0.0到255.255.255.255。保留,用于科学研究。
特殊IP地址:
0.0.0.0:本网络上的本主机。127.0.0.1:本地环回地址 (Loopback Address)。- 网络地址:主机号全为0的地址,代表整个网络。
- 广播地址:主机号全为1的地址,向网络中所有主机发送数据。
3.2 CIDR (无分类域间路由 - Classless Inter-Domain Routing)
分类IP地址的缺点是地址空间利用率低,且路由表庞大。CIDR是为了解决这些问题而提出的。
- 斜线记法 (Slash Notation) :
IP地址/网络前缀的位数。例如,192.168.1.0/24表示IP地址为192.168.1.0,网络前缀有24位。 - 地址掩码 (Address Mask) :也称子网掩码。由一串连续的1和一串连续的0组成。1的个数就是网络前缀的位数。例如,
/24对应的子网掩码是255.255.255.0。 - 子网划分 (Subnetting) :从主机号中借用若干位作为子网号,从而将一个大的网络划分为若干个小的子网。这增加了IP地址的灵活性,提高了地址利用率。
- 网络地址 = IP地址 AND 子网掩码。
- 广播地址 = 网络地址 OR (NOT 子网掩码)。
- 构造超网 (Supernetting) / 路由聚合 (Route Aggregation) :
- 将多个连续的、具有相同网络前缀的较小网络聚合成一个更大的网络。
- 通过减少路由表中的条目数量,可以显著减小路由表的规模,提高路由查找效率。
- 聚合的原则是找到这些网络地址的最长公共前缀。
4. 重要协议
4.1 ARP (地址解析协议 - Address Resolution Protocol)
- 功能:将网络层IP地址解析为数据链路层MAC地址。
- 过程 :
- 主机A要与主机B通信,已知B的IP地址,但不知道MAC地址。
- 主机A在本地ARP缓存中查找B的MAC地址,如果找到则直接使用。
- 如果未找到,主机A发送一个ARP请求报文 (包含B的IP地址),以广播形式发送到局域网。
- 局域网内所有主机收到ARP请求。主机B发现请求中的IP地址是自己的,则发送一个ARP响应报文(包含自己的MAC地址)给主机A。
- 主机A收到ARP响应后,将B的IP地址和MAC地址映射关系存入ARP缓存,并使用该MAC地址封装数据帧。
4.2 ICMP (网际控制报文协议 - Internet Control Message Protocol)
- 功能:IP协议的伴侣协议,用于在IP主机、路由器之间传递控制消息,报告网络故障或提供诊断信息。
- ICMP报文封装在IP数据报的数据部分。
- 主要类型 :
- 差错报告报文 :
- 目的不可达:当路由器无法将数据报交付给目的主机时发送。
- 源站抑制:当路由器或主机因拥塞而丢弃数据报时发送,要求源站降低发送速率(已不推荐使用)。
- 时间超过:当数据报的TTL字段减为0时,或分片重组定时器超时时发送。
- 参数问题:当IP首部字段出现错误时发送。
- 重定向:当路由器发现数据报应发送到另一个更好的路由器时,通知源主机更改路由。
- 询问报文 :
- 回送请求与回答 (Echo Request/Reply) :用于测试目的主机是否可达,即
ping命令。 - 时间戳请求与回答:用于测量网络延迟。
- 回送请求与回答 (Echo Request/Reply) :用于测试目的主机是否可达,即
- 差错报告报文 :
4.3 DHCP (动态主机配置协议 - Dynamic Host Configuration Protocol)
- 功能:为网络中的主机动态分配IP地址、子网掩码、默认网关、DNS服务器地址等网络配置信息。
- 优点:简化了网络管理,提高了IP地址的利用率。
- 工作过程 (DORA) :
- Discover (发现):新主机以广播形式发送DHCP Discover报文,寻找DHCP服务器。
- Offer (提供):DHCP服务器收到Discover报文后,从地址池中选择一个可用IP地址,并以广播或单播形式发送DHCP Offer报文。
- Request (请求):主机收到一个或多个Offer报文后,选择一个服务器的Offer,并以广播形式发送DHCP Request报文,确认请求该IP地址。
- ACK (确认):被选中的DHCP服务器发送DHCP ACK报文,确认分配IP地址及其他配置信息。
4.4 NAT (网络地址转换 - Network Address Translation)
- 功能:将私有IP地址(在局域网内部使用)转换为公有IP地址(在互联网上使用),以解决IPv4地址短缺问题。
- 工作原理:NAT路由器维护一个转换表,记录内部私有IP地址、端口号与外部公有IP地址、端口号的映射关系。当内部主机访问外部网络时,NAT路由器将源IP地址和端口号替换为自己的公有IP地址和新的端口号;当外部响应数据包到达时,NAT路由器根据转换表将目的IP地址和端口号还原为内部主机的私有IP地址和端口号。
- 优点:节省公有IP地址,增强内部网络安全性。
- 缺点:增加了通信延迟,破坏了端到端透明性,对某些应用(如P2P)可能造成问题。
5. 路由算法与协议
5.1 静态路由 vs 动态路由
- 静态路由 (Static Routing) :
- 由网络管理员手动配置和维护路由表。
- 适用于小型、拓扑结构稳定、变化不频繁的网络。
- 优点:简单、安全、开销小。
- 缺点:不适应网络拓扑变化,管理复杂。
- 动态路由 (Dynamic Routing) :
- 路由器之间通过运行路由协议,自动发现网络拓扑变化,并更新路由表。
- 适用于大型、拓扑结构复杂、变化频繁的网络。
- 优点:适应性强,管理开销小。
- 缺点:协议开销大,可能存在路由环路等问题。
5.2 距离向量算法 (Distance-Vector Algorithm) vs 链路状态算法 (Link-State Algorithm)
这是两种最基本的动态路由算法。
| 特性 | 距离向量算法 (如RIP) | 链路状态算法 (如OSPF) |
|---|---|---|
| 信息交换 | 路由器周期性地向邻居发送自己的整个路由表。 | 路由器向所有路由器发送自己的链路状态信息 (LSA)。 |
| 拓扑视图 | 路由器只知道到目的地的距离和下一跳,不知道完整网络拓扑。 | 每个路由器都构建完整的网络拓扑图。 |
| 收敛速度 | 慢,容易出现"好消息传得快,坏消息传得慢"问题,可能产生路由环路。 | 快,通过Dijkstra算法计算最短路径,收敛迅速。 |
| 计算方式 | Bellman-Ford算法。 | Dijkstra算法。 |
| 度量 | 跳数 (Hop Count)。 | 链路代价 (Cost),如带宽、延迟等。 |
| 规模 | 适用于小型网络。 | 适用于大型网络,支持层次化路由。 |
5.3 外部网关协议 BGP (Border Gateway Protocol)
- 功能 :用于不同自治系统 (AS - Autonomous System) 之间交换路由信息。
- 特点 :
- 路径向量协议 (Path-Vector Protocol):BGP路由器不仅交换距离信息,还交换到达目的网络的完整路径(AS序列)。
- 基于策略的路由:BGP路由选择不仅考虑最短路径,更重要的是根据自治系统的策略(如商业关系、流量工程)来选择最佳路径。
- TCP连接:BGP使用TCP作为传输层协议(端口号179),保证路由更新的可靠性。
- 增量更新:只发送发生变化的路由信息,而不是周期性发送整个路由表。
6. 典型例题
例题 1: CIDR 路由聚合
Problem: 某路由器的路由表中有以下4个目的网络地址:
202.112.16.0/24202.112.17.0/24202.112.18.0/24202.112.19.0/24
请将这4个网络地址聚合成一个超网,并写出聚合后的目标网络地址(斜线记法),以及二进制推导过程。
Solution :
首先将这四个IP地址的第三个字节转换为二进制,因为它们的前两个字节 202.112 是相同的,且前缀都是 /24,说明网络号的前24位是相同的,变化发生在第3个字节。
202.112.16.0/24->...00010000.0202.112.17.0/24->...00010001.0202.112.18.0/24->...00010010.0202.112.19.0/24->...00010011.0
现在我们只关注第三个字节的二进制表示:
16 的二进制是 00010000
17 的二进制是 00010001
18 的二进制是 00010010
19 的二进制是 00010011
找出这四个二进制数的最长公共前缀:
00010000
00010001
00010010
00010011
共同前缀是 000100 (前6位)。
所以,聚合后的网络前缀是 24 + 6 = 30 位。
聚合后的网络地址是:202.112. (00010000) .0,即 202.112.16.0。
聚合后的目标网络地址为:202.112.16.0/30。
Analysis :
路由聚合(或称构造超网)的目的是通过合并多个连续的、具有共同前缀的网络地址,来减少路由表中的条目数量。这有助于提高路由查找效率,并减小路由表的存储需求。
在这个例子中,我们通过比较四个网络地址的二进制表示,找到了它们的最长公共前缀。这个公共前缀的长度就是聚合后超网的网络前缀长度。聚合后的网络地址就是以这个公共前缀开头,后面全部补0的地址。
202.112.16.0/30 这个超网包含了从 202.112.16.0 到 202.112.19.255 的所有IP地址。
例题 2: IP 分片计算
Problem: 一个IP数据报的总长度为4000字节,IP首部长度为20字节。该数据报需要通过一个MTU为1500字节的网络。请计算分片后的各个数据报的:
- 总长度 (Total Length)
- 标识 (Identification)
- 标志 (Flags) 中的 MF 位
- 片偏移 (Fragment Offset)
Solution:
原始数据报信息:
- 总长度 = 4000 字节
- 首部长度 = 20 字节
- 数据部分长度 = 4000 - 20 = 3980 字节
- MTU = 1500 字节
每个分片的最大数据部分长度 = MTU - 首部长度 = 1500 - 20 = 1480 字节。
由于片偏移的单位是8字节,所以每个分片的数据部分长度必须是8的倍数。
1480÷8=1851480 \div 8 = 1851480÷8=185,所以1480字节是8的倍数,符合要求。
现在计算分片:
分片 1:
- 数据部分长度 = 1480 字节
- 总长度 = 首部长度 + 数据部分长度 = 20 + 1480 = 1500 字节
- 标识 = 假设原始数据报的标识为
X(所有分片标识相同) - MF = 1 (因为后面还有分片)
- 片偏移 = 0 (这是第一个分片,偏移量为0)
分片 2:
- 原始数据报已发送数据:1480 字节
- 剩余数据:3980 - 1480 = 2500 字节
- 数据部分长度 = 1480 字节
- 总长度 = 20 + 1480 = 1500 字节
- 标识 =
X - MF = 1 (因为后面还有分片)
- 片偏移 = 1480 / 8 = 185
分片 3:
- 原始数据报已发送数据:1480 + 1480 = 2960 字节
- 剩余数据:3980 - 2960 = 1020 字节
- 数据部分长度 = 1020 字节 (这是最后一个分片,不需要是8的倍数,但通常为了简化重组,也会尽量保持是8的倍数,这里1020是8的倍数 1020÷8=127.51020 \div 8 = 127.51020÷8=127.5 错误,1020不是8的倍数。这里需要注意,除了最后一个分片,其他分片的数据部分长度必须是8的倍数。最后一个分片可以不是8的倍数。)
- 修正:1020不是8的倍数。这意味着在分片2之后,如果剩余1020字节,那么分片3的数据部分就是1020字节。
- 总长度 = 20 + 1020 = 1040 字节
- 标识 =
X - MF = 0 (这是最后一个分片)
- 片偏移 = 2960 / 8 = 370
最终结果汇总 (假设原始标识为 12345):
| 分片序号 | 总长度 (字节) | 标识 | MF | 片偏移 (单位8字节) | 数据部分长度 (字节) |
|---|---|---|---|---|---|
| 1 | 1500 | 12345 | 1 | 0 | 1480 |
| 2 | 1500 | 12345 | 1 | 185 | 1480 |
| 3 | 1040 | 12345 | 0 | 370 | 1020 |
Analysis :
IP分片是网络层处理不同MTU链路的一种机制。理解分片的关键在于:
- 数据部分长度 :每个分片能携带的最大数据量是
MTU - IP首部长度。 - 8字节对齐 :除了最后一个分片,所有分片的数据部分长度必须是8字节的整数倍,这是因为片偏移字段的单位是8字节。如果计算出的最大数据部分长度不是8的倍数,需要向下取整到最近的8的倍数。
- 在本例中,
1480是8的倍数,所以不需要调整。
- 在本例中,
- MF标志位:用于指示是否还有后续分片。
- 片偏移:表示当前分片的数据在原始数据报数据部分的起始位置,以8字节为单位。
7. 易错点分析
- 子网划分中"全0"和"全1"主机号的扣除 (2h−22^h - 22h−2) :
- 在传统的分类IP地址和子网划分中,一个子网内的主机号全为0的地址代表网络地址 ,主机号全为1的地址代表广播地址 。这两个地址通常不能分配给主机使用,因此一个子网可用的主机地址数量是 2h−22^h - 22h−2 (其中 hhh 是主机号的位数)。
- 易错点 :在某些特殊情况下(例如,点对点链路),这两个地址也可以被使用。但在大多数考试和实际应用中,如果未明确说明,通常默认扣除。CIDR环境下,如果子网掩码是
/31(点对点链路) 或/32(单个主机地址),则没有网络地址和广播地址的概念,不需要扣除。
- 片偏移量的单位是 8 字节 (IP 数据报首部中该字段值 = 实际偏移字节 / 8) :
- 这是最常见的错误之一。片偏移字段的值不是实际的字节偏移量,而是实际偏移量除以8的结果。这意味着所有分片的数据部分(除了最后一个)必须是8字节的整数倍。
- 路由器在转发时 TTL 减 1,首部校验和需重新计算,但源/目的 IP 不变 (除非 NAT) :
- TTL:每经过一个路由器,TTL值必须减1。
- 首部校验和:由于TTL字段改变,IP首部内容发生变化,因此路由器必须重新计算并更新首部校验和。
- 源/目的IP地址:通常情况下,路由器在转发IP数据报时,不会改变源IP地址和目的IP地址。
- 例外 :如果网络中部署了NAT (网络地址转换) 设备,它会修改IP数据报的源IP地址(出站)或目的IP地址(入站),并可能修改端口号。这是唯一一种路由器(或NAT设备)会改变IP地址的情况。