時間:2011-03-12 11:57:27 作者:不思議游戲 瀏覽量:3346
主動模式(active):
我們知道,F(xiàn)TP是由TCP封包的模式連接,TCP 這種封包由于需要經(jīng)過 Server 端與 Client 端兩邊的『三次握手』之后,才能確定聯(lián)機,也就是需要執(zhí)行ACK確認的動作,需要經(jīng)過以下幾個動作。
Client 端主動向 Server 端發(fā)送聯(lián)機需求: 首先client端會隨機選取1024以上的端口來主動聯(lián)機到server端提供的21端口,也就是會主動發(fā)送一個封包到server。
Server 端接受后,響應給 Client 端:當 Server 接收到 Client 的要求之后,會響應 Client 端的需求,此時 Server 端會建立等待聯(lián)機的資源,并且將一帶有 SYN 與確認 (ACK) 的封包送回 Client 端;
Client 端回應確認封包:在 Client 端接收到來自 Server 端告知的封包后,會再次的發(fā)送一個確認封包給主機,此時,兩邊才會正式的建立起聯(lián)機的通道,這個步驟 1 ~ 3 就是 Three-Way Handshake(三次握手)。需要注意的是,這個已經(jīng)建立聯(lián)機的通道(通常是 port 21)僅能進行 FTP 的『指令』而已,如果該指令涉及到數(shù)據(jù)的傳送(data transfer)時,例如上傳或下載等等,那么就需要額外建立一條數(shù)據(jù)傳輸?shù)耐ǖ啦判?( ftp-data )!而數(shù)據(jù)傳輸?shù)耐ǖ澜t需要繼續(xù)底下的步驟;
Client 端發(fā)送數(shù)據(jù)傳輸要求的命令給 Server:當需要進行數(shù)據(jù)的傳輸時,Client 端會啟用另一個高于 1024 的端口來做為聯(lián)機的準備(這個高于 1024 的端口與步驟 1 那個端口不是同一個!),并且 Client 端會主動的利用剛剛已經(jīng)建立的指令信道(通常是 port 21)發(fā)送一個命令告訴 Server 說:『我已經(jīng)準備好一個數(shù)據(jù)傳輸?shù)亩丝诹�,請準備進行傳輸吧』!
Server 端以 ftp-data 端口主動聯(lián)機到 Client :收到命令之后的 Server 會『主動』的以 ftp-data 端口(一般為 port 20)向 Client 端通知的那個高于 1024 的端口進行聯(lián)機。
Client 端響應主機端,并繼續(xù)完成三次握手:在接到 Server 來的封包之后, Client 會響應一個帶有 ACK 確認的封包,并繼續(xù)來完成另一個三次握手的程序,此時,數(shù)據(jù)傳輸?shù)耐ǖ啦耪降慕ⅰ?/p>
以上就是client端以主動模式連接Server端的過程,適合FTP 服務器和PC客戶端的直接建立連接,使用到的端口:
(1)命令通道的 (預設為port 21) 。
(2)數(shù)據(jù)傳輸?shù)?(預設為port 20)。
被動模式(passive)
還有一種網(wǎng)絡狀況,就是Client 端是在防火墻后端,或者是NAT主機后端,這個時候client端和server端之間建立FTP連接時,就會出現(xiàn)一些不一樣的狀況。
FTP client 是在 NAT 主機的后端,那由于我們的 NAT 主機會自動的紀錄 client 端向外聯(lián)機的信息,所以在 Client 依上面步驟 1 送出要求封包后,步驟 2 的 FTP 回傳的封包可以透過 NAT 轉(zhuǎn)交給 client ,這沒有問題!所以, Client 連接到 Server 的命令通道 ( port 21 )可以正確的被建立起來的。不過,Client 端在建立起了命令通道之后,對 Server 下達數(shù)據(jù)傳輸?shù)拿畛鯐霈F(xiàn)一些問題,我們以底下的圖示來說明好了:
由于目前的 NAT 主機可以記錄由內(nèi)部計算機聯(lián)機出去的信息,因此,由 port 21 的聯(lián)機可以順利的被建立起來;
當 Client 端由 port 21 下達數(shù)據(jù)傳輸?shù)拿顣r,此時client會告訴 FTP Server 說:『我開了一個 >1024 的端口,請來連接吧』!
這個時候要特別留意的是,client經(jīng)過NAT主機聯(lián)機后,在 FTP Server 看到的client的 IP 其實是 NAT 那部主機的!所以,這個時候 FTP Server 會主動的由 port 20 向 NAT 主機的 >1024 那個 port 要求建立聯(lián)機!
經(jīng)過上圖我們會發(fā)現(xiàn),F(xiàn)TP Server會根據(jù)client的命令去連接那個>1024的端口,NAT主機或者防火墻并沒有那個開啟那個>1024的端口,所以就會造成無法連接的問題。
既然這樣不能正常連接,那么我們就讓client主動去連接服務器,這樣就不會出現(xiàn)上述的問題了,這種方式我們稱之為“被動模式(passive)”。被動模式會經(jīng)過經(jīng)過以下幾個步驟:
Client 端主動向 Server 端發(fā)送聯(lián)機需求:
Server 端接受后,響應給 Client 端:
Client 端回應確認封包:上面這三個步驟與主動式聯(lián)機一樣,同樣的完成三次握手后,建立命令通道了!底下說明被動式數(shù)據(jù)傳輸信道的建立。