一根网线,两台电脑直接传文件
Transfer files over an Ethernet patch cable
只需一根普通的 Ethernet 网线,无需路由器或云端中转,就能在两台电脑间实现高达 900 Mbits/second 的文件传输。通过简单的 IP 配置,利用 Linux 下的 socat 和 dd 命令,即可绕过 WiFi 的不稳定和 USB 接口的速度瓶颈。相比云存储的二次传输耗时和 USB 线缆的接触问题,这种点对点的 Ethernet 连接不仅成本低廉,还能抵抗 RFI 干扰,是传输大文件最可靠且高效的方式。
Ethernet 是唯一一种能通过廉价线缆,在两台随机设备间可靠达到千兆速度的常见连接方式。
HN 评论区
181- rmunn
以前这活儿非得用交叉网线不可;在 https://en.wikipedia.org/wiki/Medium-dependent_interface#Aut... 普及之前,我确实就是这么干的(用的就是交叉线)。如果用直通线,你会把一台适配器的发送(TX)引脚连到另一台的 TX 引脚,接收(RX)引脚连到 RX 引脚——结果两台设备都“听”不到对方发的消息。交叉线就是把这几根线对调一下,让每台设备的 TX 引脚连到另一端的 RX 引脚,这样双方就能互相“听”到了。
但有了自动 MDI-X 功能,每台设备都会察觉到“嘿,我在发但没收到任何东西”,然后尝试把发送和接收功能对调(在 RX 引脚上发,在 TX 引脚上收)。因为每台设备在这么做之前都会随机等待一段时间,所以它们在同一瞬间同时翻转的概率极低(几乎不可能)。就算真撞上了,第二个等待间隔也大概率不一样。
上面的解释稍微简化了一点,但大体思路就是这样。这也是我那堆贴得清清楚楚标签的交叉线开始吃灰的原因。(后来我反应过来“嘿等等,我现在可以直接把它们当普通网线用了”,于是把它们从储物箱里翻出来,混进了我的普通跳线堆里)。
- steve1977
人们发现网线可以用来联网,然后管这叫“技巧”(我甚至有点惊讶它没被叫成“黑客手段”)。
- yjftsjthsd-h
我有 95% 的把握你其实不需要分配 IP。试试这个:
# ping 接口上的所有链路本地设备:
ping ff02::1%eth0
然后对唯一有响应的 IP 执行你的 socat/rsync/whatever 操作。
- yitchelle
这让我想起了 8 位机时代的美好时光,那时我们用交叉 RS232 线在两台电脑之间传文件。哪怕只有 30bps,也比把数据写到一台电脑的磁带里,再拿到另一台电脑上读要可靠得多。
- sgt
在 macOS 上甚至更简单。
类似下面这样的命令应该就能用:
ifconfig enX inet6 fd42:dead:beef::1 prefixlen 48
没必要特意把它启动起来,因为它应该已经是 up 状态了。enX 应该是你的 USB/Thunderbolt 以太网适配器,比如 en6。
然后你就可以用 socat 把文件传到另一台机器上,哪怕那台是 Linux 机。我习惯用 nc,但 socat 肯定更快。
有人可能会问为什么用 deadbeef 这个网段?因为这是私有地址空间,不会和公网地址冲突。
话虽如此,在 99% 的大文件传输场景下,我直接 AirDrop 就完事了!
- 3r7j6qzi9jvnve
tbstream 看起来挺好玩,但对普通用户来说太难用了——不确定它以后会不会变简单,但我估计我记不住为了传个文件就去折腾 configfs:
https://git.kernel.org/pub/scm/linux/kernel/git/westeri/thun...
- SillyUsername
你还可以在传输过程中通过 zstd 进行实时压缩,对于压缩效果好的数据,你通常会看到 1.5 到 3 倍的原始吞吐量提升,所以千兆链路实际上能跑出 165–330MB/s 的速度。
接收端:
socat -u TCP6-LISTEN:1234,reuseaddr STDOUT | zstd -d -c | tar -xpf - -C /destination
发送端:
tar -C /source -cf - directory | zstd -T0 -6 -c | socat -u STDIN 'TCP6:[fd42:dead:beef::2]:1234'
-T0 会用满所有核心。把压缩等级调高过 -6 可以获得更高压缩率,调低则速度更快;但如果你的 CPU 跟不上,高等级反而会拖慢速度。已经压缩过的数据收益不大。
- awruko
我确实有一次不得不把网线改成交叉线。那是某种演示,交叉线找不到了。当地的电脑店也没货,时间紧迫……我就用口袋刀把线给改了一下。那是 2000 年以前的事,速度限制在 10/100 Mbit——ifconfig 没报任何错误,演示进行得很顺利。