导语:如果说前两单元是告诉我们网络分层的规则,那么本单元我们将真正深入互联网的“发动机”内部。现代互联网完全建立在分组交换 (Packet Switching) 的基础之上。数据包在路由器中是如何排队的?网络延迟到底由哪些物理部分组成?交换机硬件是如何工作的?让我们一探究竟。

1. What the Internet is? (互联网是什么:简史)
要理解现代网络为什么长这样,我们需要快速回顾一下人类通信的发展史。
1.1 History (古代与近代的通信)
- 1000 BC (物理与光学通信):利用烽火台、飞鸽传书、驿站快马(Horse Relays)甚至挥舞旗帜(Flag)进行通信。携带信息量极少,且受物理距离和天气严重限制。
- 1800 AD (电信号通信):电报 (Telegraph) 时代开启,人类首次实现了将信息转化为“编码(摩斯密码)”进行通信。重点是:在这个时期,错误处理、流量控制、同步、加密等网络协议的雏形就已经萌生了。
1.2 Today (现代互联网的诞生)
- 1960s:首次提出“网络”概念,进行了早期的计算机通信实验。
- 1970s:无线电网络(如 ALOHAnet)出现,孕育了共享信道的概念。
- 1980s - 1990s:统治当今世界的 TCP/IP 协议族正式确立,万维网(浏览器)横空出世,互联网正式成型。
2. Packet Switching - Background (分组交换的背景)
在分组交换统治世界之前,人类通信使用的是电路交换 (Circuit Switching)。
2.1 Circuit Switching (电路交换)
- Example (老式电话):当你拨打电话时,电话局的交换机会在你们两人之间物理地“接通”一条专属铜线。
- 机制:发起通信 -> 告诉中心目标 -> 沿交换机链路建立物理连接 -> 通话 -> 挂断并释放线路。这本质上是建立了一条端到端的物理管道。
- Problem (致命缺陷):
- 效率低下 (Inefficient):一旦线路建立,无论你们是在说话还是在沉默,这条线都被死死独占,别人无法使用。
- 应对突发流量能力差 (Diverse Rate):现代网络应用(打字、看视频)的频率是极其不均匀的(Bursty),用固定带宽的电路来传数据是极大的浪费。
- 状态管理灾难 (State Management):网络核心必须维护成千上万个连接的“建立/拆除”状态,一旦核心交换机宕机,所有通话全部中断。
2.2 Packet Switching (分组交换)
- 数据包 (Packet):数据被切分成小块,每个小块同时携带着数据 (Payload) + 目标地址 (Header),成为一个自包含的独立单元。
- 传输方式:逐跳传输 (Hop-by-hop),多条数据流共享同一条物理链路。
- 缓冲机制:交换机内部带有缓存 (Buffers)。如果瞬间涌来的包太多,先放在缓存里排队,这就解决了速率不匹配的问题。
2.3 为什么互联网选择分组交换?
- 高效使用昂贵的链路:把线路视为稀缺资源,谁有数据谁就用,极致压榨带宽(统计多路复用)。
- 极强的抗打击能力 (Resilience to failure):不需要建立固定线路。如果中间某台路由器炸了,后续的数据包可以立刻绕道其他链路,保证了传输的可靠性。
3. Packet Switching - End to End Delay (端到端延迟)
分组交换虽然灵活,但引入了复杂的网络延迟。端到端延迟 (End-to-End Delay) 由三个核心物理分量组成,务必明确区分,切勿混淆!
3.1 Propagation Delay (传播延迟)
- 定义:1 个 bit 从链路的一端(A)像光一样飞到另一端(B)所需的绝对物理时间。
- 公式:t=l/ct = l / ct=l/c (lll 为物理链路长度,ccc 为介质中的光速)。
- 特点:完全取决于距离,你无法通过升级千兆宽带去缩短从中国到美国的传播延迟。
3.2 Packetization / Transmission Delay (分组/发送延迟)
- 定义:网卡将一个数据包从第一个 bit 到最后一个 bit 全部“推”到网线上所需的时间。
- 公式:t=p/rt = p / rt=p/r (ppp 为数据包大小/ bits,rrr 为链路带宽速率 bps)。
- 特点:取决于包有多大以及你的网速(带宽)有多快。
3.3 End-to-End Delay (端到端延迟总和)
端到端延迟 = 传播延迟 + 分组延迟 + 💥 排队延迟 (Queuing Delay)
- 排队延迟 Q(t)Q(t)Q(t):因为多条数据流共享链路,数据包必然会在路由器的 Buffer 中排队等待。这是延迟公式中唯一的可变部分 (Variable)。
- Ping 命令:我们在电脑上用 Ping 测出来的延迟(RTT, 往返时间),实际上就是上述三种延迟往返累加的结果。
💡 跳跃累加 (Example):
假设路径是 A→S1→S2→BA \to S_1 \to S_2 \to BA→S1→S2→B。
S1S_1S1 必须等待整个数据包接收完毕(存储-转发),查表后再发给 S2S_2S2。因此,每经过一个路由器,都要重新计算一次“分组延迟”和“排队延迟”。
4. Packet Switching - Playback Buffer (播放缓冲区)
排队延迟 Q(t)Q(t)Q(t) 是不断波动的,这导致了网络中到达的数据包会有抖动 (Jitter / Packet Delay Variation)。
4.1 Example (流媒体应用)
- Why and What:YouTube 或 Netflix 等流媒体绝不能依赖网络的“实时到达”,因为网络抖动会导致视频疯狂卡顿。
- 解决方案:在客户端引入 Playback Buffer (播放缓冲区)。
- 原理 (Reader-Writer Problem):网络(Writer)以极其不规律、波动的速度把数据包塞进 Buffer;而视频播放器(Reader)以平滑、线性的固定速度从 Buffer 中读取画面。
- 总结:Buffer 的伟大之处在于,它通过“提前囤货”,吸收了网络延迟的可变性,将现实中非线性的到达数据,重新熨平为线性的连续流。
5. Packet Switching - Queue Models (队列模型)
5.1 Simple Model of a Router Queue (路由器队列简单模型)
- A(t)A(t)A(t):到时刻 ttt 为止,总共到达 (Arrive) 路由器的包裹数量。
- D(t)D(t)D(t):到时刻 ttt 为止,总共离开 (Depart/处理完毕) 路由器的包裹数量。
- Q(t)Q(t)Q(t):当前时刻排队的占用量,公式极其简单:Q(t)=A(t)−D(t)Q(t) = A(t) - D(t)Q(t)=A(t)−D(t)。
- FIFO 系统:最基础的模型假设所有数据包遵循先入先出 (First-In-First-Out)。这是一种剔除随机性的简单确定性队列模型 (Simple Deterministic Queue Model),可以用来初步计算平均队列长度。
5.2 Small Packets Reduce End to End Delay (小包减少延迟)
为什么不把 1GB 的文件直接塞进一个巨大无比的数据包里发送?
- 因为路由器是“存储-转发”机制。一个巨大的包在每一跳都要耗费极长的时间去接收(分组延迟巨大),这会导致整条链路被严重阻塞。
- 切分成多个小包后,包可以像“流水线”一样,在多个路由器之间并行传输 (Pipelining),显著降低整体端到端延迟,并增加信道利用率。
5.3 Statistical Multiplexing Gain (统计复用增益)
- 定义:根据多个数据流的瞬间流量需求,动态共享一条链路的带宽。
- 原理:假设 10 个人共享 100M 带宽。如果你用电路交换,每人固定分 10M,哪怕 9 个人在睡觉,你最多也只能用 10M。而在分组交换的统计复用下,如果其他人没发数据,你可以独享 100M。这就是增益!
6. Packet Switching - Useful Queue Properties (队列的数学特性)
现实中的队列往往是一个随机过程 (Random Process)。
6.1 突发性增加延迟 (Burstiness Increases Delay)
哪怕平均速率相同,数据包如果是“一阵一阵”扎堆涌来,排队延迟会急剧飙升。
6.2 确定性减少延迟 (Determinism Minimizes Delay)
如果数据包像节拍器一样极其规律、等间隔地到达,那么队列几乎不会发生拥堵,排队时间趋近于零。
6.3 Little’s Result (利特尔法则)
排队论中最优雅的公式:L=λ×WL = \lambda \times WL=λ×W。
只要知道平均到达率 (λ\lambdaλ) 和平均排队时间 (WWW),就能直接算出系统里的平均顾客/数据包数量 (LLL),反之亦然。无论队列内部多复杂,这个宏观定律永远成立。
6.4 The Poisson Process (泊松过程)
- 我们常用泊松分布来对数据包的“随机到达”进行数学建模。
- 警告 (Be Warned):真正的互联网流量其实并不是严格的泊松分布,而是极其具有突发性的(分形/自相似特征)。但泊松模型 M/M/1 队列作为一种理论工具,依然能帮我们很好地理解系统的稳定边界。
7. Packet Switching - How a Packet Switch Works (1) (交换机工作原理上)
7.1 Generic Packet Switch (通用动作)
任何交换机收到包后都要做几件事:查找目的地址 →\to→ 更新头部 (如校验和) →\to→ 丢入对应端口的输出队列。
7.2 Ethernet Switch (二层以太网交换机)
- 查 MAC 地址表。如果找不到,采取最笨但有效的办法:广播 (Flooding)。所有端口全发一份,等目标回应后,交换机就“学习”到了该地址。
7.3 Internet Router (三层互联网路由器)
处理 IP 地址,比以太网交换机复杂得多:
- 减少 TTL:防止死循环。
- 判断:如果 TTL 减到了 0,丢弃该包并发回 ICMP 报错。
- 更新:由于 TTL 变了,必须重新计算 Header Checksum。
- 查找转发表:决定下一跳设备的 MAC 地址。
7.4 Basic Operations: Lookup Address (核心操作:地址查找)
- 以太网 (Ethernet):精确匹配 (Exact Match)。
- 路由器 (IP):最长前缀匹配 (Longest Prefix Match)。例如
65.14.24.120会匹配路由表中前缀最详细的那一项(如65.0.0.0/8)。 - 硬件实现黑科技:TCAM
普通 CPU 查表太慢了。工业界使用 TCAM (Ternary Content Addressable Memory,三态内容寻址存储器)。除了 0 和 1,它还能识别“Don’t Care(无所谓)”状态。数据包丢进去,TCAM 能在 1 个时钟周期内硬件并发比对所有路由条目,瞬间出结果!
8. Packet Switching - How a Packet Switch Works (2) (交换机工作原理下)
8.1 Input Queued Packet Switch (输入队列交换机)
- Head-of-Line Blocking (队头阻塞):假设队列最前面的数据包要去出口 A(但出口 A 拥堵),即使排在它后面的数据包想去完全空闲的出口 B,也被前面这个包死死挡住出不去。这就是要命的队头阻塞现象。
- 解决方案 (VOQ, Virtual Output Queues):在输入端为每个输出端口维护一个独立的虚拟队列,想去哪儿就排哪个队,彻底解决互相挡道的问题。
8.2 Properties of OQ Switches (输出队列交换机)
现代高性能交换机致力于追求 OQ (Output Queued) 架构。它具备三大神级特性:
- 工作保存 (Work-conserving):只要输出链路上还有包没发完,交换机绝不休息,绝不浪费哪怕 1ms 的带宽。
- 吞吐量最大化:单位时间内压榨出硬件的处理极限。
- 延迟最小化:利用上述两点,将所有数据包的排队等待时间降到最低。
9. Packet Switching - Strict Priorities and Guaranteed Flow Rates (优先级与速率保证)
纯粹的 FIFO 队列存在一个大问题:遇到不讲理的“带宽恶霸”(疯狂发包),其他正常流量会被彻底淹没。
9.1 FIFO is a free for all (FIFO 的灾难)
先进先出意味着谁抢到位置谁先走。视频流和下载流混在一起,会导致重要的视频流被下载包卡死。我们需要在输出端设计调度器。
9.2 Strict Priorities (严格优先级)
- 机制 (如 IP ToS 字段):高优先级队列有包,就一直发高优先级的包,直到发空为止,才去看一眼低优先级队列。
- 致命缺陷 (饥饿现象 Starvation):如果高优先级包源源不断,低优先级的包就会被“饿死(Killed/Dropped)”,永远没有出头的日子。
9.3 Weighted Priorities (加权公平调度)
- 为了解决饥饿,我们给不同队列分配权重 (Weight)。比如 High 的权重是 2,Low 的权重是 1。
- 调度器采取轮询遍历 (Round-Robin) 的策略:每次从 High 发两个包,再从 Low 发一个包。这样不仅保证了 VIP 客户的体验,也让普通流量有路可走。
9.4 A practical way to do it (工业界实用做法: WFQ)
Weighted Fair Queuing (加权公平队列):调度器会根据数据包的到达时间、大小和预设权重,精确计算每个数据包的“理想完成时间”,并根据这个时间排序发送,从而实现极其平滑的流量调度。
10. Packet Switching - Guaranteed Delay (如何提供延迟保证)
10.1 Intuition (直觉思考)
回到端到端延迟公式,传播延迟和发送延迟是物理固定的,唯一波动的只有 Q(t)Q(t)Q(t) 排队延迟。如果我们能控制排队延迟的上限,就能给客户提供“确保延迟不超过多少毫秒”的服务质量保证 (QoS)。
10.2 Constraining Traffic (约束流量:漏桶模型)
如果不限制输入,队列迟早会溢出。数学家们引入了 (σ,ρ)(\sigma, \rho)(σ,ρ) 受限到达模型,也叫漏桶/令牌桶调节器 (Leaky-bucket regulator):
- ρ\rhoρ (Rho, 平均速率):约束数据流在长期观测下的平均发送速度不能超过 ρ\rhoρ。
- σ\sigmaσ (Sigma, 最大突发量):约束数据流在极短时间内,瞬间爆发的数据量不能超过 σ\sigmaσ。
结论:只要发送方承诺遵守 (σ,ρ)(\sigma, \rho)(σ,ρ) 的流量约束,网络服务商结合路由器的 Buffer Size,就能从数学上精确计算出 Q(t)Q(t)Q(t) 的最大值,从而向用户拍胸脯保证:你的数据包延迟绝对不会超过这个极值!

406

被折叠的 条评论
为什么被折叠?



