从一个问题开始
你用手机把一段视频发到电脑上,文件"到了"。但它是怎么到的?
没有一根线专门跑这段视频,也没有一个"文件通道"凭空出现。真实情况是:你的视频被拆成了几十万个极小的数据包,每个包独立地、甚至走不同的路线穿过网络,到达电脑后再被重新拼装成原来的样子。
文件传输的实现原理,本质上就是回答四个问题:怎么拆、怎么发、怎么收、怎么拼回去。
一、文件传输的本质:把字节从一块内存搬到另一块内存
文件在磁盘上只是一段连续的字节。所谓"传输",就是:
源设备把这段字节从磁盘读入内存 → 交给网卡 → 网卡转成电信号/光信号/无线电波发出去 → 对端网卡收到 → 写入内存 → 落盘。
但中间隔着一整个网络。网络不保证数据能到、不保证顺序、不保证不丢、不保证不被篡改。所以需要在多个层次上加"保障机制"。
二、分层:每一层只管自己那一段事
文件传输不是某一个协议单独完成的,而是协议栈各层接力的结果。可以把它想象成寄快递:
| 层次 | 类比 | 实际协议 | 职责 |
|---|---|---|---|
| 应用层 | 你填快递单、决定寄什么 | FTP / HTTP / SMB / AirDrop | 决定"传什么文件、从哪到哪" |
| 传输层 | 快递公司保证包裹完整送达 | TCP / UDP / QUIC | 端到端可靠传输、流量控制 |
| 网络层 | 快递的路由规划 | IP | 寻址、选路 |
| 链路层 | 每一段公路上的运输 | Ethernet / Wi-Fi | 相邻节点之间的帧传输 |
| 物理层 | 公路本身 | 光纤 / 无线电波 / 网线 | 比特流的物理传输 |
文件从应用层一路"下潜",每经过一层就被加一个"信封"(头部),到了对端再一层层"拆信封"。
三、应用层:告诉系统"我要传什么"
应用层协议是用户直接打交道的部分。它负责:
- 建立会话:我是谁、我要连谁、认证凭据是什么
- 描述文件:文件名、大小、修改时间、权限
- 控制传输:开始、暂停、续传、取消
- 校验完整性:传完后比对哈希
举几个例子:
FTP用两条连接——一条发命令("给我 file.zip"),一条传数据。
HTTP用GET请求下载,用Range头实现断点续传("从第 100 万个字节开始给我")。
SMB在局域网里共享文件,还要处理文件锁(你正在编辑的文档别人不能同时改)。
AirDrop / 互传先用蓝牙发现设备,再建 Wi-Fi 直连,最后跑一个加密的 HTTP 传文件。
但不管应用层怎么设计,它最终都要把文件交给下一层——传输层。
四、传输层:文件传输的核心引擎
这是整个文件传输中最关键的一层。它要解决的核心问题是:
网络是不可靠的——包会丢、会乱序、会重复、会延迟。怎么在不可靠的网络上实现可靠的字节流传输?
4.1 TCP:最经典的解法
TCP(Transmission Control Protocol)的思路是:编号 + 确认 + 重传。
发送端做的事:
- 把应用层交下来的字节流切成段(Segment),每段通常 1~64 KB;
- 给每段编一个序号(Sequence Number),表示"这是整个流的第几个字节";
- 把段交给网络层发出去;
- 启动一个定时器,等对方的确认。
接收端做的事:
- 收到段,检查序号;
- 如果序号连续、数据完整,回一个ACK(确认号 = 已收到的最大序号 + 1);
- 如果序号不连续(中间缺了),只确认到连续的位置,后面的先缓着;
- 如果收到重复的段(序号已经确认过),丢弃,但重新回 ACK。
超时重传:
发送端如果在定时器到期前没收到 ACK,就认为这个段丢了,重发。
这就是 TCP 实现可靠传输的基本循环:
发送端 接收端 │── 段(seq=0, len=1460) ──→│ │── 段(seq=1460, len=1460)──→│ │ │ │←── ACK(1460) ─────────────│ (收到了前1460字节) │←── ACK(2920) ─────────────│ (又收到了下一个1460字节) │ │ │── 段(seq=2920, len=1460)──→│ (这个包丢了) │ │ │ ... 定时器超时 ... │ │── 段(seq=2920, len=1460)──→│ (重传) │←── ACK(4380) ─────────────│ (确认)4.2 滑动窗口:别一个一个发
如果每发一个段就停下来等 ACK,效率极低(大量时间在等)。TCP 用滑动窗口解决:
发送端可以连续发出多个段(窗口大小个),不用每个都等 ACK。
窗口大小由两个因素决定:
- 接收窗口(rwnd):接收方说"我的缓冲区还能装多少"
- 拥塞窗口(cwnd):发送方根据网络状况估算"网络还能承受多少"
实际窗口 = min(rwnd, cwnd)。
4.3 流量控制:别把接收方撑死
接收方通过 TCP 头部的Window 字段告诉发送方"我还能接收多少字节"。如果接收方处理不过来,就把窗口设为 0,发送方就暂停发送。
4.4 拥塞控制:别把网络堵死
发送方不能无限制地往网络里灌数据,否则路由器会丢包,所有人都慢。TCP 的拥塞控制经历了几个阶段:
慢启动:连接刚建立时,窗口从 1 个段开始,每收到一个 ACK 就翻倍(指数增长),快速探测带宽。
拥塞避免:窗口到达阈值后,改为线性增长(每 RTT 加 1)。
丢包响应:一旦检测到丢包(超时或收到 3 个重复 ACK),就认为网络拥塞了,立刻把窗口砍半或砍到 1,重新慢慢爬。
现代算法(如 BBR)不再依赖丢包信号,而是直接测量瓶颈带宽和最小 RTT,算出最优发送速率。
4.5 UDP + QUIC:另一条路
TCP 虽然可靠,但有个老毛病:队头阻塞。一个包丢了,后面所有包都得等着,哪怕后面的包已经到了。
QUIC 的做法是:跑在 UDP 上,自己在用户态实现可靠传输,但把数据分成多个独立的流(Stream)。流 A 丢了一个包,只阻塞流 A,流 B、C 完全不受影响。
QUIC 还内置了 TLS 加密(不用单独握手)、支持连接迁移(换网络不断连)、支持 0-RTT 快速重连。
五、网络层与链路层:包怎么从这台机器到那台机器
5.1 IP:寻址与路由
每个段被交给 IP 层后,加上源 IP 和目的 IP,变成一个IP 数据包。路由器根据目的 IP 查路由表,决定下一跳往哪走。一个文件的数据包可能经过十几个路由器,每个路由器独立做转发决策。
5.2 链路层:一跳一跳地走
IP 包到了每一段物理链路上,还要再包一层帧头(以太网帧或 Wi-Fi 帧),加上源 MAC 和目的 MAC 地址。链路层负责的是"相邻两个设备之间"的传输。
5.3 MTU 与分片
以太网帧的有效载荷最大 1500 字节(MTU)。如果一个 TCP 段超过 1500 字节,IP 层会把它分片成多个小片。接收端再根据分片信息重组。
现代实践中通常避免 IP 分片(通过 TCP MSS 协商让段不超过 MTU),因为分片丢失任何一片都要重传整个段。
六、物理层:字节变成信号
到了最底层,数字比特要变成物理信号才能在介质上传播:
| 介质 | 信号形式 | 编码方式 |
|---|---|---|
| 双绞线(网线) | 电压差分 | PAM-4 / PAM-5 |
| 光纤 | 光脉冲 | NRZ / PAM-4 |
| Wi-Fi | 无线电波 | OFDM + QAM 调制 |
| 蓝牙 | 无线电波(2.4 GHz) | GFSK / π/4-DQPSK |
| 5G 蜂窝 | 毫米波 / Sub-6 GHz | OFDM + 256-QAM |
物理层不关心"这是文件的第几个字节",它只负责把比特忠实地变成信号发出去、把收到的信号还原成比特。
七、接收端:逆过程
对端收到信号后,一切倒着来:
物理层:信号 → 比特 链路层:剥帧头,得到 IP 包,校验 FCS 网络层:剥 IP 头,得到 TCP 段,查目的端口 传输层:剥 TCP 头,按序号排序,去重,确认,重组字节流 应用层:拿到完整的文件字节,校验哈希,写入磁盘关键步骤:
- 排序:TCP 段可能乱序到达,接收端按序号放入缓冲区,等齐了再交给应用层。
- 去重:重传的段可能和原始段都到了,按序号去重。
- 校验:TCP 校验和(16 位)做基本检查;应用层再做 SHA-256 等强校验。
- 写入磁盘:所有字节到齐、校验通过后,操作系统把缓冲区的数据刷到磁盘。
八、大文件的特殊处理
传一个 50 GB 的文件和传一个 5 KB 的文本,面临的问题完全不同。大文件需要额外机制:
分片并行
把文件切成多个块,开多条 TCP 连接(或多线程)同时传。下载工具(IDM、迅雷)就是这么干的。
断点续传
记录已传输的偏移量,中断后从该偏移继续。HTTP 用Range头,FTP 用REST命令。
增量传输
rsync 的 rolling checksum 算法:两端各算一遍文件的块级校验和,只传有差异的块。100 GB 的文件改了 10 MB,就只传 10 MB。
校验分层
| 层次 | 校验对象 | 时机 |
|---|---|---|
| 每段 | TCP 校验和 | 每收到一个段 |
| 每块 | 块级 CRC / 哈希 | 每收到一个分片 |
| 全文 | SHA-256 | 整个文件收完后 |
九、安全:传输过程中的加密
裸传的文件在网络上是明文的,任何中间节点都能窥探。所以实际系统都会加密:
- TLS:HTTPS、FTPS、SMB 3.x 加密都基于 TLS。它在传输层和应用层之间插入一个加密层,对应用透明。
- 端到端加密:AirDrop、Signal 文件传输等,密钥只在两端,中间服务器即使拿到数据也解不开。
- 完整性保护:TLS 自带 MAC(消息认证码),防止中间人篡改。
十、把整个流程串起来
以"手机通过 Wi-Fi 直连传一个 200 MB 视频给电脑"为例,完整流程如下:
【发送端(手机)】 1. 应用层:用户点击"发送",互传协议协商好文件名、大小、哈希 2. 应用层:文件从闪存读入内存缓冲区 3. 传输层:TCP 把字节流切成 ~64 KB 的段,加序号 4. 网络层:每段加 IP 头(源=手机 IP,目的=电脑 IP) 5. 链路层:加 Wi-Fi 帧头(源/目的 MAC),OFDM 调制 6. 物理层:2.4/5 GHz 无线电波发出 ~~~ 无线电波穿过空气 ~~~ 【接收端(电脑)】 7. 物理层:网卡收到信号,OFDM 解调,还原比特 8. 链路层:剥 Wi-Fi 帧头,校验 FCS,交给 IP 层 9. 网络层:剥 IP 头,查目的端口,交给 TCP 10. 传输层:按序号排序,回 ACK,重组字节流 11. 应用层:收到完整文件,比对 SHA-256 哈希 12. 应用层:写入磁盘,更新文件系统元数据 13. 应用层:通知用户"接收完成"整个过程大约 3~5 秒(取决于 Wi-Fi 速率)。期间可能有几千个 TCP 段在飞,可能丢了几个被重传,但用户完全无感。
十一、总结:实现原理的五个支柱
把文件传输的实现原理提炼为五个核心机制:
| 支柱 | 解决的问题 | 关键技术 |
|---|---|---|
| 分层封装 | 各层职责分离,互不干扰 | 协议栈、头部嵌套 |
| 编号与确认 | 保证不丢、不乱、不重 | TCP 序号、ACK、重传 |
| 流量与拥塞控制 | 不撑死接收方、不堵死网络 | 滑动窗口、慢启动、BBR |
| 分片与重组 | 适配链路 MTU、支持并行 | MSS 协商、IP 分片、应用层分块 |
| 校验与加密 | 保证完整性和机密性 | CRC、SHA-256、TLS |
这五个支柱协同工作,才让"把文件从 A 搬到 B"这件看似简单的事,在充满噪声、丢包、乱序、拥塞的真实网络中,做到了可靠、高效、安全。
文件传输没有什么魔法。它就是编号、确认、重传、校验这八个字,在七层协议栈上反复运转。朴素,但极其有效。