第3章:网络层(Network Layer)
一、导读
1.1 本章学习目标
第3章讲解网络层——负责将分组从源主机路由到目的主机。本章从数据平面(转发)和控制平面(路由)两个维度展开,深入分析 IP 协议、路由算法和 SDN。
本章核心学习目标:
- 掌握 IP 协议的核心机制:寻址、分片、TTL
- 理解路由算法:链路状态(Dijkstra)vs 距离向量(Bellman-Ford)
- 掌握 BGP 的工作原理:自治系统间的路由
- 理解 SDN 的设计哲学:控制平面与数据平面分离
- 掌握 NAT 的工作原理和争议
1.2 为什么本章如此重要
网络层是互联网的核心——IP 协议将全球数十亿设备连接在一起。理解路由和转发的工作原理,是网络工程师的基本功。
1.3 核心问题引导
IP 为什么设计为"不可靠"的?可靠性为什么留给传输层?
BGP 的路由策略为什么如此复杂?
SDN 相比传统网络有什么优势?
二、核心概念详解
2.1 IP 协议
IPv4 数据报格式:
┌──────┬──────┬──────────┬───────────────┬──────────────┐
│Ver(4)│IHL(4)│DSCP(6)+ECN(2)│ 总长度(16) │
├──────┴──────┴──────────┼───────────────┤──────────────┤
│ 标识(16) │Flags(3)+偏移(13) │
├────────────────────────┼───────────────┤──────────────┤
│ TTL(8) │ 协议(8) │ 首部校验和(16) │
├───────────┴────────────┼───────────────┤──────────────┤
│ 源 IP 地址 (32) │ │
├────────────────────────┤ │
│ 目的 IP 地址 (32) │ │
├────────────────────────┴──────────────────────────────┤
│ 选项(可选) │
└───────────────────────────────────────────────────────┘
关键字段:
- TTL: 防止分组无限循环,每经过一个路由器减 1,为 0 时丢弃
- 协议: 标识上层协议(6=TCP, 17=UDP, 1=ICMP)
- 首部校验和: 只校验首部,不校验数据(效率考虑)2.2 路由算法
2.2.1 链路状态路由(Dijkstra)
算法:
1. 每个节点向所有其他节点广播链路状态
2. 每个节点构建完整的网络拓扑图
3. 运行 Dijkstra 算法计算最短路径树
复杂度: O(n²) 或 O(n log n)(使用优先队列)
优势: 收敛快,无路由环路
劣势: 需要全局拓扑信息,扩展性差
代表: OSPF2.2.2 距离向量路由(Bellman-Ford)
算法:
每个节点维护到所有目的的距离向量
周期性向邻居发送自己的距离向量
收到邻居的距离向量后更新:
d_x(y) = min_v {c(x,v) + d_v(y)}
复杂度: O(n × m)(n 节点, m 链路)
优势: 分布式,只需邻居信息
劣势: 收敛慢,计数到无穷问题
代表: RIP, BGP (路径向量变体)
计数到无穷问题:
A → B → C → D
如果 D 断开:
B 先更新: d(B,D) = ∞
A 还没更新: d(A,D) = 2 (通过 B)
B 收到 A 的更新: d(B,D) = min(∞, 1 + 2) = 3 (通过 A)
→ 环路! 需要毒性反转或水平分割来解决2.3 BGP
BGP (Border Gateway Protocol):
- 互联网的路由协议
- 在自治系统 (AS) 之间交换路由信息
- 基于路径向量,携带完整的 AS 路径
BGP 属性:
- AS_PATH: 路由经过的 AS 序列(用于环路检测和策略)
- NEXT_HOP: 到达目的的下一跳 IP
- LOCAL_PREF: 本地优先级
- MED: 多出口鉴别器
BGP 路由选择:
1. 最高 LOCAL_PREF
2. 最短 AS_PATH
3. 最低 MED
4. eBGP 优于 iBGP
5. 最短 IGP 路径到 NEXT_HOP
6. 路由器 ID 最小
BGP 策略:
- 不一定要最短路径
- 可以基于商业关系选择路由
- 客户 > 对等 > 提供商2.4 SDN
SDN (Software-Defined Networking):
核心思想: 控制平面与数据平面分离
┌──────────────────────────────┐
│ 应用层 (路由、防火墙) │
├──────────────────────────────┤
│ 控制层 (OpenFlow 控制器) │
├──────────────────────────────┤
│ 数据层 (交换机/路由器) │
└──────────────────────────────┘
优势:
- 集中式控制: 全局视图,优化路由
- 可编程: 通过软件定义网络行为
- 创新加速: 新协议只需更新控制器
OpenFlow:
- 流表: 匹配字段 + 动作 + 优先级
- 匹配: 目的 IP、源 IP、端口、协议...
- 动作: 转发、丢弃、修改、发送到控制器三、实战案例
3.1 案例一:Dijkstra 路由算法实现
python
import heapq
def dijkstra(graph, source):
"""
graph: {node: {neighbor: cost}}
返回: (dist, prev)
"""
dist = {node: float('inf') for node in graph}
prev = {node: None for node in graph}
dist[source] = 0
pq = [(0, source)]
while pq:
d, u = heapq.heappop(pq)
if d > dist[u]:
continue
for v, w in graph[u].items():
if dist[u] + w < dist[v]:
dist[v] = dist[u] + w
prev[v] = u
heapq.heappush(pq, (dist[v], v))
return dist, prev
# 示例网络
graph = {
'A': {'B': 1, 'C': 4},
'B': {'A': 1, 'C': 2, 'D': 5},
'C': {'A': 4, 'B': 2, 'D': 1},
'D': {'B': 5, 'C': 1},
}
dist, prev = dijkstra(graph, 'A')
print("从 A 到各节点的最短距离:", dist)
# 输出: {'A': 0, 'B': 1, 'C': 3, 'D': 4}四、本章小结
IP 提供不可靠的尽力传输,可靠性由 TCP 保证
路由算法分为链路状态(全局信息,快速收敛)和距离向量(分布式,慢收敛)
BGP 是互联网的路由基石,支持基于策略的路由选择
SDN 将控制与转发分离,提供了更灵活的网络管理方式
五、思考与练习
思考题
为什么 BGP 使用 TCP 而非 UDP 作为传输层?
SDN 的集中式控制有什么风险?如何缓解?
编程练习
实现距离向量路由算法,模拟计数到无穷问题。
实现一个简单的 OpenFlow 控制器,根据目的 IP 设置流表规则。