bc's club

This is Bc's club

计算机网络:自顶向下方法 - Day 10 | IP 协议详解与路由算法

📖 Day 10 / 15 · 《计算机网络:自顶向下方法》阅读笔记

每天 30 分钟,15 天读懂计算机网络。今天我们进入网络层的核心——IP 协议。IPv4、IPv6、子网掩码、CIDR、DHCP、NAT,再加上路由算法(链路状态、距离向量、OSPF、BGP),一次讲透。这是计算机网络中最「硬核」的一天,撑过去,后面的内容就是 downhill。

一、网络层:互联网的「邮政系统」#

前几讲我们聊了应用层和传输层。你知道了 HTTP 怎么请求、TCP 怎么保证可靠传输。但有一个问题一直被我们刻意回避:

数据包从你的 Mac mini 到远程服务器,中间穿越了无数个路由器,它到底是怎么找到路的?

这就是网络层的职责。

传输层负责端到端的通信(进程到进程),网络层负责主机到主机的通信。如果说 TCP 是你寄快递时的「签收确认」服务,那 IP(Internet Protocol,网际协议)就是快递单上的地址系统——它决定了包裹从哪寄、寄到哪、走哪条路。

1.1 网络层的两大功能#

网络层干两件事:

  1. 转发(Forwarding):路由器收到一个数据包,看一眼目标 IP,决定从哪个端口丢出去。这叫「查表转包」,是本地操作,纳秒级别。
  2. 路由(Routing):所有路由器一起商量,计算出一张全局的「最短路径图」,填到各自的转发表里。这是全局操作,需要路由算法支撑。

🎯 生活类比

想象你开车从北京去上海:

  • 转发 = 到了每个高速匝道口,看路牌决定走哪条路
  • 路由 = 高德地图提前帮你规划好了整个路线

路由器就是高速匝道口的路牌,路由算法就是高德地图的路径规划引擎。


二、IPv4 详解:32 位的地址宇宙#

2.1 IP 地址长什么样#

每个联网设备都需要一个 IP 地址。IPv4 地址是 32 位,通常用点分十进制表示:

1
2
3
192.168.31.31  ← 你的 Mac mini
192.168.31.1 ← 你的小米路由器
8.8.8.8 ← Google 公共 DNS

每个 IP 地址由两部分组成:网络号 + 主机号

🎯 生活类比

IP 地址 = 邮政编码 + 门牌号

  • 网络号(邮政编码):标识你属于哪个小区(网络)
  • 主机号(门牌号):标识你是这个小区里的哪一户

路由器只看邮政编码(网络号)就能决定把信送到哪个小区,到了小区之后再看门牌号(主机号)找到具体住户。

2.2 子网掩码:网络号的分界线#

那路由器怎么知道 IP 地址的前多少位是网络号?答案是子网掩码(Subnet Mask)

子网掩码也是 32 位,前面连续的 1 表示网络号,后面的 0 表示主机号。拿你的 Mac mini 举例:

1
2
3
4
5
6
7
IP 地址:    192.168.31.31
二进制: 11000000.10101000.00011111.00011111

子网掩码: 255.255.255.0
二进制: 11111111.11111111.11111111.00000000

前 24 位是网络号

做一次按位与(AND)运算

1
2
3
192.168.31.31
AND 255.255.255.0
= 192.168.31.0 ← 这就是你的网络地址(子网)

这意味着,你的小米路由器下挂的所有设备,都在 192.168.31.0/24 这个子网里。/24 表示前 24 位是网络号,这是 CIDR 表示法,我们待会儿细讲。

2.3 特殊 IP 地址#

不是所有 IP 都能随便用的,有几类特殊地址需要记住:

地址 含义
0.0.0.0 本机的所有 IP(服务器绑定时常听这个)
127.0.0.0/8 环回地址(localhost),只在本机转悠
255.255.255.255 广播地址,发给本子网所有人
10.0.0.0/8 A 类私有地址
172.16.0.0/12 B 类私有地址
192.168.0.0/16 C 类私有地址 ← 你的家庭网络就在这里
169.254.0.0/16 链路本地地址(DHCP 拿不到 IP 时的尴尬默认值)

