Linux下常用的文件傳輸方式介紹與比較

本文介紹了linux之間傳輸文件的幾種方式,並通過具體實驗測試了幾種文件傳輸方式之間的傳輸速度。這篇文章是我一次作業的實驗報告,我經常查看這個文檔,所以貼出來方便自己查略。

0. 實驗環境以及實驗數據

實驗環境: 兩臺裝有Ubuntu的電腦,兩臺電腦位於同一個局域網中,傳輸速度約4.1MB/s。

實驗數據: 使用MySQL的日誌文件(ib_logfile0)進行測試,日誌文件壓縮前1.1G,壓縮後159M,具體應用中,壓縮比例可能沒有這麼高,但是不影響我們的討論。

1. scp

scp是secure copy的縮寫,scp是linux系統下基於ssh登陸進行安全的遠程文件拷貝命令,主要用於linux服務器之間複製文件和目錄。scp使用ssh安全協議傳輸數據,具有和ssh一樣的驗證機制,從而可以實現安全的遠程拷貝文件。

下面介紹SCP三種不同用法的效率。注意:使用SCP前請配製好SSH。

1.1 scp 不使用壓縮

將本地文件拷貝到遠程服務器:

scp -P port ufile user@host:~/ufile

將遠程服務器中的文件拷貝到本地的用法:

scp -P port user@host:~/ufile ufile

經測試,SCP不啓用壓縮功能的情況下,傳輸ib_logfile0文件需要4:12s。

1.2 壓縮後傳輸

SCP傳輸ib_logfile0文件之所以需要那麼多時間,是因爲它沒有對傳輸的數據進行壓縮,可以先 將文件壓縮,然後再進行遠程拷貝。如下所示:

tar -zcf ufile.tar.gz ufile
scp -P port ufile.tar.gz user@host:~/ufile.tar.gz
ssh -p port user@host 'tar -zxf ufile.tar.gz'

經測試,先手動壓縮,然後再傳輸,4次測試結果的平均值爲00:39s。

1.3 scp啓用壓縮

相對於第一種方法,第二種方法極大地減少了傳輸時間,但是需要執行三條語句,較爲麻煩。更簡單的方法如下所示:

scp -P port -C ufile user@host:~/ufile

-C選項啓用了SSH的壓縮功能,通過man ssh可以看到,在-C選項的解釋部分有這麼一句話:"the compression algorithm is the same used by gzip"。SSH與gzip使用的是同一種壓縮算法,即第二種方法與第三種方法幾乎一樣,但是,第三種方法更爲簡單方便,所以,推薦使用第三種方法傳輸數據。

第三種方法傳輸ib_logfile0花費了00:52s,比第二種方法多花了10秒,這10秒主要用於數據的壓縮和解壓。

此外,值得注意的是,修改壓縮算法的壓縮比對總的數據傳輸時間影響不大,這是因爲更高的壓縮比例,需要的壓縮時間也更多。

2. sftp

sftp是Secure File Transfer Protocol的縮寫,安全文件傳送協議,可以爲傳輸文件提供一種安全的加密方法。sftp與ftp有着幾乎一樣的語法和功能,不過SFTP是SSH的一部分,它使用加密傳輸認證信息和傳輸的數據,所以,使用SFTP是非常安全的。但是,由於這種傳輸方式使用了加密、解密技術,所以傳輸效率比普通的FTP要低一些。

上傳數據到服務器上:

echo progress; echo "put ufile"; echo quit) | sftp -o Compression=yes -o Port=port user@host -b

從服務器上下載數據:

echo progress; echo "get ufile"; echo quit) | sftp -o Compression=yes -o Port=port user@host -b

在我的實驗中,使用sftp傳輸ib_logfile0文件花費了1:05s。比SCP略慢。

3. 直截使用ssh

將本地的數據傳輸到遠程服務器的用法:

gzip -c ufile | ssh -p port user@host 'gunzip >ufile'

將遠程服務器傳輸到本地的用法

ssh -p port user@host "gzip -c ufile" | gunzip -c > ufile

使用這種方式傳輸ib_logfile0需要00:55s,相對於scp -C慢了幾秒,不過相差不大。但是,scp用法更簡單一些,只需要加一個-C參數,而不用手動調用gzip壓縮程序。

4. nc

netcat(簡稱nc)是網絡工具中的瑞士軍刀,它能通過TCP和UDP在網絡中讀寫數據。通過與其他工具結合和重定向,你可以在腳本中以多種方式使用它。使用netcat命令所能完成的事情令人驚訝。

