FTP文件传输协议:


一、简述:

1、TCP/IP协议簇,应用层协议,采用服务端与客户端通信方式共享文件。

2、FTP根目录:/            (如路径: /hello/)  

3、现在的FTP一般用Serv-U搭建,IIS搭建的FTP服务端与Serv-U搭建的服务端返回的响应信息格式不一样,可能会导致解析出错。

4、服务端监听端口:

1)端口20:传输套接字(仅用于传输文件,每传输完毕一次,就关闭一次连接)

2)端口21:控制套接字(对话,传输控制,获取信息,持久连接)


二、FTP缺点:

1、明文登录.
2、FTP客户端程序因使用>1024端口接收大数据,容易被防火墙过滤.

 被动模式解决,被动模式的概念在下面)

3、运行FTP服务端程序的机器可能在连接目标监听随机端口被防火墙提示.
4、FTP在传输数量多的小文件性能不好.


三、匿名登录:

1、为了实现文件在互联网上传输的开放性,服务端管理员可以建立一个特殊的用户ID,
   提供给互联网上的用户下载和上传文件,这就是匿名用户,它不需要密码.

2、常用的匿名登录名称:anonymous


主动模式与被动模式的概念:(建立文件传输连接的两种不同方式而已)

一、主动模式:

1、客户端创建一个监听套接字,监听端口>1024,控制套接字发送PORT命令附带IP地址以及端口(特殊格式)到服务端.
2、服务端收到PORT命令,服务端的20端口连接到客户端,建立文件传输通信.

二、被动模式:

1、客户端发送PASV命令,服务端收到后,会创建一个在>1024端口的监听套接字,然后回复一串IP地址以及端口号(特殊格式).
2、通过回复的信息,连接到服务端的文件传输套接字上进行通信.


三、两种模式下的IP地址以及端口号的特殊表示形式:(须知)

1、PORT与PASV命令表示IP和端口的特殊格式:(PORT与PASV命令使用方式在下面)

举例:    IP地址:192.168.1.120      端口:4500
表示格式:192,168,1,120,17,148

解释:
1、注意是逗号.
2、前4个字段表示IP地址,即192,168,1,120,没有变
3、17,148字段:相当于(17 乘 256) + 148 =  4500端口

总结:
1、使用的是逗号
2、前四字段为IP地址,第五字段 ×  256 + 第六字段 = 端口号.

3、由于建立文件传输套接字连接时,会发送一个IP地址以及端口号(被动模式),说明控制连接与文件传输连接有可能不在同一台机器上,这是由发送参数推断出来的,并未测试过.

为什么会有两种文件传输连接模式:

1、因为防火墙的存在,导致使用FTP协议的一方可能被防火墙过滤一些东西.
   主动模式:客户端的>1024端口可能被过滤.

   被动模式:服务端的>1024端口可能被过滤.

通常都是使用被动方式进行FTP连接。


编写FTP客户端:

一、编写步骤:

1、控制套接字连接服务端的21端口,使用USER 、PASS 登录.
2、利用控制套接字获取感兴趣信息,文件套接字在传输文件时才连接服务端.

3、QUIT 退出.


二、上传文件:

1、文件套接字连接,可以设置一些杂项(如传输类型),一般默认就行.
2、发送STOR命令,接收一个服务端的响应码.
3、开始在文件套接字使用send函数将文件数据上传上去.
4、文件套接字send执行完毕后,不用管,直接closesocket文件套接字.
5、控制套接字用recv函数等待服务端发出接收完成信号即可.


三、下载文件:

1、文件套接字连接,可以设置一些杂项(如传输类型),一般默认就行.
2、发送RETR命令,意思让服务端把指定的文件的数据,send过来文件套接字,之后接收一个服务端的响应码(一般为226发送完毕信号,要等待这个信号来到为止).
3、226发送完毕信号到来,就可以让文件套接字recv函数来接收到来的数据了.


四、需要注意:

1、文本模式:传输文本文件时使用,一般在使用REST命令断点续传时,不能指定为文本模式.
2、二进制模式:通用


常用命令:(每执行一次命令后,服务端会给与回复)

一、登录类:


USER 账号\r\n

登录账号

PASS 密码\r\n

登录密码

REIN\r\n

想重新登录,连接不会关闭,下一条命令USER可重新连接

QUIT\r\n

退出


二、建立文件传输套接字通信类:


PASV\r\n

被动模式,服务端会回复一个IP地址和端口,然后你再连接.(一般使用被动模式)

PORT 表示IP端口的特殊格式\r\n