你的 Mac mini 的 192.168.31.31 就是私有地址。私有地址在公网上是不可路由的——也就是说,互联网上的路由器看到目标地址是 192.168.x.x,会直接丢弃。那你怎么上网的?答案在后面的 NAT 部分。

2.4 IP 数据报格式#

IP 数据报(Data gram)是网络层的「快递包裹」,结构如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
┌──────────────────────────────────────────────────┐
│ 版本 │ 首部长度 │ 服务类型 │ 总长度 │
│ (4位) │ (4位) │ (8位) │ (16位) │
├──────────────────────────────────────────────────┤
│ 标识符 (16位) │ 标志(3位) │ 片偏移(13位) │
├──────────────────────────────────────────────────┤
│ TTL(8位) │ 协议(8位) │ 首部校验和 (16位) │
├──────────────────────────────────────────────────┤
│ 源 IP 地址 (32位) │
├──────────────────────────────────────────────────┤
│ 目标 IP 地址 (32位) │
├──────────────────────────────────────────────────┤
│ 载荷 (TCP/UDP 报文段) │
└──────────────────────────────────────────────────┘

几个关键字段:

  • TTL(Time To Live):生存时间,每经过一个路由器减 1,减到 0 就丢弃。防止数据包在网络里无限循环。traceroute 命令就是利用这个原理工作的——发 TTL=1 的包看第一个路由器是谁,发 TTL=2 的包看第二个……
  • 协议(Protocol):告诉接收方,载荷里装的是什么。6 = TCP,17 = UDP,1 = ICMP。
  • 分片(Fragmentation):如果数据报太大(超过 MTU),路由器会把它拆成多个小片。接收端再拼回来。

🎯 实战演示

打开终端,运行:

1
ping -c 3 192.168.31.1

你看到的 64 bytes 就是 ICMP 报文(协议号 1)被封装在 IP 数据报里。TTL 从 64 开始(macOS 默认),如果你经过 10 个路由器到目标,对方收到的 TTL 就是 54。


三、CIDR:告别分类的噩梦#

3.1 古老的分类编址(Classful Addressing)#

早期的 IP 地址被严格分成五类:

类别 前缀 网络号位数 主机号位数 地址范围
A 0 8 24 1.0.0.0 ~ 127.255.255.255
B 10 16 16 128.0.0.0 ~ 191.255.255.255
C 110 24 8 192.0.0.0 ~ 223.255.255.255
D 1110 - - 组播地址
E 1111 - - 保留

问题很明显:一个 C 类网络最多只有 254 台主机(2^8 - 2 = 254),太少了。一个 B 类网络有 65534 台主机,对大多数公司来说太多了,浪费严重。

🎯 生活类比

这就好比开发商只卖两种房子:10 平米的单间和 5000 平米的大楼。三口之家只能买大楼——住不完,空着浪费。

3.2 CIDR:无类别域间路由#

1993 年,人们终于受不了了,发明了 CIDR(Classless Inter-Domain Routing,无类别域间路由)。核心思想:网络号的长度不再固定,可以任意指定

表示方法:a.b.c.d/x,其中 /x 表示前 x 位是网络号。

1
2
3
4
192.168.31.0/24   → 前 24 位是网络号,可容纳 2^8-2 = 254 台主机
192.168.0.0/16 → 前 16 位是网络号,可容纳 2^16-2 = 65534 台主机
10.0.0.0/8 → 前 8 位是网络号,可容纳 2^24-2 = 16777214 台主机
192.168.31.0/30 → 前 30 位是网络号,可容纳 2^2-2 = 2 台主机(点对点链路用)

CIDR 让地址分配极其灵活。一个 /22 的地址块可以切成 4 个 /24,也可以切成 1 个 /23 + 2 个 /24,随需应变。

🎯 生活类比

CIDR 就像可变面积的「可切割土地」。开发商可以根据你的需求,精确划出一块地给你——不多不少,杜绝浪费。


四、DHCP:自动分配 IP 的「物业管家」#

4.1 为什么需要 DHCP#

想象一下,如果每次你连上 Wi-Fi,都要手动输入 IP 地址、子网掩码、网关、DNS……你会疯的。

DHCP(Dynamic Host Configuration Protocol,动态主机配置协议) 就是为了解决这个问题。它是你的网络「物业管家」,设备一接入网络,它就自动帮你配好一切。

