zoukankan      html  css  js  c++  java
  • 网络协议-应用层协议-文件传输协议

    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 命令如下:


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



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

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

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

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

  • 相关阅读:
    [算法] 堆栈
    [刷题] PTA 02-线性结构3 Reversing Linked List
    java IO流 (八) RandomAccessFile的使用
    java IO流 (七) 对象流的使用
    java IO流 (六) 其它的流的使用
    java IO流 (五) 转换流的使用 以及编码集
    java IO流 (四) 缓冲流的使用
    java IO流 (三) 节点流(或文件流)
    java IO流 (二) IO流概述
    java IO流 (一) File类的使用
  • 原文地址:https://www.cnblogs.com/stringarray/p/12968478.html
Copyright © 2011-2022 走看看