FTP协议浅析

FTP协议浅析


Author:Leen



今日需要用到FTP上传文件,就研读了一下FTP协议。
虽然MFC中有 CFtpConnection 等类 使用起来很简易,但是不方便让我来理解FTP传输文件的过程,P传输解FT文件的过程,而且据说无法在WINCE上使用该类。

FTP使用两个端口,21作为命令传输端口使用
20一般作为主动传输时使用,被动传输时服务器开放端口,并将信息通过21端口发过来,

协议内容详见 RFC959。

假设位于U的用户希望从S上(下)传文件,通常用户需要使用用户FTP进程和服务器通信,下面就是一个例子:
用户发出的本地命令        解释
ftp (host) multics<CR>        连接到S的端口L,建立控制连接
<---- 220 Service ready <CRLF>.
用户名 Doe <CR>
need password<CRLF>.        USER Doe<CRLF>---->
<---- 331 用户名正确
口令 <CR>        PASS 口令<CRLF>---->
<---- 230 User logged in<CRLF>.
retrieve (local type) ASCII<CR>
(local pathname) test 1 <CR>
(for. pathname) test.pl1<CR>        User-FTP opens local file in ASCII.
RETR test.pl1<CRLF> ---->
<---- 150 文件状态正常,将打开数据连接<CRLF>
服务器于端口U建立数据连接
文件传输中
         <---- 226 关闭数据连接,文件传输正确<CRLF>
type Image<CR>        TYPE I<CRLF> ---->
<---- 200 Command OK<CRLF>
store (local type) image<CR>
(local pathname) file dump<CR>
(for.pathname) >udd>cn>fd<CR>        User-FTP opens local file in Image.
STOR >udd>cn>fd<CRLF> ---->
<---- 550 访问拒绝<CRLF>
中止        QUIT <CRLF> ---->
服务器关闭所有连接

互联网各个协议间的层次关系图:
本帖隐藏的内容
网络协议层次.JPG



一个FPT上传 文件 的请求与应答,参考下图

本帖隐藏的内容
未命名.JPG



想先我们要做的就是连接FTP服务器
/
//连接服务器
//strIp IN IPAddress
//iPort        IN Port 
/
BOOL CFtpTtansFile::Connect(CString strIp,int iPort)
{
        if(iPort <= 0)
                return FALSE;

        //设置服务器信息
        m_local.sin_family=AF_INET;     
        m_local.sin_port=htons(iPort);  
        m_local.sin_addr.S_un.S_addr=inet_addr(strIp);

        m_socketClient = socket(AF_INET,SOCK_STREAM,0);     

        int     ret;   
        //联接服务器     
        ret=connect(m_socketClient,(LPSOCKADDR)&m_local,sizeof(m_local));  
        //有错的话     
        if(ret!=0)     
        {     
                int ierror = WSAGetLastError() ;
                CString strerror ;
                strerror.Format(_T("联接错误,错误代码:%d"),ierror);

                AfxMessageBox( strerror );     

                closesocket(m_socketClient);     
                return    FALSE;// -1;     
        }


        //设置套接字通讯模式为异步模式
        DWORD ul= 1;
        ret = ioctlsocket(m_socketClient,FIONBIO,&ul);
        if(ret != 0)
        {
                AfxMessageBox(_T("设置监听套接字通讯模式为异步模式失败"));
                return FALSE;
        }

        //接收服务器欢迎信息
        char szRevbuff[1024];
        memset(szRevbuff,0,1024); 
        Safe_recvCmd(m_socketClient,szRevbuff,1024,0); 
        TRACE(szRevbuff);
        return TRUE;

}

连接成功以后服务器会发来消息
220-Serv-U FTP Server v6.4 for WinSock ready...

收到后我们就可发送用户名跟密码进行登录
用户名 密码的格式为
USER ***\r\n
响应: 331 User name okay, need password.
PASS ***\r\n
响应:230 User logged in, proceed.


        //发送用户名

        CString strSend;
        strSend.Format(_T("USER %s\r\n"),strUserName);

        //发送登录请求
        //用户名
        if(send(m_socketClient,strSend,strSend.GetLength(),0) == SOCKET_ERROR)
        {
                int ierror = WSAGetLastError();
                return FALSE;

        }

切换到我们需要上传文件的目录
CWD /新文件夹/
应答:
250 Directory changed to /新文件夹

设置数据传输格式
TYPE I//二进制格式
应答:
200 Type set to I.

使用被动传输,让服务器开放端口进行监听
PASV
应答:
227 Entering Passive Mode (192,168,10,10,128,234)
这个字段中:
192,168,10,10, 为IP
128,234)为端口
端口计算方法:
128*256+234 = 33002

这样我们就要再建立一个套接字连接过去

然后要求服务器建立这个文件并打开

STOR 关于FTP标准.doc
应答:
150 Opening BINARY mode data connection for 关于FTP标准.doc.

然后就可以通过33002将文件发送给服务器
关闭该套接字视为传输完毕
//关闭套接字作为传输完成标志
        closesocket(sockData);
发送成功的话的典型响应:
226 Transfer complete.


下面我们根据数字顺序列出各个应答码及其意义:
110        重新启动标记应答。在这种情况下文本是确定的,它必须是:MARK yyyy=mmmm,其中yyyy是用户进程数据流标记,mmmm是服务器标记。
120        服务在nnn分钟内准备好
125        数据连接已打开,准备传送
150        文件状态良好,打开数据连接
200        命令成功
202        命令未实现
211        系统状态或系统帮助响应
212        目录状态
213        文件状态
214        帮助信息,信息仅对人类用户有用
215        名字系统类型
220        对新用户服务准备好
221        服务关闭控制连接,可以退出登录
225        数据连接打开,无传输正在进行
226        关闭数据连接,请求的文件操作成功
227        进入被动模式
230        用户登录
250        请求的文件操作完成
257        创建"PATHNAME"
331        用户名正确,需要口令
332        登录时需要帐户信息
350        请求的文件操作需要进一步命令
421        不能提供服务,关闭控制连接
425        不能打开数据连接
426        关闭连接,中止传输
450        请求的文件操作未执行
451        中止请求的操作:有本地错误
452        未执行请求的操作:系统存储空间不足
500        格式错误,命令不可识别
501        参数语法错误
502        命令未实现
503        命令顺序错误
504        此参数下的命令功能未实现
530        未登录
532        存储文件需要帐户信息
550        未执行请求的操作
551        请求操作中止:页类型未知
552        请求的文件操作中止,存储分配溢出
553        未执行请求的操作:文件名不合法


这世界上本没有靓仔,天天被丑女说眼睛小,也就慢慢变成了靓仔
 
   

关于FTP标准 

  FTP标准是在RFC959说明的。该协议定义了一个从远程计算机系统和本地计算机系统之间传输文件的一个标准。一般来说,传输文件的用户需要先经过认证以后才能登录网站,然后方能访问在远程服务器的文件。而大多数的FTP服务器往往提供一个GUEST的公共帐户来允许没有远程服务器的用户可以访问该FTP服务器。     
 一个FTP会话通常包括五个软件元素的交互。   

  用户接口   提供了一个用户接口并使用客户端协议解释器的服务     
  客户   PI   客户协议解释器,其项远程服务器协议机发送命令并且驱动客户数据传输过程     
  服务器PI   服务器协议解释器,响应客户协议机发出的命令并驱动服务器端数据传输过程     
  客户   DTP   客户数据传输过程,其负责完成和服务器数据传输过程及客户端本地文件系统的通信     
  服务DTP   服务器数据传输过程,其负责完成和客户数据传输过程及服务器端文件系统的通信     

  在RFC   959中,一般使用用户这个名词来指代客户。RFC   959定义了客户PI和服务器PI交互的方式和规范。用户接口与PI和DTP交互的机理都并不是协议标准的一部分。PI和DTP往往通常是在同一个程序模块中实现的。     

  在FTP会话中,一共会存在有两个独立的网络连接,一个是由两端的PI使用的,另一个是由两端的DTP使用的。PI之间的连接一般被称作控制连接(control   connection),DTP之间的连接被称做数据连接(data   connection)   

 使用TCP服务的控制和数据连接   

  通常情况下,FTO服务器监听端口号21来等待控制连接建立请求。而数据连接端口号的选择依赖于控制连接上命令。通常是客户发送一个控制消息来指定客户监听并等待服务器端发送数据连接建立请求的端口号。     

  对数据传输和控制命令传输来使用不同的独立连接有如下优点:两个连接可以选择不同的合适服务质量,如:对控制连接来说高需要更小的延迟时间,对数据连接来说需要更大的数据吞吐量;而且可以避免实现数据流中的命令的通明性及逃逸。   

  当传输建立时,总是由客户端首先发起。然而客户和服务器都可能是数据发送者。除了传输用户请求下载文件,数据传输过程同样在客户端请求列服务器端目录结构时建立。   

1.命令选择   

当一个传输建立时,一般通常需要指定四个方面的属性:     

文件类型     
该属性指定如何将文件的数据匹配成适于传输的格式,一共有四种可能的选择:     

ASCII文件类型     
在发送端,文件从本地文本文件格式转换为   NVT   ASCII格式,每行结束有一个CR/LF对来标识。   在接收端,再被转换为本地的文本格式。   这说明了为什么Unix主机之间传输文本文件为何传输的数据量要大于文件的实际大小。若传输一段端或传输两端都不使用ASCII文本编码,则是应该由数据传输过程来实现本地编码和NVT   ASCII   编码之间的转换。     

EBCDIC文件类型     
类似于ASCII,区别仅仅上使用EBCDIC字符编码   

图象   (或二进制)文件类型     
文件以本地传输内容传输,在远端以同本地完全相同的内容存储。     

本地文件系统     
用在字节大小不是8位的环境下。没字节位数由发送者指定。     

在实际应用中,只有ASCII和图象格式使用的较多。   

格式控制     
该属性是和将文本文件最后传送到打印设备相关的,其中有多种方式来实现将垂直格式信息编码到文件中,包括指示一个新页开始的方式。有如下方式可供选择:     

无须打印格式控制,这是缺省值     
Telnet打印控制,在telnet协议中定义的控制字符包含在数据流中。.     

Fortran打印控制,     
该属性在实际中很少使用。   
结构     
文件可以拥有内部结构,在传输中该结构被保留。由数据传输过程来负责在传输中的结构及本地结构之间相互匹配,有三种可能性:     

文件结构     
这实际上意味着文件被看作没有内部结构的连续的字节流。     

记录结构     
文件是有一系列记录组成的结构。这只适用于文本文件。     

页面结构     
也可以称做块结构。每一页都伴随一个页号来传输,从而以顺序的方式来完成传输。   

页面结构很少在实际中遇到。记录结构也不是很常见。对于文本文件使用ASCII文件类型可以获得相同的效果。   

传输模式     
该属性可以取三个不同的值:     

流模式     
文件的以字节流的方式传输。   

块模式     
文件以一个块连接一个块的方式传输,每个块的开头都有一个头。     

压缩模式     
一个简单的运程长度压缩编码被应用,来压缩连续的相同的字节。     

实际中,一般只有流模式被使用。而压缩一般通过使用各种其他的工具程序来获得。   

当一次传输被建立,客户端一般指定一个或多个前面说明的属性。若服务器端不能支持某个选项,服务器将用一个错误信息来响应客户端,并不具有协商机制。   

FTP提供了充足的命令来使用户和远程建立连接并访问远程文件系统。   

2.命令格式   

命令以NVT   ASCII串的格式被传输。每个命令以三个或四个大写的NVT   ASCII字符开始,后面带有选项参数和一个CR/LF对来标识命令结束   

应答由三个NVT   ASCII数字及一个选项消息组成。   

一个长的应答也许会有多个消息组成,第一个消息的三个数字后带有一个破折号,最后的消息不带有破折号。中间的消息无须携带三个数字,但是如果带了三个数字,则也需要破折号。     

下面是所有的命令的列表。带有星号的命令一般很少使用,所以往往在具体实现中不支持。   

String   Meaning     
ABOR   放弃传输     
*ACCT   某些系统将帐号和用户与文件系统相关联     
*ALLO   为即将传送的文件分配空间。后面携带的参数来确定字节数     
*APPE   将文件附加到已经存在的文件后面     
CDUP   在远程系统上将当前目录切换到上级父目录     
CWD   改变远程系统的工作目录     
DELE   删除远程系统的文件     
HELP   读取服务器的帮助信息,如:支持的命令的列表     
LIST   在一个新建立的数据连接上发送当前工作目录下的文件名列表     
MKD   创建目录     
MODE   指定传输模式,可携带的参数是:S、B或   C.     
NLST   在一个新建立的数据连接上发送一个当前目录下的 "完全 "的目录列表     
NOOP   空操作,防止连接断掉     
PASS   提供一个用户登录密码,必须立即跟随在USER命令后     
*PASV   指定服务器数据传输过程监听等待客户端的数据连接连接建立请求     
PORT   指定客户端监听等待服务器端建立的连接的端口号     
PWD   显示服务器端的当前工作目录名     
QUIT   退出登录并终止连接     
*REIN   重新初始化,退出登录但是并不断开连接,后面必须随后发出一个新的USER命令     
*REST   从服务器的一个标识处重新开始传输     
RETR   从远程系统取回一个文件     
RMD   删除一个目录     
*RNFR   指定要被命名的文件的老的路径名,随后必须是一个RNTO命令     
*RNTO   指定要被命名的文件的新的路径名     
*SITE   站点特有的服务器提供的服务     
*SMNT   结构加载,提供一个文件系统结构的远程系统路径名     
*STAT   状态信息     
STOR   上载一个文件到服务器上,若文件已经存在则覆盖     
*STOU   上载一个文件到服务器上,不覆盖已经存在的文件     
STRU   指定文件结构,参数可以是F、R或P.     
*SYST   报告远程系统的操作系统类型     
TYPE   指定文件类型,参数可以是A、E、I、L只有TYPE   A和TYPE   I常用     

控制连接命令应答有如下形式:   

Type   Description     
1yz   主动初步应答,在发送另一个命令以前等待另一个应答     
2yz   主动最后应答,最后一个命令成功结束     
3yz   主动中间应答,必须再发送一个命令     
4yz   暂时被动应答,要求的动作当时不能完成,但可以重试     
5yz   永久被动应答,要求的动作不能完成,不应该重试     

"y "数字编码进一步的信息   

Digit   Meaning     
0   语法错误     
1   信息     
2   连接状态     
3   认证和记帐     
4   保留     
5   File   s文件系统状态     

下面是一些典型的消息:   

Number   Meaning     
125   数据连接打开,传输开始     
200   命令OK     
331   用户名OK   需要输入密码     
425   不能打开数据连接     
452   错误写文件     
500   语法错误-不可识别的命令    
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值