Python的網絡編程[1] -> FTP -> FTP 的基本理論
FTP協議 / FTP Protocol
FTP全稱為File Transfer Protocol(文件傳輸協議),常用於Internet上控制文件的雙向傳輸,常用的操作有上傳和下載。基於TCP/IP,基於RFC959通信協議。
0 FTP理論 / FTP Theory
詳細的理論可以參考這裏。
1 FTP結構 / FTP Structure
FTP如同其他的很多通訊協議,FTP通訊協議也采用客戶機 / 服務器(Client / Server)架構。用戶可以通過各種不同的FTP客戶端程序,借助FTP協議,來連接FTP服務器,以上傳或者下載文件。
2 FTP通訊端口 / FTP Communication Port
FTP的服務器與客戶端之間的文件傳輸,需要通過端口來進行,FTP協議的端口包括:
TCP端口21:
主要用於指令傳輸,所有客戶端發往FTP服務器的命令和服務器的反饋指令都是通過該端口進行傳輸。
TCP端口20:
主要用於數據傳輸(主動模式),例如客戶端上傳下載內容,以及查看目錄顯示內容等。
3 FTP連接模式 / FTP Communication Mode
FTP的主動模式和被動模式,兩者的區別,用兩張圖來表示:
3.1 主動模式PORT
主動模式工作過程:
1. 客戶端以隨機非特權高位端口N (>1024),對server端21端口發起連接,並且之後所有控制命令均通過這條鏈路傳送;
2. 當需要進行數據傳輸時,客戶端開始監聽N+1端口,並發送port N+1的命令到FTP服務器;
3. 服務端會主動以20端口連接到客戶端的N+1端口。
總結流程如下:
客戶端向服務器的FTP端口(默認是21)發送連接請求,服務器接受連接,建立一條命令鏈路。當需要傳送數據時,客戶端在命令鏈路上用PORT命令告訴服務器:“我打開了***X端口,你過來連接我”。於是服務器從20端口向客戶端的***X端口發送連接請求,建立一條數據鏈路來傳送數據
主動模式的優點:
服務端配置簡單,利於服務器安全管理,服務器只需要開放21端口
主動模式的缺點:
如果客戶端開啟了防火墻,或客戶端處於內網(NAT網關之後), 那麽服務器對客戶端端口發起的連接可能會失敗
3.2 被動模式PASV
被動模式工作過程:
1. 客戶端打開隨機非特權端口N和N+1,並以端口N連接服務端的21端口(提交PASV命令);
2. 服務端開啟一個非特權端口M為被動端口,並返回給客戶端;
3. 客戶端以N+1的端口主動連接服務端的被動端口M,從而建立連接傳輸數據。
總結流程如下:
客戶端向服務器的FTP端口(默認是21)發送連接請求,服務器接受連接,建立一條命令鏈路。當需要傳送數據時,服務器在命令鏈路上用PASV命令告訴客戶端:“我打開了***X端口,你過來連接我”。於是客戶端向服務器的***X端口發送連接請求,建立一條數據鏈路來傳送數據。
被動模式缺點:
服務器配置管理稍顯復雜,不利於安全,服務器需要開放隨機高位端口以便客戶端可以連接,因此大多數FTP服務軟件都可以手動配置被動端口的範圍
被動模式的優點:
對客戶端網絡環境沒有要求,而對服務端有。
被動模式客戶端Log:
*resp* ‘220 Welcome to my FTP server.‘ *cmd* ‘USER Admin‘ *resp* ‘331 Username ok, send password.‘ *cmd* ‘PASS ******‘ *resp* ‘230 Admin login successful‘ *welcome* ‘220 Welcome to my FTP server.‘ *cmd* ‘TYPE I‘ *resp* ‘200 Type set to: Binary.‘ *cmd* ‘PASV‘ *resp* ‘227 Entering passive mode (127,0,0,10,8,74).‘ *cmd* ‘RETR testFile.py‘ *resp* ‘125 Data connection already open. Transfer starting.‘ *resp* ‘226 Transfer complete.‘ *cmd* ‘TYPE I‘ *resp* ‘200 Type set to: Binary.‘ *cmd* ‘PASV‘ *resp* ‘227 Entering passive mode (127,0,0,10,8,105).‘ *cmd* ‘RETR testFile.docx‘ *resp* ‘125 Data connection already open. Transfer starting.‘ *resp* ‘226 Transfer complete.‘ *cmd* ‘QUIT‘ *resp* ‘221 Goodbye, admin.‘View Code
Note:
- *resp*為ServeràClient, *cmd*為ClientàServer
- TYPE I 為二進制方式傳輸
- ‘227 Entering passive mode (127,0,0,10,8,74).‘表示返回了服務器IP和服務器開啟的臨時端口,臨時端口算法為,8*256+74=2122。
參考鏈接
http://blog.csdn.net/sever2012/article/details/7074426
http://blog.csdn.net/cuker919/article/details/6403925
Python的網絡編程[1] -> FTP -> FTP 的基本理論