Linux 局域网传输大文件

2021-07-02 ⏳2.0分钟(0.8千字)

今天需要把一个大文件(约20G)拷贝到路由器的硬盘上。一般大家会想到用 scp 命令。scp 是 ssh copy 的缩写。我试了一下,速度只有 5M 多。要花将近一个小时才能拷完,实在不能忍。于是我就研究了一下怎么才能加快传输速度。

那为什么会慢呢?主要是 ssh 会对通信内容做加密🔐处理,发送端要加密,接收端要解密。但我的接收端是一台二手的华硕 AC1900P,主频是双核 1.4G,不支持 AES 硬解密。所以解密 ssh 数据的时候比较吃力。速度慢也是正常。所以我们需要找一种不用加密的办法来传。其实我的家庭局域网可以看成安全的环境,加密传输确实没有必要。

明文传输有好多办法。比如可以 http 协议,也可以使用 ftp 协议。但一般的 http 服务器默认都不支持上传文件,ftp 服务器更是难以配置。最简单的就是使用 netcat

netcat 功能非常强大,可以执行简单的网络通信。

安装好 netcat 之后需要在接收端等待接收文件:

nc -l -p 1234 > bak.tgz

nc 就是 netcat 的命令,少数平台需要写成 netcat-l 表示监听端口,等待接收数据。-p 1234表示要监听的端口号,我们这里监听的是1234端口。后面的> bak.tgz表示将收到的数据重定向到bak.tgz文件。如果没有这个重定向,netcat 会将收到的数据输出到 stdout。

接下来就可以在发送端发传输文集了:

nc 192.168.1.1 1234 < bak.tgz

nc 后面依次指定接收端的 IP 和端口号。再后面的 < bak.tgz 又是一个重定向,意思是将 bak.tgz 文件的内容通过管道传给 ncnc 会先跟接收端建立 tcp 连接,然后将整个文件的内容慢慢传过去。

我自己试了一下,传输速度稳定在 30M 左右。考虑到我本来就是机械硬盘,再加上网络损耗和CPU操作,这个速度也算不错了。

有时候我们需要批量传输多个文件。经典的办法是使用 rsync,但同样面临 scp 的问题。我们可以使用 tar 配合 nc 实现批量传输。

在发送端,我们需要先用 tar 将文件打包,然后通过管端传给 nc:

tar cvf - bak/ | nc 192.168.1.1 1234

注意 tar 没有使用类似-z的压缩参数,只打包,不压缩,节约 CPU。参数后面的-表示将打包数据写入 stdout 设备,也就是管道。

在接收端,我们让 nc 收到数据后通过管道传给 tar 解包:

nc -l -p 1234 | tar xvf -

这样就可以实现批量传输文件。

参考链接: