网络层
网络层
IP
在现实生活中,我们通过“国家‑省份‑城市‑街道‑小区‑楼栋‑门号”等层级信息来定位一个具体地点,例如 中国‑北京市‑海淀区‑某街道‑某小区‑某栋‑某户。
在计算机网络里,定位一台主机同样需要使用唯一的地址,这个地址就是 IP 地址。IP(Internet Protocol)直译为“互联网协议”,它既提供了主机的标识,又规定了数据在网络中的传输方式。
仅有地址并不能保证数据能够顺利从源端到达目的端。互联网是一张由无数路由器、交换机等网络设备相互连接而成的全球性网络。从 一个机器 到 另一个机器 的通信,往往要经过多级转发。如何在众多可能的路径中找到一条通向正确目的地的路线,就需要 IP 协议 与路由协议共同配合完成。后续章节我们会逐步剖析这一过程的细节。
目前 IP 协议有两个版本:
- IPv4(Internet Protocol Version 4)
- IPv6(Internet Protocol Version 6)
本文的重点在于深入理解 IPv4 的工作原理和细节。
一、IPv4地址格式
IPv4 地址由 4 个字节(即 32 位)构成,例如:11000000.10101000.00000100.00000010 就是一个典型的 IPv4 地址的二进制形式。
1.1 点分十进制
由于二进制表示不便于人类阅读,IPv4 通常采用 点分十进制 的方式进行表示。
在点分十进制中,每个字节用十进制数表示,并以点号分隔 4 个字节。例如,上述二进制地址对应的点分十进制形式为 192.168.4.2。

1.2 网络号与主机号
IP 地址的设计本质上是为了在互联网中唯一标识一台设备,因此通常被划分为两个部分:
- 网络号(Network ID):用于标识设备所在的网络。
- 主机号(Host ID):用于标识该网络中的具体主机。

网络号负责确定目标网络,主机号用于在该网络中定位到具体设备。
1.3 特殊地址
在 IP 地址的划分中,有些 主机号 是保留的,不能被用于分配给普通设备:
- 主机号全为 0:表示网络本身,不能用于主机。
- 主机号全为 1:表示该网络中的广播地址,用于向网络内所有主机发送信息。
此外,还有以下两个特殊的全局地址:
0.0.0.0:表示“本机”,通常用于设备尚未获得 IP 地址时的占位。255.255.255.255:称为“本地广播地址”,用于向本地网络中的所有设备广播数据。
二、IPv4首部
IP 协议位于 OSI 7 层模型的网络层,其承载上层(传输层)的数据,对其进行 封装,然后传递给下层(数据链路层)进行进一步的处理。
封装的具体过程就是为 传输层的数据 加上 IP 协议的首部的二进制表示,IPv4 的首部的 逻辑格式 如下图所示,其中包含多个字段,长度通常为 20 个字节。

这一小节简单介绍各个字段,帮助大家建立一个粗略的了解,部分字段的细节我会在后面几个小节详解说明。
- 版本(Version):
- 4 位字段,用于指定 IP 协议版本,IPv4 的版本为 4。
- 头部长度(Header Length):
- 4 位字段,用于指示 IPv4 首部的长度,以 4 字节为单位。由于 IPv4 首部的固定部分长度为 20 字节,因此这个字段的值通常是 5(即该字段二进制表示为
0101,5 * 4(4 字节为单位) = 20,最终表示的长度为 20)。
- 4 位字段,用于指示 IPv4 首部的长度,以 4 字节为单位。由于 IPv4 首部的固定部分长度为 20 字节,因此这个字段的值通常是 5(即该字段二进制表示为
- 服务类型(Type of Service):
- 8 位字段,用于指定数据报的服务质量(Quality of Service,QoS),包括优先级、延迟、吞吐量等。
- 总长度(Total Length):
- 16 位字段,指定整个 IPv4 数据报(包括首部和数据部分)的总长度,以字节为单位。最大值为 65535 字节。
- 标识(Identification):
- 16 位字段,用于唯一标识数据报。通常在数据报分片时用于重新组装数据报。
- 标志(Flags):3 位字段,包括以下标志:
- 最左边位:保留为 0,未使用。
- DF(Don’t Fragment):
- 如果设置为 1,表示数据报不允许分片。当路由器发现需要分片才能转发时,则路由器会丢弃该数据报,并发送一个 ICMP 错误消息(“Fragmentation Needed and DF Set”)返回给发送方,告知需要分片但不允许分片。
- 如果设置为 0,标识允许分片,路由器在传输过程中如果需要,可以将数据报分片,以确保数据报能够通过传输链路。
- MF(More Fragments):
- 如果设置为 1,还有更多的分片;
- 如果设置为 0,表示当前分片是对应数据报的最后一个分片,或者表示当前数据报根本没有分片。
- 片偏移(Fragment Offset):
- 13 位字段,用于指示数据报分片的位置。以 8 字节为单位,表示相对于原始数据报的偏移量。
- 生存时间(Time to Live,TTL):
- 8 位字段,指定数据报在网络中可存在的最大时间(跳数),每经过一个路由器,TTL 减 1,当 TTL 减至 0 时,数据报被丢弃。
- 协议(Protocol):
- 8 位字段,指定上层协议,表示数据报的载荷是由哪个协议处理。例如,6 表示 TCP,17 表示 UDP。
- 首部校验和(Header Checksum):
- 16 位字段,用于检测 IPv4 首部的错误。
- 源 IP 地址(Source IP Address):
- 32 位字段,指定数据报的发送者的 IP 地址。
- 目标 IP 地址(Destination IP Address):
- 32 位字段,指定数据报的接收者的 IP 地址。
- 选项(Options):
- 可选字段,长度可变,用于包含一些额外的信息。IPv4 首部中的选项字段通常很少被使用。
2.1 分片和相关字段
简而言之,IP 数据报的最大长度为 65535 字节,这是因为其“总长度”字段占 16 位,所能表示的最大无符号整数为 65535。然而,数据链路层(如以太网)的 MTU(最大传输单元)往往远小于该值,例如以太网的 MTU 通常为 1500 字节。
因此,当 IP 数据报长度超过底层链路的 MTU 时,就需要将其拆分成多个更小的部分进行传输,这一过程称为 IP 分片(IP Fragmentation)。关于分片的详细内容可参考:IP 数据报分片。

在进行分片时,会引出两个关键问题:
- 如何区分不同数据报的分片?
比如,假设 packet A 被分片为 A1、A2、A3,而 packet B 被分片为 B1、B2,我们如何知道 A1 属于 packet A 而不是 packet B?
- 如何将同一数据报的多个分片重新组合为原始数据?
为了解决这些问题,IP 协议在首部中设计了以下两个重要字段:
- Identification(标识符):为每一个 IP 数据报分配一个唯一的标识值,使接收方能够识别属于同一个数据报的所有分片。
- Fragment Offset(分片偏移量):指明当前分片在原始数据报中的位置,单位为 8 字节(即偏移值乘以 8 即为实际字节偏移量),用于在接收端正确地重组数据报。
通过这两个字段,接收方可以准确地将来自不同数据报的分片加以区分,并将同一数据报的所有分片按照正确顺序重新组装起来,恢复出原始的 IP 数据报。
2.2 差错校验字段
IP 首部的 checksum 为 IP 协议的差错校验字段,用于检验 IP 首部在传输的过程中是否发生错误,接下来我会告诉你如何通过该字段进行校验。
当一个 IP 数据报被创建时,发送端设备会计算 IP 头部的校验和,并填充 IP 数据报中的 checksum 字段。
当 路由器 和 目标机器 在收到数据报时会重新计算首部校验和,并将计算得到的校验和和接收到的 IP 数据报中的 checksum 进行比较。如果 不一致 的话,则说明 IP 数据报中的某些数据在传输的过程中出现变动,就需要 丢弃 该 IP 数据报。

需要注意的是,当 IP 数据报 经过某个路由器时,路由器需要 重新计算 并填充 checksum 字段,因为 IP 数据报中的某些字段在经过路由器时会被改变(比如 TTL 会减 1 等)。
一般而言,对于校验和,了解到以上程度即可,如果你好奇校验和究竟是如何计算且学有余力的话,可以查看 checksum 校验和计算方式。
2.3 TTL
TTL(Time To Live)用于控制 IP 分组的 生命周期,发送方在发送 IP 分组时会设定一个 TTL 值,这个值是不固定的,但是一般是 32、64、128 或 255 这四个值中的一个。
当 IP 分组经过 路由器 时,路由器会自动 IP 分组中的 TTL 值减 1,路由器 发现其 TTL = 0,则路由器会 丢弃 该 IP 分组,并且返回一个 ICMP “Time Exceed” 消息。

三、IPv4分类寻址
在互联网早期,IP 地址采用了 分类寻址(Classful Addressing)。具体而言,就是根据 IP 地址的 网络号的前几位 将地址分为 A、B、C、D、E 五类。

在分类寻址中,如果给定一个 IP 地址,我们可以马上判断出该 IP 地址属于哪一类网络(根据前几位的值),以及该 IP 地址的 网络编号 和 主机编号 是多少。
| 类别 | 起始二进制 | 起始地址 | 结束地址 | 默认子网掩码 | 网络号长度 | 主机号长度 | 用途 |
|---|---|---|---|---|---|---|---|
| A 类 | 0xxxxxxx | 1.0.0.0 | 126.255.255.255 | 255.0.0.0 | 8 位 | 24 位 | 大型网络 |
| B 类 | 10xxxxxx | 128.0.0.0 | 191.255.255.255 | 255.255.0.0 | 16 位 | 16 位 | 中型网络 |
| C 类 | 110xxxxx | 192.0.0.0 | 223.255.255.255 | 255.255.255.0 | 24 位 | 8 位 | 小型网络 |
| D 类 | 1110xxxx | 224.0.0.0 | 239.255.255.255 | — | — | — | 多播(Multicast) |
| E 类 | 1111xxxx | 240.0.0.0 | 255.255.255.255 | — | — | — | 保留(Reserved) |
分类寻址 曾是 IPv4 设计时的核心思路。它通过把全部 32 位地址空间划分为五大类,既简化了路由器的实现,也方便了地址的分配。 在互联网的萌芽阶段,这种“一刀切”的方案效率极高,完全能够满足当时少量主机的需求。
然而,设计者没有预见到随后出现的 设备爆炸式增长:每台联网设备都需要一个唯一的 IP 地址。IPv4 的 32 位地址空间(约 43 亿 个地址)在全球范围内迅速被耗尽,原本简单的分类方式反而成为制约网络扩展的瓶颈。
具体表现为:
- 地址空间浪费
- B 类地址提供 65 534 个主机位。如果一个组织只有几千台主机,其余地址就被闲置。
- C 类地址只能容纳 254 台主机。当组织的需求超过这一规模,却又不想使用一个庞大的 B 类地址块时,就会陷入分配困难。
- 分配不灵活
- 分类寻址的层次结构固定,无法根据实际需求进行细粒度的划分,导致大块地址被“硬切”,小块需求又常常得不到满足。

四、CIDR
无类别域间路由(CIDR,classless inter-domain routing)的主要目标是克服传统的基于类别的 IP 地址划分方法,使网络资源的分配更加灵活和高效。
在 分类寻址 中,每一类网络的网络编号的长度是固定的,在 CIDR 中,网络编号的长度是动态的,可以根据需求定制。其中网络编号的长度叫做 前缀长度(Prefix Length),前缀长度通常以 IP 地址 斜杠后跟一个数字表示,例如,192.168.1.13/24 表示前 24 位 是网络部分,剩下的位数用于主机部分。
4.1 子网掩码
为了实现 CIDR,需要引入 子网掩码(subnet mask)这个概念,如果一个 CIDR 网络的 前缀长度 是 n 位的话,那么其子网掩码的二进制表示就是 111 (n 个 1) ... 0000 (32-n 个 0)。
子网掩码的作用是用来 区分网络号和主机号:
- 网络号部分:与子网掩码中 1 对应的比特位
- 主机号部分:与子网掩码中 0 对应的比特位
下表给出了 CIDR 中不同前缀长度对应的子网掩码:

五、子网划分
子网划分(Subnetting) 是将一个较大的 IP 网络进一步划分为多个更小的网络(子网)的过程。这样做的目的包括:
- 更高效地利用 IP 地址资源
- 减少广播范围,降低网络拥塞
- 优化路由效率
那么子网划分如何实现呢?在 CIDR 中,IP 地址由 网络部分 + 主机部分 组成。子网划分的 关键思想 是:从主机部分 “借用” 若干位,加入到网络部分,用来表示新的子网:

在子网划分过程中,子网掩码(Subnet Mask)用于区分 IP 地址的网络部分和主机部分。常见的做法是通过调整子网掩码的长度,将更多位分配给网络部分,减少主机部分的位数。
子网划分包含 变长子网划分(Variable Length Subnet Masking, VLSM) 和 固定长度子网划分(Fixed Length Subnet Mask, FLSM) 两种方式。
5.1 变长子网划分
VLSM(Variable Length Subnet Masking)使用不同长度的掩码来划分 IP 地址空间,从而根据实际需求为各个子网分配不同数量的地址。
假设你有一个 C 类 网络192.168.1.0/24,需要划分给四个部门,其中 A 部门需要 100 个 IP 地址,B 部门需要 50 个 IP 地址,C 部门只需要 25 个 IP 地址,D 部门需要 14 个 IP。
使用 VLSM,你可能会这样划分:
| 部门名称 | 子网地址 | 子网掩码 | 地址个数 | 可用 IP 范围 |
|---|---|---|---|---|
| A 部门 | 192.168.1.0/25 | 255.255.255.128 | 128 | 192.168.1.1 ~ 192.168.1.126 |
| B 部门 | 192.168.1.128/26 | 255.255.255.192 | 64 | 192.168.1.129 ~ 192.168.1.190 |
| C 部门 | 192.168.1.192/27 | 255.255.255.224 | 32 | 192.168.1.193 ~ 192.168.1.222 |
| D 部门 | 192.168.1.224/27 | 255.255.255.240 | 32 | 192.168.1.225 ~ 192.168.1.254 |

- 每向 下一层表示子网掩码加 1 位,即 地址空间减半。
- 每个节点的 “0” 代表当前块的前半段,“1” 代表后半段。
- 从根节点 /24 开始,依次为 A、B、C、D 部门分配子网。
- 每个子网 最终落在一个叶子节点,子网大小正好满足其所需地址数。

5.2 定长子网划分
FLSM(Fixed Length Subnet Masking)使用相同长度的子网掩码来划分网络。这种方法在划分时更为简单和直接,但通常不如 VLSM 灵活高效,FLSM 具备如下特点:
- 每个子网使用相同的子网掩码
- 每个子网拥有相同数量的 IP 地址
假设你有一个 C 类 网络192.168.1.0/24,需要划分给 A、B、C、D 四个部门,可以这样划分:
| 部门名称 | 子网地址 | 子网掩码 | 地址个数 | 可用 IP 范围 |
|---|---|---|---|---|
| A 部门 | 192.168.1.0/26 | 255.255.255.192 | 64 | 192.168.1.1 ~ 192.168.1.62 |
| B 部门 | 192.168.1.64/26 | 255.255.255.192 | 64 | 192.168.1.65 ~ 192.168.1.126 |
| C 部门 | 192.168.1.128/26 | 255.255.255.192 | 64 | 192.168.1.129 ~ 192.168.1.190 |
| D 部门 | 192.168.1.192/26 | 255.255.255.192 | 64 | 192.168.1.193 ~ 192.168.1.254 |
与 VLSM 类似,FLSM(Fixed Length Subnet Masking)也可以通过二叉树结构进行子网划分:

不同之处在于,FLSM 中所有子网大小相同,因此划分过程会持续到每个子网达到相同掩码长度为止。最终,每个子网都对应于二叉树的 最底层叶子结点。
六、子网聚合
子网聚合(Route Aggregation 或 Supernetting)是将多个相邻的子网 合并为一个更大的网络 的过程。这一技术通常用于 路由汇总,以减少路由表项数量,提高路由器的处理效率。
例如,当一个路由器连接了多个相邻子网:
192.168.0.0/23192.168.2.0/24192.168.3.0/24
它可以将这些子网聚合成一个更大的网络:192.168.0.0/22
进行子网聚合需要满足以下的 聚合条件:
- 地址对齐:聚合后的网络地址必须是其新掩码下的网络起始地址(低位必须为 0);
- 掩码缩短:聚合的结果一定是更短的前缀,比如从 /24 聚合成 /22。
子网聚合的过程也可以根据二叉树来理解:子网划分是将一个中间结点(的网络)拆分为若干个叶子结点(的网络),子网聚合就是将若干个叶子结点合并为一个中间结点。


七、IP数据报分片
IP 数据报分片是一种网络通信中的过程,它允许较大的 IP 数据报在经过一些网络链路时被分割成多个较小的片段,以适应网络链路的 最大传输单元(MTU,Maximum Transmission Unit)。
MTU 是指网络链路能够传输的最大数据报大小,不同网络链路的 MTU 大小可能不同。当一个 IP 数据报的大小超过了某个链路的 MTU 时,它就需要被分片,以确保可以顺利传输。

以下是 IP 数据报分片的基本过程:
- 发送端分片:
- 发送端的主机首先创建一个 IP 数据报,并将它发送到目标主机。这个数据报的大小可能大于某些链路的 MTU。
- 路由器检查 MTU:
- 当数据报经过 路由器 时,路由器 会检查下一个链路的 MTU 大小。它会比较数据报的大小和链路 MTU。
- 如果数据报的大小 小于或等于 链路 MTU,那么数据报会继续传输,无需分片。
- 如果数据报的大小 大于 链路 MTU,那么 路由器 需要将数据报分片为多个较小的片段,以适应链路 MTU。
- 数据报分片:
- 当数据报需要分片时,路由器 会将数据报拆分成多个片段。每个片段都会包含原始数据报的一部分数据。
- 每个片段的头部将保留原始数据报的首部,但有一个特殊的标志(Fragment Offset)来指示它在原始数据报中的位置。
- 路由器 将这些片段分别发送到下一个链路。
- 目标端重组:
- 当片段到达目标主机时,目标主机将重新组装这些片段以恢复原始的数据报。
- 目标主机使用每个片段的标志和偏移量信息来确定如何正确地重组数据报。

以上图为例,假设我们有一个 IP 数据报,其总长度为 10000 字节,它需要通过两个链路,两个链路的 MTU 分别为 4000 和 2500 字节。当 IP 数据报经过第一个链路时,它需要被拆分为 3 个分片以通过链路:
| 数据报 | 首部长度 | 数据长度 | 总长度 | 偏移量 | 片偏移字段 | MF 标志位 | ID 字段 |
|---|---|---|---|---|---|---|---|
| 原始 IP 数据报 | 20 | 10000 | 10020 | - | 0 | 0 | 578 |
| 分片 1 | 20 | 3976 | 3996 | 0 | 0 | 1 | 578 |
| 分片 2 | 20 | 3976 | 3996 | 3976 | 497 | 1 | 578 |
| 分片 3 | 20 | 2048 | 2068 | 7952 | 994 | 0 | 578 |

分片经过第二个链路时也会根据 MTU 进行拆分,以分片 1 为例进行说明:
| 数据报 | 首部长度 | 数据长度 | 总长度 | 实际偏移量 | 片偏移字段 | MF 标志位 | ID 字段 |
|---|---|---|---|---|---|---|---|
| 分片 1 | 20 | 3976 | 3996 | 0 | 0 | 1 | 578 |
| 分片 1.1 | 20 | 2480 | 2500 | 0 | 0 | 1 | 578 |
| 分片 1.2 | 20 | 1496 | 1516 | 2480 | 310 | 0 | 578 |
八、IP组播
IP 组播(IP Multicast)是一种 IP 通信模式,允许一台发送器将数据报发送到多个接收器,而不是传统的单播(点对点通信)模式。组播是一种多对多的通信方式,非常适合用于广播、多媒体流传输和分布式应用中。

以下是 IP 组播的一些关键特点和概念:
- 组播组:IP 组播通信由一个或多个组播组组成,每个组都有一个唯一的组播组地址。组播组地址属于 IPv4 地址范围的特殊区域,通常以 224.0.0.0 到 239.255.255.255(D 类地址) 为范围。多个接收器可以订阅同一个组播组。
- 发送器:发送器是将数据报发送到组播组的设备。发送器只需发送一次数据报,然后由网络基础设施复制并传送给订阅了该组播组的接收器。
- 接收器:接收器是订阅了特定组播组的设备。它们希望接收组播组中的数据。接收器可以是单个主机、路由器或多个主机。
- IGMP(Internet Group Management Protocol):IGMP 是用于管理 IP 组播成员的协议。它允许主机通知路由器它们希望加入或离开特定的组播组。路由器使用 IGMP 来了解哪些主机希望接收特定组播组的数据。
- 组播路由:组播路由器是网络中的设备,负责将组播数据报从发送器传送到接收器。组播路由器根据 IGMP 报文和组播组地址表,将数据报仅传送到订阅了该组播组的网络分支。
- 组播范围:IP 组播地址可以分为不同的范围,如永久组播地址、临时组播地址和本地链路组播地址,以满足不同的需求和使用情况。
九、IPv6
IPv4 协议于 20 世纪 70 年代设计,经过互联网几十年的快速发展,至 2011 年 2 月,IPv4 地址已完全耗尽。为应对 “IP 地址耗尽” 问题,主要采取了以下三种措施:
- 采用 CIDR:通过更灵活的地址分配方式,提高 IPv4 地址的使用效率。
- 使用 NAT:通过允许多个设备共享同一公网 IP 地址,有效节省全球 IP 地址资源。
- 推广新一代 IPv6 协议:IPv6 拥有更大的地址空间,从根本上解决 IP 地址短缺问题。
前两种方法仅能延缓 IPv4 地址耗尽的进程,而只有 IPv6 的广泛应用才能彻底解决这一问题。
9.1 特点

9.2 首部

IPv6 首部包含 8 个字段,总长度固定为 40 字节。字段如下:
- 版本(Version):表示协议版本,对于 IPv6,该字段值为 6。用于标识数据包的协议类型,确保接收端正确解析。
- 流量类别(Traffic Class):用于服务质量(QoS)管理,标记数据包的优先级或服务类型(如实时流量或低优先级流量)。
- 流标签(Flow Label):标识属于同一数据流的数据包,便于路由器进行特殊处理(如保持数据包顺序或优先级)。
- 有效载荷长度(Packet Length):表示 IPv6 数据包中除首部外的有效载荷长度(单位:字节),包括扩展首部和上层数据。
- 下一首部(Next Header):指明紧跟 IPv6 首部之后的首部类型(如 TCP、UDP 或扩展首部),类似于 IPv4 的“协议”字段。
- 跳数限制(Hop Limit):表示数据包在网络中可经过的最大跳数,每经过一个路由器减 1,若减至 0 则丢弃。
- 源地址(Source Address):标识数据包的发送方地址。
- 目标地址(Destination Address):标识数据包的目标接收方地址。
9.3 地址
IPv6 地址使用 128 位,通常以冒号分隔的 32 位十六进制数 表示,例如:2001:0db8:85a3:0000:0000:8a2e:0370:7334。
IPv6 地址在表示时支持 缩写规则 以简化书写,具体如下:
- 省略前导零:对于每个 16 位 域(4 个十六进制字符),可以省略开头的零,但每个域必须至少保留一个数字。例如,地址
4BF5:0000:0000:BA5F:039A:000A:2176可简化为4BF5:0:0:BA5F:39A:A:2176。 - 压缩连续全零域:当地址中存在连续的多个全零域(即
0000:0000:...),可用双冒号(::)代替这些域,进一步压缩地址。但双冒号在一个地址中只能使用一次,因为全零域的个数需根据地址的总域数(8 个域)推算。例如,上述地址可进一步缩写为4BF5::BA5F:39A:A:2176。
通过这些规则,IPv6 地址的表示更加简洁紧凑。
IPv6 数据报按照目的地址可以分为如下类型:
- 单播地址(Unicast Address):用于将数据报从一个源节点传输到一个目标节点。
- 多播地址(Multicast Address):用于将数据报传输到一组目标节点,而不是单个节点。
- 任播地址(Anycast Address):用于将数据报传输到一组目标节点中的最近者(最接近的一个)。
9.4 过渡方案
IPv4 到 IPv6 的过渡是一个复杂的过程,因为两种协议不直接兼容。以下是两种主要的过渡方法:
- 双栈技术:网络设备同时实现 IPv4 和 IPv6 两个协议栈,分别配置一个 IPv4 地址和一个 IPv6 地址,这样这台设备既能和 IPv4 网络通信,也能和 IPv6 网络通信。
- 双协议栈主机使用 DNS 来获取目标主机使用的 IP 地址,根据其类型使用 IPv4 或 IPv6 进行通信。
- 隧道技术:是指在 IPv6 数据报要进入 IPv4 网络时,把整个 IPv6 数据报封装成 IPv4 数据报的数据部分,使原来的 IPv6 数据报就好像在 IPv4 网络的隧道中传输。当 IPv4 数据报离开 IPv4 网络时,再将其数据部分交给主机的 IPv6 协议。
十、移动IP
移动 IP(Mobile IP) 是一种网络协议,用于实现移动设备在不同网络之间切换时,仍能够保持连接并无缝通信。移动 IP 的主要目标是支持移动性,允许移动设备在移动时保持与互联网或企业网络的连接。
通信过程:
- 移动节点在家庭网络中连接,并分配了家庭网络的永久 IP 地址,建立了通信会话。
- 当移动节点决定移动到外部网络时,它会通知家庭网络的 移动 IP 服务节点,告知其即将离开。
- 家庭网络的 移动 IP 服务节点会分配一个临时 IP 地址,并记录移动节点的当前位置。
- 移动节点连接到外部网络,使用临时 IP 地址与外部网络中的其他设备通信。
- 当其他设备要与移动节点通信时,数据报被发送到移动节点的临时 IP 地址,然后到达外部网络。
- 外部网络的 移动 IP 服务节点接收到数据报后,将数据报转发到移动节点的临时 IP 地址。
- 移动节点接收到数据报后,可以回复或继续与外部网络中的其他设备通信。
- 如果移动节点决定返回家庭网络,它可以通知外部网络的 移动 IP 服务节点,并断开与外部网络的连接。
- 移动节点返回家庭网络后,通信会话继续,并且移动节点将继续使用家庭网络的永久 IP 地址。
ICMP
ICMP(Internet Control Message Protocol)是一个 网络层协议 用于在 IP 主机和路由器之间发送 控制消息。ICMP 是 Internet 协议套件的 重要组成部分,它主要用于 诊断 和 报告错误 和某些特定条件。
一、首部

- 类型 (Type):8位
- 用于指定 ICMP 消息 的类型。
- 例如,
Echo Request的类型为8,Echo Reply的类型为0。
- 代码 (Code):8位
- 为更进一步 细分 某个特定类型的 ICMP 消息而设置。
- 例如,对于 “目的地不可达”(
Destination Unreachable)类型的消息,代码可以用来指定具体的不可达原因,如网络不可达、主机不可达等。
- 检验和 (Checksum):16位
- 用于验证 ICMP 消息在传输过程中没有被损坏。这个检验和涵盖了整个 ICMP 消息。
- 其它字段
- 这些字段的内容取决于 ICMP 消息 的 类型 和 代码。
- 例如,对于
Echo Request和Echo Reply消息,接下来的字段包括一个标识符(Identifier)和一个序列号(Sequence Number)。
二、消息类型
ICMP 的消息类型可以分为 差错报文 和 查询报文 这两大类型:
- 差错报文:用于 报告 网络通信过程中出现的各种 错误 。
- 查询报文:用于 诊断 或网络信息查询,主要用于网络测试和管理 。
当然了,这里不需要背,了解消息类型的含义即可,比方说给你一个消息类型 源点抑制,你能知道它是干嘛的就行。
2.1 差错报文
ICMP 的 差错报文 分为五大类型:
- 终点不可达(Destination Unreachable)
- 当数据不能被传送到目的地时,发送此消息。
- 下面是一些常见的“不可达”子类型:
Network Unreachable:无法到达目标网络。Host Unreachable:无法到达目标主机。Protocol Unreachable:目标网络不支持所请求的协议。Port Unreachable:目标主机上的特定端口不可用。Fragmentation Needed and Don't Fragment was Set:数据包太大,需要分片,但数据包的“不分片”标志已设置。Source Route Failed:源路由指定的路径失败。Network Unknown:目标网络未知。Host Unknown:目标主机未知。
- 源点抑制(Source Quench)
- 网络中出现拥塞,请发送主机放慢发送数据包的速度。
- 路由重定向(Redirect)
- 告诉发送主机存在更好的路由。
- 超时(Time Exceeded)
- 当数据包在网络中传输的时间太长或超过了其TTL(生存时间)时发送。有两种主要的子类型:
TTL Exceeded in Transit:数据包在传输过程中TTL达到零。Fragment Reassembly Time Exceeded:分片重新组装超时。
- 当数据包在网络中传输的时间太长或超过了其TTL(生存时间)时发送。有两种主要的子类型:
- 参数错误(Parameter Problem)
- 当
IP头包含错误或不可识别的信息时,发送此消息。
- 当
2.2 查询报文
查询报文 包含以下类型:
- Echo Request 和 Echo Reply (ping)
Echo Request:通常被称为 ping 请求。用于测试目的地是否可达。Echo Reply:通常被称为 ping 回应。是对Echo Request的回应。
- Timestamp Request and Timestamp Reply
- 用于报告当前的时间。
- Address Mask Request and Address Mask Reply
- 用于请求和响应子网地址掩码。
三、应用
这里需要了解基于 ICMP 协议 的两个 linux 程序,一个是 ping,大家应该都比较熟悉。另一个是 traceroute,用于寻找从起点到终点经过了哪些 IP 地址。
3.1 ping
Ping 是一个简单的工具,用于测试两台主机之间的 网络连接性,测量往返时延(RTT,Round-Trip Time),并检测是否有 数据包丢失。

ping 利用了 ICMP 中的 Echo Request/Reply 消息类型:
- 发送 ICMP Echo Request:Ping 工具向 目标主机 发送一个 ICMP Echo Request 消息。
- 接收 ICMP Echo Reply:如果 目标主机 可达且未被防火墙阻止,它会回复一个 ICMP Echo Reply 消息。
- 计算时延:Ping 记录发送和接收消息的时间差,计算 RTT。
- 统计 丢包率:通过发送多个 Echo Request,统计有多少消息未收到回复,计算 丢包率。
3.2 traceroute
Traceroute 用于跟踪数据包从源到目标的 路径,显示沿途经过的路由器(跳点)及其 延迟。

Traceroute 利用 ICMP 的 Time Exceeded 消息和 IP 数据包的 TTL(Time To Live) 字段:
- 逐步增加 TTL:
- Traceroute 发送一系列 UDP 数据包(或 ICMP Echo Request,取决于实现),从 TTL=1 开始,每次递增 1。每台路由器在转发数据包时将 TTL 减 1。当 TTL 减为 0 时,路由器丢弃数据包并返回一个 ICMP Time Exceeded 消息(类型 11,代码 0)。
- 记录跳点:
- Traceroute 记录发送 Time Exceeded 消息的路由器 IP 地址和响应时间。
- 重复此过程,直到数据包到达 目标主机(目标返回 ICMP Echo Reply 或 UDP 端口不可达消息)。
- 显示路径:
- Traceroute 将每跳的路由器 IP 和 延迟 显示出来,构成从源到目标的完整 路径。
DHCP
动态主机配置协议(DHCP)是一个网络管理协议,用于自动分配 IP 地址 和其他网络配置参数给网络设备,从而允许它们连接到 IP 网络。
当你连接到一个网络中时,不管是通过 无线网,还是在电脑上连接了 以太网线,你会发现无需任何配置,你自动获取了一个 IP 地址,并可以通过该 IP 地址进行网络通信。

DHCP 的工作流程通常包括以下四个步骤,这个过程也被称作 DORA 过程,即 Discover, Offer, Request, 和 Acknowledgment。
- Discover:
- 客户端通过网络 广播 一个 DHCP DISCOVER 消息,请求可用的网络配置信息。因为客户端还没有分配到 IP 地址,所以这个消息的 源 IP 地址 是 0.0.0.0,目的 IP 地址 是 255.255.255.255。
- Offer:
- 网络上的 DHCP 服务器接收到 DHCP DISCOVER 消息后,会向客户端发送一个 DHCP OFFER 消息。这个消息包含了一个提供给客户端的 IP 地址 和其他配置信息,如 子网掩码、DNS 服务器地址 和 IP 地址租用期。
- Request:
- 客户端可能会从多个 DHCP 服务器收到多个 DHCP OFFER 消息。客户端选择其中一个提议,并通过 广播 一个 DHCP REQUEST 消息来响应这个提议,通知网络中的所有 DHCP 服务器它接受了哪个 DHCP 服务器的提议。
- Acknowledgment:
- 提供所选 IP 地址的 DHCP 服务器收到 DHCP REQUEST 消息后,会发送一个 DHCP ACK 给客户端,确认IP 地址和配置信息的租约。如果由于某种原因导致该 IP 地址不再可用或者有其他问题,DHCP 服务器可能会发送一个 DHCP NAK。
ARP
一、概念
ARP(Address Resolution Protocol,地址解析协议) 是一种在 TCP/IP 网络 中使用的协议,用于将 IP 地址 转换为 物理硬件地址(例如,MAC 地址)。ARP 的主要目的是确定要通过网络传输数据的目标设备的 物理硬件地址,以便将数据帧正确地传送到目标设备。

二、流程
以上图为例,主机 10.1.1.2 用 ARP 协议查找主机 10.1.1.4 的 MAC 地址,其流程如下图所示

具体而言,一次 ARP 请求可以被拆分为 如下步骤:
- ARP 请求
当一台设备(我们称它为主机 A)需要发送数据包到同一局域网内的另一台设备(主机 B),但它只知道目标设备的 IP 地址 时,它会在本地网络上广播一个 ARP 请求。这个请求的语义大致是这样的:“我拥有 IP 地址 X.X.X.X 的设备,请告诉我你的物理 MAC 地址。”
ARP 请求的 目的 MAC 地址 为 ff-ff-ff-ff-ff-ff-ff-ff,源 MAC 地址 设置为自己的 MAC 地址。
- 网络上的广播
ARP 请求是一个 广播帧,它发送到本地网络上的所有设备。每一台设备都会收到这个请求,但只有 IP 地址匹配请求中 IP 地址的设备会回应这个请求。
- ARP 响应
当主机 B 收到这个 ARP 请求 后,它会识别出请求中的 IP 地址与自己的 IP 地址 相匹配,然后向主机 A 发送一个 ARP 响应。这个响应包含了主机 B 的 MAC 地址,并且这个响应是直接发送给主机 A 的,不是广播。
- 更新 ARP 缓存
主机 A 收到 ARP 响应 后,它会在自己的 ARP 缓存 表中更新这个信息,将主机 B 的 IP 地址 与其 MAC 地址 关联起来。ARP 缓存 表中的这些条目通常会在一段时间后过期,所以可能需要定期更新。
- 数据传输
主机 A 现在知道了主机 B 的 MAC 地址,它可以构建一个以太网帧,将数据包含在其中,并使用 B 的 MAC 地址 作为目的地址发送出去。
三、ARP缓存
所有主机都会维护一个 ARP 缓存,该缓存存储了网络上其他设备的 IP 地址 和 MAC 地址 的映射。 这减少了广播 ARP 请求 的需要,因为主机可以查看自己的缓存来找到之前解析过的地址。
以下是一个简化的 ARP 缓存 表格示例,展示了 IP 地址 与 MAC 地址 的映射关系:
| IP 地址 | MAC 地址 | 状态 | 接口 |
|---|---|---|---|
| 192.168.1.1 | 00:1A:2B:3C:4D:5E | 动态 | eth0 |
| 192.168.1.2 | 00:1A:2B:3C:4D:5F | 静态 | eth0 |
| 192.168.1.3 | 00:1A:2B:3C:4D:60 | 动态 | wlan0 |
| 192.168.1.4 | 00:1A:2B:3C:4D:61 | 动态 | eth0 |

路由算法
一、路由
这一节我们首先通过三个问题来认识什么是 路由,接下来再在此基础上介绍 路由协议。
什么是 路由?
在一个 IP 网络中,数据包要从一个设备发送到另一个设备,中间通常需要经过多个路由器的转发。每个路由器就像是一个“交通指挥员”,决定数据包该往哪个方向走。
例如,PC-1(IP 地址为 192.168.1.5)通过如下图所示的网络向 PC-2(IP 地址为 10.1.1.5)发送数据包。当路由器 R1 接收到这些数据包时,它必须知道如何到达目标子网 10.1.1.0/24,否则将丢弃这些数据包。

路由器 R2 知道如何到达 PC-2,因为它有一个接口位于子网 10.1.1.0/24,并在 路由表 中包含了一条直接连接路由。然而,默认情况下,路由器 R1 和 R3 不知道如何到达 10.1.1.0/24。网络管理员需要配置一条 静态路由,或者 R2 必须自动告知 R1 和 R3,它们可以将目的地为 10.1.1.0/24 的数据包发送到 R2,这种方式叫做 动态路由。
路由器 怎么知道往哪里转发?
路由器 内部有一个叫 路由表 的数据结构,里面记录了各种目的 IP 地址该怎么走。这个表告诉 路由器:当收到一个 IP Packet 时,应该把包发给哪个 下一跳(下一个路由器)。
路由表 如何建立?
路由表 主要包含两种建立方式:
- 静态路由(Static):人工手动配置,适合小型或稳定网络。
- 动态路由(Dynamic):通过 路由协议 自动学习和更新路由信息。

两个 路由表 建立方式各自适用于不同的场景:
| 特点 | 静态路由 | 动态路由 |
|---|---|---|
| 配置方式 | 手动配置 | 自动学习和适应 |
| 适用性 | 适用于小型网络或需要特定路由策略的情况 | 适用于大型、复杂的网络 |
| 稳定性 | 较稳定 | 可能更灵活,但较复杂 |
| 自动故障恢复 | 不支持自动故障恢复 | 支持自动故障检测和恢复 |
| 网络变化响应速度 | 静态,不会自动适应网络变化 | 自动适应网络变化,响应速度较快 |
| 管理复杂性 | 相对简单 | 较复杂,需要更多计算和资源 |
| 适用情况 | 较小规模的网络,特定路由策略需求 | 大型、复杂网络,需要动态适应 |
二、路由协议
路由协议 是一种 用于路由器之间交换网络路由信息的通信规则。它的主要作用是让路由器能够自动学习和维护到达各个目的网络的路径,从而实现数据包的正确转发。
路由协议 的主要作用有两个:
- 自动学习路由:当网络结构发生变化(如新增路由器、链路断开),路由协议 能自动更新 路由表,省去了手动配置的麻烦。
- 选择最佳路径:如果到同一个目标有多条路径,路由协议 能根据跳数、带宽、延迟等因素计算出最优路径,提高网络效率。
路由协议 分为不同种类,各自适用于不同场景,在介绍其分类前,首先要理解计算机网络中 自治系统 的概念。
2.1 自治系统
一个 自治系统(AS,Autonomous System)是由一个或多个网络组成的集合,这些网络 在统一的管理和策略控制下运行,并对外表现为一个单一的路由实体。

互联网是由无数个独立组织维护的网络组成的。每个组织内部的网络结构和路由策略不同,AS 的概念让每个组织可以作为一个独立的“区域”,既能自主控制路由,又能通过标准协议与外部沟通,保证整个互联网正常运作。
AS 通常由一个 ISP(互联网服务提供商)、大型企业、大学等拥有和运营。AS 之间通过外部 路由协议 互联,组成整个互联网。
2.2 分类
路由协议 根据其使用范围的不同,可以分为两大类:内部网关协议(IGP,Interior Gateway Protocol)和外部网关协议(EGP,Exterior Gateway Protocol)。

- 内部网关协议:在单个组织或 自治系统(AS)内部使用的路由协议,常见的 IGP 协议包括 RIP 和 OSPF。这些协议的主要作用是在一个组织的网络内部传播和更新路由信息,以实现高效的网络通信。
- 外部网关协议:用于在不同组织或不同 自治系统 之间交换路由信息。如今,唯一广泛使用的 EGP 协议是 BGP。BGP 的设计初衷是为了控制跨组织网络之间的路由信息传递,从而实现 自治系统 之间的互联和路径控制。

2.3 对比
重点掌握 RIP、OSPF、BGP 三个协议的区别,三者的对比如下表所示:
| 项目 | RIP | OSPF | BGP |
|---|---|---|---|
| 封装协议 | UDP | IP | TCP |
| 传播方式 | 逐跳 | 泛洪 | TCP 会话间传递 |
| 更新内容 | 全表,周期性 | 链路状态,事件驱动 | 路径属性,事件驱动 |
| 拓扑视图 | 无全局视图 | 拥有全图 | 无全图,仅路径属性 |
| 计算算法 | Bellman-Ford | Dijkstra | 策略驱动 |
| 收敛速度 | 慢 | 快 | 慢(但更稳定) |
| 带宽占用 | 高(周期发全表) | 中(仅更新变化) | 低(TCP 控制精细) |
| 扩展性 | 差 | 较好 | 极强 |
| 应用场景 | 小型网络 | 企业内部网络 | 运营商/跨 AS 互联 |
三、RIP
RIP(Routing Information Protocol,路由信息协议)是一种基于 距离向量 的路由协议,主要用于小型和中型网络中的 内部网关协议。
3.1 距离向量
一个典型的 距离向量(Distance Vector)可以表示为一个列表,其中每个条目包含以下信息:
- 目的地(To):目标网络或子网的地址。
- 跳数/度量值(Metric):从当前路由器到达目标网络的 代价,通常以跳数、延迟、带宽等度量标准表示。
- 下一跳(Next Hop):到达目标网络的 下一跳 路由器的地址。
下表是一个 距离向量示例:
| 目标网络 | 跳数 | 下一跳 |
|---|---|---|
| 192.168.1.0/24 | 0 | A |
| 192.168.2.0/24 | 1 | B |
| 192.168.3.0/24 | 1 | C |

3.2 距离向量算法
在 距离向量算法 中,通过 周期性地 与相邻路由器交换 距离向量 信息,每个路由器能够逐渐获得整个网络的拓扑信息,并更新其路由表以 选择最佳路径。
具体而言,工作流程如下:
- 初始化:每个路由器初始化其 距离向量,只包含自己直接连接的网络,距离设为 0。
- 周期性更新:每个路由器周期性地(30s)将其 距离向量 广播给所有相邻的 路由器。
- 接收和更新:每个路由器接收到相邻路由器的 距离向量 后,检查是否有新的或更短的路径。如果有,则更新自己的 距离向量 和 路由表。
- 收敛:经过多次交换和更新后,所有路由器的 距离向量 和 路由表 最终会收敛到最优路径。

3.3 最短路径计算方法

以上过程使用的算法名称叫做 Bellman-Ford 算法,是一种寻找单源最短路径的算法,单源最短路径的意思是从一个结点出发到达其他结点的最短路径。这个算法不会直接考察,了解这个算法的名称即可。
3.4 坏消息传得慢
假设一个路由器检测到它无法到达一个网络,这个信息可能需要比较长的时间才能被网络中的所有路由器感知到,这个问题也叫做 “计数到无穷”(count to infinity)问题。
举例说明:
对于以下拓扑结构:
A --- B --- C --- X🟢 正常情况是这样:
- C 广播:“我可以 1 跳到达 X”
- B 收到后更新:B 到 X 跳数 = 2(通过 C)
- A 收到后更新:A 到 X 跳数 = 3(通过 B)
🔴 C 和 X 之间的连接断开:
- C 发现 X 不可达,设置到 X 的跳数为 16(不可达)。
- 但 B 和 A 互相认为“另一个可能知道路径”。
- A 说:“我能通过 B 到 X”,B 也说:“我能通过 A 到 X”,
- 这个过程导致 跳数慢慢增加(4、5、6…),直到达到 16(不可达),才终止。
这也是 RIP 的 核心缺陷,主要由以下几个 RIP 的特性导致:
📌 1. RIP 是“距离向量协议*”,而不是“链路状态协议”:**
- RIP 每 30 秒定期广播自己的“路由表”(包含目标网络和跳数),而不是主动通告“链路断了”。
- 也就是说:C 不会特意说“我原本能到 X,现在不能了”,它只是不再提 X,或者说“到 X 是 16(不可达)”。
📌 2. *RIP* 更新是“基于 *下一跳*”的,不能判断环**
B 不知道“我从 A 学到的这条路径,实际上也是绕了一圈又回到我这里”,因为:
- B 从 A 收到:“X 的跳数是 4”
- B 就以为“哦,那我到 A 是 1 跳,所以我到 X 是 5 跳”
- B 没有办法判断这条路径是否环绕回了自己!
它只根据“谁告诉我能到哪里”来加一跳数做判断,而不会检查路径是否形成了环路。
四、OSPF
OSPF(Open Shortest Path First)是一种基于 链路状态 的 内部网关协议(IGP),广泛应用于中大型网络中。
4.1 链路状态
路由器通过 链路状态通告(LSA,Link State Advertisement)来了解其与邻居之间的链路状态。
在 RIP 路由算法中,路由器会定期将自己的 距离向量 发送给相邻的路由器。在 OSPF 中,也有类似的概念,不过这里传送的不是距离向量,而是 链路状态通告。
路由器将其自身的状态和与邻居的链路状态信息打包成 链路状态包(LSP,Link State Packet),并在网络中 洪泛传播(flooding)。
每个 LSA 专注于描述一种类型的链路状态或网络信息。一个 LSA 包含的信息通常是:
- 路由器与某一特定链路的连接状态(如 Router LSA)。
- 某个网络的状态和与其相连的路由器信息(如 Network LSA)。
- 区域间或外部路由信息(如 Summary LSA 和 AS External LSA)。
4.2 链路状态数据库
链路状态数据库(LSDB,Link State Database)是 OSPF 协议中的关键组件,它存储了网络中所有 链路状态通告(LSA)。通过 LSDB,每个路由器可以构建整个网络的拓扑图,并使用 Dijkstra 算法计算最短路径树。
这里举个例子方便大家理解 LSDB 的概念。假设我们有一个简单的网络拓扑,包含 4 个路由器(R1, R2, R3, R4)和几个网络网段(NetA, NetB, NetC)。

在 链路状态算法 收敛之后,某个路由器的 LSDB 可能是如下这种形式:
| LSA 类型 | LSA ID | 路由器ID | 链路 ID | 链路类型 | 路径成本 | 连接的路由器或网络 |
|---|---|---|---|---|---|---|
| Router | 1 | R1 | NetA | 广播链路 | 10 | R2 |
| Router | 1 | R1 | NetC | 广播链路 | 5 | |
| Router | 2 | R2 | NetA | 广播链路 | 10 | R1 |
| Router | 2 | R2 | NetB | 广播链路 | 15 | R4 |
| Router | 2 | R2 | R3 | 点对点链路 | 20 | R3 |
| Router | 3 | R3 | R2 | 点对点链路 | 20 | R2 |
| Router | 3 | R3 | R4 | 点对点链路 | 10 | R4 |
| Router | 4 | R4 | NetB | 广播链路 | 15 | R2 |
| Router | 4 | R4 | R3 | 点对点链路 | 10 | R3 |
4.3 链路状态路由算法
距离向量 算法(如 RIP)中,每个路由器只维护到各个目的网络的距离(如跳数)和 下一跳 信息,周期性地 将整个路由表发送给直接相邻的 路由器,依赖邻居的更新来调整自己的 路由表,缺乏全局视角,容易形成路由环路,收敛速度较慢,并且存在坏消息传得慢的问题。
而 链路状态 算法(如 OSPF)则由每个路由器通过 链路状态广播(LSA)将本地链路信息 泛洪 给全网,所有路由器据此构建一致的网络拓扑图,然后独立运行 Dijkstra 最短路径算法计算路由,具备 全局视角,收敛速度 快,稳定性好,适合大型复杂网络。
下图通过一个实例对比了 距离向量 和 链路状态 算法的区别:


五、BGP
BGP(Border Gateway Protocol,边界网关协议)是互联网的核心路由协议,用于在不同 自治系统 之间交换路由信息,属于路径向量(Path Vector)协议,目前广泛使用的版本是 BGP-4。
在 BGP 中,自治系统(AS)是互联网的基本单位,每个 AS 是一个由单个组织控制的网络集合(如一个运营商或大型企业)。AS 与 AS 之间的路由交换就是通过 BGP 完成的,AS 之内的路由交换通过 内部网关协议 完成。



SDN
软件定义网络 (SDN) 是一种新颖的 网络架构,它将 网络的控制功能 从 传统的网络硬件 中解耦出来,并允许通过 软件应用程序 来进行 集中式管理。SDN 提供了 更高的网络灵活性,使得 网络配置、优化、管理、调试 都变得更加简单。
SDN 的架构如下图所示:

一、控制平面和数据平面
在 SDN 中,主要有两个关键的组件:数据平面 (Data Plane) 和 控制平面 (Control Plane)。
- 数据平面 (Data Plane):
- 这是网络中负责处理数据包的部分,通常是在交换机、路由器等设备上。
- 它基于控制平面提供的策略和规则,进行数据包的转发、丢弃或修改。
- 数据平面通常需要高效地执行操作,因为它直接影响网络的性能。
- 控制平面 (Control Plane):
- 控制平面负责整个网络的决策和策略,确定如何处理在网络中流动的数据包。
- 在传统的网络设备中,控制平面直接嵌入在设备上。但在 SDN 中,这个控制平面被抽象为一个集中的软件控制器。
- 控制器与网络设备之间的交互是通过某些标准化的接口进行的,这样可以确保多厂商设备的互操作性。
二、接口
SDN 架构中的接口主要分为 南向接口 和 北向接口。
- 南向接口 (Southbound Interface):
- 这是 SDN 控制器与网络设备之间的接口。
- 它允许控制器下发流表到数据平面设备,并从设备获取信息。
- OpenFlow 是最常用的南向接口协议,但还有其他协议也被使用。
- 北向接口 (Northbound Interface):
- 这是 SDN 控制器与网络应用或上层服务之间的接口。
- 通过这个接口,应用程序可以请求网络服务或查询网络状态,并指导控制器进行相应的网络配置。
- 这个接口通常没有严格的标准,但通常提供 RESTful API 供开发者使用。
除此之外,还有 东向接口 (East/West Interface),它用于 SDN 控制器 之间的通信,特别是在 多控制器的环境 中。
三、流表
流表 基本上是一个 数据库 或 查找表,用于决定如何处理经过 交换机 的数据包。
在 OpenFlow 流表 中,可能有多个流表,并且数据包可能按照顺序经过这些流表。每个流表可能基于不同的 规则、策略 来处理数据包,这为 网络设计 提供了高度的灵活性。
流表 的内容通常由 SDN 控制器 动态管理和更新,这是通过 南向接口(如 OpenFlow 协议)实现的。当 网络的状态 或 策略 发生变化时,控制器 可以修改 流表条目 以适应新的需求。
流表中主要包含如下部分:
- 匹配字段 (Match Fields):
- 这些字段描述了特定的数据包特征。例如,它可以匹配数据包的 源地址、目的地址、端口号、VLAN 标签 等。
- 当一个数据包到达交换机时,它的头部字段会与流表中的匹配字段进行比较,以决定哪个条目适用于该数据包。
- 优先级 (Priority):
- 当多个流表条目都能匹配到一个数据包时,优先级最高 的条目会被选中。
- 优先级 使得网络管理员可以设计更为精确和特定的流规则。
- 计数器 (Counters):
- 这些是用于收集 统计信息 的,如匹配到某个流条目的 数据包数量。
- 计数器 有助于网络监控和分析。
- 指令和动作 (Instructions & Actions):
- 当一个数据包与流表条目匹配时,会执行相应的 指令和动作。
- 常见的动作包括:转发数据包 到特定的端口、丢弃数据包、修改数据包头部信息、发送数据包到控制器 等。
网络层设备
一、路由器
路由器(Router)是一种实现网络互连的设备,在 OSI 网络模型中的第三层,提供 路由 与 转发 的两种重要机制;可以决定数据包从来源端到目的端所经过的路由路径,这个过程称为 路由;将路由器输入端的数据包移至适当路由器输出端,称为 转发。
1.1 组成

简单来说,路由器主要由以下软硬件组成:
- 硬件:
- CPU:运行操作系统,处理 路由协议。
- 交换结构:高速传输数据包,连接输入输出端口。
- 网络接口:以太网、光纤等,收发数据包。
- 软件:
- 操作系统:运行专用的嵌入式 操作系统,提供 路由协议 支持、配置管理等功能。
1.2 路由表

路由表 是路由器内部的数据结构,其中包含了有关网络之间如何进行 路由 的信息。路由表 是根据 路由协议(如 RIP、OSPF、BGP 等)和手动配置动态生成和维护的。
路由表包含如下信息:
- 目标网络(Network Destination):表示数据包要传递到的目标网络或主机。
- 子网掩码(Network Mask):确定了 目标网络 的范围,路由器 使用它来匹配数据包的 目标地址。
- 网关(Gateway):数据报转接口的 IP 地址。
- 接口(Interface):指明了路由器上哪个物理或逻辑 接口 将被用来 转发 数据包。
- 跳数/度量值(Metric):跳数或度量值是 路由选择 的一个度量标准,用来表示到达 目标地址 的成本。如果存在多条 路由 到同一个目的地,路由器通常会选择跃点数最低的 路由。
1.3 功能
路由表的 核心功能 就是 路由决策 和 分组转发,接收数据包,查询路由表,然后从某个端口 转发出去。
分组转发
分组转发 是指路由器根据数据包的 目的 IP 地址 和其内部的 路由表,决定将数据包发送到下一个网络节点(下一跳)或 目标设备 的过程。其详细工作流程如下:
- 接收和解析 数据包
- 查询路由表:
- 路由器将 目的 IP 地址 与路由表中的条目进行匹配,使用 最长前缀匹配(Longest Prefix Match, LPM)算法选择 最佳路由。
- 处理TTL和其他字段:
- 路由器减少数据包的 TTL(Time To Live)值,防止循环转发。
- 如果需要,执行其他处理,如分片、重组或 NAT。
- 转发数据包
- 根据 路由表 查找结果,将数据包发送到指定的 下一跳 地址或直接连接的设备。

最长前缀匹配
当路由器收到一个数据包时,它会提取数据包的 目的 IP 地址,并与 路由表 中的条目进行比较。最长前缀匹配的核心是选择与目的 IP 地址 前缀匹配最长 的路由表项,因为更长的前缀表示更具体的路由,优先级更高。
举个实际例子,假设有如下路由表:
| 网络前缀 | 子网掩码 | 下一跳 |
|---|---|---|
| 192.168.1.0/24 | 255.255.255.0 | 接口 A |
| 192.168.0.0/16 | 255.255.0.0 | 接口 B |
| 0.0.0.0/0 | 0.0.0.0 | 接口 C |
对于 目的 IP 地址 192.168.1.100:
1. 与 192.168.1.0/24 匹配:前 24 位完全匹配。 2. 与 192.168.0.0/16 匹配:前 16 位匹配。 3. 与 0.0.0.0/0 匹配:默认路由,总是匹配。
由于 /24 是 最长的前缀,路由器选择接口 A 作为下一跳。
二、NAT
NAT(Network Address Translation,网络地址转换)的核心作用是把一个 IP 地址空间映射到另一个 IP 地址空间,常见的情形是把局域网内部的 私有 IP 地址 转换为 公网 IP 地址(或将公网地址转换回私有地址),从而实现内部设备与外部网络(如 Internet)的互联。NAT 主要有以下功能:
- 解决 IPv4 地址匮乏:在 IPv4 中,公网地址资源有限。通过 NAT,整个局域网可以共享同一个或少量的公网 IP,极大地节约了地址分配。
- 提供安全屏障:外部主机只能看到 NAT 设备的公网地址,内部的真实 IP 地址被隐藏,形成了一个简单的防护层,降低了直接攻击的风险。

2.1 NAT表
上图中路由器的 NAT 表 的示例如下:
| 私有 IP 地址 | 私有端口 | 公有 IP 地址 | 公有端口 | 协议 | 连接状态 |
|---|---|---|---|---|---|
| 192.168.100.3 | 12345 | 145.12.131.7 | 54321 | TCP | ESTABLISHED |
| 192.168.100.4 | 8888 | 145.12.131.7 | 54322 | UDP | NEW |
| 192.168.100.5 | 15839 | 145.12.131.7 | 54323 | TCP | SYN_SENT |
| 192.168.100.3 | 7890 | 145.12.131.7 | 54324 | TCP | ESTABLISHED |
表中条目包含如下内容:
- 内部私有 IP 地址:局域网中设备的私有 IP 地址。
- 内部端口号:发送数据包的私有网络设备所使用的端口号。
- 外部公有 IP 地址:路由器 在广域网(WAN)侧使用的 IP 地址,通常是单个 IP 地址,但也可能有多个。
- 外部端口号:与内部端口号对应的,由 NAT 分配用于标识特定会话的公有端口号。
- 协议类型:数据包使用的协议(如 TCP、UDP 等)。
NAT 表的条目通常是 动态创建 的。当内部设备发起到外部网络的连接时,路由器会在 NAT 表中创建一个条目。通过 NAT 表,路由器可以将从外部网络收到的数据包转发到正确的内部设备。当 NAT 表中的条目因为超时或者NAT 表容量限制而被删除时,新的数据包会触发创建新的NAT条目。
2.2 地址转换过程
在 NAT(网络地址转换)中,数据包的地址会根据其流向进行相应的改写,主要可以分为两种情况:
- 从内网发送到公网
- 当内网主机向外部(Internet)发起通信时,数据包首先经过 NAT 路由器。
- 在此过程中,NAT 会把数据包的 源 IP 地址和源端口 替换为 路由器的公网 IP 地址和分配的公网端口(即进行源地址/端口转换,SNAT)。
- 这样,外部主机只能看到公网 IP+端口,而看不到内部私有地址,确保内网结构对外部保持透明。
- 从公网返回到内网
- 当外部主机向 NAT 路由器的公网 IP+端口发送响应报文时,报文同样会先到达 NAT 路由器。
- NAT 根据之前记录的映射表,将报文的 目的 IP 地址和目的端口 改写回对应的 私有 IP 地址和私有端口(即进行目的地址/端口转换,DNAT),随后将报文转发给内网的目标主机。
简要概括
- 出站(内网 → 公网):修改 源 地址/端口为公网地址。
- 入站(公网 → 内网):修改 目的 地址/端口为对应的私有地址。
通过上述两步映射,NAT 实现了内网主机对外通信的隐藏与地址复用,同时保证了返回流量能够正确回到发起请求的内部主机。
2.3 私有IP地址
在局域网(内部网络)中常用的 私有 IP 地址 共有三个连续的地址段。它们分别对应不同规模的网络,使用时只需在相应范围内任选一个未被占用的地址即可。
| 地址段(CIDR 表示) | 起始地址 | 结束地址 | 适用场景 |
|---|---|---|---|
10.0.0.0/8 | 10.0.0.0 | 10.255.255.255 | 大型网络、企业内部骨干网 |
172.16.0.0/12 | 172.16.0.0 | 172.31.255.255 | 中型网络,例如校区网、部门网 |
192.168.0.0/16 | 192.168.0.0 | 192.168.255.255 | 小型网络、家庭或小型办公网 |
三、路由器IP地址
路由器接口的 IP 地址 配置方式取决于其连接的网络类型。常见有以下两种场景:
- 点对点连接:当两个路由器通过专用链路直接相连时,通常为该链路划分一个小型子网,例如 IPv4 的
/30。/30子网提供 2 个可用主机地址,正好分配给两端路由器接口。- 这种方式能够高效利用地址空间,特别适合点对点链路。
- 连接到局域网或子网:当路由器接口接入一个局域网(LAN)或更大的子网时,需要分配该子网中的一个 IP 地址。
- 通常选择子网的第一个或最后一个可用地址,作为网络中设备的 默认网关。
- 例如,在
192.168.1.0/24子网中,路由器接口常被配置为192.168.1.1或192.168.1.254。

