计算机网络协议系列 - 通过 FTP 协议实现与远程主机的文件传输

- 1 min

计算机网络协议系列(二十七)

FTP 的英文全称是 File Transfer Protocol,意为文件传输协议,也就是在两个相连的计算机(通常是本地主机与服务器)之间进行文件传输的协议。

FTP 底层原理

FTP 使用两个 TCP 连接实现文件传输:一个 TCP 连接用于控制,另一个 TCP 连接用于数据传输。

控制主要包含用户登录和验证、发送文件的名称、发送方式设置等。利用这个连接,可以通过 ASCII 码字符串发送请求和接收应答。但在这个连接上无法发送数据,只能通过另一个专门的 TCP 连接实现数据传输。

FTP 控制用的连接使用的是 21 号端口,该端口进行文件 GET(RETR)、PUT(STOR)、以及文件预览(LIST)等操作时,每次都会建立一个用于数据传输的 TCP 连接。数据传输完毕后,传输数据的这个连接被断开,然后在控制用的连接上继续进行命令或应答的处理。

控制用的连接,在用户要求断开之前会一直保持连接状态,不过,绝大多数 FTP 服务器都会对长时间没有任何新命令输入的用户的连接强制断开。

数据传输用的连接通常使用端口 20,不过可以用 PORT 命令修改为其它值。

FTP 文件传输

以上就是 FTP 的大致原理,我们要使用 FTP 传输文件,需要准备好客户端和服务端守护进程,客户端一般就是支持 FTP 文件传输的软件,比如 FileZilla,而服务端守护进程就是 vsftpd,可以参考学院上的这篇教程进行安装配置。

服务器端守护进程启动以后,就会监听 21 号端口等待连接,然后我们可以通过前面介绍的 TELNET 在命令行测试连接到远程 FTP 服务器:

~ telnet 114.215.241.29 21   # 远程主机IP和端口号
Trying 114.215.241.29...
Connected to 114.215.241.29.
Escape character is '^]'.
220 (vsFTPd 3.0.2)
USER ftpuser   # 通过 USER 指令设置 FTP 用户名
331 Please specify the password.
PASS ********  # 通过 PASS 指令设置 FTP 用户密码
230 Login successful.   # 返回 230 表示认证成功

然后,我们可以通过 FTP 支持的命令在 TELNET 客户端中进行文件传输操作。常见的 FTP 命令如下:

img

img

下面是常见的 FTP 服务器返回响应状态码:

img

img

img

当然,用命令行操作不够直观,也不太方面,我们通常还是使用 FTP 客户端软件进行操作,以 FileZilla 为例,连接远程 FTP 服务器成功后,页面显示如下:

img

其中左侧区域是本地计算机的目录信息,右侧区域是服务器端默认的 FTP 用户家目录,现在服务器对应目录还没有任何文件,可以将本地主机文件上传过去,之后也可以从服务器下载文件到本地:

img

img

其实底层调用的也就是前面列出的 FTP 远程操作命令。

FTP 在传输过程中不会对信息进行加密,都是明文传输,因而有被窃听和侵入的风险,由此衍生出了安全的文件传输协议 SFTP(SSH File Transfer Protocol),它会使用 SSH 协议进行身份验证并建立安全连接,所以推荐在日常使用时优先考虑 SFTP,上面介绍的服务端 vsftpd 和客户端 FileZilla 都支持 SFTP,感兴趣的同学可以自行研究下实现,这里就不深入展开了。

rss facebook twitter github gitlab youtube mail spotify lastfm instagram linkedin google google-plus pinterest medium vimeo stackoverflow reddit quora quora