繼上一篇《CentOS 6.5 手動搭建FTP服務(wù)器--vsftpd》,我們再來看一下FTP通信的過程是怎么樣的。這里我們使用了最流行的網(wǎng)絡(luò)抓包工具:Wireshark,版本是2.4.2。我們把它安裝在了client端,也就是實(shí)驗(yàn)機(jī)上的Windows虛擬機(jī)。我們把整個操作過程所觸發(fā)的所有通信包都抓了下來,從底層來窺探下FTP實(shí)現(xiàn)機(jī)制 -- 登錄FTP服務(wù)器,運(yùn)行l(wèi)s命令查看文件列表,并用get命令下載服務(wù)器上的一個文件,最后退出FTP登錄。
FTP Server IP: 192.168.111.15
FTP Client IP: 192.168.111.13
分析之前還要免費(fèi)做個安利,公司內(nèi)的網(wǎng)絡(luò)大牛的一本抓包分析圖書《Wireshark網(wǎng)絡(luò)分析就是這么簡單》,本文從中受到了很大啟發(fā)也做了些借鑒,侵權(quán)即刪。
1. ARP
同一網(wǎng)段內(nèi)的主機(jī)在二層網(wǎng)絡(luò)需要Mac地址來通信,client端發(fā)起了ARP廣播查詢,查詢server的mac地址。Server響應(yīng)正確的mac地址
2. TCP 三次握手
Client端發(fā)起與Server的TCP通信
3. FTP 服務(wù)器應(yīng)答FTP請求,并與client交互識別身份完成登錄
上述三個包展現(xiàn)的是TCP連接建立完成后,F(xiàn)TP server返回的應(yīng)答以及client的ACK。透過wireshark的解析,我們看到Response 220的具體含義是:Service ready for new user(220)
以上是身份識別過程的包,到此為止這也是TCP登錄過程中所有的通信包,前提是你輸入完用戶名密碼后沒有做其他的操作,比如ls查看文件列表。可以看到,每一個TCP請求或者應(yīng)答都會伴隨一個TCP的ACK包
4. 用戶請求文件列表
18 - 20:
client和server交互通信所有的端口, client端口的計算方法為192x256+42 = 49194。這里沒有協(xié)商任何有關(guān)server端口的信息,那么server端口是怎么來的呢?答案在FTP server的配置文件中(/etc/vsftpd/vsftpd.conf):
connect_from_port_20=YES
21:
Client 發(fā)出ls命令
22 - 24:
Server發(fā)起與client的三次握手
25 - 26:
Server應(yīng)答FTP請求,返回ls命令的data
27,28,31,32:
Server應(yīng)答完成立即斷開TCP連接,這里是4次揮手的過程
29 - 30:
這里是client返回ACK應(yīng)答Server發(fā)來的文件列表數(shù)據(jù),包括了FTP和TCP兩個ACK包。值得注意的是,雖然這兩個包出現(xiàn)在TCP4次揮手過程中,并不代表這兩個包和TCP斷開連接有關(guān)系,實(shí)際上,TCP server發(fā)送完數(shù)據(jù)后會立刻斷開連接。這里的兩個包實(shí)際上是“控制連接”的兩個包,仔細(xì)觀察可以看到,通信端口是49131->21。而“數(shù)據(jù)連接”通信是在49194和20之間。
可能到了這里讀者也已經(jīng)看了出來,F(xiàn)TP的工作方式分為兩部分,一部分是控制鏈接,用于傳輸控制信息,具體工作在建立鏈接過程;而另一個部分則是數(shù)據(jù)鏈接,每當(dāng)client請求數(shù)據(jù),client和server就會重新建立一個TCP鏈接用于數(shù)據(jù)傳輸,數(shù)據(jù)傳輸完成后,這個TCP鏈接就會被斷開。其中,控制鏈接的TCP通信是由client發(fā)起,而數(shù)據(jù)鏈接的FTP通信則又server端發(fā)起。而每次數(shù)據(jù)傳輸,都需要控制鏈接和數(shù)據(jù)鏈接的共同協(xié)作完成,數(shù)據(jù)鏈接完成數(shù)據(jù)交互,控制鏈接也要做傳輸完成應(yīng)答。
5. 用戶請求文件
這三個包體現(xiàn)的是用戶切換至binary傳輸模式發(fā)生的網(wǎng)絡(luò)通信。client請求,server應(yīng)答,client返回ACK。
同上面第四部分用戶執(zhí)行l(wèi)s命令相同,當(dāng)用戶發(fā)出 get b.txt命令后,首先是client和server交互通信端口信息(38-40)。然后是server利用協(xié)商出的新端口發(fā)起和client的新的TCP鏈接(41-43),并傳輸數(shù)據(jù)(44-45)。數(shù)據(jù)傳輸完成后斷開這個TCP數(shù)據(jù)鏈接(46-47, 50-51)。而TCP的控制鏈接也對傳輸完成做了確認(rèn)(48-49)。
6. Client斷開FTP鏈接
當(dāng)用戶在終端敲出bye命令后,我們看到client發(fā)出了一個FTP包,請求QUIT FTP鏈接,隨即server友好地回應(yīng)了一句Goodbye。之后又是sever發(fā)起的TCP四次揮手?jǐn)嚅_控制鏈接。所以,控制鏈接是伴隨整個FTP鏈接生命周期的。至此,整個FTP通信過程分析完畢,是不是感覺FTP是個比較簡潔的協(xié)議呢?