本文适用于Windows系统。所需要的程序的windows版本在文后有下载连接。

Netcat/Ncat是很好用的网络工具,使用方法网上已经有很多文章讲解了,不再赘述。本文讲述压缩软件7-zip配合Ncat,实现从A机器到B机器的文件压缩传输。
也就是说,准备发送的文件先在A机器上压缩,再把压缩之后的数据传送到B机器,在B机器实时解压缩,整个的传输过程对用户来说是透明的。因为流量减小了,网传速度可能得以加快。
之所以说“可能”,是因为压缩后传输速度是否得以加快,取决于CPU速度与网络速度之比。如果CPU慢而网速快,那还不如不压缩。
如果出现这种情况,就当本文是一片纯技术探讨文把。
希望你能在这次短暂的旅行中获得乐趣。

多文件传输方法(只打包不压缩,传送当前目录下所有的TXT文件):
发送端:tar -cv *.txt | ncat --send-only 192.168.1.2 
接收端:ncat -l | tar -xvf -

进阶:压缩传输。
最简单的方法当然是用WINRAR、7-ZIP之类的软件压缩打包然后再传输,但这需要很大的磁盘暂存空间,其实可以采用“边压缩边传输”的方法,在发送端实时压缩后传输,在接收端实时解压存盘,整个过程对用户透明,也不再需要磁盘暂存空间。
有2种方法压缩之后传输:

方法1:用7za压缩/解压:
发送端:tar -cv *.txt|7za a -tgzip -an -so -si|ncat 192.168.1.2 --send-only
接收端:ncat -l|7za x -tgzip -bd -y -si -so|tar -xvf - -C /tmp

命令行解释:
7-zip是一款很流行的压缩软件,其命令行版本(7z.exe,7za.exe)支持标准输入(STDIN)和标准输出(STDOUT),也就是参数里的 -si 和 -so。
发送端的tar把当前目录下的所有的txt文件一个一个打包(但不压缩)发送到STDOUT(-si),7za从STDIN接收这些tar包(-so),压缩之后通过管道喂给Ncat发送出去;
接收端的Ncat把收到的压缩数据喂给7za解压成tar包,再喂给tar解包写入磁盘当前盘符的tmp目录之下(不能指定其它盘符)。
目录操作:
1、把abc文件夹,及其之下子文件夹的内容传送到接收端,并在接收端的当前目录下重建abc文件夹的结构。

发送端:tar -cv abc | bzip2 | ncat 192.168.1.2 --send-only
接收端:ncat -l | bzip2 -d | tar -xvf - -C .

2、把abc文件夹,及其之下子文件夹的内容(除了txt文件夹,不论在哪一层)传送到接收端,并在接收端的当前目录下重建abc文件夹的结构。

发送端:tar -cv abc --exclude=txt | bzip2 | ncat 192.168.1.2 --send-only

另外,gzip、bzip2、xz这3种格式支持标准输入输出,7z目前不支持,比如换成这样的语句:

发送端:tar -cv *.txt|7za a -txz -an -so -si|ncat 192.168.1.2 --send-only
接收端:ncat -l|7za x -txz -bd -y -si -so|tar -xvf - -C /tmp

7-zip的标准输入输出(STDIN,STDOUT)与Ncat的配合使用,压缩后传输文件_第1张图片

方法2:用bzip2压缩/解压:
发送端:tar -cv *.txt|bzip2|ncat 192.168.1.2 --send-only
接收端:ncat -l|bzip2 -d|tar -xvf - -C /tmp

命令行解释:原理与方法1一样,只是把压缩程序换成bzip2。用bzcat替换接收端的bzip2也可以,该程序专职解压缩。

如何证明数据已经被压缩传输了?
tar的 -cv 参数仅仅是多文件打包,并没有压缩。
打包之后不经过压缩就发送,用Wireshark抓包能发现经Tar的打包的数据,虽然加了包头包尾,但被传输文件的数据并没有变。
比如1.txt的内容是ABCDKKAAAAAAAAAAAAAAAAAA,命令如下:

发送端:tar -cv 1.txt|ncat --send-only 192.168.1.2
接收端:ncat -l>1.tar

wireshark抓到的tcp数据(节选):
7-zip的标准输入输出(STDIN,STDOUT)与Ncat的配合使用,压缩后传输文件_第2张图片

但经过7za和bzip2压缩的数据,在tcp里无论如何找不到1.txt的内容了。

另一种证明方法,就是找一个大文件压缩发送,然后看网卡的“已发送”字节数与文件体积之比。
于是找来体积又大,又容易被压缩的虚拟磁盘文件做实验,先禁用网卡使已发送字节数归零,再启用网卡发送文件:
7-zip的标准输入输出(STDIN,STDOUT)与Ncat的配合使用,压缩后传输文件_第3张图片
发送完毕,比例是3:8。

程序下载地址
tar for windows:http://gnuwin32.sourceforge.net/packages/gtar.htm
7z for windows:https://www.7-zip.org/download.html
7za for windows:https://www.7-zip.org/a/7za920.zip
bzip2 for windows:http://gnuwin32.sourceforge.net/packages/bzip2.htm