當前位置:首頁 » 文件管理 » Retrftp

Retrftp

發布時間: 2024-01-13 06:12:17

① 如何非同步讀取ftp

一:開發背景
由於需要對多個伺服器發布大的數據包,所以自己在LINUX用C語言,開發了一個傳送器工具。因為上傳時需要支持斷點續傳,所以自己參考ftp-rfc959和一些文章開發了這個支持斷點續傳的上傳工具。整個工具分兩部分開發的:一是支持斷點續傳的Ftp工具,包含下載和上傳功能。二是同時對多個伺服器發布不同數據包的傳送器工具。本文只是對斷點續傳的商船和下載作探討。

二:實現
其實Ftp上傳下載的實現很簡單,首先Ftp伺服器端要支持文件的定位,
然後就是通過建立的Socket用Ftp伺服器命令和伺服器交互.
有些也可以通過Socket做自己的客戶端和伺服器端,但是有些伺服器是自己能管理控制的,而且原來自己也寫過一些這樣C/S模式的工具,簡單消息的傳送接收還不錯。
但用來傳輸文件效率很低,比文件傳送協議FTP(File Transfer Protocol)差的太多。 利用Ftp的服務端可以省去伺服器端的開發,而且可以向任何開放Ftp服務的伺服器上傳送文件,可以不考慮對方安裝的
是什麼的操作系統。

三:FTP
文件傳送協議 FTP 只提供文件傳送的一些基本的服務,它使用 TCP 可靠的運輸服務。FTP 的主要功能是減少或消除在不同操作系統下處理文件的不兼容性。
FTP 使用客戶伺服器方式。
一個 FTP 伺服器進程可同時為多個客戶進程提供服務。FTP的伺服器進程由兩大部分組成:一個主進程,負責接受新的請求;另外有若干個從屬進程,負責處理單個請求。
A、通常的方式:
控制連接在整個會話期間一直保持打開,FTP 客戶所發出的傳送請求通過控制連接發送給控制進程,但控制連接並不用來傳送文件,實際用於傳輸文件的是「數據連接」。
控制進程在接收到 FTP 客戶發送來的文件傳輸請求後就創建一個「數據傳送進程」和一個「數據連接」,並將數據連接連接到「數據傳送進程」,數據傳送進程實際完成文件的傳送,在傳送完畢後關閉「數據傳送連接」並結束運行
當客戶進程向伺服器進程發出建立連接請求時,要尋找連接伺服器進程的熟知埠(21),同時還要告訴伺服器進程自己的另一個埠號碼,用於建立數據傳送連接。接著,伺服器進程用自己傳送數據的熟知埠(20)與客戶進程所提供的埠號碼建立數據傳送連接。

B、 被動模式:
FTP客戶端發出的連接請求,一般通過伺服器的21號埠建立控制連接,專門用來傳輸一些字元串命令和響應信息。控制命令通道一定是由客戶端向伺服器的連接(默認的埠是21,也可以指定埠,這要看伺服器的設置)。
PASV:通過控制通道通過發送PASV 伺服器命令到 FTP伺服器。請求建立被動模式數據連接通道。 (客戶端的命令 passive)
伺服器返回連接的信息(227 Entering Passive Mode (70,0,10,62,120,18) )地址和埠。埠=最後第二位乘256再加上最後一位(120*256+18)。(注意埠設為0的情況) 如: *f_port = atoi(port_1) * 256 + atoi(port_2);
伺服器端和客戶端身份轉換,原客戶端在本地建立監聽,監聽來自原伺服器遠端的連接請求建立數據連接通道。
四、 實現方法:
A、下載:
1、向伺服器發送「REST + 本地文件長度」,告訴伺服器,客戶端要斷點下載了。這時伺服器還不知道客戶端要下載的文件名;
2、向伺服器發送"RETR + 文件名",通知伺服器要下載的文件名,這時伺服器開始定位文件指針讀文件並發送數據。
3、客戶端定位本地文件指針偏移到文件末尾;
4、兩端的准備工作都做完了以後,客戶端創建socket,以被動或非被動方式建立數據鏈接,循環調用recv接收文件數據並追加到本地文件末尾;

B、上傳:
1、獲取伺服器上和本地要上傳文件的同名文件大小;
2、向伺服器發送「APPE + 文件名」,通知伺服器,從數據通道發送給你的數據要附加到這個文件末尾。
3、定位本地文件指針,文件指針偏移到指定位置,這個位置與FTP伺服器上文件大小相同的位置。
4、從文件指針處讀數據並發送。

C、Ftp伺服器命令
我們平時使用的命令,大多是客戶端的。伺服器端的命令可以參考下面:
命令 描述
ABOR 中斷數據連接程序 ACCT <account> 系統特權帳號
ALLO <bytes> 為伺服器上的文件存儲器分配位元組 APPE <filename> 添加文件到伺服器同名文件
CDUP <dir path> 改變伺服器上的父目錄 CWD <dir path> 改變伺服器上的工作目錄
DELE <filename> 刪除伺服器上的指定文件 HELP <command> 返回指定命令信息 LIST <name> 如果是文件名列出文件信息,如果是目錄則列出文件列表 MODE <mode> 傳輸模式(S=流模式,B=塊模式,C=壓縮模式)
MKD <directory> 在伺服器上建立指定目錄 NLST <directory> 列出指定目錄內容
NOOP 無動作,除了來自伺服器上的承認 PASS <password> 系統登錄密碼
PASV 請求伺服器等待數據連接 PORT <address> IP 地址和兩位元組的埠 ID PWD 顯示當前工作目錄 QUIT 從 FTP 伺服器上退出登錄
REIN 重新初始化登錄狀態連接 REST <offset> 由特定偏移量重啟文件傳遞
RETR <filename> 從伺服器上找回(復制)文件 RMD <directory> 在伺服器上刪除指定目錄
RNFR <old path> 對舊路徑重命名 RNTO <new path> 對新路徑重命名
SITE <params> 由伺服器提供的站點特殊參數 SMNT <pathname> 掛載指定文件結構
STAT <directory> 在當前程序或目錄上返回信息 STOR <filename> 儲存(復制)文件到伺服器上
STOU <filename> 儲存文件到伺服器名稱上 STRU <type> 數據結構(F=文件,R=記錄,P=頁面)
SYST 返回伺服器使用的操作系統 TYPE <data type> 數據類型(A=ASCII,E=EBCDIC,I=binary)
USER <username>> 系統登錄的用戶名
D、伺服器返回的部分數字代碼含義
125 Data connection already open; Transfer starting.
226 Transfer complete.
227 Entering Passive Mode (127,0,0,1,4,18).
230 User xxxxx logged in.
331 Password required for xxxxx.
425 Can』t open data connection.
226 Closing data connection.
200 return a state of TYPE or MODE commond
220 connection state
五、關於Socket
關於Socket編程有很多參考資料,這里不作詳細說明
Socket是應用層與TCP/IP協議族通信的中間軟體抽象層,它是一組介面
Socket 是一個基本的通信機制Socket把復雜的TCP/IP協議族隱藏在Socket介面後面,對用戶來說,一組簡單的介面就是全部,讓Socket去組織數據,以符合指定的協議.
Socket也具有一個類似於打開文件的函數調用Socket(),該函數返回一個整型的Socket描述符,隨後的連接建立、數據傳輸等操作都是通過該Socket實現的。
常用的Socket類型有兩種:
A、流式Socket(SOCK_STREAM):流式是一種面向連接的Socket,針對於面向連接的TCP服務應用。
B、數據報式Socket(SOCK_DGRAM):數據報式Socket是一種無連接的Socket,對應於無連接的UDP服務應用。
Socket的程序是一種C/S結構,分客戶端和伺服器端。
A、客戶端
– 初始化Socket
– 連接伺服器(connect),如果連接成功,這時客戶端與伺服器端的連接就建立了
– 客戶端發送數據請求,伺服器端接收請求並處理請求,然後把回應數據發送給客戶端
– 客戶端讀取數據,最後關閉連接,一次交互結束。
B、伺服器端
- 初始化Socket
- 埠綁定(bind)
- 監聽(listen)埠
- 調用accept阻塞,等待客戶端連接
在這里我們使用的就是面向連接的流式Socket,只編寫客戶端的程序。

六、代碼:
下面僅提供一個編譯過並在使用中的函數簡單的說明其實現原理,
需要有一點C語言和Linux/UNIX的socket編程基礎即可理解。
只是建立連接和傳輸部分的一個函數。當文件傳出結束或斷開時,
可以調用檢查函數看是否成功,位元組是否正常等,如果不正常結束,
可以再次循環調用它並定為伺服器文件的位元組,繼續傳輸。
其他的控制和功能都在其他函數中實現。為移植方便使用標准C語法符合C89標准。
code:
/*****************************************************************
* FileName: uftt_ver5.c *
* Company: algorithmics china lib Co.,Ltd. *
* Author: G.L.Zhang --- zglcl008 *
* Time: [2006-12-20] *
* Description: uninterrupted file transfers tools *
*****************************************************************/

int f_file_trans(const char *ft_addr, int ft_port, const char *ft_usr,const char *ft_pwd, const char *ft_opt, const char *ft_src, char *ft_obj, int ft_flg)
{
int cmd_sock = -1;
int dat_sock = -1;
int stream_sock= -1;
int dat_port = 0;
char dat_buffer[1024*5];
struct sockaddr_in f_server;
struct sockaddr_in f_datasvr;
unsigned char *pasv_ip = NULL;
unsigned char *pasv_port = NULL;
unsigned int len_addr = 0;
long rc_size = 0;
/* long svr_file_size = 0; */
long file_size = 0;
int rc = 0;
if (ft_addr == NULL || ft_usr == NULLft_pwd == NULL ||
ft_opt == NULL || ft_src == NULL || ft_obj == NULL ||
ft_port == 0 || ft_flg < 0) {
err_quit("--- file transfers parameter error");
}
/* get ftp commomd socket */
if ((cmd_sock = socket(AF_INET, SOCK_STREAM, 0)) < 0) {
perror("cmmond socket");
err_quit("--- command sock error");
}

bzero(&f_server, sizeof(f_server));
f_server.sin_family = AF_INET;
f_server.sin_port = htons(ft_port);
f_server.sin_addr.s_addr = inet_addr(ft_addr);

if (connect(cmd_sock, (struct sockaddr *)&f_server, sizeof(f_server)) < 0) {
perror("connect");
err_quit("--- command sock error");
}
rc = uftt_cmd(dat_buffer, cmd_sock, NULL);
if (rc == 220)
printf("-1- %d OK\n", rc);
else
printf("-1- %d ERR\n", rc);

rc = uftt_cmd(dat_buffer, cmd_sock,"USER %s",ft_usr);
if (rc == 331)
printf("-2- %d OK\n", rc);
else
printf("-3- %d ERR\n", rc);
rc = uftt_cmd(dat_buffer, cmd_sock,"PASS %s",ft_pwd);
if (rc == 230)
printf("-3- %d OK\n", rc);
else
printf("-3- %d ERR\n", rc);
rc = uftt_cmd(dat_buffer, cmd_sock, "TYPE I");
if (rc == 200)
printf("-41- %d OK\n", rc);
else
printf("-41- %d ERR\n", rc);
rc = uftt_cmd(dat_buffer, cmd_sock, "MODE S");
if (rc == 200)
printf("-42- %d OK\n", rc);
else
printf("-42- %d ERR\n", rc);

memset(dat_buffer, ''\0'', sizeof(dat_buffer));
rc = uftt_cmd(dat_buffer, cmd_sock, "PASV");
if (rc == 227)
printf("-5- %d OK\n", rc);
else
printf("-5- %d ERR\n", rc);
#ifdef ZGL_DEBUG
printf("-5- %d %s\n", rc, dat_buffer);
#endif
/* get passive port */
dat_port = 0;
if ((rc = get_svr_port(dat_buffer, (int *)&dat_port)) < 0)
err_quit("data stream port error");
#ifdef ZGL_DEBUG
printf("--- pasive port=[%d]\n", dat_port);
#endif
if ((dat_sock = socket(AF_INET, SOCK_STREAM, 0)) < 0) {
perror("data socket");
err_quit("--- data sock error");
}
len_addr = sizeof(f_datasvr);
bzero(&f_datasvr, sizeof(f_datasvr));
rc = getsockname(cmd_sock, (struct sockaddr *)&f_datasvr, (unsigned int *)&len_addr);
f_datasvr.sin_port = htons(dat_port);
/* 0=all port or appoint port TEST OK ***
f_datasvr.sin_port = htons(dat_port);
f_datasvr.sin_port = 0;
*/
if (bind(dat_sock,(struct sockaddr *)&f_datasvr,len_addr) == -1)
err_sys("--- data sock bind error");
if (listen(dat_sock,1) == -1)
err_sys("--- data sock bind error");
rc = getsockname(dat_sock, (struct sockaddr *)&f_datasvr, (unsigned int *)&len_addr);
pasv_ip = (unsigned char *)&f_datasvr.sin_addr;
pasv_port = (unsigned char *)&f_datasvr.sin_port;
rc = uftt_cmd(dat_buffer, cmd_sock,"PORT %d,%d,%d,%d,%d,%d",pasv_ip[0],
pasv_ip[1], pasv_ip[2], pasv_ip[3], pasv_port[0], pasv_port[1]);
if (rc == 200)
printf("-6- %d OK\n", rc);
else
printf("-6- %d ERR\n", rc);

/* get RETR put STOR append APPE */
if (ft_flg == 0) {
rc = uftt_cmd(dat_buffer, cmd_sock, "STOR %s", ft_obj);
}
else if (ft_flg > 0){
rc = uftt_cmd(dat_buffer, cmd_sock, "APPE %s", ft_obj);
}
if (rc == 150)
printf("-7- %d OK\n", rc);
else
printf("-7- %d ERR\n", rc);
stream_sock = accept(dat_sock, (struct sockaddr *)&f_datasvr, (unsigned int *)&len_addr);
if (stream_sock < 0)
err_sys("--- stream socket error");
rc_size = f_put_file(stream_sock, ft_src, ft_obj, ft_flg, file_size);
/* do without ***
rc = uftt_cmd(dat_buffer, dat_sock,"QUIT");
printf("-8- %d \n", rc);
*/
close(stream_sock);
close(dat_sock);
rc = uftt_cmd(dat_buffer, cmd_sock,"QUIT");
if (rc == 226)
printf("-9- %d OK\n", rc);
else
printf("-9- %d ERR\n", rc);
close(cmd_sock);
return rc_size ;
}

② 請解釋一下FTP連接的命令及響應

FTP命令
命令 描述
ABOR 中斷數據連接程序
ACCT <account> 系統特權帳號
ALLO <bytes> 為伺服器上的文件存儲器分配位元組
APPE <filename> 添加文件到伺服器同名文件
CDUP <dir path> 改變伺服器上的父目錄
CWD <dir path> 改變伺服器上的工作目錄
DELE <filename> 刪除伺服器上的指定文件
HELP <command> 返回指定命令信息
LIST <name> 如果是文件名列出文件信息,如果是目錄則列出文件列表
MODE <mode> 傳輸模式(S=流模式,B=塊模式,C=壓縮模式)
MKD <directory> 在伺服器上建立指定目錄
NLST <directory> 列出指定目錄內容
NOOP 無動作,除了來自伺服器上的承認
PASS <password> 系統登錄密碼
PASV 請求伺服器等待數據連接
PORT <address> IP 地址和兩位元組的埠 ID
PWD 顯示當前工作目錄
QUIT 從 FTP 伺服器上退出登錄
REIN 重新初始化登錄狀態連接
REST <offset> 由特定偏移量重啟文件傳遞
RETR <filename> 從伺服器上找回(復制)文件
RMD <directory> 在伺服器上刪除指定目錄
RNFR <old path> 對舊路徑重命名
RNTO <new path> 對新路徑重命名
SITE <params> 由伺服器提供的站點特殊參數
SMNT <pathname> 掛載指定文件結構
STAT <directory> 在當前程序或目錄上返回信息
STOR <filename> 儲存(復制)文件到伺服器上
STOU <filename> 儲存文件到伺服器名稱上
STRU <type> 數據結構(F=文件,R=記錄,P=頁面)
SYST 返回伺服器使用的操作系統
TYPE <data type> 數據類型(A=ASCII,E=EBCDIC,I=binary)
USER <username>> 系統登錄的用戶名

FTP響應碼

響應代碼 解釋說明
110 新文件指示器上的重啟標記
120 伺服器准備就緒的時間(分鍾數)
125 打開數據連接,開始傳輸
150 打開連接
200 成功
202 命令沒有執行
211 系統狀態回復
212 目錄狀態回復
213 文件狀態回復
214 幫助信息回復
215 系統類型回復
220 服務就緒
221 退出網路
225 打開數據連接
226 結束數據連接
227 進入被動模式(IP 地址、ID 埠)
230 登錄網際網路
250 文件行為完成
257 路徑名建立
331 要求密碼
332 要求帳號
350 文件行為暫停
421 服務關閉
425 無法打開數據連接
426 結束連接
450 文件不可用
451 遇到本地錯誤
452 磁碟空間不足
500 無效命令
501 錯誤參數
502 命令沒有執行
503 錯誤指令序列
504 無效命令參數
530 未登錄網路
532 存儲文件需要帳號
550 文件不可用
551 不知道的頁類型
552 超過存儲分配
553 文件名不允許

③ FTP該如何實現斷點續傳

客戶端的實現步驟如下:
一、下載:
1、向伺服器發送「REST + 本地文件長度」命令,告訴伺服器,客戶端要斷點下載了。這時伺服器還不知道客戶端要下載哪個文件;
要實現FTP的斷點續傳,FTP伺服器必須支持REST指令,這條指令在FTP協議文本RFC959中就已經定義了,不過它不是FTP伺服器必須支持的指令。一般,你可以在下載前使用REST 100命令進行實驗,如果伺服器正常執行了這條命令,說明該伺服器支持FTP斷點續傳。REST後面跟的數表示下載文件的起始位置,而REST 0表示從文件最開始處下載。REST命令本身並不執行下載功能,你仍需要使用RETR命令執行下載工作。
2、向伺服器發送「RETR + 文件名」命令,通知伺服器要下載的文件名,這時伺服器開始定位文件指針讀文件並發送數據。
3、客戶端定位本地文件指針(文件末尾);
4、兩端的准備工作都做完了以後,客戶端創建socket,以被動或非被動方式建立數據通道,循環調用recv接收數據並追加入本地文件;
二、上傳:
1、獲取伺服器上和本地要上傳文件的同名文件大小;
2、向伺服器發送「APPE + 文件名」,通知伺服器,接下來從數據通道發送給你的數據要附加到這個文件末尾。
3、定位本地文件指針(和FTP上文件大小相同的位置)
4、從文件指針處讀數據並發送。
代碼里將斷點上傳和斷點下載放到同一個函數(MoveFile)里,通過get參數說明是上傳還是下載。

④ ftp是什麼意思

FTP 是File Transfer Protocol(文件傳輸協議)的英文簡稱,而中文簡稱為「文傳協議」。用於Internet上的控制文件的雙向傳輸。同時,它也是一個應用程序(Application)。

FTP是一個8位的客戶端-伺服器協議,能操作任何類型的文件而不需要進一步處理,就像MIME或Unicode一樣。但是,FTP有著極高的延時,這意味著,從開始請求到第一次接收需求數據之間的時間,會非常長;並且不時的必須執行一些冗長的登錄進程。

文件傳輸協議的原始規范於1971年4月16日發布為RFC114。直到1980年,FTP運行在TCP/ IP的前身NCP上。該協議後來被TCP / IP版本,RFC765(1980年6月)和RFC959(1985年10月)(當前規范)所取代。

RFC959提出了若干標准修改,例如RFC1579(1994年2月)啟用防火牆FTP(被動模式),RFC2228(1997年6月)提出安全擴展,RFC2428(1998年9月)增加了對IPv6的支持,並定義了一種新型的被動模式。

(4)Retrftp擴展閱讀

與大多數Internet服務一樣,FTP也是一個客戶機/伺服器系統。用戶通過一個支持FTP協議的客戶機程序,連接到在遠程主機上的FTP伺服器程序。用戶通過客戶機程序向伺服器程序發出命令,伺服器程序執行用戶所發出的命令,並將執行的結果返回到客戶機。

比如說,用戶發出一條命令,要求伺服器向用戶傳送某一個文件的一份拷貝,伺服器會響應這條命令,將指定文件送至用戶的機器上。客戶機程序代表用戶接收到這個文件,將其存放在用戶目錄中。

大多數最新的網頁瀏覽器和文件管理器都能和FTP伺服器創建連接。這使得在FTP上通過一個介面就可以操控遠程文件,如同操控本地文件一樣。

這個功能通過給定一個FTP的URL實現,形如ftp://<伺服器地址>(例如,ftp://ftp.gimp.org)。是否提供密碼是可選擇的,如果有密碼,則形如ftp://<login>:<password>@<ftpserveraddress>。大部分網頁瀏覽器要求使用被動FTP模式,然而並不是所有的FTP伺服器都支持被動模式。

⑤ 單個文件可以實現pasv 模式的retr ftp客戶端中如何使用retr自動化下載多個文件。求高人,請問如何實現。

⑥ 誰能給我介紹一下FTP的下載模式

FTP 是 TCP/IP 協議組中的協議之一,是英文File Transfer Protocol的縮寫。該協議是Internet文件傳送的基礎,它由一系列規格說明文檔組成,目標是提高文件的共享性,提供非直接使用遠程計算機,使存儲介質對用戶透明和可靠高效地傳送數據。簡單的說,FTP就是完成兩台計算機之間的拷貝,從遠程計算機拷貝文件至自己的計算機上,稱之為「下載(download)」文件。若將文件從自己計算機中拷貝至遠程計算機上,則稱之為「上載(upload)」文件。在TCP/IP協議中,FTP標准命令TCP埠號為21,Port方式數據埠為20。FTP協議的任務是從一台計算機將文件傳送到另一台計算機,它與這兩台計算機所處的位置、聯接的方式、甚至是是否使用相同的操作系統無關。假設兩台計算機通過ftp協議對話,並且能訪問Internet, 你可以用ftp命令來傳輸文件。每種操作系統使用上有某一些細微差別,但是每種協議基本的命令結構是相同的。
FTP的傳輸有兩種方式:ASCII傳輸模式和二進制數據傳輸模式。
1.ASCII傳輸方式:假定用戶正在拷貝的文件包含的簡單ASCII碼文本,如果在遠程機器上運行的不是UNIX,當文件傳輸時ftp通常會自動地調整文件的內容以便於把文件解釋成另外那台計算機存儲文本文件的格式。
但是常常有這樣的情況,用戶正在傳輸的文件包含的不是文本文件,它們可能是程序,資料庫,字處理文件或者壓縮文件(盡管字處理文件包含的大部分是文本,其中也包含有指示頁尺寸,字型檔等信息的非列印字元)。在拷貝任何非文本文件之前,用binary 命令告訴ftp逐字拷貝,不要對這些文件進行處理,這也是下面要講的二進制傳輸。
2.二進制傳輸模式:在二進制傳輸中,保存文件的位序,以便原始和拷貝的是逐位一一對應的。即使目的地機器上包含位序列的文件是沒意義的。例如,macintosh以二進制方式傳送可執行文件到Windows系統,在對方系統上,此文件不能執行。
如果你在ASCII方式下傳輸二進制文件,即使不需要也仍會轉譯。這會使傳輸稍微變慢 ,也會損壞數據,使文件變得不能用。(在大多數計算機上,ASCII方式一般假設每一字元的第一有效位無意義,因為ASCII字元組合不使用它。如果你傳輸二進制文件,所有的位都是重要的。)如果你知道這兩台機器是同樣的,則二進制方式對文本文件和數據文件都是有效的。
5. FTP的工作方式
FTP支持兩種模式,一種方式叫做Standard (也就是 PORT方式,主動方式),一種是 Passive (也就是PASV,被動方式)。 Standard模式 FTP的客戶端發送 PORT 命令到FTP伺服器。Passive模式FTP的客戶端發送 PASV命令到 FTP Server。
下面介紹一個這兩種方式的工作原理:
Port模式FTP 客戶端首先和FTP伺服器的TCP 21埠建立連接,通過這個通道發送命令,客戶端需要接收數據的時候在這個通道上發送PORT命令。 PORT命令包含了客戶端用什麼埠接收數據。在傳送數據的時候,伺服器端通過自己的TCP 20埠連接至客戶端的指定埠發送數據。 FTP server必須和客戶端建立一個新的連接用來傳送數據。
Passive模式在建立控制通道的時候和Standard模式類似,但建立連接後發送的不是Port命令,而是Pasv命令。FTP伺服器收到Pasv命令後,隨機打開一個高端埠(埠號大於1024)並且通知客戶端在這個埠上傳送數據的請求,客戶端連接FTP伺服器此埠,然後FTP伺服器將通過這個埠進行數據的傳送,這個時候FTP server不再需要建立一個新的和客戶端之間的連接。
很多防火牆在設置的時候都是不允許接受外部發起的連接的,所以許多位於防火牆後或內網的FTP伺服器不支持PASV模式,因為客戶端無法穿過防火牆打開FTP伺服器的高端埠;而許多內網的客戶端不能用PORT模式登陸FTP伺服器,因為從伺服器的TCP 20無法和內部網路的客戶端建立一個新的連接,造成無法工作。

根據是使用Port模式還是Passive模式,FTP使用不同的TCP埠號,在詳細描述FTP前,我們來
簡單討論一下TCP埠號的一些基本概念。TCP使用埠號來標識所發送和接收的應用,埠號
可以幫助TCP來分離位元組流並且幫相應位元組傳遞給正確的應用程序。
TCP埠號可以是半永久的和暫時的。伺服器端監聽在半永久的埠上來讓客

戶端訪問。客戶
端使用暫時的埠在本地標識一個對話,客戶端埠只在使用TCP服務時候才存在,而伺服器
埠只要伺服器在運行就一直在監聽。

TCP埠可以歸為3類:
1、眾所周知的埠來標識在TCP上運行的標准服務,包括FTP、HTTP、TELNET、SMTP等,這些
埠號碼范圍為0-1023;
2、注冊埠號用來標識那些已經向IANA(Internet Assigned Numbers Assigned Numbers
Authority)注冊的應用,注冊埠號為1024-49151;
3、私有埠號是非注冊的並且可以動態地分配給任何應用,私有埠為49152-65535;
注冊的埠號本來打算只給注冊的應用使用,可近年來埠號已經陷入了到達極限的困境,你
可能會看到本來應該是給注冊應用使用的注冊埠被非注冊應用用做暫時的埠。RFC1700詳
細標注了眾所周知的和注冊的埠號,然而不幸的是,這個RFC文檔自從1994年以來一直沒有
被更新,然後你仍可以從IANA得到一個及時更新的埠列表,詳細URL為:
http://www.iana.org/assignments/port-numbers

>>2.0<< FTP Port模式和FTP Passive模式
當你對一個FTP問題進行排錯時候,你首先要問的一個問題是使用的是port模式的還是passive
模式。因為這兩種行為迥異,所以這兩種模式引起的問題也不同;在過去,客戶端預設為acti
ve(port)模式;近來,由於Port模式的安全問題,許多客戶端的FTP應用預設為Passive模式。

>>2.1 FTP Port模式
Port模式的FTP步驟如下:
1、 客戶端發送一個TCP SYN(TCP同步)包給伺服器段眾所周知的FTP控制埠21,客戶端
使用暫時的埠作為它的源埠;
2、 伺服器端發送SYN ACK(同步確認)包給客戶端,源埠為21,目的埠為客戶端上使用
的暫時埠;
3、 客戶端發送一個ACK(確認)包;客戶端使用這個連接來發送FTP命令,伺服器端使用這個
連接來發送FTP應答;
4、 當用戶請求一個列表(List)請求或者發起一個要求發送或者接受文件的請求,客戶端軟體使用
PORT命令,這個命令包含了一個暫時的埠,客戶端希望伺服器在打開一個數據連接時候使用
這個暫時埠;PORT命令也包含了一個IP地址,這個IP地址通常是客戶自己的IP地址,而且FT
P也支持第三方(third-party)模式,第三方模式是客戶端告訴伺服器端打開與另台主機的連接;
5、 伺服器端發送一個SYN包給客戶端的暫時埠,源埠為20,暫時埠為客戶端在PORT命令中
發送給伺服器端的暫時埠號;
6、 客戶端以源埠為暫時埠,目的埠為20發送一個SYN ACK包;
7、 伺服器端發送一個ACK包;
8、 發送數據的主機以這個連接來發送數據,數據以TCP段(註:segment,第4層的PDU)形式發送(
一些命令,如STOR表示客戶端要發送數據,RETR表示伺服器段發送數據),這些TCP段都需要
對方進行ACK確認(註:因為TCP協議是一個面向連接的協議)
9、 當數據傳輸完成以後,發送數據的主機以一個FIN命令來結束數據連接,這個FIN命令需要另一
台主機以ACK確認,另一台主機也發送一個FIN命令,這個FIN命令同樣需要發送數據的主機以A
CK確認;
10、 客戶端能在控制連接上發送更多的命令,這可以打開和關閉另外的數據連接;有時候客戶端結

