计算机网络:自顶向下方法 - 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 网络层的两大功能#
网络层干两件事:
- 转发(Forwarding):路由器收到一个数据包,看一眼目标 IP,决定从哪个端口丢出去。这叫「查表转包」,是本地操作,纳秒级别。
- 路由(Routing):所有路由器一起商量,计算出一张全局的「最短路径图」,填到各自的转发表里。这是全局操作,需要路由算法支撑。
🎯 生活类比
想象你开车从北京去上海:
- 转发 = 到了每个高速匝道口,看路牌决定走哪条路
- 路由 = 高德地图提前帮你规划好了整个路线
路由器就是高速匝道口的路牌,路由算法就是高德地图的路径规划引擎。
二、IPv4 详解:32 位的地址宇宙#
2.1 IP 地址长什么样#
每个联网设备都需要一个 IP 地址。IPv4 地址是 32 位,通常用点分十进制表示:
1 | 192.168.31.31 ← 你的 Mac mini |
每个 IP 地址由两部分组成:网络号 + 主机号。
🎯 生活类比
IP 地址 = 邮政编码 + 门牌号
- 网络号(邮政编码):标识你属于哪个小区(网络)
- 主机号(门牌号):标识你是这个小区里的哪一户
路由器只看邮政编码(网络号)就能决定把信送到哪个小区,到了小区之后再看门牌号(主机号)找到具体住户。
2.2 子网掩码:网络号的分界线#
那路由器怎么知道 IP 地址的前多少位是网络号?答案是子网掩码(Subnet Mask)。
子网掩码也是 32 位,前面连续的 1 表示网络号,后面的 0 表示主机号。拿你的 Mac mini 举例:
1 | IP 地址: 192.168.31.31 |
做一次按位与(AND)运算:
1 | 192.168.31.31 |
这意味着,你的小米路由器下挂的所有设备,都在 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 | ┌──────────────────────────────────────────────────┐ |
几个关键字段:
- 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 | 192.168.31.0/24 → 前 24 位是网络号,可容纳 2^8-2 = 254 台主机 |
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 | 客户端 DHCP 服务器 |
- 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)访问外网时:
- 数据包源地址
192.168.31.31:54321 - 路由器收到后,把源地址替换成公网 IP + 新端口
公网IP:40001 - 记录映射关系
- 回来的包,路由器根据映射关系,把目标地址改回
192.168.31.31:54321
这就是为什么你能用一个公网 IP 让家里所有设备同时上网。
5.3 NAT 穿透与 frp#
NAT 有个副作用:外部无法主动发起连接到内部设备。因为 NAT 表里没有对应的映射规则,外来的包会被丢弃。
这对你来说意味着什么?如果你想在外面远程 SSH 到你的 Mac mini,你是连不上 192.168.31.31 的——因为它在 NAT 后面。
解决方案有几种:
- 端口转发(Port Forwarding):在路由器上手动添加规则,把公网某端口映射到内网设备。静态 NAT。
- UPnP / NAT-PMP:应用自动向路由器申请端口映射。不需要手动配。
- 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 |
简化规则:
- 前导零可以省略:
0db8→db8,0000→0 - 连续的零组可以用
::缩写(只能用一次)
1 | 2001:db8:85a3:0:0: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)#
工作流程:
- 发现邻居:每个路由器先搞清楚自己的邻居是谁,距离多远
- 广播链路状态:把「我和谁连,距离多少」这个信息广播给全网所有路由器
- 独立计算最短路径:每个路由器用收到的全部信息,运行 Dijkstra 算法,算出自己到其他所有节点的最短路径
Dijkstra 算法的直觉:
从源节点出发,每次找到距离最近的未访问节点,用它来更新其他节点的距离。不断扩展,直到所有节点都被访问。
1 | 源点 A |
优点:每个路由器有全网视图,计算结果一致,收敛快
缺点:广播开销大,需要 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 的距离)」
工作流程:
- 每个路由器初始化自己的距离向量(自己到自己是 0,其他是 ∞)
- 周期性地把自己的距离向量发给所有邻居
- 收到邻居的向量后,用 Bellman-Ford 方程更新自己的向量
- 如果更新了,下一轮把新向量发给邻居
- 重复直到收敛
「好消息传得快,坏消息传得慢」 ——这是 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/距离向量有很大不同:
- BGP 是路径向量协议:不仅记录距离,还记录完整路径(经过哪些 AS)
- BGP 关心策略:不只是「最短」,还要考虑「能不能走」「愿不愿意走」
- BGP 使用 TCP:端口 179,可靠传输
🎯 生活类比
BGP 就像国际快递。你从中国寄包裹到美国:
- OSPF 负责国内段——从你家到海关仓库的路线
- BGP 负责国际段——中国海关决定走哪条航线到美国海关,考虑的不只是距离,还有海关政策、贸易协定、禁运限制
BGP 路径就像快递追踪记录:
AS4134 → AS4837 → AS15169,从中国电信 → 中国联通 → Google。
BGP 的重要性: 互联网上几乎所有的跨运营商流量都走 BGP。BGP 出问题 = 大规模断网。历史上多次重大断网事故都是 BGP 配置错误导致的。
💡 有趣的事实
2008 年,巴基斯坦电信在 BGP 中错误地宣告了自己拥有 YouTube 的 IP 段,导致全球访问 YouTube 的流量都被吸到了巴基斯坦——然后巴基斯坦的网络直接被冲垮了。这就是 BGP 的「威力」——它信任所有人宣告的路由信息。
九、实战分析:你的 Mac mini 的网络全貌#
现在让我们把今天学的所有概念串起来,看看你的实际网络:
1 | 互联网 |
让我们用命令逐个验证今天学过的概念:
① 查看自己的 IP、子网掩码、网关:
1 | networksetup -getinfo Wi-Fi |
→ 192.168.31.31/24,CIDR 表示法确认。
② 查看路由表:
1 | netstat -rn |
→ 路由器查表转发的逻辑,和你 Mac 上的路由表是同一个道理。
③ 查看 ARP 缓存(IP → MAC 地址映射):
1 | arp -a |
→ 在子网内部,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 地址,背后有一整套精妙的协议在支撑。
📚 系列导航
- Day 5:Socket 编程与邮件协议
- Day 6:传输层与多路复用
- Day 7:UDP 与可靠数据传输
- Day 8:TCP 协议与拥塞控制
- Day 10:IP 协议详解与路由算法 ← 你在这里
- Day 11:链路层——以太网、ARP、CSMA/CD、交换机(明日更新)