3Computer Networks: A Systems Approach(第6版)

网络层

路由与转发

IP协议路由算法BGPSDN

🎯 AI 时代的学习建议:不要只读理论。理解这一章的设计动机(为什么需要这个概念?)和边界条件(什么情况下会失效?)。当 AI 生成的代码涉及这些概念时,你能判断它是否用对了场景。AI 能帮你总结内容,但无法替代你亲手阅读、思考、建立直觉的过程。

第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)(使用优先队列)

优势: 收敛快,无路由环路
劣势: 需要全局拓扑信息,扩展性差
代表: OSPF

2.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 设置流表规则。


3/7网络层
0%