ftp的主动模式和被动模式以及被动模式未打开造成的文件上传不成功

先说问题:最近有个需求,上传一些文件到ftp服务器,代码在linux服务器上运行ok,档案正常上传到了ftp服务器。代码如下:

$ftp_server = "";
$port = 21;
$username = "";
$password = "";
$filename = "aa.csv";
$remote_file = "aa.csv";

$ftp = ftp_connect($ftp_server,  $port);
$login_result = ftp_login($ftp, $username, $password);
$res = ftp_put($ftp, $remote_file,  $filename, FTP_ASCII);
ftp_close($ftp);

 

然而放到windows系统的IIS服务器后,发现了10个档案只随机上传成功了1-5个,而且1k左右的文件也传输了好久。有经验的同事加了一行代码,代码在IIS上成功运行,文件全部快速的传到了ftp服务器上。

$ftp_server = "";
$port = 21;
$username = "";
$password = "";
$filename = "aa.csv";
$remote_file = "aa.csv";

$ftp = ftp_connect($ftp_server,  $port);
$login_result = ftp_login($ftp, $username, $password);
ftp_pasv($ftp, true); //windows防火墙,打开被动模式
$res = ftp_put($ftp, $remote_file,  $filename, FTP_ASCII);
ftp_close($ftp);

 

这里补一下FTP主动模式的被动模式的知识:

FTP的两个端口:命令控制端口(用于发送FTP命令信息,默认21)和数据传输端口(用于传输数据,默认20)

FTP的默认工作模式为被动模式。

主动模式:

FTP客户端使用随机端口c1(N)连接到FTP服务器的21端口,发送用户名和密码登录,登录成功后读取数据时,客户端开放端口c2(N+1),使用 PORT命令将端口号c2发送到FTP服务器,告诉服务器客户端采用主动模式并开放端口c2;FTP服务器收到PORT主动模式命令和端口号后,通过服务器的20端口和客户端开放的端口c2连接,传输数据.

被动模式:

FTP客户端使用随机端口c1(N)连接FTP服务器的21端口,发送用户名和密码登录,登录成功后读取数据时,发送PASV命令到FTP服务器, 服务器在本地开放一个随机端口s1(1023以上),然后把开放的端口s1发送给客户端, 客户端开放端口c2(N+1),再通过c2端口连接到服务器开放的端口s1进行数据传输

区别对比:

二者的区别主要在于建立数据传输连接的时候,主动模式的数据连接发起方为服务器端,使用20端口连接客户端的c2端口建立数据连接;

被动模式连接发起方为客户端,客户端使用端口c2去连接服务器的s1端口;

主动模式服务器配置简单,利于服务器安全管理。数据传输连接由服务器发起,如果服务器开启了防火墙,需放行21、20端口,如果客户端开启了防火墙,需要放行一段端口,否则可能导致连接失败,客户端处于内网之后可能会导致连接失败。

被动模式对客户端网络环境没有要求,服务器配置管理稍显复杂,不利于安全,服务器需要开放随机高位端口以便客户端可以连接。数据传输连接由客户端发起,如果服务器开启了防火墙,需放行一段端口,客户端是否开启了防火墙,对被动模式没什么影响。被动模式常用在处于防火墙之后的FTP客户访问外界FTP服务器的情况,在这种情况下,防火墙通常配置为不允许外界访问防火墙之后主机,而只允许由防火墙之后的FTP客户端发起的连接请求通过,在这种情况下不能使用主动模式的FTP传输,而被动模式的FTP可以良好的工作。

 

posted @ 2023-07-26 16:14  carol2014  阅读(216)  评论(0编辑  收藏  举报