15. 网络层与路由

深入 IP 协议工作原理:IPv4/IPv6 编址、子网划分、NAT、路由算法与协议,构建完整的网络层知识体系。

1. IP 协议概述

网络层负责逻辑寻址分组转发,核心协议是 IP(Internet Protocol),提供无连接、不可靠的点到点数据传输。

1.1 IPv4 报头结构

 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
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|Version|  IHL  |Type of Service|          Total Length         |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|         Identification        |Flags|      Fragment Offset    |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|  Time to Live |    Protocol   |         Header Checksum       |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|                       Source Address                          |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|                    Destination Address                        |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|                    Options (if IHL > 5)                       |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+

Version: 4 (IPv4) / 6 (IPv6)
IHL: 头部长度,单位 4 字节(最小 5 = 20 字节)
TTL: 生存时间,每经过一个路由器减 1,到 0 丢弃
Protocol: 上层协议(6=TCP, 17=UDP, 1=ICMP)

2. IP 编址

2.1 IPv4 地址分类

类别首字节范围默认掩码网络位主机位用途
A1-126255.0.0.0824大型网络
B128-191255.255.0.01616中型网络
C192-223255.255.255.0248小型网络
D224-239组播
E240-255保留实验

私有地址(RFC 1918)

类别范围可用主机数
A10.0.0.0/816,777,214
B172.16.0.0/121,048,574
C192.168.0.0/1665,534

2.2 CIDR(无类别域间路由)

用斜线后的数字表示网络前缀长度,取代传统的 A/B/C 分类。

192.168.1.0/24  = 网络位 24,主机位 8,254 个可用主机
192.168.1.0/26  = 网络位 26,主机位 6,62 个可用主机
10.0.0.0/8      = 整个 A 类私有地址

2.3 子网划分计算

def subnet_info(network, prefix):
    """
    计算子网信息
    network: e.g., '192.168.1.0/24'
    """
    import ipaddress
    net = ipaddress.IPv4Network(network, strict=False)
    print(f"网络地址: {net.network_address}")
    print(f"广播地址: {net.broadcast_address}")
    print(f"可用主机: {net.num_addresses - 2}")
    print(f"主机范围: {net.network_address + 1} - {net.broadcast_address - 1}")
    print(f"掩码: {net.netmask}")

subnet_info('192.168.1.0/26')
# 网络地址: 192.168.1.0
# 广播地址: 192.168.1.63
# 可用主机: 62
# 主机范围: 192.168.1.1 - 192.168.1.62
# 掩码: 255.255.255.192

2.4 子网划分实例

需求:将 192.168.1.0/24 划分为 4 个子网,每网至少 50 主机

分析:
  50 主机 → 需要 6 位主机位(2⁶ - 2 = 62 ≥ 50)
  剩余 2 位用于子网 → 4 个子网

子网掩码:/26(255.255.255.192)

子网 1: 192.168.1.0/26    (1-62)
子网 2: 192.168.1.64/26   (65-126)
子网 3: 192.168.1.128/26  (129-190)
子网 4: 192.168.1.192/26  (193-254)

3. 路由基础

3.1 路由表

$ ip route
# 或 route -n
default via 192.168.1.1 dev eth0 proto dhcp metric 100
192.168.1.0/24 dev eth0 proto kernel scope link src 192.168.1.100 metric 100

# 各项含义:
# destination: 目标网络
# gateway: 下一跳
# interface: 出接口
# proto: 来源(kernel=直连, dhcp=动态, static=静态)

3.2 最长前缀匹配

路由选择时,选择与目标地址匹配位数最多的路由条目。

目标: 10.1.2.3
路由表:
  10.0.0.0/8      → 路由器 A  (匹配 8 位)
  10.1.0.0/16     → 路由器 B  (匹配 16 位)✓
  10.1.2.0/24     → 路由器 C  (匹配 24 位)✓✓

选择: 10.1.2.0/24 → 路由器 C

4. 路由算法

4.1 距离向量算法(RIP)

每个路由器维护到所有目的地的距离(跳数),定期与邻居交换路由表。

Bellman-Ford 方程:
dₓ(y) = minᵥ { c(x,v) + dᵥ(y) }

x 到 y 的最短距离 = 所有邻居 v 中,x 到 v 的代价 + v 到 y 的距离的最小值

问题:
- 计数到无穷大(Count to Infinity)
- 15 跳限制(RIP 最大 15 跳)
- 收敛慢

4.2 链路状态算法(OSPF)

每个路由器泛洪 LSA(链路状态通告),构建全网的拓扑图,运行 Dijkstra 算法计算最短路径。

OSPF 工作过程:
1. 邻居发现(Hello 包)
2. 交换 LSA 数据库
3. 运行 Dijkstra 计算最短路径
4. 维护 LSDB,拓扑变化时重新计算

