公众号旧文
为什么 3Mbps 的小水管,能跑出 30Gbps?
我有一台 3Mbps 的阿里云ECS:

这台服务器的公网出口带宽上限,也就是 3Mbps。
但刚刚,我突发奇想,在这台 2核2G 的 阿里云 ECS 的小水管上。
跑出了 30Gbps
没错,不是 30Mbps,而是 30000Mbps
相差整整一万倍。
这到底是怎么回事?
一、第一层:服务器内部的理论带宽
首先,我测试了最经典的一种情况:
iperf3 -c 127.0.0.1 -P 8 -t 10
这里的 127.0.0.1,大家都知道是本机 IP。
但实际上,它是 Linux 内核里的一个特殊接口:
lo
数据路径大概是:
应用程序
→ Linux TCP/IP 协议栈
→ lo
→ Linux TCP/IP 协议栈
→ 应用程序
注意,在这个过程中:
- 不经过网卡
- 不经过交换机
- 不经过公网
- 不经过运营商
连网线都不存在。
本质上它测的是:
CPU + 内存 + Linux 内核
最终结果:
- - - - - - - - - - - - - - - - - - - - - - - - -
[ ID] Interval Transfer Bitrate Retr
[SUM] 0.00-10.00 sec 34.9 GBytes 30.0 Gbits/sec 7 sender
[SUM] 0.00-10.00 sec 34.9 GBytes 30.0 Gbits/sec receiver
≈ 30Gbps
也就是说,虽然这台服务器公网只有 3Mbps
但在机器内部,却能轻松跑到 30000Mbps
二、第二层:虚拟网卡层
随后,我继续测试:
iperf3 -c 172.22.184.73 -P 8 -t 10
这里的 172.22.184.73 已经不是 loopback。
而是真正的 eth0 网卡。
虽然数据依然没有离开这台机器。
但已经开始经过:
- virtio
- vSwitch
- hypervisor
- 虚拟网卡驱动
于是速度掉到了:
[ ID] Interval Transfer Bitrate Retr
[SUM] 0.00-10.01 sec 25.0 GBytes 21.4 Gbits/sec 12 sender
[SUM] 0.00-10.01 sec 25.0 GBytes 21.4 Gbits/sec receiver
≈ 21Gbps
你会发现,哪怕还没出公网。
仅仅只是多走了一层。
速度就已经开始变化了。
三、第三层:同机房内网
事实上,在进入公网之前。
还有非常重要的一层:同机房内网
比如:
北京阿里云 ECS A
↔
北京阿里云 ECS B
如果它们:
- 在同地域
- 同 VPC
- 同交换网络
很多时候内网速度甚至可以达到:
1Gbps
10Gbps
甚至更高
而且很多云厂商的内网流量并不收费。
这时候,数据已经真正离开了机器。
开始经过:
- 物理交换机
- TOR
- Spine
- Leaf
- 数据中心 Fabric
但还没有进入公网世界。
四、第四层:真正的公网世界
最后,我测试了真正的跨机器通信。
用这台北京阿里云 ECS 连接我的日本服务器。
结果自然变成了:
[ ID] Interval Transfer Bitrate Retr
[SUM] 0.00-10.00 sec 5.25 MBytes 4.40 Mbits/sec 659 sender
[SUM] 0.00-10.27 sec 4.06 MBytes 3.32 Mbits/sec receiver
≈ 3Mbps
这时,购买机器时看到的:
公网带宽:3Mbps
终于真正开始生效。
因为数据已经真的离开了数据中心。
开始经过:
- 云厂商公网出口
- NAT
- 跨境链路
- 国际运营商
- 海缆
- TCP 拥塞控制
甚至还出现了大量:
Retr(TCP重传)
也就是说,这时候影响速度的。
已经不仅仅是带宽。
还有:
- 延迟
- 丢包
- QoS
- 路由质量
- 跨境拥塞
五、最反直觉的地方
你会发现,同一台 3Mbps 小水管。
理论上可能同时存在四种速度:
30Gbps(内核层)
21Gbps(虚拟网卡层)
1~10Gbps(同机房内网)
3Mbps(公网出口)
而且它们全都是真的。
区别只在于你测的是哪一层。
很多人理解的网速,都是公网出口速度。
但在公网之前,在 Linux 内核里。
数据甚至可以以几十Gbps的速度疯狂搬运。
所以,带宽不是一个绝对数字,而是一个位置相关的数字。
你站在公网出口看,它是 3Mbps。
你站在 Linux 内核里看,它就是 30Gbps。
扩展阅读: