FTP的两种不同工作模式

FTP的两种不同工作模式:PORT(主动模式)、PASV(被动模式)

 

1、PORT模式:该模式是FTP协议最初定义的连接模式,其连接过程是:在开始一个FTP连接时,客户端程序首先会为自己随机分配一个TCP端

 

口,它使用这个端口向服务器的FTP端口(默认21)发出连接请求,服务器接受请求后会建立一条控制链路,然后客户程序向服务器发出Port命

 

令,告诉服务器它的数据通道的端口打开了。当需要传送数据时,服务器端口通过20端口向客户端提供的随机端口发送连接请求,请求被接受之

 

后便开始传输数据,数据链路通道也就打开了, 在整个过程中,由于服务器在建立数据连接时主动发起连接,因此称为主动模式。

 

注:PORT模式的问题

 

由于客户端提供的端口号是随机的,如果客户端处于防火墙内部,由于防火墙大多会限制自问主机连接内部非开放端口,数据连接很可能被防火墙限制,造成无法建立数据连接,从而导致FTP无法正常工作

 

2、PASV模式:其连接过程是,在开始一个FTP连接时,客户端程序首先为自己随机分配一个TCP端口,它使用这个端口向服务器的FTP端口

 

(默认21)发出连接请求,服务器接受请求后会建立一条控制链路,然后客户端程序发出一Pasv命令,要求服务器采用PASV模式建立数据连

 

接,服务器便为自己随机分配一个数据通道端口,并将这个端口号告诉客户端程序。传送数据时,客户端程序采用另一个随机端口向服务器提供

 

的数据通道端口发送连接请求,请求被接受之后便开始传输数据,数据链路通道也就打开了。在这个方式中,由于服务器端在建立数据连接时,

 

被动接受客户端的连接请求,因此称为被动方式

 

注:被动方式,由于两个连接都由客户端发起,对于防火墙来说,一般不限制这样的访问,因此解决了防火墙内无法进行FTP的问题

 

 

附一例子:

用MFC 提供的CInternetSession、CFtpConnection进行FTP连接

 

CInternetSession test(_T("test")); try { CFtpConnection *pFtpConn=test.GetFtpConnection(_T("127.0.0.1"),NULL,NULL,21,TRUE); CFtpFileFind FileFind(pFtpConn); if (FileFind.FindFile(_T("*"))) { AfxMessageBox(_T("该目录存在文件!")); } else { AfxMessageBox(_T("该目录不存在文件!")); } } catch(CInternetException * m_pException) { cout<<"error!"<<endl; }  

 

如果在CFtpConnection *pFtpConn=test.GetFtpConnection(_T("127.0.0.1"),NULL,NULL,21,TRUE);中将最后的参数TRUE设为

 

默认(即FALSE),大多数情况下会连接错误,因为FALSE代表采用主动方式

 

 

你可能感兴趣的:(FTP的两种不同工作模式)