数据包 · Packet 篇
互联网发送信息,从来不是一整块扔过去——而是先切成一小块一小块,每块叫一个"数据包"(Packet)。这些包独立走自己的路,到了目的地再拼回来。这个看似简单的设计,是互联网能稳定运转 50 年的核心秘密。
你不会叫一辆大卡车把所有家具一次搬走——你会把沙发拆成几块、把书装箱、把餐具分门别类包好,每一箱都贴上标签:"厨房"、"客厅"、"书房",到了新家再拼起来。
为什么要这么做?
① 卡车装不下整家当;
② 一箱丢了还能单独补,不用全部重搬;
③ 不同的箱子可以走不同的路(有的走高速、有的走船)——哪条快到哪。
网络发数据,逻辑完全一样。大包拆小包、每个包贴序号、到了目的地再拼起来——这就是为什么你的视频哪怕跨越半个地球,画面也是完整流畅的。
一个数据包长什么样
每个数据包大致分两块——头部(Header)和载荷(Payload):
| 部分 | 类比 | 装的是什么 |
|---|---|---|
| 头部 · Header | 快递面单 | 源地址、目标地址、序号、长度、协议类型、校验码 |
| 载荷 · Payload | 快递内容 | 真正的数据——可能是网页代码的一小段、图片的一个分片、视频的一帧 |
一个快递包裹里——面单是"头部"(收件人、寄件人、单号、重量),里面的东西是"载荷"。
快递公司只看面单就能决定这包往哪送——根本不需要打开看里面是书还是袜子。
数据包也一样——路由器只读头部,不关心载荷里装的是什么字节。
包可以有多小?可以有多大?
数据包不是想多大就多大——受一个叫 MTU(Maximum Transmission Unit)的限制:以太网默认是 1500 字节。超过这个大小,就必须切片。
| 场景 | 典型包大小 | 备注 |
|---|---|---|
| 普通以太网 | 1500 B | 最常见的 MTU |
| 数据中心专用 Jumbo Frame | 9000 B | 减少头部开销,效率更高 |
| 语音 / 视频流 | 几十到几百 B | 小包降低延迟 |
| 纯 ACK 确认包 | 40-60 B | 只有头没有载荷 |
为什么要拆小?三个原因
- 公平共享互联网是亿万人共享的"高速路"。如果一个大文件占路半小时,其他人都得等着——拆小包让数据流"穿插",大家都能前进。
- 失败成本低一个 1MB 文件如果不拆,丢一次就得全重发;拆成 700 个 1.5KB 的包,丢一个只重传那一个,效率差 700 倍。
- 绕路灵活小包可以走不同路线——北京到上海的包可能一半走京沪光缆,一半绕西安。哪条不堵走哪条。
为什么"绕路"也能拼回去
这是新手最容易困惑的一点——包走的路线不同,到达时间不同,怎么保证最后拼出来的内容是正确的?答案是序号。
你有一份 100 页的报告,但每个信封最多塞 10 页——你只能拆成 10 个信封,分别寄给朋友。
① 你给每个信封标注:"第 1 页到第 10 页"、"第 11 页到第 20 页"……
② 朋友收到所有信封后,按编号排好,从 1 拼到 100。
③ 如果第 5 个信封没到,朋友就告诉你:"请重发第 5 封。"——不用重发全部 10 封。
这就是 TCP 协议做的事——给每个字节一个序号,按序号排序、按序号确认、按序号重传。
数据包的"生命周期"
1. 诞生
你的应用程序(比如浏览器)构造一份数据,TCP 协议栈把它切成若干段,每段加序号、加校验和,封装成 TCP 包。
2. 加 IP 头
TCP 包再被 IP 层包裹——加上源 IP 和目标 IP。现在它能被路由器识别了。
3. 加 MAC 头
IP 包再被以太网层包裹——加上源 MAC 和下一跳路由器的 MAC。现在它能从你家网卡出去了。
4. 一跳一跳转发
包经过你家路由器 → 运营商骨干 → 骨干网 → 对方运营商 → 对方路由器——每跳都会看一眼目标 IP,决定下一跳去哪。
5. 抵达目标
对方机器收到包,反过来一层一层"剥皮"——MAC 头撕掉、IP 头撕掉、TCP 头撕掉——剩下的就是真正的数据。
6. 拼装回完整内容
所有包都到齐了,TCP 按序号排序、检查有没有缺——齐了,交给应用程序(浏览器)渲染。
一个完整的数据包像一颗洋葱——MAC 头在最外层,IP 头在中间,TCP 头在更里,数据在最心。
每过一台路由器,路由器会撕掉外层(MAC 头),换上新的(自己的 MAC 头)继续往前送。最终目标机器一层层撕到最里,才看到真正的数据。
包丢了怎么办
- TCP 模式(可靠)接收方每隔一段时间告诉发送方"我收到 1-1500 号了"——发送方看到哪个号没收到,就自动重发。代价是慢一点。
- UDP 模式(快速)丢了就丢了,不管。优点是快——视频通话、直播、游戏用 UDP,丢一两帧你根本察觉不到。
你刚才看这篇文章,经过了多少数据包
粗略估算:本页 HTML + 样式 + 字体 + 图片 ≈ 300KB。
按每包 1500 字节算,大约需要 200 个数据包,从 Cloudflare 服务器发到你手机。这 200 个包跨越了十几个路由器,可能走了3-5 条不同路径,最终在 200 毫秒内全部到齐——你完全无感知。
数据包是互联网的"原子"——小而独立、贴序号、走自己的路、到了再拼。
这个看似简单的设计,让互联网能做到"任何一条线路断了都不影响整体"、"任何一段内容丢了只重传那一点"、"所有人共享同一张网而不互相堵死"。
下一次你看到"网络拥塞"、"丢包"、"MTU"这些词,脑海里就该浮现出"快递分箱"的画面。