4.2 DHCP 的四步握手#

DHCP 的交互过程堪称经典,四个步骤,全部用 UDP 广播 完成(端口号 67/68):

1
2
3
4
5
6
7
8
9
10
11
12
13
14
客户端                                    DHCP 服务器
| |
| ① DHCP DISCOVER(广播:「有管家在吗?」) |
| ────────────────────────────────────────→ |
| |
| ② DHCP OFFER(「我在!给你 192.168.31.31」)|
| ←──────────────────────────────────────── |
| |
| ③ DHCP REQUEST(「我要这个 IP!」) |
| ────────────────────────────────────────→ |
| |
| ④ DHCP ACK(「确认,用吧!附赠网关和 DNS」) |
| ←──────────────────────────────────────── |
| |
  • DISCOVER:客户端广播喊话「有没有 DHCP 服务器?」(此时还没有 IP,源地址 0.0.0.0
  • OFFER:DHCP 服务器回应,提供一个候选 IP(你的小米路由器就是 DHCP 服务器)
  • REQUEST:客户端说「好,我要这个 IP」(广播,这样其他 DHCP 服务器也知道不需要保留了)
  • ACK:服务器正式确认,附带子网掩码、网关、DNS、租期等信息

🎯 生活类比

入住酒店的完美比喻:

  • DISCOVER = 你拖着行李箱到前台:「有房吗?」
  • OFFER = 前台:「有间 808 号房,要不要?」
  • REQUEST = 「要!」
  • ACK = 「卡给你,入住成功。早餐 7-10 点,WiFi 密码是……」

4.3 DHCP 租约#

DHCP 分配的 IP 不是永久的,而是有租期(Lease)。通常 12-24 小时。租期快到时,客户端会续租。如果续租失败,IP 被收回。

🔧 Mac mini 实战

你的 Mac mini 当前 IP 是 192.168.31.31,这是小米路由器的 DHCP 服务分配的。可以在终端验证:

1
networksetup -getinfo Wi-Fi

输出里的 DHCP Configuration 就说明你用的是 DHCP。如果你想把 Mac mini 做服务器(比如跑 frp),建议在路由器里给它绑定一个固定 IP,避免 DHCP 重新分配导致 IP 漂移。


五、NAT:让全世界共享一个 IP#

5.1 为什么需要 NAT#

IPv4 地址只有 2^32 ≈ 43 亿个,全世界 80 亿人,根本不够分。于是人们发明了 NAT(Network Address Translation,网络地址转换)——让多台设备共用一个公网 IP。

🎯 生活类比

NAT 就像公司前台。公司有 200 个员工(内部设备,私有 IP),但只有一个对外电话号码(公网 IP)。外面的人打电话进来,前台帮你转接到具体分机。你打出去,前台也帮你用公司的号码拨出去,对方看到的是公司号码,不是你的分机号。

5.2 NAT 的工作原理#

你的小米路由器就是一台 NAT 设备。它维护一张 NAT 转换表

内部 IP:端口 外部 IP:端口
192.168.31.31:54321 公网IP:40001
192.168.31.15:8080 公网IP:40002
192.168.31.162:51234 公网IP:40003

当你的 Mac mini(192.168.31.31)访问外网时:

  1. 数据包源地址 192.168.31.31:54321
  2. 路由器收到后,把源地址替换成公网 IP + 新端口 公网IP:40001
  3. 记录映射关系
  4. 回来的包,路由器根据映射关系,把目标地址改回 192.168.31.31:54321

这就是为什么你能用一个公网 IP 让家里所有设备同时上网。

5.3 NAT 穿透与 frp#

NAT 有个副作用:外部无法主动发起连接到内部设备。因为 NAT 表里没有对应的映射规则,外来的包会被丢弃。

这对你来说意味着什么?如果你想在外面远程 SSH 到你的 Mac mini,你是连不上 192.168.31.31 的——因为它在 NAT 后面。

解决方案有几种:

  1. 端口转发(Port Forwarding):在路由器上手动添加规则,把公网某端口映射到内网设备。静态 NAT。
  2. UPnP / NAT-PMP:应用自动向路由器申请端口映射。不需要手动配。
  3. frp(Fast Reverse Proxy):这是你正在用的方案。原理是——
    • 你的 Mac mini 主动连接到一台有公网 IP 的服务器(frp server)
    • 外面想连你的设备时,先连 frp server,frp server 再通过这条已经建立的隧道把流量转给你
    • frp 本质上就是 NAT 穿透(NAT Traversal)——利用 NAT 允许「内→外」连接的特性,从内部主动打通一条隧道

🎯 生活类比

frp 的原理就像你想让外面的人联系你,但你住的小区不让外人进。于是你主动给外面的朋友(frp server)打个电话,保持通话。外面的人想找你,先打给那个朋友,朋友再通过电话转告你。


六、IPv6:128 位的未来#

6.1 为什么要有 IPv6#

IPv4 的 43 亿地址在 2011 年就基本分完了。IPv6 用 128 位地址,地址空间有 2^128 ≈ 3.4 × 10^38 个。

这个数字大到什么程度?地球上每粒沙子都能分到一个 IP,还绰绰有余。

6.2 IPv6 地址格式#

IPv6 用冒号分隔的十六进制表示:

1
2001:0db8:85a3:0000:0000:8a2e:0370:7334

简化规则:

  • 前导零可以省略:0db8db800000
  • 连续的零组可以用 :: 缩写(只能用一次)
1
2
2001:db8:85a3:0:0:8a2e:370:7334
2001:db8:85a3::8a2e:370:7334 ← 更简洁

IPv6 不再有广播地址(用组播代替),也不需要 DHCP(支持无状态自动配置 SLAAC),首部也简化了——固定 40 字节,不像 IPv4 首部可变长。

🔧 你的 Mac mini 支持 IPv6 吗?

1
ifconfig en1 | grep inet6

如果输出有 inet6 开头的地址,说明你的网络已经支持 IPv6(小米路由器支持)。不过目前很多家庭网络的 IPv6 体验还不完美,IPv4 + NAT 仍然是主流。


七、路由算法:数据包的「导航软件」#

现在我们来聊网络层最激动人心的部分——路由算法。这是决定数据包如何在互联网中找到最优路径的大脑。

7.1 路由算法的分类#

路由算法的核心目标:在所有路由器之间计算出一张最短路径图

两大流派:

类型 代表算法 特点
链路状态(Link State, LS) Dijkstra 算法 每个路由器知道全网拓扑,独立计算
距离向量(Distance Vector, DV) Bellman-Ford 方程 每个路由器只知道邻居,互相交换信息

🎯 生活类比

链路状态 = 所有人共享一张完整地图,各自用高德导航算最短路径

距离向量 = 你不知道完整地图,但你问邻居「去上海多远?」,邻居问他的邻居,一层层传下去

7.2 链路状态路由(LS)#

工作流程:

  1. 发现邻居:每个路由器先搞清楚自己的邻居是谁,距离多远
  2. 广播链路状态:把「我和谁连,距离多少」这个信息广播给全网所有路由器
  3. 独立计算最短路径:每个路由器用收到的全部信息,运行 Dijkstra 算法,算出自己到其他所有节点的最短路径

Dijkstra 算法的直觉:

从源节点出发,每次找到距离最近的未访问节点,用它来更新其他节点的距离。不断扩展,直到所有节点都被访问。

1
2
3
4
5
6
7
8
9
10
11
源点 A
/ | \
B C D
| | |
E F G

A 知道:B=2, C=5, D=1
→ 当前最近:D(1)
→ 通过 D 到 F:1+1=2 < 5(通过 C)
→ 更新 F=2
→ 最终 A 的最短路径树:A→D→F→G, A→B→E, A→C

优点:每个路由器有全网视图,计算结果一致,收敛快
缺点:广播开销大,需要 N² 量级的信息传播(N = 路由器数量)

7.3 距离向量路由(DV)#

核心思想: 每个路由器维护一个「距离向量」——到所有其他网络的距离估计。然后周期性地只和邻居交换这个向量。

Bellman-Ford 方程:

1
d(x, y) = min over all neighbors v: { c(x, v) + d(v, y) }

翻译成人话:「我到 y 的最短距离 = min(到邻居 v 的距离 + v 到 y 的距离)」

工作流程:

  1. 每个路由器初始化自己的距离向量(自己到自己是 0,其他是 ∞)
  2. 周期性地把自己的距离向量发给所有邻居
  3. 收到邻居的向量后,用 Bellman-Ford 方程更新自己的向量
  4. 如果更新了,下一轮把新向量发给邻居
  5. 重复直到收敛

「好消息传得快,坏消息传得慢」 ——这是 DV 算法的特点。如果某条链路断了(距离变 ∞),这个「坏消息」要传遍整个网络可能需要很多轮。这就是著名的计数到无穷(Count-to-Infinity)问题。

解决方案

  • 毒性逆转(Poisoned Reverse):如果 A 通过 B 到达 C,那 A 告诉 B 时说「我到 C 的距离是 ∞」,防止 B 也通过 A 到 C 形成环路
对比 链路状态 距离向量
信息范围 全网拓扑 只有邻居
计算方式 独立 Dijkstra 分布式 Bellman-Ford
收敛速度 慢(尤其坏消息)
消息开销 大(全网广播) 小(只发邻居)
环路问题 不会 可能

八、OSPF 与 BGP:互联网的两大路由协议#

8.1 OSPF:组织内部的导航#

OSPF(Open Shortest Path First,开放最短路径优先) 是基于链路状态域内(Intra-AS)路由协议。也就是说,它负责一个组织(Autonomous System, AS)内部的路由。

特点:

  • 使用 Dijkstra 算法
  • 每个路由器维护完整的链路状态数据库
  • 支持区域(Area)分层,减少计算开销
  • 开放标准,各厂商设备通用

🎯 生活类比

OSPF 就像一个大公司内部的「内部通讯录」——所有部门互相知道自己人是谁,在哪里。新员工入职或离职,消息会在公司内部迅速传开。

8.2 BGP:互联网的「联合国」#

BGP(Border Gateway Protocol,边界网关协议) 是互联网上最重要的路由协议,没有之一。它负责不同自治系统(AS)之间的路由——也就是说,ISP A 和 ISP B 之间怎么交换路由信息。

BGP 和 OSPPF/距离向量有很大不同:

  1. BGP 是路径向量协议:不仅记录距离,还记录完整路径(经过哪些 AS)
  2. BGP 关心策略:不只是「最短」,还要考虑「能不能走」「愿不愿意走」
  3. BGP 使用 TCP:端口 179,可靠传输

🎯 生活类比

BGP 就像国际快递。你从中国寄包裹到美国:

  • OSPF 负责国内段——从你家到海关仓库的路线
  • BGP 负责国际段——中国海关决定走哪条航线到美国海关,考虑的不只是距离,还有海关政策、贸易协定、禁运限制

BGP 路径就像快递追踪记录:AS4134 → AS4837 → AS15169,从中国电信 → 中国联通 → Google。

BGP 的重要性: 互联网上几乎所有的跨运营商流量都走 BGP。BGP 出问题 = 大规模断网。历史上多次重大断网事故都是 BGP 配置错误导致的。

💡 有趣的事实

2008 年,巴基斯坦电信在 BGP 中错误地宣告了自己拥有 YouTube 的 IP 段,导致全球访问 YouTube 的流量都被吸到了巴基斯坦——然后巴基斯坦的网络直接被冲垮了。这就是 BGP 的「威力」——它信任所有人宣告的路由信息。


九、实战分析:你的 Mac mini 的网络全貌#

现在让我们把今天学的所有概念串起来,看看你的实际网络:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
互联网

│ (公网 IP,比如 121.4.x.x)

┌─┴──────────────┐
│ 小米路由器 │ ← NAT 设备 + DHCP 服务器
│ 192.168.31.1 │
│ (xiaoqiang) │
└─┬───┬───┬───┬──┘
│ │ │ │
│ │ │ │ 192.168.31.0/24 子网 (CIDR)
│ │ │ │ 子网掩码: 255.255.255.0
│ │ │ │
┌┴┐ ┌┴┐ ┌┴┐ ┌┴┐
│📱│ │🖥│ │📱│ │❓│
│.15│ │.31│ │.162│ │.22│
iPhone Mac iPad 其他
mini

让我们用命令逐个验证今天学过的概念:

① 查看自己的 IP、子网掩码、网关:

1
2
3
4
networksetup -getinfo Wi-Fi
# IP address: 192.168.31.31
# Subnet mask: 255.255.255.0
# Router: 192.168.31.1

192.168.31.31/24,CIDR 表示法确认。

② 查看路由表:

1
2
3
4
netstat -rn
# default 192.168.31.1 UGScg en1 ← 默认路由,所有未知目标都丢给路由器
# 192.168.31 link#14 UCS en1 ← 本子网直连,不需要经过路由器
# 127 127.0.0.1 UCS lo0 ← 环回地址,走本地

→ 路由器查表转发的逻辑,和你 Mac 上的路由表是同一个道理。

③ 查看 ARP 缓存(IP → MAC 地址映射):

1
2
3
4
5
arp -a
# xiaoqiang (192.168.31.1) at 58:ea:1f:71:25:bb on en1
# iphone (192.168.31.15) at de:bb:e:58:97:1a on en1
# mac (192.168.31.31) at 26:a:bc:79:39:c8 on en1
# ipad (192.168.31.162) at 26:b1:3d:8e:61:50 on en1

→ 在子网内部,IP 地址最终要映射到 MAC 地址才能通信。ARP 就是做这件事的(Day 11 会详细讲)。

④ traceroute 看 TTL 和路由路径:

1
traceroute 8.8.8.8

→ 每一跳就是一个路由器。你看到的路径,就是 BGP + OSPF 共同计算出的「最优路径」。

⑤ frp 的本质:

你的 Mac mini 在 192.168.31.0/24 私有网络里,经过小米路由器的 NAT。外部无法直接访问你。frp 的原理就是——Mac mini 主动向公网的 frp server 发起 TCP 连接(NAT 允许内→外),建立一条隧道。外部请求到达 frp server 后,通过这条隧道转发给你。

frp 本质上就是 NAT 穿透——利用 NAT 允许「从内到外」发起连接的特性,从内部主动打通一条反向隧道。


十、关键知识点回顾#

让我们用一张表总结今天的内容:

概念 一句话总结
IPv4 地址 32 位,分为网络号 + 主机号
子网掩码 告诉你网络号和主机号的分界线在哪
CIDR /x 表示法,让网络划分更灵活,告别 ABCDE 分类
DHCP 四步握手(DISCOVER → OFFER → REQUEST → ACK),自动分配 IP
NAT 私有 IP + 公网 IP 的转换,让全家共享一个公网 IP 上网
IPv6 128 位地址,解决 IPv4 枯竭问题,:: 缩写,无状态自动配置
链路状态路由 Dijkstra 算法,全网拓扑,每个路由器独立计算最短路径
距离向量路由 Bellman-Ford 方程,只和邻居交换,好消息传得快坏消息传得慢
OSPF 基于链路状态的域内路由协议,用 Dijkstra
BGP 基于路径向量的域间路由协议,互联网的「联合国」,关心策略

记忆口诀#

  • IP 地址 = 邮编 + 门牌号
  • DHCP = 酒店前台办入住(四步握手)
  • NAT = 公司前台帮你转电话
  • frp = NAT 穿透,从内部主动打通隧道
  • 链路状态 = 有完整地图,自己算路(Dijkstra)
  • 距离向量 = 没地图,问邻居(Bellman-Ford)
  • OSPF = 公司内部导航
  • BGP = 国际快递的跨国路线

十一、Day 11 预告:链路层——以太网、ARP、CSMA/CD、交换机#

今天我们讲了网络层的 IP 协议和路由算法。数据包到了目标网络之后,还需要在物理链路上传输——这就是链路层的职责。

明天 Day 11,我们将学习:

  • 以太网(Ethernet):最常见的链路层协议,你的网线就在用它
  • MAC 地址:网卡的「身份证号」,和 IP 地址的区别
  • ARP 协议:IP 地址 → MAC 地址的翻译官
  • CSMA/CD:多台设备共享一根网线时的「交通规则」
  • 交换机(Switch):链路层的核心设备,和路由器有什么区别

到时候你会发现,你用 arp -a 看到的那些 MAC 地址,背后有一整套精妙的协议在支撑。


📚 系列导航