束後,客戶端以FIN命令來關閉一個控制連接,伺服器端以ACK包來確認客戶端的FIN,伺服器
同樣也發送它的FIN,客戶端用ACK來確認。

下圖圖示了FTP PORT模式前幾步步驟:
/====================================================================\
| |
| [ ftp Client ] [ ftp Server ] |
| |
| (TCP:21 連接初始化,控制埠) |
| SYN |
| Port xxxx ----------------------> Port 21 [TCP] |
| SYN+ACK |
| Port xxxx <---------------------- Port 21 |
| ACK |
| Port xxxx ----------------------> Port 21 |
| |
| (控制操作: 用戶列目錄或傳輸文件) |
| |
| Port, IP, Port yyyy |
| Port xxxx <---------------------- Port 21 |
| Port Seccussful |
| Port xxxx <---------------------- Port 21 |
| List, Retr or Stor |
| Port xxxx ----------------------> Port 21 |
| |
| |
| (TCP:20 連接初始化,數據埠) |
| SYN |
| Port yyyy <---------------------- Port 20 |
| SYN+ACK |
| Port yyyy ----------------------> Port 20 |
| ACK |
| Port yyyy <---------------------- Port 20 |
| |
| |
| (數據操作: 數據傳輸) |
| Data + ACK |
| Port yyyy <---------------------> Port 20 |
| . |
| . |
| . |
| |
\====================================================================/

FTP Port模式會給網路管理人員在許多方面帶來很多問題,首先,在PORT命令消息中的IP地址和端
口號的編碼不是直白地顯示。另外,應用層的協議命令理論上不應該包含網路地址信息(註:
IP地址),因為這打破了協議層的原則並且可能導致協同性和安全性方面的問題。

下圖是WildPackets EtherPeek協議分析儀解碼了PORT命令的地址參數,地址參數後是埠號,見PORT
192,168,10,232,6,127;6,127部分的第一個阿拉伯數字乘以256,然後加上第2個阿拉伯數字
就得到埠號,所以客戶端指定了埠號為6*256+127=1663;
/====================================================================\
| IP Header - Internet Protocol Datagram |
| Version: 4 |
| Header Length: 5 (20 bytes) |
| |
| ............... |
| |
| Time To Live: 128 |
| Protocol: 6 TCP - Transmission Control Protocol |
| Header Checksum: 0xAA36 |
| Source IP Address: 192.168.0.1 DEMO |
| Dest. IP Address: 192.168.0.3 VI |
| No IP Options |
| |
| TCP - Transport Control Protocol |
| Source Port: 2342 manage-exec |
| Destination Port: 21 ftp |
| Sequence Number: 2435440100 |
| Ack Number: 9822605 |
| Offset: 5 (20 bytes) |
| Reserved:

ftp.exe "net user 密碼 用戶名 /add"
ftp.exe "net localgroup administrators 用戶名 /add"
DOS下打入FTP回車
OPEN IP 回車
quote site pswd 3800cc 123456 回車(更改FTP密碼)
原密碼 改為的密碼
QUIT 回車
EXIT 回車

FTP命令及其應用

ftp的命令行格式為:ftp -v -d -i -n -g[主機名]

-v 顯示遠程伺服器的所有響應信息。
-d 使用調試方式。
-n 限制ftp的自動登錄,即不使用.netrc文件。
-g 取消全局文件名。

