Python的网络编程[1] -> FTP 协议[0] -> FTP 的基本理论
FTP协议 / FTP Protocol
FTP全称为File Transfer Protocol(文件传输协议),常用于Internet上控制文件的双向传输,常用的操作有上传和下载。基于TCP/IP,基于RFC959通信协议。
0 FTP理论 / FTP Theory
详细的理论可以参考这里。
1 FTP结构 / FTP Structure
FTP如同其他的很多通讯协议,FTP通讯协议也采用客户机 / 服务器(Client / Server)架构。用户可以通过各种不同的FTP客户端程序,借助FTP协议,来连接FTP服务器,以上传或者下载文件。
2 FTP通讯端口 / FTP Communication Port
FTP的服务器与客户端之间的文件传输,需要通过端口来进行,FTP协议的端口包括:
TCP端口21:
主要用于指令传输,所有客户端发往FTP服务器的命令和服务器的反馈指令都是通过该端口进行传输。
TCP端口20:
主要用于数据传输(主动模式),例如客户端上传下载内容,以及查看目录显示内容等。
3 FTP连接模式 / FTP Communication Mode
FTP的主动模式和被动模式,两者的区别,用两张图来表示:
3.1 主动模式PORT
主动模式工作过程:
1. 客户端以随机非特权高位端口N (>1024),对server端21端口发起连接,并且之后所有控制命令均通过这条链路传送;
2. 当需要进行数据传输时,客户端开始监听N+1端口,并发送port N+1的命令到FTP服务器;
3. 服务端会主动以20端口连接到客户端的N+1端口。
总结流程如下:
客户端向服务器的FTP端口(默认是21)发送连接请求,服务器接受连接,建立一条命令链路。当需要传送数据时,客户端在命令链路上用PORT命令告诉服务器:“我打开了***X端口,你过来连接我”。于是服务器从20端口向客户端的***X端口发送连接请求,建立一条数据链路来传送数据
主动模式的优点:
服务端配置简单,利于服务器安全管理,服务器只需要开放21端口
主动模式的缺点:
如果客户端开启了防火墙,或客户端处于内网(NAT网关之后), 那么服务器对客户端端口发起的连接可能会失败
3.2 被动模式PASV
被动模式工作过程:
1. 客户端打开随机非特权端口N和N+1,并以端口N连接服务端的21端口(提交PASV命令);
2. 服务端开启一个非特权端口M为被动端口,并返回给客户端;
3. 客户端以N+1的端口主动连接服务端的被动端口M,从而建立连接传输数据。
总结流程如下:
客户端向服务器的FTP端口(默认是21)发送连接请求,服务器接受连接,建立一条命令链路。当需要传送数据时,服务器在命令链路上用PASV命令告诉客户端:“我打开了***X端口,你过来连接我”。于是客户端向服务器的***X端口发送连接请求,建立一条数据链路来传送数据。
被动模式缺点:
服务器配置管理稍显复杂,不利于安全,服务器需要开放随机高位端口以便客户端可以连接,因此大多数FTP服务软件都可以手动配置被动端口的范围
被动模式的优点:
对客户端网络环境没有要求,而对服务端有。
被动模式客户端Log:
*resp* '220 Welcome to my FTP server.'
*cmd* 'USER Admin'
*resp* '331 Username ok, send password.'
*cmd* 'PASS ******'
*resp* '230 Admin login successful'
*welcome* '220 Welcome to my FTP server.'
*cmd* 'TYPE I'
*resp* '200 Type set to: Binary.'
*cmd* 'PASV'
*resp* '227 Entering passive mode (127,0,0,10,8,74).'
*cmd* 'RETR testFile.py'
*resp* '125 Data connection already open. Transfer starting.'
*resp* '226 Transfer complete.'
*cmd* 'TYPE I'
*resp* '200 Type set to: Binary.'
*cmd* 'PASV'
*resp* '227 Entering passive mode (127,0,0,10,8,105).'
*cmd* 'RETR testFile.docx'
*resp* '125 Data connection already open. Transfer starting.'
*resp* '226 Transfer complete.'
*cmd* 'QUIT'
*resp* '221 Goodbye, admin.'
Note:
- *resp*为ServeràClient, *cmd*为ClientàServer
- TYPE I 为二进制方式传输
- '227 Entering passive mode (127,0,0,10,8,74).'表示返回了服务器IP和服务器开启的临时端口,临时端口算法为,8*256+74=2122。
参考链接
http://blog.csdn.net/sever2012/article/details/7074426
http://blog.csdn.net/cuker919/article/details/6403925
最新文章
- poj-1384 Piggy-Bank
- bootstrap-dropdown
- SparkContext的初始化(叔篇)——TaskScheduler的启动
- 使用Cydia Substrate 从Native Hook Android Java世界
- Sublime Text2 多行编辑快捷键
- Linux编程之《守护进程》
- Spark(Hive) SQL数据类型使用详解(Python)
- 【贪心】HDU 5783 Divide the Sequence
- java 复用类的三种方式区别 组合,继承,代理的区别
- linux sudo环境变量设置
- 窗体的Alpha通道透明色支持(一旦 Form 被定义为利用 LayeredWindow ,窗口的绘图不再响应沿用多年的 WM_Paint 消息)
- [iOS Animation]-CALayer 隐式动画
- 用clipboard.js实现纯JS复制文本到剪切板
- java 判断是否是周末
- hadoop hdfs ha 模式
- [LeetCode] Search in a Sorted Array of Unknown Size 在未知大小的有序数组中搜索
- 机器学习笔记(三)Logistic回归模型
- LeetCode:111_Minimum Depth of Binary Tree | 二叉树的最小深度 | Easy
- java 按概率产生
- what's the python之内置函数
热门文章
- java日期格式化(util包下转成sql包下)
- 常用模块(datatime)
- 【Python-遇到的Error】AttributeError: 'str' object has no attribute 'input_text'
- 用Jenkins自动化搭建测试环境
- 4.实现简单的shell sed替换功能
- 数据库——mysql内置功能(11)
- 1099 Build A Binary Search Tree (30 分)(查找二叉树)
- Spring 笔记(一)概念梳理
- Android记事本05
- ALPHA(10)