主动模式,让服务端主动来连接你的文件监听套接字


三、操作文件类:


STOR 文件名\r\n

上传文件

APPE 文件名\r\n

上传文件,如果文件名已存在,把数据插入尾部

DELE 文件名\r\n

删除指定文件

REST 字节个数\r\n

跳过字节数,短点续传,下载文件前使用,使RETR命令仅下载偏移后的部分

RETR 文件名\r\n

下载文件

ABOR\r\n

放弃传输一个文件,将关闭文件套接字通信


注意:REST命令一般不能在文本模式来使用.一般在二进制模式下使用(I),经测试,不能在上传时使用(不确定,可以自己去试试).

四、目录操作类:

CWD 目录名\r\n

改变当前目录到指定目录

CDUP\r\n

返回上一次目录,当到根目录时,不变

LIST\r\n

显示当前目录下的文件,包括长度,文件类型(如目录)与权限(表示类型:drwxr-xr-x)

LIST 目录名\r\n

显示指定目录下的文件,包括长度,文件类型(如目录)与权限(表示类型:drwxr-xr-x)

MKD 目录名\r\n

创建一个目录

PWD\r\n

显示当前目录的路径

RMD 目录名\r\n

删除目录

RNFR 文件或目录名\r\n

将某文件或目录重命名,接下来要使用RNTO指定新名称

RNTO 文件或目录名\r\n

重命名为....

NLST\r\n

仅显示当前目录下的文件,以\r\n表示下一个

NLST 目录\r\n

仅显示指定目录下的文件,以\r\n表示下一个


五、模式与类型:


TYPE 字符\r\n

选择传输类型

A为文本模式

I为二进制模式

E为EBCDIC

N为Nonprint非打印模式

T为Telnet格式控制符

六、参数信息:


SYST\r\n

获取服务端系统信息(NT或Unix)

STAT 文件或文件夹\r\n

获取相关信息

七、其他不常用的命令:


ACCT 用户帐号\r\n

发送PASS命令并接收到332代码之后才应发送

SMNT 另一个文件数据系统的路径\r\n

允许用户装配另一个文件系统的数据结构而无需改变登录

MODE 字符\r\n

指定传输类型:默认为流模式(S为流)(B为块)(C为经过压缩)

STRU 字符\r\n

指定结构类型:F为文件结构(默认值,就是流式传输)

ALLO 逻辑字节数\r\n

上传文件前,使用此命令申请内存(本人还没见到需要的,都是直接上传)

NOOP

测试通信

HELP

帮助,会列出有效命令

FTP服务端的响应码:

150

文件状态良好,打开数据连接

200

命令成功

212

目录状态

213

文件状态

110

重新启动标记应答

500

格式错误,命令不可识别

501

参数语法错误

502

命令未实现

120

在X分钟内准备好

125

连接打开准备传送

214

帮助信息,信息仅对人类用户有用

215

名字系统类型

220

对新用户服务准备好

221

服务关闭控制连接,可以退出登录

202

命令未实现

211

系统状态或系统帮助响应

225

数据连接打开,无传输正在进行

226

关闭数据连接,请求的文件操作成功

227

进入被动模式

230

用户登录

331

用户名正确,需要口令

332

登录时需要帐户信息

350

请求的文件操作需要进一步命令

421

连接用户过多

425

不能打开数据连接

426

关闭连接,中止传输

450

请求的文件操作未执行

451

中止请求的操作:有本地错误

452

未执行请求的操作:系统存储空间不足

250

请求的文件操作完成

257

创建"PATHNAME"

503

命令顺序错误

504

此参数下的命令功能未实现

530

账号或密码错误

532

存储文件需要帐户信息

550

未执行请求的操作

551

请求操作中止:页类型未知

552

请求的文件操作中止,存储分配溢出

553

未执行请求的操作:文件名不合法

关于与Serv-U搭建FTP服务器通信返回的文件格式:

举例:发送LIST命令到服务端,返回一个文件列表,每一个文件最前面带有:drwxr-xr-x
(这应该是Linux下用户权限与文件类型的表达方式)
(我对Linux不熟,所以一开始我还以为是什么加密的数据,其实他代表用户权限与文件类型)

drwxr-xr-x    10个域   Linux下表示用户拥有的权限
顺序:从左到右
第1位(文件类型):d(目录文件)、l(链接文件),-(普通文件),p(管道)
第2-4位(权限):r(读)、w(写)、x(可执行)
第5-7位(此文件属主的用户组权限)
第8-10位(其他用户所具有的权限)