目录
1、链路分类
FTP是仅基于TCP的服务,与众不同的是FTP协议要用到两个TCP连接,一个是控制链路,用来在客户端与服务器之间传递命令的;另一个是数据链路,用来上传或下载数据的。控制链路是由客户端向服务器端的 21 号端口建链,根据数据链路的建链方向以及所使用的端口号的不同分为主动模式和被动模式两种。
2、控制链路
无论是被动模式还是主动模式都是需要客户端用一个大于1024的端口主动先向服务器的 21号端口 建链形成控制链路,具体过程如下:
1、客户端向服务器发起三次握手操作,完成TCP链路的建立
2、TCP建链完成,服务器向客户端回复220 (220:对新用户服务准备好)
3、服务器向客户端发送回应530(530:需要客户端发送用户名和密码)
4、客户端发送用户名,服务器收到用户名并校验成功后回复331(331:用户名正确,需要口令)
5、客户端发送密码,服务收到密码校验成功后并回复230(230:用户登录成功)
client:10.43.42.199、server:10.43.85.223,报文如下
//client
[root@localhost ~]# netstat -anp | grep 10.43.85.223
tcp 0 0 10.43.42.199:52055 10.43.85.223:21 ESTABLISHED 19848/ftp
3、数据链路
3.1、被动模式(PASV)
ftp默认使用被动模式传输数据,具体过程如下:
1、客户端向服务器发送PASV指令,告诉服务器使用被动模式(控制链路)
2、服务器收到指令后,开启一个监听端口 listen_port(大于1024),并将该端口信息回复客户端
3、客户端收到服务的监听端口 listen_port 信息后,立刻再起一个端口向listen_port进行建链(数据链路)
4、数据链路建链完成后,数据信息走数据链路、控制指令信息走控制链路
模型如下:
抓包信息如下:
client命令执行结果:
//client
ftp> get test1
local: test1 remote: test1
227 Entering Passive Mode (10,43,85,223,25,164).
150 Opening BINARY mode data connection for test1 (70776816 bytes).
226 Transfer complete.
70776816 bytes received in 6.1 seconds (1.1e+04 Kbytes/s)
....
[roott@localhost ~]# netstat -anp | grep 10.43.85.223
tcp 0 0 10.43.42.199:44613 10.43.85.223:6564 ESTABLISHED 19848/ftp
tcp 0 0 10.43.42.199:52055 10.43.85.223:21 ESTABLISHED 19848/ftp
3.2、主动模式(PORT)
1、客户端本地开启一个监听端口listen_port,后向服务器发送PROT指令,并将端口信息带给服务器
2、服务收到PROT指令,立刻用本地20号端口向客户端的 listen_port 进行建链(数据链路)
3、数据链路建链完成后,数据信息走数据链路、控制指令信息走控制链路。
抓包信息如下:
client命令执行结果:
//client
ftp> passive
Passive mode off.
ftp> get test2
local: test2 remote: test2
200 PORT command successful. Consider using PASV.
150 Opening BINARY mode data connection for test2 (86743786 bytes).
226 Transfer complete.
86743786 bytes received in 7.5 seconds (1.1e+04 Kbytes/s)
ftp> quit
[roott@localhost ~]# netstat -anp | grep 10.43.85.223
tcp 0 0 10.43.42.199:59250 10.43.85.223:20 ESTABLISHED 19848/ftp
tcp 0 0 10.43.42.199:52055 10.43.85.223:21 ESTABLISHED 19848/ftp
[roott@localhost ~]# netstat -anp | grep 10.43.85.223
tcp 0 0 10.43.42.199:59250 10.43.85.223:20 ESTABLISHED 19848/ftp
tcp 0 0 10.43.42.199:52055 10.43.85.223:21 ESTABLISHED 19848/ftp
[roott@localhost4 ~]# netstat -anp | grep 10.43.85.223
3.3、两种模式数据链路区别
- 被动模式和主动模式的区分主要是在数据链路上,控制链路两者完全相同。
- 被动模式是客户端向服务器主动建链,监听端口由服务器响应PASS后带回。
- 主动模式是服务器向客户端主动建链,监听端口封装在客户端的请求信息PROT中,同时服务只能使用21号端口进行建链链,也就是说如果是主动模式,同一时刻只能有一条数据链路在传输(相同 ip)。
- 还有一点需要注意:数据链路仅用于数据传输,数据传输完毕后立刻断链,如果后续还有数据传输会重新新建一条数据链,无论是PASS 还是 PROT。
4、FTP 相关命令
(每执行一次命令后,服务端会给与回复)
4.1、登录
USER 账号\r\n | 登录账号 |
PASS 密码\r\n | 登录密码 |
REIN\r\n | 想重新登录,连接不会关闭,下一条命令USER可重新连接 |
QUIT\r\n | 退出 |
4.2、建立文件传输套接字通信
PASV\r\n | 被动模式,服务端会回复一个IP地址和端口,然后你再连接.(一般使用被动模式) |
PORT 表示IP端口的特殊格式\r\n | 主动模式,让服务端主动来连接你的文件监听套接字 |
4.3、操作文件
STOR 文件名\r\n | 上传文件 |
APPE 文件名\r\n | 上传文件,如果文件名已存在,把数据插入尾部 |
DELE 文件名\r\n | 删除指定文件 |
REST 字节个数\r\n | 跳过字节数,短点续传,下载文件前使用,使RETR命令仅下载偏移后的部分 |
RETR 文件名\r\n | 下载文件 |
ABOR\r\n | 放弃传输一个文件,将关闭文件套接字通信 |
4.4、目录操作
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表示下一个 |
4.5、模式与类型
TYPE 字符\r\n | 选择传输类型 A为文本模式 I为二进制模式 E为EBCDIC N为Nonprint非打印模式 T为Telnet格式控制符 |
4.6、参数信息
SYST\r\n | 获取服务端系统信息(NT或Unix) |
STAT 文件或文件夹\r\n | 获取相关信息 |
4.7、其他不常用的命令
ACCT 用户帐号\r\n | 发送PASS命令并接收到332代码之后才应发送 |
SMNT 另一个文件数据系统的路径\r\n | 允许用户装配另一个文件系统的数据结构而无需改变登录 |
MODE 字符\r\n | 指定传输类型:默认为流模式(S为流)(B为块)(C为经过压缩) |
STRU 字符\r\n | 指定结构类型:F为文件结构(默认值,就是流式传输) |
ALLO 逻辑字节数\r\n | 上传文件前,使用此命令申请内存(本人还没见到需要的,都是直接上传) |
NOOP | 测试通信 |
HELP | 帮助,会列出有效命令 |
4.8、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 | 未执行请求的操作:文件名不合法 |
参考文献:
https://blog.csdn.net/jingzi123456789/article/details/83409572
https://blog.csdn.net/Aaron133/article/details/78508211