netcat所做的就是在兩臺電腦之間建立鏈接並返回兩個數據流,在這之後所能做的事就看你的想像力了。你能建立一個服務器,傳輸文件,與朋友聊天,傳輸流媒體或者用它作爲其它協議的獨立客戶端。我們這裏只討論nc的用於數據傳輸的情況。

在服務器端:

sudo nc -l -p port | tar -zxf - #l 參數用於監聽
sudo nc -l -p port > ufile

在客戶端:

tar -zcf - ufile | sudo nc host port
sudo nc host port < ufile

使用nc傳輸ib_logfile0文件需要00:49s,比SCP -C略快,這是因爲SCP需要對數據進行加密,而nc只是簡單的傳輸數據。

可以看到,nc不需要任何配置操作,使用也非常簡單,不過nc需要root權限。

5. rsync

rsync(remote sync)是類unix系統下的數據鏡像備份工具,從軟件的命名上就可以看出來,它主要用於數據的同步備份。

rsync有兩種用法,一種是通過SSH通道傳輸數據,另一種是通過與服務器的rsync守護者(daemon)進程建立連接來傳輸數據。下面對這兩種情況進行測試。

5.1 rsync with ssh

rsync使用SSH通道傳輸數據時,配置比較簡單,只要配置好了SSH,就直接可用,不需要額外的操作,正是這個原因,很多人更喜歡使用這種方式來使用rsync。

使用方法如下:

rsync -zav --rsh='ssh -p port' ufile user@host:path

rsync 使用SSH 通道傳輸ib_logfile0花費了00:55s,與直接使用SSH傳輸數據時間一樣。

5.1 rsync with daemon

不同於SCP和SFTP,rsync是一套獨立的軟件,除了通過SSH通道傳輸數據以外,還可以通過rsync的守護者進程進行數據傳輸。

這裏只是對rsync的數據傳輸的性能進行簡單的測試,關於rsync的配置,可以參考其他資料。

rsync 的使用方法如下:

rsync -avz ufile user@host::module_name

在實驗中,rsync傳輸ib_logfile0共花費了00:51s,與scp -C差不多。此外,值得注意的是,rsync使用zlib壓縮算法壓縮數據。ssh與gzip使用的是LZ77算法。

rsync的參數特別多,詳細的使用方法可以參考這裏

6. ftp

FTP命令使用文件傳輸協議(File Transfer Protocol, FTP)在本地主機和遠程主機之間或者在兩個遠程主機之間進行文件傳輸。

ftp的使用方法就不再介紹了,在我們的實驗中,使用FTP傳輸ib_logfile0共花費了4:25s,這是因爲,FTP沒有數據壓縮的功能。從前面的實驗環境中可以看到,數據壓縮能夠顯著減少傳輸的數據量,數據不能壓縮,再好的傳輸工具也會受限於網絡傳輸速率。

7. 結論

單純從數據傳輸來看,我個人比較喜歡SCP,也強烈推薦SCP,不過,千萬要記住,使用SCP時一定要使用-C選項,即啓用壓縮功能。從前面的實驗中也可以看到,啓用壓縮與不啓用壓縮傳輸的數據量相差很多。

此外,以上幾種數據傳輸方式也有各自的應用場景,其中,nc使用最簡單,配置也最方便,但是需要root權限,在有root權限沒有配置SSH的情況下,推薦使用nc。

rsync配置相對比較複雜,它的主要功能是進行增量備份而不是數據傳輸,在需要增量備份的情況下,毫不猶豫地選擇rsync。

FTP配置也比較麻煩,傳輸速度也很一般,而且,FTP沒有自帶壓縮功能,需要手動壓縮,但是,FTP是最常用的一種數據傳輸方式,大多數普通用戶都使用過FTP,對於用戶來說,學習成本較低,在需要將文件傳送給多個用戶時,推薦使用FTP。

SFTP是建立在SSH上的FTP,傳輸速度也很快,與SCP不分伯仲,但是SFTP可以交互式的使用,在某些情況下可能會比較有用,而且,如果已經配置好了SSH,SFTP的配置成本爲零,即無需配置,直接可用。

總的來說,每種傳輸方式都各有千秋,我們應當根據自己的實際需要,選擇適合的文件傳輸方法


轉自:http://mingxinglai.com/cn/2014/03/copy-file-in-linux/

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