优点:
- 无计数到无穷大问题
- 收敛快(触发更新 + 增量更新)
- 支持区域划分(Area),减少 LSA 泛洪范围

4.3 边界网关协议(BGP)

路径向量协议,用于自治系统(AS)之间的路由。每个路由条目包含完整 AS 路径

BGP 路径属性:
- AS_PATH: 经过的 AS 序列(防环)
- NEXT_HOP: 下一跳
- LOCAL_PREF: 本地优先级(IBGP 选路)
- MED: 多出口鉴别器(影响邻居 AS 的入站流量)

BGP 选路规则(简化为前几条):
1. 最高 LOCAL_PREF
2. 最短 AS_PATH
3. 最低 ORIGIN 类型
4. 最低 MED
5. eBGP 优先于 iBGP
6. 最近的 IGP 下一跳

4.4 算法对比

特性RIP(距离向量)OSPF(链路状态)BGP(路径向量)
范围内部网关(IGP)内部网关(IGP)外部网关(EGP)
算法Bellman-FordDijkstra路径向量
度量跳数带宽(Cost)AS 路径策略
收敛慢(30s 周期)快(触发更新)较慢(策略复杂)
可扩展好(区域化)好(分层设计)

5. NAT(网络地址转换)

5.1 为什么需要 NAT

IPv4 地址枯竭,NAT 允许多个私有地址共享一个公网 IP。

5.2 NAT 类型

静态 NAT:一对一映射
  公网 203.0.113.1 ↔ 私网 192.168.1.10

动态 NAT:从地址池中动态分配
  地址池: 203.0.113.1 - 203.0.113.10

NAPT/PAT(端口地址转换):多对一
  通过端口号区分不同内网主机
  192.168.1.10:54321 ↔ 203.0.113.1:54321
  192.168.1.11:54321 ↔ 203.0.113.1:54322

5.3 NAPT 端口映射

出站连接:
  内网(192.168.1.10:54321) → NAT → 公网(203.0.113.1:60001) → 目标

NAT 会话表:
┌───────────────────────┬───────────────────────┐
│ 内网地址:端口          │ 公网地址:端口          │
├───────────────────────┼───────────────────────┤
│ 192.168.1.10:54321    │ 203.0.113.1:60001     │
│ 192.168.1.11:80       │ 203.0.113.1:60002     │
└───────────────────────┴───────────────────────┘

入站连接(端口映射):
  公网访问 203.0.113.1:80 → NAT 映射到 192.168.1.10:80

6. ICMP 与 ARP

6.1 ICMP(Internet Control Message Protocol)

常用 ICMP 类型:
  Type 0 / Code 0: Echo Reply(ping 回应)
  Type 8 / Code 0: Echo Request(ping 请求)
  Type 3: Destination Unreachable
    Code 0: 网络不可达
    Code 1: 主机不可达
    Code 3: 端口不可达
  Type 11: Time Exceeded(TTL 耗尽)
  Type 5: Redirect(路由器重定向)
# ping 用到 ICMP Echo Request/Reply
ping 8.8.8.8

# traceroute 利用 TTL 递增或端口不可达
traceroute 8.8.8.8
# UDP 模式:发送到高端口,到目标时返回 ICMP Port Unreachable
# ICMP 模式:发送 Echo,中间返回 Time Exceeded

6.2 ARP(Address Resolution Protocol)

IP 地址 → MAC 地址的映射。

ARP 请求(广播):
  "谁的 IP 是 192.168.1.1?请告诉我你的 MAC!"

ARP 响应(单播):
  "我是 192.168.1.1,我的 MAC 是 aa:bb:cc:dd:ee:ff"

ARP 缓存:
  arp -a
  ? (192.168.1.1) at aa:bb:cc:dd:ee:ff [ether] on eth0

7. IPv6

7.1 IPv6 特性

特性IPv4IPv6
地址长度32 位128 位
地址数量~4.3×10⁹~3.4×10³⁸
表示法点分十进制冒号分隔十六进制
头部长度可变(20-60B)固定 40B
校验和头部有无(上层负责)
NAT普遍使用设计原则上不需要
安全性IPsec 可选IPsec 内置支持

7.2 IPv6 地址表示

完整:2001:0db8:85a3:0000:0000:8a2e:0370:7334

简化:
  1. 前导 0 省略:2001:db8:85a3:0:0:8a2e:370:7334
  2. 连续 0 块压缩为 ::(只能一次)
     2001:db8:85a3::8a2e:370:7334

回环地址:::1
未指定地址:::

参考文章

继续阅读

探索更多技术文章

浏览归档,发现更多关于系统设计、工具链和工程实践的内容。

全部文章 返回首页

「计算机基础」更多文章

  1. 16. 数据链路层
  2. 14. 网络模型与协议
  3. 13. 死锁与同步