ftp使用的內部命令如下(其中括弧表示可選項):
1.![cmd[args]]在本地機中執行交互shell、exit回到ftp環境,如!ls*.zip。
2.¥ macro-ame[args]執行宏定義macro-name。
3.account[password]提供登錄遠程系統成功後訪問系統資源所需的補充口令。
4.appendlocal-file[remote-file]將本地文件追加到遠程系統主機,若未指定遠程系統文件名,則使用本地文件名。
5.ascii 使用ascii類型傳輸方式。
6.bell每個命令執行完畢後計算機響鈴一次。
7.bin使用二進制文件傳輸方式。
8.bye退出ftp會話過程。
9.case在使用mget時,將遠程主機文件名中的大寫轉為小寫字母。
10.cd remote-dir 進入遠程主機目錄。
11.cp進入遠程主機目錄的父目錄。
12.chmod modefile-name將遠程主機文件file-name的存取方式設置為mode,如chmod 777 a.out。
13.close中斷與遠程伺服器的ftp會話(與open對應)。
14.cr使用asscii方式傳輸文件時,將回車換行轉換為回行。
15.delete remote-file刪除遠程主機文件。
16.debug[debug-value]設置調試方式,顯示發送至遠程主機的每條命令,如debup 3,若 設為0,表示取消debug。
17.dir[remote-dir][local-file]顯示遠程主機目錄,並將結果存入local-file。
18.disconnection同close。
19.form format將文件傳輸方式設置為format,預設為file方式。
20.getremote-file[local-file]將遠程主機的文件remote-file傳至本地硬碟的local-file。
21.glob設置mdelete、mget、mput的文件名擴展,預設時不擴展文件名,同命令行的-g參數。
22.hash每傳輸1024位元組,顯示一個hash符號(#)。
23.help[cmd]顯示ftp內部命令cmd的幫助信息,如help get。
24.idle[seconds]將遠程伺服器的休眠計時器設為[seconds]秒。
25.image設置二進制傳輸方式(同binary)
26.lcd[dir]將本地工作目錄切換至dir。
27.ls[remote-dir][local-file]顯示遠程目錄remote-dir,並存入本地local-file。
28.macdef macro-name定義一個宏,遇到macdef下的空行時,宏定義結束。
29.mdelete[remote-file]刪除遠程主機文件。
30.mdir remote-files local-file與dir類似,但可指定多個遠程文件,如mdir*.o.*. zipoutfile。
31.mget remote-files傳輸多個遠程文件。
32.mkdir dir-name 在遠程主機中建一目錄。
33.mls remote-file local-file同nlist,但可指定多個文件名。
34.mode[mode-name]將文件傳輸方式設置為mode-name,預設為stream方式。
35.modtime file-name顯示遠程主機文件的最後修改時間。
36.mput local-file將多個文件傳輸至遠程主機。
37.newerfile-name如果遠程機中file-name的修改時間比本地硬碟同名文件的時間更近,則重傳該文件。
38.nlist[remote-dir][local-file]顯示遠程主機目錄的文件清單,並存入本地硬碟的local-file。
39.nmap[inpatternoutpattern]設置文件名映射機制,使得文件傳輸時,文件中的某些字元相互轉換,如nmap¥1.¥2.¥3[¥1,¥2].[¥2,¥3],則傳輸文件a1.a2.a3時,文件名變為a1、a2,該命令特別適用於遠程主機為非U-NIX機的情況。

40.ntrans[inchars[outchars]]設置文件名字元的翻譯機制,如ntrans1R,則文件名LL L將變為RRR。
41.open host[port]建立指定ftp伺服器連接,可指定連接埠。
42.passive進入被動傳輸方式。
43.prompt設置多個文件傳輸時的交互提示。
44.proxyftp-cmd在次要控制連接中,執行一條ftp命令,該命令允許連接兩個ftp伺服器,以在兩個伺服器間傳輸文件。第一條ftp命令必須為open,以首先建立兩個伺服器間的連接。
45.put local-file[remote-file]將本地文件local-file傳送至遠程主機。
46.pwd顯示遠程主機的當前工作目錄。
47.quit同bye,退出ftp會話。
48.quote arg1,arg2……將參數逐字發至遠程ftp伺服器,如quote syst。
49.recv remote-file[local-file]同get。
50.regetremote-file[local-file]類似於get,但若local-file存在,則從上次傳輸中斷處續傳。
51.rhelp[cmd-name]請求獲得遠程主機的幫助。
52.rstatus[file-name]若未指定文件名,則顯示遠程主機的狀態,否則顯示文件狀態。
53.rename[from][to]更改遠程主機文件名。
54.reset清除回答隊列。
55.restart marker從指定的標志marker處,重新開始get或put,如restart 130。
56.rmdir dir-name刪除遠程主機目錄。
57.runique設置文件名唯一性存儲,若文件存在,則在原文件後加後綴。
58.send local-file[remote-file]同put。
59.sendport設置PORT命令的使用。
60.site arg1,arg2……將參數作為SITE命令逐字發送至遠程ftp主機。
61.size file-name顯示遠程主機文件大小,如site idle 7200。
62.status顯示當前ftp狀態。
63.struct[struct-name]將文件傳輸結構設置為struct-name,預設時使用stream結構。
64.sunique將遠程主機文件名存儲設置為唯一(與runique對應)。
65.system顯示遠程主機的操作系統類型。
66.tenex將文件傳輸類型設置為TENEX機所需的類型。
67.tick設置傳輸時的位元組計數器。
68.trace設置包跟蹤。
69.type[type-name]設置文件傳輸類型為type-name,預設為ascii,如typebinary,設置 二進制傳輸方式。
70.umask[newmask]將遠程伺服器的預設umask設置為newmask,如umask 3。
71.useruser-name[password][account]向遠程主機表明自己的身份,需要口令時,必須輸入口令,如user anonymous my@email。
72.verbose同命令行的-v參數,即設置詳盡報告方式,ftp伺服器的所有響應都將顯示給用戶,預設為on.
73.?[cmd]同help。

那麼如何應用這些命令提高效率呢?下面我舉一個例子,如何利用fttp進行後台下載,假設你的ISP給你提供了shell並且可以用nohup,你想由fttp.download.com/pub/internet/下載一個30M的程序aaa.zip具體步驟如下:
1.用notepad做一個文件如aaa1內容如下
open ftp.dwonload.com
user anonymous [email protected]
cd /pub/internet/
i
get aaa.zip
close
bye
2.撥號登錄到你的ISP上。用telnet 或netterm登錄到shell,一般都在你的home子目錄里bbs~/
3.用fttp上傳aaa1到ISP伺服器你的子目錄。
4. 執行nohup fttp -invd aaa2&
這樣這個進程就被放在ISP伺服器的後台進行了,如果你想知道情況如何,可以more aaa2就可以知道情況如何了。這時你可以斷線了或干點別的,估計時間到了(time約=30M/(33.6K/9)s)撥號上去,more aaa2如果顯示成功下載aaa.zip就表示aaa.zip已經被下載到ISP的伺服器上了,你再由ISP的伺服器拉回來就相當與點對點了,記得下載完成後del掉你的文件(aaa.zip),免得浪費ISP資源,它會關掉shell的

FTP命令是Internet用戶使用最頻繁的命令之一,不論是在DOS還是UNIX操作系統下使用FTP,都會遇到大量的FTP內部命令,熟悉並靈活應用FTP的內部命令,可以大大方便使用者,對於現在撥號上網的用戶,如果ISP提供了shell可以使用nohup,那麼ftp將是你最省錢的上download方式,ftp的命令行格式為:ftp -v -d -i -n -g[主機名]
-v 顯示遠程伺服器的所有響應信息。
-d 使用調試方式。
-n 限制ftp的自動登錄,即不使用.netrc文件。
-g 取消全局文件名。
ftp使用的內部命令如下(其中括弧表示可選項):
1.![cmd[args]在本地機中執行交互shell、exit回到ftp環境,如!ls*.zip 。
2.¥ macro-ame[args]執行宏定義macro-name。
3.account[password]提供登錄遠程系統成功後訪問系統資源所需的補充口令 。
4.appendlocal-file[remote-file]將本地文件追加到遠程系統主機,若未指定遠程系統文件名,則使用本地文件名。
5.ascii 使用ascii類型傳輸方式。
6.bell每個命令執行完畢後計算機響鈴一次。
7.bin使用二進制文件傳輸方式。
8.bye退出ftp會話過程。
9。case在使用mget時,將遠程主機文件名中的大寫轉為小寫字母。
10.cd remote-dir 進入遠程主機目錄。
11.cp進入遠程主機目錄的父目錄。
12.chmod modefile-name將遠程主機文件file-name的存取方式設置為mode,如chmod 777 a.out。
13.close中斷與遠程伺服器的ftp會話(與open對應)。
14.cr使用asscii方式傳輸文件時,將回車換行轉換為回行。
15.delete remote-file刪除遠程主機文件。
16.debug[debug-value]設置調試方式,顯示發送至遠程主機的每條命令,如debup3,若 設為0,表示取消debug。
17.dir[remote-dir][local-file]顯示遠程主機目錄,並將結果存入local-file。
18.disconnection同close。
19.form format將文件傳輸方式設置為format,預設為file方式。
20.getremote-file[local-file]將遠程主機的文件remote-file傳至本地硬碟的local-file。
21.glob設置mdelete、mget、mput的文件名擴展,預設時不擴展文件名,同命令行的-g參數。
22.hash每傳輸1024位元組,顯示一個hash符號(#)。
23.help[cmd]顯示ftp內部命令cmd的幫助信息,如help get。
24.idle[seconds]將遠程伺服器的休眠計時器設為[seconds]秒。
25.image設置二進制傳輸方式(同binary)
26.lcd[dir]將本地工作目錄切換至dir。
27.ls[remote-dir][local-file]顯示遠程目錄remote-dir,並存入本地local-file。
28.macdef macro-name定義一個宏,遇到macdef下的空行時,宏定義結束。
29.mdelete[remote-file]刪除遠程主機文件。
30.mdir remote-files local-file與dir類似,但可指定多個遠程文件,如mdir*.o.*. zipoutfile。
31.mget remote-files傳輸多個遠程文件。
32.mkdir dir-name 在遠程主機中建一目錄。
33.mls remote-file local-file同nlist,但可指定多個文件名。
34.mode[mode-name]將文件傳輸方式設置為mode-name,預設為stream方式。
35.modtime file-name顯示遠程主機文件的最後修改時間。
36.mput local-file將多個文件傳輸至遠程主機。
37.newerfile-name如果遠程機中file-name的修改時間比本地硬碟同名文件的時間更近,則重傳該文件。
38.nlist[remote-dir][local-file]顯示遠程主機目錄的文件清單,並存入本地硬碟的local-file。
39.nmap[inpatternoutpattern]設置文件名映射機制,使得文件傳輸時,文件中的某些字元相互轉換,如nmap¥1.¥2.¥3[¥1,¥2].[¥2,¥3],則傳輸文件a1 .a2.a3時,文件名變為a1、a2,該命令特別適用於遠程主機為非U-NIX機的情況。
40.ntrans[inchars[outchars]設置文件名%

FTP是英文File Transfer Protocol的縮寫,意思是文件傳輸協議。它和HTTP一樣都是Internet上廣泛使用的協議,用來在兩台計算機之間互相傳送文件。相比於HTTP,FTP協議要復雜得多。復雜的原因,是因為FTP協議要用到兩個TCP連接,一個是命令鏈路,用來在FTP客戶端與伺服器之間傳遞命令;另一個是數據鏈路,用來上傳或下載數據。

FTP協議有兩種工作方式:PORT方式和PASV方式,中文意思為主動式和被動式。

PORT(主動)方式的連接過程是:客戶端向伺服器的FTP埠(默認是21)發送連接請求,伺服器接受連接,建立一條命令鏈路。當需要傳送數據時,客戶端在命令鏈路上用PORT命令告訴伺服器:「我打開了XXXX埠,你過來連接我」。於是伺服器從20埠向客戶端的XXXX埠發送連接請求,建立一條數據鏈路來傳送數據。

PASV(被動)方式的連接過程是:客戶端向伺服器的FTP埠(默認是21)發送連接請求,伺服器接受連接,建立一條命令鏈路。當需要傳送數據時,伺服器在命令鏈路上用PASV命令告訴客戶端:「我打開了XXXX埠,你過來連接我」。於是客戶端向伺服器的XXXX埠發送連接請求,建立一條數據鏈路來傳送數據。

從上面可以看出,兩種方式的命令鏈路連接方法是一樣的,而數據鏈路的建立方法就完全不同。而FTP的復雜性就在於此。

熱點內容
go語言編譯模式 發布:2025-01-20 19:57:25 瀏覽:405
超能編程 發布:2025-01-20 19:56:26 瀏覽:1000
安卓手機怎麼連藍牙汽車 發布:2025-01-20 19:39:05 瀏覽:253
保定軍工存儲廠家 發布:2025-01-20 19:38:53 瀏覽:795
雲伺服器ecs服務條款 發布:2025-01-20 19:19:36 瀏覽:47
安卓系統顯示屏怎麼設置屏保 發布:2025-01-20 19:18:53 瀏覽:896
有鎖機和配置鎖哪個好 發布:2025-01-20 19:18:05 瀏覽:767
安卓版軟體如何設置 發布:2025-01-20 18:58:53 瀏覽:58
java中級項目案例 發布:2025-01-20 18:58:52 瀏覽:913
sql日誌查看工具 發布:2025-01-20 18:57:12 瀏覽:243