公众号旧文

发送文件时,大文件比一堆小文件传输更快,但为什么网络中的 IP 数据包却不是包越大网速越快?

作者:胖子阅读 —

相信很多人都有这样的体会:

在电脑上复制文件时,一个大文件往往比一堆同样总大小的小文件更快。

那么顺着这个经验,很容易得出一个推论:

在网络中传输数据,IP 数据包越大,网速就越快。

但实际上,答案是:只对了一半。

因为它们的背后是两个完全不同层面的机制在起作用。


一、先来看为什么大文件更快

当我们复制文件时,速度慢的根本原因,往往不在于数据本身,而在于“操作次数”。每一个文件,都会经历一整套流程:打开文件、读取元数据、分配资源、写入目标位置、关闭文件。这个过程看起来很简单,但在操作系统内部,却涉及大量系统调用和磁盘寻址。

如果是一个1GB的大文件,这些流程只执行一次;但如果是1万个100KB的小文件,这套流程就要执行1万次。时间并不是耗在“传输数据”上,而是被这些重复的管理动作消耗掉了。

所以你看到的是:数据总量一样,但小文件更慢。


二、但网络世界完全是另一回事儿

在网络中传输数据时,数据会被切分成一个个“数据包”,通过 TCP 和 IPv4 这样的协议一层层封装,再发送出去。

这里确实存在一个类似的现象:

数据包越大,单位数据的“协议开销”越低。

比如每个数据包都要带上额外的信息(头部):

IP 头大约 20 字节

TCP 头大约 20 字节

如果你发送 100 字节的数据,40 字节的头部就显得很“浪费”;但如果发送 1400 字节的数据,这 40 字节几乎可以忽略。

从这个角度看,确实是“包越大越高效”。


三、但问题在于现实中的网络并不是一个完全理想的环境

首先,有一个非常现实的限制,叫做 MTU(最大传输单元)。在 Ethernet 网络中,这个值通常是1500 字节。这意味着,一个数据包如果超过这个大小,就无法一次性发送出去。

如果强行发送更大的包,就会发生“分片”:一个大包被拆成多个小包分别传输,然后在接收端再重新拼起来。听起来似乎没什么问题,但实际情况是——只要其中一个碎片丢失,整个数据包就必须重传。

这就带来了一个非常严重的后果:

包越大,失败成本越高。


四、其次是网络的不稳定性

现实中的网络并不是完全可靠的,尤其是在无线网络、跨国链路或者拥塞环境中,丢包是常态。如果一个小包丢了,重传的数据很少;但如果一个很大的包丢了,就需要重传大量数据。

这就像寄快递:

小包裹丢了,补发一个就行

大包裹丢了,损失更大,补发更慢

因此,在不稳定的网络中,过大的数据包反而会拖慢整体速度。


五、还有一个常被忽视的点,是网络设备的处理能力

路由器和交换机处理数据是“逐包进行”的。如果包太小,会导致每秒处理的包数量(PPS)过高,设备压力变大;但如果包太大,又会占用更多缓冲区,增加延迟,甚至影响其他流量。

所以网络工程中,从来不是简单追求“越大越好”,而是寻找一个平衡点。


六、这个平衡点,在实践中已经非常明确

以太网的 MTU 是 1500 字节,扣掉 IP 和 TCP 头部后,真正用于数据传输的部分大约是1460 字节。这就是为什么你在抓包时,经常看到 TCP 的数据段大小接近这个数值。

换句话说,现代网络的默认策略其实是:

尽量把数据包做大,但严格控制在不会分片的范围内。


七、回到最初的问题,我们就可以得到一个更准确的理解

在本地文件系统中,大文件更快,是因为减少了操作次数和管理开销;

而在网络中,数据包确实“适当大”更高效,但一旦超过网络的承载能力,就会带来分片、丢包成本上升、设备压力增加等一系列问题。

所以最终形成的结论是:

网络传输并不是包越大越快,而是在“刚好不分片”的前提下,越接近上限越高效。

扩展阅读:


原来在 Windows 上也可以 apt install ?

全球几十亿网络设备,靠多少台时间服务器在维持?

Tailscale 进化:Peer Relay (对等中继) 上线

Gmail 用户终于可以“改名不换号”了