设为首页 收藏本站
查看: 1311|回复: 0

[经验分享] FTP集成开发总结-之主动、被动模式

[复制链接]

尚未签到

发表于 2016-6-10 09:37:24 | 显示全部楼层 |阅读模式

  • FTP协议背景
  ftp协议的正常工作需要两个TCP连接:命令端口、数据端口。 前者用来传输纯文本的命令交互,此连接在整个FTP会话周期中不中断; 后者用来传输二进制、文本等数据信息,只是在需要传输数据时,才会建立此连接,传输数据完毕就关闭,属于临时会话的性质。

  • 第一阶段 建立ftp会话
  1. 服务器在21端口监听。 客户端在本地随机端口(eg 1982)发起和服务器21端口的TCP 连接,建立TCP连接成功后 next 。
2. 服务器发送hello信息给客户端
3. 客户端分别 通过USER PASS命令输入正确的用户、口令登陆
4. 服务器认证通过后返回2xx 正确相应。
   至此FTP会话层(按ISO7层的定义)已成功建立
5. 客户端发送 CDUP PWD CWD 等命令切换当前工作目录
6. 服务器响应请求,并在命令端口返回指令相应 eg: 2xx 5xx 4xx
   至此客户端、服务端的交互均仅仅局限在命令端口进行,双方的交互只占用一个TCP连接。对于NAT 防火墙等都不会有什么特殊影响

  • 第二阶段 客户端请求数据
  
所谓主动模式、被动模式是指在数据端口工作时 服务器的在TCP 传输层的动作模式
主动模式下: 
1. 客户端首先要用PORT命令告诉服务器,准备传数据了,并告知它自己在本地哪个端口listen;
2. 服务端收到PORT后,返回2xx 正确响应
3. 客户端再通过STOR RETR LIST等告诉服务端 它想要的数据
4. 服务端收到后,服务端主动发起本地一个随机端口至客户端listen的端口的 TCP连接, 再将数据塞给客户端
5. 服务器塞数据完毕后,在命令端口中返回2xx 正确响应。
6. 工作结束,关闭4 中建立的临时TCP连接。 命令端口的连接仍然保持,服务端等待客户端命令

被动模式下:
1. 客户端首先要用PASV命令告诉服务器,准备传数据了
2. 服务端收到PASV后,在本地listen一个端口,并返回2xx 正确相应信息 + listen的端口
3. 客户端收到响应后,发送STOR RETR LIST 等告知服务端 它想要的数据
4. 服务端收到命令后,准备相关数据,完毕后发送150 响应
5. 客户端收到正确响应后,客户端主动发起一个本地随机端口至服务端listen的端口的 TCP连接, 然后服务器将数据在此TCP连接塞给客户端。
6. 服务端塞数据完毕后,在命令端口中返回2xx 正确响应。
7. 工作结束,关闭4 中建立的临时TCP连接。 命令端口的连接仍然保持,服务端等待客户端命令
另:PORT PASSIVE命令中携带的端口信息是这样的:192,168,0,1,55,66 。 前面4个 192 168 0 1 是ip地址,后面两个计算后代表端口号: 55*256 + 66 = 14146, 14146就是端口号了

简而言之就是:
主动模式下,服务器把活包干了。客户端想要数据时,就简单的开本地监听端口,坐等服务器将数据塞给客户端;
被动模式下,服务器比较懒,客户端想要数据时,得要请求服务器监听一个端口,然后客户端主动连接服务器才能得到想要的数据。



  • 部署问题:
  
  中国的ip地址资源太少,很多情况下ftp回话两端要经过层层NAT、网关、防火墙。 导致PORT PASV中的ip 信息不一定都是正确的。比如client的ip是192.168.0.107,其实它是通过NAT连接上网的,该NAT对外的internet地址是218.2.135.1,那么client 发送的PORT指令中携带的192,168,0,107,xx,yy 对于server是没有意义的。 所幸现在的NAT、防火墙一般都有FTP应用层感知能力,它能够截获ftp会话中的PORT PASSIVE, 自动将private的ip翻译成对外的正确的ip,并实时的在NAT上开放临时端口转发 。刚才的例子就会翻译成 218,2,135,1,xx,yy。 所以一般情况下,ftp还是能够正常工作的。

  主动模式下,客户端的NAT、防火墙容易导致连接问题。比如PORT 后 NAT需要临时开转发端口,并改变TCP报文中PORT的内容,如果NAT不具备应用层解析能力或只能感知标准21端口的命令,都将容易导致传数据失败。 而且 主动模式下对于使用代理、ssl,会带来很多其它问题。
  被动模式下,问题主要集中在服务端的网络。因为需要服务器开临时端口并listen,对其部署的Firewall 要求有动态开 forward 的能力,这可能带来一定的安全隐患。 但是,大部分情况下,服务端的网络管理员应该已经配置了对FTP的支持。 所以推荐:大部分情况下,还是使用被动模式比较好。

运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-228507-1-1.html 上篇帖子: PHP命令行编程实例:FTP+SSL简单客户端示例 下篇帖子: centos6.3搭建FTP服务器图文教程
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表