FTP:構建在TCP協議之上的文件傳輸協議

在前幾節我們辛苦完成了TCP協議的基本設計,我們的代碼當然無法達到工業級要求,但是基本將TCP協議的要點表達出來,是一個”基本可用版本“。TCP協議類似於一條貨輪,負責把貨物也就是上層數據從一端穩定的運輸到另一端,我們既然已經有了貨輪,如果不讓他來運貨,那麼其作用就難以體現,從本節開始我將從基於TCP之上的協議入手,理解它們的設計原理,並掌握上層協議如何應用TCP實現自己的數據傳輸目的。

我們首先關注的是FTP協議,因爲它到目前依然還有較爲廣泛的應用,前幾節我們實現了基於UDP的TFTP協議,從本節開始我們看看如何實現基於TCP的FTP協議。FTP提供了一系列方便的文件瀏覽,上傳,刪除和複製等操作,而這一系列功能都建立在TCP之上。FTP協議基於客戶端-服務器模式,一旦底層TCP協議建立連接後,客戶端和服務器可以通過交互控制命令來建立連接。整個協議建立在一個所謂的"FTP模型”之上,模型規定了文件傳輸的雙方之間如何互動。

FTP模型要求建立兩條邏輯連接,一條連接用於傳輸控制命令,另一條連接用於控制數據傳輸。一次FTP會話建立時首先要建立用於控制命令的邏輯連接,該鏈接直到斷開時才結束。當雙方需要實現數據傳輸時,第二條連接才需要建立。實現FTP協議的兩端都需要設立兩個組件,一個叫protocol interpreter,用於解讀雙方傳輸的控制命令,另一個叫data transfer process,用於負責數據塊的傳輸,基本流程如下圖所示:

屏幕快照 2020-01-04 下午6.08.03.png

在上圖右邊FTP 服務器中有兩個模塊,一個叫服務器協議解釋器,它負責與左邊幫客戶的的協議解釋器進行交互,相互間發送控制命令。第二個模塊叫服務器數據傳輸進程,它與左邊的客戶端數據傳輸進程交互,雙方負責發送和接收數據。接下來我們看看FTP兩方在協議層面的連接過程。服務器端的協議模塊會在給定端口21監聽來自客戶端的連接,首先是登陸過程,客戶端將自己的用戶名和密碼發送給服務器,客戶端使用USER控制命令發送自己的用戶名,使用PASS控制命令發送密碼,服務器接收後檢索數據庫看是否有給定用戶存在,如果有那麼雙方就可以建立會話過程,該流程如下圖所示:

屏幕快照 2020-01-06 下午6.28.30.png

兩邊在控制命令層面建立連接完成溝通後,接下來就是在數據傳輸層面完成連接。數據傳輸連接有兩種方式,一種是主動連接,也就是服務器端通過TCP,以端口20主動向客戶端發起連接請求,客戶端使用自己的端口來接受服務器端的連接請求。我們看一個具體例子,假設客戶端使用端口1678與服務器端口21在控制命令層面完成了連接,然後服務器會使用端口20向客戶端發起連接請求,客戶端重新使用另一個端口例如1742來承接服務器端的請求,一旦接受服務器端請求後,雙方的數據傳輸通道就可以確立,整個過程如下圖所示:

屏幕快照 2020-01-07 上午11.18.52.png

在使用主動連接模式時,在控制命令傳輸層面,客戶端要通過PORT命令把自己用於數據傳輸的端口告知服務器,這樣服務器才能主動發起連接。第二種數據連通方法是被動連接,也就是連接由客戶端發起,服務器端只能被動等待客戶端的連接請求。這需要在控制命令傳輸時,客戶端向服務器端發送PASV控制命令告訴服務器由它來發起數據傳輸連接。然後服務器會將返回一個端口值例如2223,讓客戶端使用該端口向其發起連接。當客戶端使用該端口發起連接後,服務器端纔會接收然後雙方纔能相互發送文件數據,整個流程如下圖所示:

屏幕快照 2020-01-07 上午11.25.47.png

這兩種連接方式的差別主要在於安全性。通常情況下客戶端極少會收到服務器端的主動連接,因此很多安全配置會讓客戶端封堵掉一切主動連接。使用被動連接時,客戶端主動向服務器發起連接,於是安全防護的責任就落到服務器身上,因爲任何主動進來的連接都會帶有安全隱患。下一節我們看看FTP的數據發送流程。

更詳細的講解和代碼調試演示過程,請點擊鏈接](https://study.163.com/provider/7600199/course.htm?share=2&shareId=7600199)

更多技術信息,包括操作系統,編譯器,面試算法,機器學習,人工智能,請關照我的公衆號:
這裏寫圖片描述

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