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可以良好的工作。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧
· 园子的第一款AI主题卫衣上架——"HELLO! HOW CAN I ASSIST YOU TODAY
· 【自荐】一款简洁、开源的在线白板工具 Drawnix