一、FTP介绍
ftp(File Transfer Protocol)是早期的三个应用级协议之一,基于C/S结构,双通道协议,数据和命令连接,数据传输格式默认是二进制,当然也支持文件方式传输。默认情况下FTP协议使用TCP端口中的21和20这两个端口,其中20用于数据传输,21用作命令传输,但是20号端口是否作为数据传输的端口,这与FTP使用的传输模式有关,从FTP服务器的角度讲,FTP传输数据的模式分为主动模式和被动模式。主动模式就是服务器主动去连接客户端,被动模式就是客户端去连接服务器。不管FTP服务器工作在那个模式下,它的命令控制端口都监听在ftp服务器的tcp21端口,而主动模式(PORT)中数据传输端口是ftp服务器的20号端口去连接客户端的一个随机端口来传输数据,在被动模式(PASV)是客户端的一个随机端口去连接FTP服务端的一个随机端口,这样一来各位可能会有一个疑问就是在被动模式中,客户端怎么知道去连接那个端口和服务器连接传输数据呢?双方的随机端口怎么确认呢?它的工作流程是这样的,在被动模式中我们知道命令控制端口是连接FTP服务器的21号端口(这是默认情况,不更改其监听的端口),客户端连接服务端的时候就会和服务端协商,到底哪个端口来当做数据传输的端口啊,事实上被动模式或主动模式中数据传输端口是通过命令链路双方协商好的,主动模式的数据传输端口是通过命令连接告诉给服务端的,这样一来当我们需要下载数据时,服务端会以20端口去连接客户端的一个协商好的端口,同理被动模式中,数据端口也是双方协商好了 的,在我们下载数据时,客户端会以一个随机端口去连接协商好的那个服务端的端口。
服务器被动模式数据端口示例
[root@test ~]#ftp 192.168.0.99
Connected to 192.168.0.99 (192.168.0.99).
220 (vsFTPd 3.0.2)
Name (192.168.0.99:root): ftp
331 Please specify the password.
Password:
230 Login successful.
Remote system type is UNIX.
Using binary mode to transfer files.
ftp> ls
227 Entering Passive Mode (192,168,0,99,43,241).
150 Here comes the directory listing.
drwxr-xr-x 2 0 0 6 Oct 30 2018 pub
226 Directory send OK.
ftp>
说明:我们可以看到消息状态为227的告诉我们被动模式(192.168.0.99,43,241)这是什么意思呢,其实它这就是告诉客户端我们连接服务端的那个端口,它的计算方式是这样的,以上为例它会去连接服务端的11249,这个端口就是通过43*256+241得来的,每传输一次数据都会写上好一个数据端口,这就是ftp工作在被动模式的端口确定方式。
227 Entering Passive Mode (192,168,0,99,201,83).
150 Here comes the directory listing.
-rw-r--r-- 1 0 0 1073741824 Dec 27 04:25 bigfile
226 Directory send OK.
ftp> ! ss -nt
State Recv-Q Send-Q Local Address:Port Peer Address:Port
ESTAB 0 0 192.168.0.99:51838 192.168.0.99:21
ESTAB 0 0 192.168.0.99:59860 192.168.0.99:3306
ESTAB 0 0 192.168.0.99:3306 192.168.0.99:59860
ESTAB 0 0 192.168.0.99:41319 192.168.0.232:1678
ESTAB 0 216 192.168.0.99:41319 192.168.0.232:1616