鏈接: C/C++Linux服務(wù)器開發(fā)/后臺(tái)架構(gòu)師【零聲教育】-學(xué)習(xí)視頻教程-騰訊課堂
1 FTP概述
FTP為File Transfer Protocol
的縮寫,即文件傳輸協(xié)議,是TCP/IP
協(xié)議族中的協(xié)議之一。FTP是一個(gè)用于在計(jì)算機(jī)網(wǎng)絡(luò)上在客戶端和服務(wù)器之間進(jìn)行文件傳輸?shù)膽?yīng)用層協(xié)議。RFC 959
定義了FTP協(xié)議規(guī)范。
同大多數(shù)Internet
服務(wù)一樣,FTP也是一個(gè)客戶/服務(wù)器系統(tǒng)(C/S
系統(tǒng))。用戶通過(guò)一個(gè)客戶端程序連接至在遠(yuǎn)程計(jì)算機(jī)上運(yùn)行的服務(wù)器程序。依照FTP協(xié)議提供服務(wù),進(jìn)行文件傳送的計(jì)算機(jī)就是FTP服務(wù)器,而連接FTP服務(wù)器,遵循FTP協(xié)議與服務(wù)器傳送文件的電腦就是FTP客戶端。用戶要連上FTP 服務(wù)器,就要用到 FTP 的客戶端軟件,通常Windows系統(tǒng)自帶“ftp”
命令,這是一個(gè)命令行的FTP客戶端程序,另外常用的FTP客戶端程序還有FileZilla
、 CuteFTP
。
2 實(shí)驗(yàn)環(huán)境
為了更透徹的理解和掌握FTP,在敘述FTP協(xié)議內(nèi)容的同時(shí),以“實(shí)戰(zhàn) ” 的方式抓取FTP客戶端和FTP服務(wù)器之間交互的網(wǎng)絡(luò)包,以此和FTP協(xié)議相互印證,加深理解。本節(jié)主要介紹抓取FTP網(wǎng)絡(luò)包的環(huán)境搭建。實(shí)驗(yàn)環(huán)境將以Windows系統(tǒng)平臺(tái)作為FTP客戶端,以linux系統(tǒng)虛擬機(jī)作為FTP服務(wù)器。
FTP實(shí)驗(yàn)環(huán)境搭建:
- 在Windows系統(tǒng)安裝wireshark抓包工具;
- 在Windows系統(tǒng)安裝linux虛擬機(jī)(本次實(shí)驗(yàn)版本:Ubuntu 16.04);
- 熟悉Windows系統(tǒng)下
"ftp"
命令行的使用。
常用的"ftp"
命令行(可以打開cmd
或PowerShell
進(jìn)行驗(yàn)證):
-
ftp 服務(wù)器域名(ip地址)
,如:ftp ftp.gnu.org,進(jìn)行FTP服務(wù)器登錄; -
ftp>? 或 ftp>help
,顯示"ftp"
命令行說(shuō)明; -
ftp>dir
,顯示FTP服務(wù)器目錄文件和子目錄列表; -
ftp>cd
,切換FTP服務(wù)器上的工作目錄; -
ftp>ls
,顯示FTP服務(wù)器上目錄文件和子目錄的縮寫列表; -
ftp>pwd
,顯示FTP服務(wù)器上的當(dāng)前目錄; -
ftp>mdir
,顯示FTP服務(wù)器上目錄文件和子目錄列表,如:mdir Music 1.txt
,將服務(wù)器目錄Music
中文件和子目錄列表詳細(xì)信息存入本地文件1.txt
中; -
ftp>binary(或bi)
,將文件傳送類型設(shè)置為二進(jìn)制模式; -
ftp>ascii
,將文件傳送類型設(shè)置為默認(rèn)的ASCII
; -
ftp>delete
,刪除遠(yuǎn)程計(jì)算機(jī)上的文件,如:delete 123.c
,刪除服務(wù)器上的123.c
文件; -
ftp>get
,將遠(yuǎn)程服務(wù)器文件復(fù)制到本地計(jì)算機(jī)上,如get 123.c
,將服務(wù)器上的123.c
文件,復(fù)制到本地; -
ftp>mget
,將遠(yuǎn)程服務(wù)器多個(gè)文件復(fù)制到本地計(jì)算機(jī),如mget 123.c 456.c
,將文件123.c
和456.c
復(fù)制到本地計(jì)算機(jī)上; -
ftp>put
,將本地文件復(fù)制到遠(yuǎn)程計(jì)算機(jī)上,如:put 789.c
, -
ftp>disconnect
,從服務(wù)器斷開,但保留"ftp"
命令行提示(依然是處于"ftp"
命令行模式,未退出); -
ftp>open
,與指定的遠(yuǎn)程FTP
服務(wù)器連接,可以通過(guò)IP地址或計(jì)算機(jī)名稱指定計(jì)算機(jī)(DNS或主機(jī)文件必須可用); -
ftp>quit或(bye)
,結(jié)束與遠(yuǎn)程服務(wù)器的FTP
會(huì)話并退出"ftp"
命令行模式; -
ftp>status
,顯示 FTP 連接和切換的當(dāng)前狀態(tài); -
ftp>debug
,切換調(diào)試,當(dāng)調(diào)試打開時(shí),客戶端發(fā)送到遠(yuǎn)程服務(wù)器的每個(gè)命令都將打印。默認(rèn)情況下,調(diào)試是關(guān)閉的; -
ftp>!
,從"ftp"
命令行子系統(tǒng)退出到cmd
或PowerShell
的shell。
注意"ftp"
命令行只是Windows系統(tǒng)自帶的FTP客戶端程序,"ftp"
命令行的使用和將要介紹的FTP文件傳輸協(xié)議無(wú)關(guān)。
3 FTP詳解
FTP最大的一個(gè)優(yōu)點(diǎn)就是部署、使用起來(lái)非常簡(jiǎn)單。只要兩個(gè)設(shè)備部署了FTP客戶程序和FTP服務(wù)程序,知道用戶名和密碼,就能夠?qū)崿F(xiàn)文件的輕松互傳。甚至一些匿名FTP服務(wù)器,就算沒(méi)有用戶名和密碼也能夠訪問(wèn)。如一些軟件分發(fā)、資料分享,就可能使用到匿名FTP服務(wù)器。
3.1 文件傳輸過(guò)程
FTP使用簡(jiǎn)單并不意味著其實(shí)現(xiàn)簡(jiǎn)單。與常見的應(yīng)用層協(xié)議http只需要一個(gè)TCP連接不同,FTP需要兩個(gè)TCP連接來(lái)完成文件的傳輸。其中一個(gè)稱為控制連接,一個(gè)稱為數(shù)據(jù)連接。
默認(rèn)情況下,FTP使用20
和21
這兩個(gè)端口,其中20
用于數(shù)據(jù)連接(傳遞數(shù)據(jù)),21
用于控制連接(傳遞控制信息)。但是,是否使用20
作為傳輸數(shù)據(jù)的端口與FTP使用的傳輸模式有關(guān),如果采用主動(dòng)模式,那么數(shù)據(jù)傳輸端口就是20
;如果采用被動(dòng)模式,則具體最終使用哪個(gè)端口要服務(wù)器端和客戶端協(xié)商決定。
如下圖所示,描述了使用FTP進(jìn)行文件傳輸?shù)倪^(guò)程,用戶通過(guò)客戶端程序(ftp命令行或FileZilla)與ftp服務(wù)器進(jìn)行交互。用戶的輸入邏輯會(huì)被用戶協(xié)議解釋器解析,轉(zhuǎn)換成FTP命令,通過(guò)控制連接(一個(gè)tcp連接,port口為21)給到服務(wù)器協(xié)議解釋器,服務(wù)器協(xié)議解釋器會(huì)回應(yīng)一個(gè)FTP應(yīng)答。并且根據(jù)傳輸過(guò)來(lái)的FTP命令類型,服務(wù)器協(xié)議解釋器可能需要去啟動(dòng)服務(wù)器數(shù)據(jù)傳輸功能,其過(guò)程包括服務(wù)器主動(dòng)發(fā)起建立一個(gè)tcp連接(用port口20),通過(guò)該連接服務(wù)端和客戶端就可以進(jìn)行數(shù)據(jù)傳輸了。在數(shù)據(jù)傳輸完成后,服務(wù)端會(huì)將該數(shù)據(jù)連接關(guān)閉掉,直到下一次需要文件傳輸時(shí)才又開啟,所以可以看到數(shù)據(jù)連接是隨時(shí)開、隨時(shí)關(guān)。而控制連接在被創(chuàng)建后,其會(huì)一直保持下去,隨時(shí)等待用戶命名的輸入,直到主動(dòng)斷開。
3.2 報(bào)文格式
在FTP協(xié)議中,FTP命令和FTP應(yīng)答,是以ASCII碼
形式的明文傳遞。FTP命令的一般報(bào)文格式是:命令 選項(xiàng)參數(shù) \r\n
,FTP應(yīng)答的一般報(bào)文格式為:狀態(tài)碼 報(bào)文選項(xiàng) \r\n
。先來(lái)介紹FTP命令。
FTP命令都是3
或4
個(gè)字節(jié)的大寫ASCII字符組成,其中一些命令帶選項(xiàng)參數(shù)。從客戶端向服務(wù)器發(fā)送的FTP命令有很多,在rfc959
中有定義。本節(jié)介紹一些常用的。
命令 說(shuō)明
ABOR 放棄先前的FTP命令和數(shù)據(jù)傳輸
LIST filelist 列表顯示文件或目錄
PASS password 服務(wù)器上的密碼
PORT n1,n2,n3,n4,n5,n6 客戶端IP地址(n1 .n2 .n3 .n4)和端口(n5 × 256 + n6)
QUIT 從服務(wù)器退出
RETR filename 檢索(?。┮粋€(gè)文件
STOR filename 存儲(chǔ)(放)一個(gè)文件
SYST 服務(wù)器返回系統(tǒng)類型
TYPE type 說(shuō)明文件類型:A表示ASCII碼,I表示二進(jìn)制類型
USER username 服務(wù)器上用戶名
FTP應(yīng)答的狀態(tài)碼是ASCII碼形式的3位數(shù)字,并且跟有報(bào)文選項(xiàng)。應(yīng)答狀態(tài)碼中每一位數(shù)字都有不同的含義。應(yīng)答狀態(tài)碼第1位和第2位的含義如下,第3位給出出錯(cuò)報(bào)文的附加含義。
狀態(tài)碼 解釋
1yz 正面的初步答復(fù)。該操作正在啟動(dòng),但在發(fā)送另一個(gè)命令之前需要另一個(gè)回復(fù)。
2yz 肯定完成回復(fù),可以發(fā)送新命令。
3yz 正面的中間答復(fù)。命令已被接受,但必須發(fā)送另一個(gè)命令。
4yz 暫時(shí)否定完成回復(fù)請(qǐng)求的操作沒(méi)有發(fā)生,但錯(cuò)誤情況是暫時(shí)的,因此可以稍后重新發(fā)出命令。
5yz 永久否定完成回復(fù)。 該命令未被接受,不應(yīng)重試。
x0z 語(yǔ)法錯(cuò)誤。
x1z 信息。
x2z 連接。涉及控制或數(shù)據(jù)連接的回復(fù)。
x3z 身份驗(yàn)證和記帳?;貜?fù)登錄或記帳命令。
x4z 未指定。
x5z 文件系統(tǒng)狀態(tài)。
一些典型的狀態(tài)碼含義如下:
- 125 數(shù)據(jù)連接已經(jīng)打開,數(shù)據(jù)傳輸開始
- 200 命令OK
- 214 幫助消息(針對(duì)用戶)
- 331 用戶名OK,需要密碼
- 425 無(wú)法打開數(shù)據(jù)連接
- 452 寫入文件時(shí)出錯(cuò)
- 500 語(yǔ)法錯(cuò)誤(無(wú)法識(shí)別的命令)
- 501 語(yǔ)法錯(cuò)誤(無(wú)效參數(shù))。
- 502 未實(shí)現(xiàn)的 MODE 類型。
下面來(lái)通過(guò)抓實(shí)際環(huán)境中的網(wǎng)絡(luò)包,看客戶端和服務(wù)器的FTP命令、FTP應(yīng)答交互過(guò)程。使用前面介紹的windows環(huán)境下的"ftp"
命令行和FTP服務(wù)器進(jìn)行交互。如下圖所示為客戶端登錄到FTP服務(wù)器的抓包過(guò)程,客戶端ip地址為192.168.213.1
,服務(wù)端ip地址為192.168.213.136
。如圖中紅框所示,可以看到首先客戶端和服務(wù)器通過(guò)tcp三次握手建立了一條tcp通路,服務(wù)端端口號(hào)21
,客戶端端口號(hào)是64257
,這條通路就是上面所說(shuō)的控制連接。因?yàn)闆](méi)有進(jìn)行文件數(shù)據(jù)傳輸,所以數(shù)據(jù)連接尚未建立。
windows環(huán)境"ftp"
命令行客戶端展現(xiàn)的交互過(guò)程:
D:\> ftp 192.168.213.136
連接到 192.168.213.136。
220 (vsFTPd 3.0.3)
200 Always in UTF8 mode.
用戶(192.168.213.136:(none)): book
331 Please specify the password.
密碼:
230 Login successful.
ftp>
建立好控制連接之后,客戶端和服務(wù)器就開始了報(bào)文交互,如圖中的框所示,下面文字也描述了其報(bào)文交互過(guò)程,并且做了注釋。
服務(wù)端(192.168.2.2): 220 (vsFTPd 3.0.3) //220,表示服務(wù)器準(zhǔn)備完成,客戶端可以發(fā)送命令了。 后面跟的是FTP服務(wù)器的版本信息。
客戶端(192.168.2.6):OPTS UTF8 ON //表示服務(wù)器需要切換到UTF8字符集進(jìn)行工作。
服務(wù)端(192.168.2.2): 200 Always in UTF8 mode. //200,表示命令執(zhí)行成功,后面的提示信息表示已經(jīng)工作再UTF8模式下了。
客戶端(192.168.2.6):USER book //指定用戶book登錄
服務(wù)端(192.168.2.2): 331 Please specify the password. //331 表示需要輸入密碼
客戶端(192.168.2.6):PASS 123456 //客戶端輸入密碼123456
服務(wù)端(192.168.2.2): 230 Login successful. //# 230 表示用戶登入成功
下圖展示了第一個(gè)FTP應(yīng)答報(bào)文220 (vsFTPd 3.0.3)\r\n
的二進(jìn)制數(shù)據(jù)形式,其也印證了FTP報(bào)文是以ASCII碼明文進(jìn)行傳遞的。220 (vsFTPd 3.0.3)\r\n
報(bào)文的20個(gè)字節(jié)(包含空格)的ASCII碼為32 32 30 20 28 76 73 46 54 50 64 20 33 2e 30 2e 33 29 0d 0a
。
3.3 數(shù)據(jù)連接
上一節(jié)看到了控制連接的建立和連接建立之后的客戶端和服務(wù)器之間的報(bào)文交互。本節(jié)來(lái)看一下數(shù)據(jù)連接。數(shù)據(jù)連接有如下三個(gè)用途:
- 從客戶向服務(wù)器發(fā)送一個(gè)文件。
- 從服務(wù)器向客戶發(fā)送一個(gè)文件。
- 從服務(wù)器向客戶發(fā)送文件或目錄列表。
這里再?gòu)?qiáng)調(diào)一下控制連接一直保持到客戶端—服務(wù)器連接的全過(guò)程,但數(shù)據(jù)連接可以根據(jù)需要隨時(shí)開、隨時(shí)關(guān)。根據(jù)FTP數(shù)據(jù)連接的用途可以看到,在進(jìn)行文件傳輸或是查詢服務(wù)器端文件或目錄列表時(shí),需要?jiǎng)?chuàng)建數(shù)據(jù)連接。數(shù)據(jù)連接的創(chuàng)建過(guò)程如下:
- 數(shù)據(jù)連接的創(chuàng)建由客戶端控制,因?yàn)槭强蛻舳税l(fā)出需要數(shù)據(jù)連接的命令(獲取文件、上傳文件或列出目錄)。
- 客戶端通常在客戶端主機(jī)上選擇一個(gè)臨時(shí)端口號(hào)來(lái)結(jié)束數(shù)據(jù)連接。客戶端從該端口發(fā)出被動(dòng)打開。
- 客戶端使用
PORT
命令通過(guò)控制連接將此端口號(hào)發(fā)送到服務(wù)器。 - 服務(wù)器接收控制連接上的端口號(hào),并向客戶端主機(jī)上的該端口發(fā)出主動(dòng)打開。數(shù)據(jù)連接的服務(wù)器端始終使用端口
20
。
下面來(lái)進(jìn)行網(wǎng)絡(luò)抓包看一下實(shí)際的數(shù)據(jù)連接建立過(guò)程。通過(guò)windows環(huán)境下的"ftp"
命令行客戶端向FTP服務(wù)器請(qǐng)求一個(gè)文件123.c
來(lái)觸發(fā)數(shù)據(jù)連接的建立。下圖為數(shù)據(jù)連接的網(wǎng)絡(luò)抓包過(guò)程??蛻舳送ㄟ^(guò)PORT
命令將端口信息(192.168.231.1 227,188、端口號(hào):277*256+188=58230)傳到服務(wù)端;服務(wù)端通過(guò)自身20
端口和客戶端58230
端口,主動(dòng)建立TCP連接,此連接就是為數(shù)據(jù)連接。文件數(shù)據(jù)123.c
就是通過(guò)該連接進(jìn)行傳輸。文件數(shù)據(jù)傳輸完成后,服務(wù)端又會(huì)主動(dòng)發(fā)起斷開該連接,如下圖中紅框所示的四次揮手。
windows環(huán)境"ftp"
命令行客戶端展現(xiàn)的交互過(guò)程:
ftp> get 123.c
200 PORT command successful. Consider using PASV.
150 Opening BINARY mode data connection for 123.c (13 bytes).
226 Transfer complete.
ftp: 收到 13 字節(jié),用時(shí) 0.00秒 13000.00千字節(jié)/秒。
3.4 主動(dòng)模式
思考一下上一節(jié)描述的數(shù)據(jù)連接會(huì)有什么問(wèn)題?其發(fā)起數(shù)據(jù)連接過(guò)程為,客戶端通過(guò)PORT
命令將客戶端監(jiān)聽的端口號(hào)傳遞給服務(wù)端,服務(wù)端通過(guò)固定的20
端口主動(dòng)去和客戶端監(jiān)聽的端口進(jìn)行TCP連接,此連接就是數(shù)據(jù)連接??梢钥吹饺绻?strong>客戶端的防火墻阻止了服務(wù)器的主動(dòng)連接請(qǐng)求,那么數(shù)據(jù)連接就會(huì)失敗。所以主動(dòng)模式有一定缺陷。
上面描述的這種連接模式就是主動(dòng)模式,主動(dòng)是相對(duì)于服務(wù)端來(lái)說(shuō)的。下圖示意了主動(dòng)模式過(guò)程,控制連接是客戶端發(fā)起,數(shù)據(jù)連接是服務(wù)端發(fā)起。
3.5 被動(dòng)模式
為了解決主動(dòng)模式所面臨的問(wèn)題,F(xiàn)TP協(xié)議也支持被動(dòng)模式。被動(dòng)模式的示意圖如下圖所示:控制連接和數(shù)據(jù)連接都由客戶端主動(dòng)發(fā)起,而且服務(wù)端數(shù)據(jù)連接端口不在是固定端口20
,而是被分配了一個(gè)臨時(shí)端口。因?yàn)閮纱芜B接都是客戶端主動(dòng)發(fā)起,所以就不會(huì)有防火墻的問(wèn)題。
通過(guò)網(wǎng)絡(luò)數(shù)據(jù)包來(lái)看一下被動(dòng)模式的交互過(guò)程??蛻舳送ㄟ^(guò)發(fā)送PASV
,表明客戶端明確告知FTP服務(wù)器它使用被動(dòng)模式。服務(wù)器收到PASV
后,會(huì)分配一個(gè)臨時(shí)端口號(hào)37499(192,168,2,5,146,123,端口號(hào)=146*256+123=34799),并通過(guò)報(bào)文將該端口號(hào)通知到客戶端。明確好了兩端的端口號(hào),客戶端就會(huì)主動(dòng)通過(guò)TCP三次握手和服務(wù)器建立連接,該連接就是數(shù)據(jù)連接。在文件傳輸完畢后,服務(wù)器通過(guò)TCP四次揮手,斷開該連接。
3.6 匿名服務(wù)器
上面介紹的客戶端向FTP服務(wù)器發(fā)起連接的過(guò)程,第一步基本都需要輸入服務(wù)器的用戶名和密碼。但有一些FTP服務(wù)器天然就是為了分發(fā)軟件和共享文件而存在,讓每一個(gè)人都申請(qǐng)用戶名和密碼,將非常的不方便。匿名FTP(anonymous FTP)就是為了應(yīng)對(duì)這種場(chǎng)景而出現(xiàn)的。
匿名FTP服務(wù)器的實(shí)質(zhì)是:提供服務(wù)的機(jī)構(gòu)在它的FTP服務(wù)器上建立一個(gè)公開賬戶(一般為anonymous),并賦予該賬戶訪問(wèn)公共目錄的權(quán)限。用戶想要登錄到這些FTP服務(wù)器時(shí),無(wú)需事先申請(qǐng)用戶賬戶和密碼,可以用anonymous
作為用戶名,用自己的E-mail地址
做密碼或直接不輸入密碼,便可登錄,獲取FTP服務(wù)。文章來(lái)源:http://www.zghlxwxcb.cn/news/detail-783534.html
如ftp.gnu.org
就是一個(gè)匿名服務(wù)器,用于GNU
的軟件分發(fā)和資料共享。如下是其登錄過(guò)程,直接用anonymous
當(dāng)作用戶名,不需要輸入密碼。文章來(lái)源地址http://www.zghlxwxcb.cn/news/detail-783534.html
ftp> open ftp.gnu.org
連接到 ftp.gnu.org。
220 GNU FTP server ready.
200 Always in UTF8 mode.
用戶(ftp.gnu.org:(none)): anonymous
230-NOTICE (Updated October 15 2021):
230-
230-If you maintain scripts used to access ftp.gnu.org over FTP,
230-we strongly encourage you to change them to use HTTPS instead.
230-
230-Eventually we hope to shut down FTP protocol access, but plan
230-to give notice here and other places for several months ahead
230-of time.
230-
230----
230-
230-Due to U.S. Export Regulations, all cryptographic software on this
230-site is subject to the following legal notice:
230-
230- This site includes publicly available encryption source code
230- which, together with object code resulting from the compiling of
230- publicly available source code, may be exported from the United
230- States under License Exception "TSU" pursuant to 15 C.F.R. Section
230- 740.13(e).
230-
230-This legal notice applies to cryptographic software only. Please see
230-the Bureau of Industry and Security (www.bxa.doc.gov) for more
230-information about current U.S. regulations.
230 Login successful.
ftp>
4 總結(jié)
-
FTP是一個(gè)用于在計(jì)算機(jī)網(wǎng)絡(luò)上在客戶端和服務(wù)器之間進(jìn)行文件傳輸?shù)膽?yīng)用層協(xié)議。
RFC 959
定義了FTP協(xié)議規(guī)范。 - FTP需要兩個(gè)TCP連接來(lái)完成文件的傳輸。其中一個(gè)稱為控制連接,一個(gè)稱為數(shù)據(jù)連接。
- 控制連接一直保持到客戶端—服務(wù)器連接的全過(guò)程,但數(shù)據(jù)連接可以根據(jù)需要隨時(shí)開、隨時(shí)關(guān)。
- 數(shù)據(jù)連接可以分為主動(dòng)模式和被動(dòng)模式,主動(dòng)模式有被客戶端防火墻阻止的風(fēng)險(xiǎn)。
-
主動(dòng)模式,FTP使用
20
和21
這兩個(gè)端口,其中20
用于數(shù)據(jù)連接(傳遞數(shù)據(jù)),21
用于控制連接(傳遞控制信息)。 - 如果采用被動(dòng)模式,具體最終使用哪個(gè)端口做數(shù)據(jù)連接要服務(wù)器端和客戶端協(xié)商決定。
- FTP報(bào)文是以ASCII碼明文進(jìn)行傳遞的。
到了這里,關(guān)于FTP協(xié)議詳解的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!