三、FTP(TCP)

一、什么是FTP

FTP协议的(file Transfer Protocol)文本传输协议,简称为FTP,提供交互式的访问,对传输文件的格式和类型有分类,允许文件具有存取权限。适合异构网络任意计算机的传送

二、FTP的工作原理

FTP采用C/S架构,使用TCP可靠的传输服务。一个FTP服务器进程可同时为多个客户进程提供服务,FTP服务器检查有两大部分组成:一个主进程,负责接收新的请求,另外有若干的从属进程,负责处理单个请求,工作步骤如下:

  1. 建立TCP连接
  2. 打开控制端口21,使客户进程能够连接上
  3. 等待客户进程发链接请求。
  4. 启动从属进程来处理客户进程发来的请求。主进程与从进程并发执行,从属进程对客户进程的请求处理完毕后即终止。
  5. 回到等待状态,继续接收其他客户进程的请求。

三、FTP的两种模式

3.1 主动模式

FTP客户端使用N(N>1023)端口连接到FTP服务器的21端口,发送用户名和密码登录,登录成功后要list列表或者读取数据时,客户端开放N+1端口,发送 PORT命令到FTP服务器,告诉服务器客户端采用主动模式并开放端口;FTP服务器收到PORT主动模式命令和端口号后,通过服务器的20端口和客户端开放的端口连接,发送数据.

3.2 被动模式

FTP客户端使用N(N>1023)连接FTP服务器的21端口,发送用户名和密码登录,登录成功后要list列表或者读取数据时,发送PASV命令到FTP服务器, 服务器在本地开放一个端口(1024以上),然后把开放的端口告诉客户端, 客户端再通过N+1端口连接到服务器开放的端口进行数据传输

3.3 区别对比

二者的区别主要在于建立数据传输连接的时候,主模式的连接发起方为服务器端,使用20号端口连接客户端的N+1端口建立数据连接;被动模式连接发起方为客户端,客户端使用端口号+1去连接服务器的某一高位端口;

3.4 网络设置区别

主动模式下,客户端的FTP软件设置主动模式开放的端口段,在客户端的防火墙开放对应的端口段即可。

有一种常见问题是:服务器端只开放了21端口, 客户端机器没开放任何端口。FTP客户端连接采用的被动模式,结果客户端能登录成功,但是无法LIST列表和读取数据。很明显,是因为服务器端没开放被动模式下的随机端口导致。

由于被动模式下,服务器端开放的端口随机,但是防火墙要不能全部开放,解决的方案是,在ftp服务器配置被动模式下开放部分随机高位端口(范围在ftp服务器软件设置,可以设置任意1024上的端口段),然后在防火墙设置规则,开放服务器端相应的端口号即可。

四、FTP协议报文解析

按照FTP客户端上传文件 TFTP.rar 为例,

客户端: 192.100.100.100
服务器: 192.100.100.200

整个过程,先三次握手,再进行账号的登录,然后再传输文件

整个报文结构是 以太网首部(14字节) + IP首部(20字节) + TCP首部(20字节) + TCP数据(FTP)

4.1 报文1 - 3(三次握手)

FTP是TCP基础上的协议,所以存在三次握手,同时客户端的port=3118(随机), 服务器的端口21(代表是FTP协议)

4.2 报文4(服务器响应用户就绪服务)

服务器(21端口)向客户端(3118端口)发出响应。
code字段表示新用户服务就绪,220代表服务就绪,可以执行信用与请求。
arg字段为服务器名称和服务器版本号

4.3 报文5(客户端发送request)

客户端(3118端口)向服务端(21端口)发送request报文。command字段表示该报文里包含的是用户名,arg字段为用户名内容。

4.4 报文6(服务器回复response)

服务端(21端口)回复response报文,code值为331,表示用户名正确,需要密码

4.5 报文7(客户端发送request)

客户端(3118端口)向服务端(21端口)发送request报文,command字段表示该报文里包含的是密码,arg字段为密码内容。

2.6 报文8(服务器回复response)

服务端(21端口)回复response报文,code值为230,表示用户已登录,请继续操作

2.7 报文9(客户端发送数据请求类型)

客户端(3118端口)向服务器(21端口)发送请求类型为 1,代表是二进制请求

2.8 报文10(服务器发送肯定的答复)

服务器(端口21)向客户端(3118端口)发送肯定的答复收到请求了

2.9 报文11(客户端发送被动连接请求)

客户端(3118端口)向服务端(21端口)请求建立被动连接

2.10 报文12(服务器响应被动连接请求)

服务端(21端口)响应,同意建立被动连接,并且向客户端发送服务端的IP(192.100.100.200)和监听端口(9527)

2.11 报文13-15(FTP子进程建立新的三次握手)

FTP 子进程创建新的三次握手,客户端(192.100.100.100, 3119), 服务器(192.100.100.200, 9527)

2.12 报文16(客户端发送上传的文件名称)

客户端(3118端口)向服务器(21端口)发送上传文件的请求

2.13 报文17(服务器响应请求上传文件的请求)

服务器(21端口)响应客户端(3118端口)请求上传文件的请求

2.14 报文18--(客户端上传文件内容)

客户端(3119断口)向服务器(9527端口)上传文件。

五、FTP基本指令介绍

指令描述
ABOR 中断数据连接程序
ACCT <account> 系统特权帐号
APPE <filename> 为服务器上的文件存储器分配字节
CDUP <dir path> 改变服务器上的父目录
CWD <dir path> 改变服务器上的工作目录
DELE <filename> 删除服务器上的指定文件
HELP <command> 返回指定命令信息
LIST <name> 如果是文件名列出文件信息,如果是目录则列出文件列表
MODE <mode> 传输模式(S=流模式,B=块模式,C=压缩模式)
MKD <directory> 在服务器上建立指定目录
NLST <directory> 列出指定目录内容
NOOP 无动作,除了来自服务器上的承认
PASS <password> 系统登录密码
PASV 请求服务器等待数据连接(被动模式)
PORT <address> IP 地址和两字节的端口 ID
PWD 显示当前工作目录
QUIT 从 FTP 服务器上退出登录
REIN 重新初始化登录状态连接
REST <offset> 由特定偏移量重启文件传递
RETR <filename> 从服务器上找回(复制)文件
RMD <directory> 在服务器上删除指定目录
RNFR <old path> 对旧路径重命名
RNTO <new path> 对新路径重命名
SITE <params> 由服务器提供的站点特殊参数
SMNT <pathname> 挂载指定文件结构
STAT <directory> 在当前程序或目录上返回信息
STOR <filename> 储存(复制)文件到服务器上
STOU <filename> 储存文件到服务器名称上
STRU <type> 数据结构(F=文件,R=记录,P=页面)
SYST 返回服务器使用的操作系统
TYPE <data type> 数据类型(A=ASCII,E=EBCDIC,I=binary)
USER <username>> 系统登录的用户名

六、FTP常见响应状态代码

七、Python实现FTP协议

https://www.cnblogs.com/wangyong123/articles/17015233.html#_label6

 

posted on 2023-04-04 19:37  软饭攻城狮  阅读(217)  评论(0编辑  收藏  举报

导航