2026-05-07 18:25:36
两台设备通过热点组成局域网,用 rsync 传大量文件——这是极其常见的场景:手机开热点、电脑连上来传照片;或者电脑开热点、手机连上来备份数据。
但实际速度往往远低于网卡标称速率。问题出在哪一层?
WiFi 速率从标称 1200Mbps 到实际文件传输 20MB/s(160Mbps),损耗超过 85%——这不是单一瓶颈,而是物理层→TCP层→应用层(rsync)的多层叠加效应。
本文将问题拆成三层,逐层分析并给出优化方法。
| 角色 | 设备 | 网络位置 |
|---|---|---|
| AP(热点提供方) | Android 手机 / Linux PC | 创建 WiFi 局域网 |
| Client(连接方) | Linux PC / Android 手机 | 连入热点 |
| 传输工具 | rsync (over SSH 或 daemon) | 应用层 |
| 网络类型 | 纯局域网,流量不经蜂窝网 | — |
文件传输方向可能为 AP→Client 或 Client→AP,两者在 WiFi 层不对称(AP→Client 下行和 Client→AP 上行速率可能不同)。
WiFi 物理层协商速率由四个参数决定:
| 参数 | 含义 | 典型消费级设备上限 |
|---|---|---|
| MCS Index | 调制编码策略 | 9 (ac, 256-QAM), 11 (ax, 1024-QAM) |
| Spatial Streams (NSS) | 空间流数 | 2(手机/笔记本) |
| Channel Width | 信道带宽 | 80 MHz(大多数), 160 MHz(高端) |
| Guard Interval (GI) | 符号间保护间隔 | 400ns (short), 800ns (long) |
给定这四个参数,查 IEEE 标准表即得 PHY 速率。例如 2×2 MIMO + 80MHz + MCS 11 + SGI = 1201 Mbps。
| 协议 | 最大带宽 | 最高 MCS | 最大 PHY 速率 |
|---|---|---|---|
| 802.11n (WiFi 4) | 40 MHz | 7 (64-QAM) | 300 Mbps |
| 802.11ac (WiFi 5) | 80 MHz | 9 (256-QAM) | 866 Mbps |
| 802.11ac Wave 2 | 160 MHz | 9 | 1733 Mbps |
| 802.11ax (WiFi 6) | 80 MHz | 11 (1024-QAM) | 1201 Mbps |
| 802.11ax (WiFi 6) | 160 MHz | 11 | 2402 Mbps |
# 查看当前协商速率(最直接的诊断命令)
iw dev wlan0 link
# => tx bitrate: 866.7 MBit/s VHT-MCS 9 80MHz short GI VHT-NSS 2这条输出告诉你当前实际协商的 MCS、带宽、GI 和流数。对照上表,如果发现:
MCS 7(而非 9/11)→ 信号不够好,设备退而求其次20MHz(而非 80/160)→ 配置或兼容性问题NSS 1(而非 2)→ 天线/信号问题iw list # 完整硬件能力关键输出段落:
Band 2: (5 GHz)
HT20/HT40 ← 802.11n 支持 40MHz
VHT80/VHT160 ← 802.11ac 支持 80/160MHz
VHT RX MCS set:
1 streams: MCS 0-9 ← 单流最高 MCS 9
2 streams: MCS 0-9 ← 双流最高 MCS 9
3 streams: not supported ← 最大 2 流
如果 iw list 显示支持 VHT160 但
iw dev wlan0 link 只跑在
80MHz,说明存在可优化的空间。
| 现象 | 可能原因 | 验证方法 | 解决 |
|---|---|---|---|
| 2.4GHz 而非 5GHz | 配置/兼容性 | iw dev wlan0 link 看 freq |
强制 5GHz 信道 |
| 20MHz 而非 80MHz | hostapd 配置错误 | iw list vs iw link 对比 |
检查 vht_oper_chwidth |
| NSS=1 而非 2 | 天线问题/距离 | iw link 看 NSS |
靠近设备 |
| MCS 偏低 | 信号弱/干扰 | iw link 看 signal |
换信道,靠近 |
| 54Mbps 封顶 | wmm_enabled=0 |
hostapd.conf | 必须设为 1 |
| TX Power 极低 | country_code 错误 | iw reg get |
iw reg set <CC> |
| AP 角色 | 优点 | 缺点 |
|---|---|---|
| Linux PC 做 AP | 天线好、不发热降频、TX power 大、可精细调优 | Intel 网卡 5GHz 不能做 AP;需要 hostapd 配置 |
| Android 手机做 AP | 零配置、便携 | 发热降频、天线弱、不可调参 |
关键选择一:如果 PC 网卡是 Intel(AX200/AX210 等),5GHz AP 模式几乎不可用——Intel 的 LAR(Location-Aware Regulatory)机制要求先侦听到合法的 5G AP beacon 才允许自己发射,这在 AP 模式下形成死锁。Intel 仅支持 2.4GHz AP。
关键选择二:如果 PC 网卡是 MT7921/MT7922 或 RTL8852BE 等,推荐 PC 做 AP,性能远超手机热点。
interface=wlan0
driver=nl80211
ssid=FastTransfer
hw_mode=a # a=5GHz, g=2.4GHz
channel=36 # 36-48 非DFS,兼容性最好
country_code=US
wmm_enabled=1 # 必选!否则 11n/ac/ax 全部失效
# 802.11n (HT)
ieee80211n=1
ht_capab=[HT40+][HT40-][SHORT-GI-20][SHORT-GI-40][MAX-AMSDU-7935]
# 802.11ac (VHT) — 80MHz
ieee80211ac=1
require_vht=1
vht_capab=[MAX-AMSDU-7935][SHORT-GI-80]
vht_oper_chwidth=1
vht_oper_centr_freq_seg0_idx=42 # 信道36-48 → 42
# 802.11ax (HE) — 如硬件支持
ieee80211ax=1
he_capab=[HE80]
# 安全:CCMP(AES) 最快,避免 TKIP
wpa=2
wpa_key_mgmt=WPA-PSK
wpa_pairwise=CCMP
rsn_pairwise=CCMP
wpa_passphrase=secretpass信道与中心频率对照(80MHz):
| 信道范围 | seg0_idx |
|---|---|
| 36-48 | 42 |
| 52-64 | 58 |
| 149-161 | 155 |
手机热点几乎没有可调参数,但有几件事可以控制:
| 现象 | 原因 | 解决 |
|---|---|---|
| hostapd 启动报错 | 网卡不支持 AP 模式 | iw list \| grep "AP" 确认能力 |
| 连不上 5GHz | DFS 信道等待 | 用 ch 36-48(非DFS) |
| 速度上不去 | wmm_enabled=0 |
设为 1 |
vht_oper_chwidth 不生效 |
seg0_idx 错误 | 对照上表 |
这是最常见却被忽视的性能黑洞。 WiFi 链路调好后,rsync 本身的参数选择经常将实际文件吞吐拉到物理极限的 30% 以下——尤其是大量小文件的场景。
# --- WiFi 层面 ---
iw dev wlan0 set power_save off # 关省电,WiFi 性能的首要杀手
ip link set wlan0 txqueuelen 4096 # 增大发送队列
# --- TCP 层面 ---
sysctl -w net.core.rmem_max=16777216
sysctl -w net.core.wmem_max=16777216
sysctl -w net.ipv4.tcp_rmem="4096 87380 16777216"
sysctl -w net.ipv4.tcp_wmem="4096 65536 16777216"
sysctl -w net.ipv4.tcp_congestion_control=bbr# 最优 LAN 传输命令
rsync -avW --no-compress --inplace --info=progress2 /source/ user@host:/dest/| 参数 | 作用 | 为什么重要 |
|---|---|---|
-W (--whole-file) |
跳过 delta 算法,直接传整个文件 | 大量小文件的首要杀手。 delta 对每个文件计算滚动校验和,对小文件来说计算开销远超直接传输。LAN 带宽足够,不需要 delta |
--no-compress |
不压缩 | LAN 上压缩浪费 CPU,得不偿失 |
--inplace |
直接写入目标文件,不用临时文件+rename | 减少目标端 I/O |
--info=progress2 |
显示整体进度而非逐文件 | 不会刷屏,能看到总体速度 |
-z 的取舍 |
默认 -a 不含 -z |
不要加 -z,除非传的都是未压缩文本 |
rsync 默认走 SSH 隧道。SSH 加密对 LAN 传输有两重开销:
| CPU 类型 | SSH 加密开销 | 影响 |
|---|---|---|
| 现代 x86(有 AES-NI) | 可忽略 | 1Gbps 链路基本不受影响 |
| ARM / 手机 / NAS | 10-30% CPU | 可能成为瓶颈 |
| 10Gbps+ 链路 | SSH 窗口限制 | 单流 2-4Gbps 封顶 |
结论:普通 WiFi LAN(PHY < 2Gbps,实际 < 1Gbps),rsync over SSH 即可。 加密开销在 AES-NI 硬件上可以忽略。
如果双方的 CPU 都很弱(老旧 ARM NAS 等),可考虑 rsync daemon 模式(免加密,端口 873):
# 服务端
cat > /etc/rsyncd.conf << 'EOF'
[share]
path = /srv/data
read only = no
EOF
rsync --daemon
# 客户端
rsync -avW --no-compress /source/ rsync://host/share/这是 rsync LAN 传输最常见的性能灾难。
rsync 对每个文件有固定开销:stat() →
checksum → send metadata →
transfer data。对于 KB
级别的小文件,这些开销远超数据传输本身,导致有效吞吐量暴跌 50-90%。
解决方案,按效果排序:
将文件列表拆成 N 份,并行跑 N 个 rsync 进程:
# msrsync 方式(推荐)
msrsync -p 8 -r '-avW --no-compress' /source/ host:/dest/
# 或 GNU Parallel 手动拆分
cd /source && find . -type f | parallel -j8 --files --pipe --block 10M \
'rsync -avW --no-compress --files-from=- /source/ host:/dest/'效果:典型 10 万个小文件场景,单 rsync 12 分钟 → 48 秒(约 15× 提升)。
如果不是增量同步而是首次全量,rsync 的逐文件开销完全是浪费:
# 接收端
nc -l 9999 | pv | tar xv -C /dest/
# 发送端
tar cv /source/ | pv | nc <receiver_ip> 9999无逐文件开销、无 SSH 加密、无 delta 计算——最接近裸 TCP 吞吐。缺点是无增量/断点续传能力。
rsync -avW --no-compress --inplace --no-inc-recursive \
--no-motd --ignore-existing --include='*/' --include='*.jpg' --exclude='*' \
--info=progress2 /source/ host:/dest/--no-inc-recursive:禁用增量递归(减少内存和预扫描时间)--ignore-existing:跳过接收端已有文件(增量同步时)如果传输的是少量大文件(ISO、视频等),瓶颈不在文件数而在 TCP 流本身:
# 多并行流(多个大文件同时传)
rsync -avW --no-compress --info=progress2 \
--rsh='ssh -c [email protected] -o Compression=no' \
/source/ host:/dest/如果要真正逼近物理极限,可以多实例同时传不同文件:
# 找大文件
find /source -type f -size +100M > big_files.txt
# 并行传
cat big_files.txt | parallel -j4 rsync -avW --no-compress {} host:/dest/| 现象 | 可能原因 | 解决 |
|---|---|---|
| 大量小文件速度极慢(< 5MB/s) | rsync 逐文件开销 | -W + 并行 rsync |
| iperf3 满速但 rsync 慢 | delta 计算或 SSH 开销 | -W --no-compress |
| CPU 满载 | SSH 加密或压缩 | 去掉 -z,换快速 cipher |
| 传输慢且 iperf3 也慢 | WiFi/TCP 层问题 | 回到第一/二层诊断 |
| 增量同步慢 | 逐文件校验 | 用 --ignore-existing 跳过已有;增量扫描不可避免 |
这是三层调优做完之后,可能仍然存在的硬限制。
PC1 ──WiFi──> 手机AP ──WiFi──> PC2
866Mbps 866Mbps
iperf3 单链路:PC1↔Phone 或 PC2↔Phone → 500-1000 Mbps ✓
PC1 → PC2 中转: → ~300 Mbps ✗
单链路满速,中转直接腰斩。这不是配置问题,是 WiFi 半双工共享介质的物理规律。
WiFi 是半双工、共享信道。AP 只有一个无线电,同一时刻只能和一个客户端通信:
时间片拆分:
t1: PC1 → AP (数据包上行)
t2: AP → PC2 (数据包下行)
t3: PC1 → AP (下一个包)
t4: AP → PC2 (下一个包)
...
一个数据包从 PC1 到 PC2 要占用两倍的空口时间:入站一次、出站一次。再加上 CSMA/CA 竞争退避、ACK 帧开销,理论极限就是单链路速率的 40-50%。
300Mbps ≈ 866Mbps × 40%——数字完全对得上。
除此之外,手机 AP 在中间做 NAT 路由而非二层桥接,每个包要经过 netfilter/conntrack,CPU 负担进一步恶化:
PC1 → AP: WiFi 上行 (空口时间 50%)
AP 内部: NAT/conntrack (CPU)
AP → PC2: WiFi 下行 (空口时间 50%)
| 方法 | 原理 | 可行性 | 预期效果 |
|---|---|---|---|
| 换 PC 做 AP | 数据源/目的地之一就是 AP,消除一跳 | ✅ 推荐(PC 网卡支持的话) | 接近单链路速率 |
| USB 有线连接 | 一台 PC 通过 USB tethering 连手机,另一台用 WiFi | ✅ 最简单 | USB 侧不占空口,WiFi 侧跑满 |
| WiFi Direct | 两台 PC 直接 P2P 连接,不经过 AP 中转 | ⚠️ 需网卡支持 | 单跳,接近满速 |
| 手机双频热点 | PC1 连 2.4G,PC2 连 5G(或反之),不同信道不共享空口 | ⚠️ 需手机支持双频同时广播 | 接近单链路速率 |
| 以太网替代一侧 | 一台 PC 用有线连路由器,另一台用 WiFi | ✅ 如果有路由器 | 有线侧不占 WiFi 空口 |
方案 A:PC 网卡能做 AP(MT792x / RTL8852)→ PC 开热点
PC1 (AP) ──WiFi──> PC2 (Client)
单跳,无中转
数据直接从 PC1 的 WiFi 接口发到 PC2,只经过一次空口传输,速率接近单链路上限。
方案 B:PC 网卡是 Intel(不能做 5G AP)→ USB tethering + WiFi 混合
PC1 ──USB──> 手机AP ──WiFi──> PC2
有线侧 无线侧
USB tethering 不占 WiFi 空口。PC1 通过 USB 把数据发给手机,手机用全部 WiFi 带宽传给 PC2——单链路速率基本不损耗。这是绕过 Intel 网卡限制和 WiFi 中转损耗的最简单方法:
# 手机 USB 连接 PC1,开启 "USB 网络共享"
# PC1 上会出现 usb0 接口
# 然后在 PC1 上启动 rsync 服务端,PC2 通过手机热点的 WiFi IP 连接 PC1
# PC1 (USB 连接手机):
rsync -avW --no-compress /source/ user@<PC2_WiFi_IP>:/dest/方案 C:只能手机做 AP,两台 PC 都 WiFi 连接 → 接受物理限制
中转损耗是硬性的,此时能做的只是确保链路本身是最优的: - 两台 PC 都连 5GHz - 手机和两台 PC 保持近距离等距 - 关省电模式 - iperf3 验证单链路能跑满,然后接受中转 ≈ 40% 的现实
如果手机支持双频同时热点(Android 16+ 的 2.4+6G 模式),可以让一台 PC 连 2.4GHz、另一台连 5GHz——两个频段不共享空口,中转损耗可大幅降低。
graph TD
A[iw dev wlan0 link<br/>查看当前 PHY 速率] --> B{达到硬件上限的<br/>60-70%?}
B -->|否| C[第一层:检查 MCS/NSS/<br/>带宽/GI/频段]
B -->|是| D[iperf3 测试 TCP 吞吐]
D --> E{达到 PHY × 0.65?}
E -->|否| F[第二层:hostapd 配置<br/>/系统 TCP 参数]
E -->|是| G{数据经过 WiFi 中转?<br/>PC→AP→PC?}
G -->|是| H[第四层:消除中转<br/>换 PC 做 AP / USB 有线 / WiFi Direct]
G -->|否| I[rsync 传输基准测试]
I --> J{是否是大量小文件?}
J -->|是| K[第三层:-W + 并行 rsync<br/>或 tar+nc]
J -->|否| L[第三层:-W --no-compress<br/>基本够用]
| 场景 | 推荐方案 | 预期吞吐(相对 PHY) |
|---|---|---|
| 少量大文件,增量同步 | rsync -avW --no-compress |
50-65% |
| 少量大文件,首次全量 | rsync -avW --no-compress --inplace |
55-70% |
| 大量小文件,增量同步 | msrsync -p8 -avW --no-compress |
取决于文件大小分布 |
| 大量小文件,首次全量 | tar + nc |
65-75%(逼近裸 TCP) |
| 手机热点中转(PC→手机→PC) | USB tethering + WiFi 混合,或换 PC 做 AP | 单链路 40-50%(物理硬限) |
| 手机热点 + PC(直连) | PC 关省电,手机强制 5G + 散热 | 热点硬件是天花板 |
| PC 热点(MT792x) 直连 | hostapd 最优配置 + 5GHz | 接近硬件极限 |
| PC 热点(Intel) 直连 | 仅 2.4G,或 USB 外接 MT792x 网卡 | 2.4G 上限 ~150Mbps |
四层优化,按优先级排:
wmm_enabled=1、正确
country_code、AP 角色选择(Intel 别做 5G AP)rsync -W(跳过
delta)、--no-compress、大量小文件用并行 rsync 或
tar+nc针对你的现象:手机热点中转跑 300Mbps,单链路能跑 500-1000Mbps——这不是配置问题,是 WiFi 半双工共享介质在中转场景下的硬限制(~40-50%)。 解决方案:让一台 PC 做 AP,或 USB tethering + WiFi 混合连接。
如果 WiFi 热点不够快,两台 Linux 电脑间建立直连链路有哪些硬件方案?以下是三种主流选择的实测数据对比。
| 指标 | 10GbE 直连 | Thunderbolt/USB4 网络 | WiFi Direct (P2P) |
|---|---|---|---|
| 实际 TCP 吞吐 | ⭐⭐⭐⭐⭐ ~9.5 Gbps | ⭐⭐⭐⭐ ~11-18 Gbps | ⭐⭐ ~0.2-1.2 Gbps |
| 延迟 | ~20-25 µs | ~15-20 µs(最低) | ~2-10 ms |
| 双工 | 全双工 | 半双工(~11 Gbps/方向) | 半双工(共享) |
| 线缆长度 | 最长 100m | <2m(被动),<3m(主动) | ~30-100m(无线) |
| 已有端口成本 | 需额外网卡 | $15-60(仅线缆) | $0 |
| 无端口时成本 | $50-200(2 网卡+线) | $30-120(扩展卡+线) | $0-60(可能需要外置网卡) |
| 配置难度 | 低 | 中 | 高 |
| Linux 驱动成熟度 | 优秀 | 良好 | 差 |
| 可靠性 | 极高 | 良好(少量桥接 bug) | 受干扰影响大 |
两条网线对插,配个 IP 就能跑满万兆。不需要交换机——现代网卡都支持 Auto MDI-X,普通 Cat6a 线直连即可。
推荐硬件: - 二手企业卡($25-40/张):Mellanox ConnectX-3/4、Intel X520/X540,PCIe 插上即用 - 全新消费卡($100-150/张):TP-Link TX401、ASUS XG-C100C - 线缆:Cat6a/Cat7 ~$15-30(短距离),或 SFP+ DAC 线 ~$20-40
配置:
# 两台机器各配一个 IP,搞定
# PC1
ip addr add 10.0.0.1/24 dev eth1
# PC2
ip addr add 10.0.0.2/24 dev eth1
# 实测
iperf3 -c 10.0.0.2 # 预期 ~9.4-9.9 Gbps优点:全双工、最稳定、CPU 开销最低(硬件卸载)、线长可达 100m。需要更高带宽时可以 bond 多张卡。
缺点:需要 PCIe 插槽(笔记本通常没有),除非用 Thunderbolt 转 10GbE 适配器。
如果两台电脑都有 TB3/TB4 或 USB4 接口,只需一根线就能获得比万兆更快的连接。
关键认知:TB4 标称 40Gbps 是物理层速率。IP 网络跑在其上是半双工的,实际单向吞吐约 11-18 Gbps——差不多是 10GbE 的 1.2-1.8 倍,但远不是 40Gbps。
驱动:Linux 内核自带 thunderbolt-net
模块。插上线后会自动出现 thunderbolt0 网络接口。
# 加载驱动(一端执行即可,对端自动触发)
modprobe thunderbolt-net
# 配置 IP
# PC1
ip link set thunderbolt0 up
ip addr add 10.0.0.1/24 dev thunderbolt0
# PC2
ip link set thunderbolt0 up
ip addr add 10.0.0.2/24 dev thunderbolt0
# 设置巨帧 MTU 提升吞吐
ip link set thunderbolt0 mtu 65520
# 实测
iperf3 -c 10.0.0.2 # 预期 ~11-18 Gbps实测数据(iperf3 TCP): - TB3 直连 (kernel 6.14):~9.4-10 Gbps - TB4/USB4 直连 (AMD):~13.7 Gbps(大数据包)、~11.7 Gbps(4K 小包) - Strix Halo USB4:~11 Gbps/方向
优点:单线缆即插即用(USB4);延迟最低(~15-20 µs);零额外成本(如果已有端口)。
缺点:半双工,总带宽有限;线缆极短(<2m);AMD USB4 和 Intel TB4 实现有差异;桥接模式下有已知性能 bug(TB→以太网方向可能掉到 ~5Mbps,kernel 6.14 中仍在修复)。
笔记本没有 PCIe 插槽也没有 Thunderbolt 时的折中选择。
芯片:Realtek RTL8156/B,USB 3.0 接口,支持 2.5GBASE-T。
实测吞吐:~2.3 Gbps(280 MB/s),接近线速。但有几个坑:
# 1. 检查驱动是否正确(必须 r8152,不是 cdc_ncm)
ethtool -i eth1 # driver: r8152 ✓
# 2. 检查协商速率和双工
ethtool eth1 # Speed: 2500Mb/s, Duplex: Full ✓
# 3. 如果驱动错误,手动修复
modprobe -r cdc_ncm
modprobe r8152驱动陷阱:内核有时错误加载 cdc_ncm 而非
r8152,导致速度下降 2-4 倍(~500-750 Mbps)且频繁断连。内核
5.13+ 自带正确的 r8152 驱动。
成本:单个适配器 ~$15-30,配 Cat5e/Cat6 线即可。
两台电脑不经过 AP 直接通过 WiFi P2P 连接。理论可跑到 867Mbps (11ac 2×2),但 Linux 上的实际体验极差:
wpa_supplicant +
p2p_find + p2p_connect + PIN 交换结论:除非绝无可能拉线,否则不要用 WiFi Direct。
两台电脑都有 Thunderbolt/USB4 接口?
├── 是 → 方案二(Thunderbolt),$15 买根线就行,~11-18 Gbps
└── 否 → 是否有 PCIe 插槽?
├── 是 → 方案一(10GbE),网卡 $25-40/张,~9.5 Gbps 全双工
└── 否(笔记本无 PCIe)→ 方案三(USB 2.5GbE),$15-30/个,~2.3 Gbps
我个人的推荐排序:10GbE > Thunderbolt/USB4 > USB 2.5GbE >>> WiFi Direct
10GbE 用二手 Mellanox 卡性价比极高,全双工 9.5Gbps 极其稳定,几乎零维护。Thunderbolt 在有口的设备上很便利,但短线和半双工是其软肋。