【前言】
要弄清FTP主动和被动模式区别,首先需要弄清端口。本质上ftp协议是TCP/IP的上层协议,即应用层协议,也就是说如果要实现一个ftp软件或工具,还是用socket去实现,因此需要弄清socket和端口是基础。注意以下几点:
1.socket分为客户端和服务端,通常情况下服务端需要进行bind绑定端口操作,而客户端不需要操心本地端口的操作,客户端只需要在connect的时候传入服务端的IP和端口参数。其实在socket连接的过程中,双方都需要打开一个端口,只不过客户端的端口由系统自己产生,自己关闭。因为客户端关心的是服务端的端口,而不需要关心本地的端口。很多人误以为客户端不需要端口。
2.ftp协议中会建立两条通道:一条是命令通道,进行命令传送,例如:客户端向服务端请求列表;另外一条是数据通道,就是在文件上传下载时使用。
FTP主动和被动模式
ftp的主被动模式指的是在于数据通道的区别,也就是说在传输文件时才会有区分。通常说的ftp的21端口指的是命令通道,是服务端监听的21端口。而数据通道是文件传输前建立连接,传输完毕则关闭连接。下面具体介绍传输文件的时候主被动工作过程。
主动模式:
建立连接,获取目录及列表 ,这个过程主被动没什么区别。下面是从客户端打印的连接过程:
响应: 220 Connected to 192.168.2.77 ready...
命令: USER admin
响应: 331 Password required for admin.
命令: PASS *****
响应: 230 User admin logged in.
状态: 连接成功
命令: OPTS UTF8 OFF
响应: 500 'OPTS': command not understood.
状态: 正在取得目录列表...
命令: PWD
响应: 257 "/E:/test/" is current directory.
状态: 成功取得目录列表
下载文件时(主动模式)过程:
响应: 220 Connected to 192.168.2.77 ready...
命令: USER admin
响应: 331 Password required for admin.
命令: PASS *****
响应: 230 User admin logged in.
状态: 连接成功
状态: 开始下载 /E:/test/100.txt
命令: CWD /E:/test/
响应: 250 CWD command successful. "/E:/test/" is current directory.
命令: PWD
响应: 257 "/E:/test/" is current directory.
命令: TYPE I
响应: 200 Type set to I.
命令: PORT 192,168,2,77,59,188
响应: 200 Port command successful.
命令: RETR 100.txt
响应: 150 Opening data connection for 100.txt.
响应: 226 Transfer complete.
状态: 下载成功
从上面的一行命令: PORT 192,168,2,77,59,188意思是:PORT是告诉服务端是主动模式建立数据通道;192,168,2,77是客户端IP,;59,188是客户端随机产生的端口,其中端口号计算为 端口号 = 59 x 256 + 188;这个端口是在客户端监听,客户端告诉服务端这个端口号,让服务端来连,建立连接后传输文件。过一段时间后,会打印-----状态: 已经从服务器断开,下次传文件的时候重新来一遍。
被动模式:
连接命令通道没什么区别,数据传输时就不同了,过程如下:
响应: 220 Connected to 192.168.2.77 ready...
命令: USER admin
响应: 331 Password required for admin.
命令: PASS *****
响应: 230 User admin logged in.
状态: 连接成功
命令: OPTS UTF8 OFF
响应: 500 'OPTS': command not understood.
状态: 正在取得目录列表...
命令: PWD
响应: 257 "/E:/test/" is current directory.
状态: 成功取得目录列表
状态: 正在连接 192.168.2.77 ...
状态: 已经连接到 192.168.2.77:0。正在等待欢迎信息...
响应: 220 Connected to 192.168.2.77 ready...
命令: USER admin
响应: 331 Password required for admin.
命令: PASS *****
响应: 230 User admin logged in.
状态: 连接成功
状态: 开始下载 /E:/test/100.txt
命令: CWD /E:/test/
响应: 250 CWD command successful. "/E:/test/" is current directory.
命令: PWD
响应: 257 "/E:/test/" is current directory.
命令: TYPE I
响应: 200 Type set to I.
命令: PASV
响应: 227 Entering Passive Mode (192,168,2,77,62,17).
命令: RETR 100.txt
响应: 150 Opening data connection for 100.txt.
响应: 226 Transfer complete.
状态: 下载成功
被动模式传输文件的时候有一行命令 : PASV 意思是告诉服务端是被动模式,然后服务端会随机产生一个端口发给客户端,这时是服务端监听,客户端去连接,然后传文件。
总结:
以上介绍了主被动模式的过程,但网上有很多文章里罗列了很多端口,还有20端口等,最后再总结一下:
一个socket连接,比如服务端监听的是21端口,客户端也需要一个端口打开和外面连接(为什么客户端需要端口?客户端可服务端都是设备,对外连接都需要打开一扇门,不打开怎么连接;只不过服务端指定了端口,并且绑定了该端口,客户端才能找到对应的去连)。所以,主动模式下,数据通道是服务端指定了20端口和客户端监听的那个随机端口对应的,也就是说ftp服务端在传文件的情况下,作为客户端,打开了20端口,连接ftp客户端监听的随机端口,这样建立了数据通道。主动模式下其实是服务端监听了21端口,而客户端监听了数据通道随机端口;在被动模式下就是服务端监听了21端口,也监听了数据通道随机端口。
最后说一句,FTP虽然是古老的东西,建立连接需要很多命令,下载上传文件也需要很多次命令,但在工作学习中ftp仍然是不可或缺的工具。
【参考】
1.https://blog.csdn.net/qq_37851194/article/details/77622272
2.https://blog.csdn.net/code09/article/details/3975223
3.https://blog.csdn.net/zhangyuan12805/article/details/71425385