7-zip的標準輸入輸出(STDIN,STDOUT)與Ncat的配合使用,壓縮後傳輸文件

本文適用於Windows系統。所需要的程序的windows版本在文後有下載連接。

Netcat/Ncat是很好用的網絡工具,使用方法網上已經有很多文章講解了,不再贅述。本文講述用7-zip配合Ncat,實現從A機器到B機器的文件壓縮傳輸。
也就是說,準備發送的文件先在A機器上壓縮,再把壓縮之後的數據傳送到B機器,在B機器實時解壓縮,整個的傳輸過程對用戶來說是透明的。因爲流量減小了,網傳速度可能得以加快。
之所以說“可能”,是因爲壓縮後傳輸速度是否得以加快,取決於CPU速度與網絡速度之比。如果CPU慢而網速快,那還不如不壓縮。
如果出現這種情況,就當本文是一片純技術探討文把。
希望你能在這次短暫的旅行中獲得樂趣。

多文件傳輸方法(只打包不壓縮):
發送端:tar -cv *.txt | ncat --send-only 192.168.1.2 
接收端:ncat -l | tar -xvf -

進階,有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目錄之下(不能指定其它盤符)。
另外,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的配合使用,壓縮後傳輸文件

方法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的配合使用,壓縮後傳輸文件

但經過7za和bzip2壓縮的數據,在tcp裏無論如何找不到1.txt的內容了。

一種證明方法,就是找一個大文件壓縮發送,然後看網卡的“已發送”字節數與文件體積之比。
於是找來體積又大,又容易被壓縮的虛擬磁盤文件做實驗,先禁用網卡以使發送字節數歸零,再啓用網卡發送文件:
7-zip的標準輸入輸出(STDIN,STDOUT)與Ncat的配合使用,壓縮後傳輸文件7-zip的標準輸入輸出(STDIN,STDOUT)與Ncat的配合使用,壓縮後傳輸文件
事實證明,比例是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

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章