第1章:基础概念(Foundations)
一、导读
1.1 本章学习目标
第1章从系统设计的角度建立计算机网络的整体框架。不同于传统的自顶向下或自底向上方法,Peterson 和 Davie 以互联网的实际架构为线索,讲解每一层的设计决策和工程权衡。
本章核心学习目标:
- 理解网络架构的分层模型:OSI 参考模型 vs TCP/IP 模型
- 掌握网络性能的基本度量:带宽、延迟、带宽延迟积、吞吐量
- 理解协议分层的设计哲学:为什么需要分层?每层解决什么问题?
- 掌握电路交换 vs 分组交换:统计复用的优势与代价
- 了解互联网的组织结构:ISP 层次、IXP、内容分发网络
1.2 为什么本章如此重要
Peterson 的书强调"为什么这样设计"而非仅仅"是什么"。理解设计决策背后的工程权衡,是网络工程师和系统架构师的核心能力。
1.3 核心问题引导
为什么互联网选择了分组交换而非电路交换?
协议分层模型的"违反层次"操作(如 TCP 的 Nagle 算法)为什么有时是必要的?
带宽延迟积如何影响协议设计?
二、核心概念详解
2.1 网络的性能度量
带宽 (Bandwidth):
- 数据速率: bits per second (bps)
- 现代网络: 1 Gbps (以太网), 10 Gbps, 100 Gbps
延迟 (Latency):
- 传播延迟: distance / speed_of_light ≈ 5 μs/km (光纤)
- 传输延迟: packet_size / bandwidth
- 排队延迟: 取决于网络负载
- 处理延迟: 路由查找、校验和计算
带宽延迟积 (BDP):
BDP = bandwidth × RTT
例: 1 Gbps × 100 ms = 100 Mbit = 12.5 MB
含义: 管道中可以同时存在的数据量
影响: TCP 窗口大小必须 ≥ BDP 才能充分利用带宽
吞吐量 (Throughput):
- 实际数据传输速率
- 通常 < 带宽(因为丢包、拥塞、协议开销)
丢包率 (Packet Loss Rate):
- 典型: < 0.01% (有线), 1-10% (无线)
- 影响 TCP 性能(触发拥塞控制)2.2 分组交换 vs 电路交换
电路交换:
- 建立连接时预留带宽
- 数据传输时独占资源
- 优势: 保证延迟和带宽
- 劣势: 资源利用率低(突发流量时浪费)
- 代表: 传统电话网络
分组交换:
- 数据被分割为分组,每个分组独立路由
- 统计复用: 多个流共享链路
- 优势: 资源利用率高
- 劣势: 延迟不确定(排队延迟变化)
- 代表: 互联网
统计复用的数学:
n 个用户,每个需要带宽 b,链路总带宽 B
电路交换: n ≤ B/b
分组交换: n 可以 > B/b(因为用户不会同时发送)
但需要保证: P(活跃用户 > B/b) < ε2.3 协议分层
TCP/IP 四层模型:
┌─────────────────────────┐
│ 应用层 (HTTP, DNS) │ ← 端到端:进程到进程
├─────────────────────────┤
│ 传输层 (TCP, UDP) │ ← 端到端:主机到主机
├─────────────────────────┤
│ 网络层 (IP) │ ← 逐跳:路由选择
├─────────────────────────┤
│ 链路层 (Ethernet) │ ← 逐跳:相邻节点
└─────────────────────────┘
每层的核心功能:
- 应用层: 定义应用协议(HTTP 的请求/响应格式)
- 传输层: 提供端到端的可靠传输(TCP)或尽力传输(UDP)
- 网络层: 将分组从源路由到目的(IP 寻址和路由)
- 链路层: 在相邻节点间传输帧(以太网、WiFi)
端到端原则 (End-to-End Principle):
功能应该在通信端点实现,而非在网络中间节点
例: 可靠性由 TCP 在端点保证,IP 层不保证三、实战案例
3.1 案例一:计算带宽延迟积
python
def calculate_bdp(bandwidth_gbps, rtt_ms):
"""计算带宽延迟积"""
bandwidth_bps = bandwidth_gbps * 1e9
rtt_sec = rtt_ms / 1000
bdp_bits = bandwidth_bps * rtt_sec
bdp_bytes = bdp_bits / 8
return bdp_bytes
# 不同场景的 BDP
scenarios = [
("数据中心内", 25, 0.01), # 25 Gbps, 0.01 ms RTT
("同城跨机房", 10, 1), # 10 Gbps, 1 ms RTT
("跨洋海底光缆", 100, 150), # 100 Gbps, 150 ms RTT
("卫星链路", 50, 600), # 50 Gbps, 600 ms RTT
]
for name, bw, rtt in scenarios:
bdp = calculate_bdp(bw, rtt)
print(f"{name}: BDP = {bdp/1024/1024:.1f} MB")
# 输出:
# 数据中心内: BDP = 3.1 MB
# 同城跨机房: BDP = 1.2 MB
# 跨洋海底光缆: BDP = 1862.6 MB
# 卫星链路: BDP = 3725.3 MB
# TCP 窗口大小建议:
# 数据中心: 默认 256 KB 足够
# 跨洋: 需要设置 net.core.rmem_max = 4 MB 以上四、本章小结
分组交换通过统计复用提高资源利用率,但引入了不确定的延迟
带宽延迟积决定了充分利用链路所需的缓冲区大小
协议分层简化了设计,但端到端原则提醒我们功能应放在正确的位置
五、思考与练习
思考题
为什么 VoIP 选择 UDP 而非 TCP?
带宽延迟积大的网络中,TCP 的默认窗口大小为什么不够?
编程练习
实现一个简单的分组交换模拟器,统计不同负载下的延迟和丢包率。
计算在给定 BDP 下,TCP 需要的最小窗口大小。