FTP协议详解

news2024/11/18 23:30:26

文章目录

    • 1 FTP概述
    • 2 实验环境
    • 3 FTP详解
      • 3.1 文件传输过程
      • 3.2 报文格式
      • 3.3 数据连接
      • 3.4 主动模式
      • 3.5 被动模式
      • 3.6 匿名服务器
    • 4 总结

1 FTP概述

FTPFile Transfer Protocol的缩写,即文件传输协议,是TCP/IP 协议族中的协议之一。FTP是一个用于在计算机网络上在客户端和服务器之间进行文件传输的应用层协议。RFC 959定义了FTP协议规范。

同大多数Internet服务一样,FTP也是一个客户/服务器系统(C/S系统)。用户通过一个客户端程序连接至在远程计算机上运行的服务器程序。依照FTP协议提供服务,进行文件传送的计算机就是FTP服务器,而连接FTP服务器,遵循FTP协议与服务器传送文件的电脑就是FTP客户端。用户要连上FTP 服务器,就要用到 FTP 的客户端软件,通常Windows系统自带“ftp”命令,这是一个命令行的FTP客户端程序,另外常用的FTP客户端程序还有FileZillaCuteFTP

2 实验环境

为了更透彻的理解和掌握FTP,在叙述FTP协议内容的同时,以“实战 ” 的方式抓取FTP客户端FTP服务器之间交互的网络包,以此和FTP协议相互印证,加深理解。本节主要介绍抓取FTP网络包的环境搭建。实验环境将以Windows系统平台作为FTP客户端,以linux系统虚拟机作为FTP服务器

FTP实验环境搭建:

  1. Windows系统安装wireshark抓包工具;
  2. Windows系统安装linux虚拟机(本次实验版本:Ubuntu 16.04);
  3. 熟悉Windows系统"ftp"命令行的使用。

常用的"ftp"命令行(可以打开cmdPowerShell进行验证):

  • ftp 服务器域名(ip地址),如:ftp ftp.gnu.org,进行FTP服务器登录;
  • ftp>? 或 ftp>help,显示"ftp"命令行说明;
  • ftp>dir,显示FTP服务器目录文件和子目录列表;
  • ftp>cd,切换FTP服务器上的工作目录;
  • ftp>ls,显示FTP服务器上目录文件和子目录的缩写列表;
  • ftp>pwd,显示FTP服务器上的当前目录;
  • ftp>mdir,显示FTP服务器上目录文件和子目录列表,如:mdir Music 1.txt,将服务器目录Music中文件和子目录列表详细信息存入本地文件1.txt中;
  • ftp>binary(或bi),将文件传送类型设置为二进制模式;
  • ftp>ascii,将文件传送类型设置为默认的ASCII
  • ftp>delete,删除远程计算机上的文件,如:delete 123.c,删除服务器上的123.c文件;
  • ftp>get,将远程服务器文件复制到本地计算机上,如get 123.c,将服务器上的123.c文件,复制到本地;
  • ftp>mget,将远程服务器多个文件复制到本地计算机,如mget 123.c 456.c,将文件123.c456.c复制到本地计算机上;
  • ftp>put,将本地文件复制到远程计算机上,如:put 789.c
  • ftp>disconnect,从服务器断开,但保留"ftp"命令行提示(依然是处于"ftp"命令行模式,未退出);
  • ftp>open,与指定的远程FTP服务器连接,可以通过IP地址计算机名称指定计算机(DNS或主机文件必须可用);
  • ftp>quit或(bye),结束与远程服务器的FTP会话并退出"ftp"命令行模式;
  • ftp>status,显示 FTP 连接和切换的当前状态;
  • ftp>debug,切换调试,当调试打开时,客户端发送到远程服务器的每个命令都将打印。默认情况下,调试是关闭的;
  • ftp>!,从"ftp"命令行子系统退出到cmdPowerShellshell

注意"ftp"命令行只是Windows系统自带的FTP客户端程序,"ftp"命令行的使用和将要介绍的FTP文件传输协议无关。

3 FTP详解

FTP最大的一个优点就是部署、使用起来非常简单。只要两个设备部署了FTP客户程序FTP服务程序,知道用户名和密码,就能够实现文件的轻松互传。甚至一些匿名FTP服务器,就算没有用户名和密码也能够访问。如一些软件分发、资料分享,就可能使用到匿名FTP服务器

3.1 文件传输过程

FTP使用简单并不意味着其实现简单。与常见的应用层协议http只需要一个TCP连接不同,FTP需要两个TCP连接来完成文件的传输。其中一个称为控制连接,一个称为数据连接

默认情况下,FTP使用2021这两个端口,其中20用于数据连接(传递数据),21用于控制连接(传递控制信息)。但是,是否使用20作为传输数据的端口与FTP使用的传输模式有关,如果采用主动模式,那么数据传输端口就是20;如果采用被动模式,则具体最终使用哪个端口要服务器端和客户端协商决定。

如下图所示,描述了使用FTP进行文件传输的过程,用户通过客户端程序(ftp命令行或FileZilla)与ftp服务器进行交互。用户的输入逻辑会被用户协议解释器解析,转换成FTP命令,通过控制连接(一个tcp连接,port口为21)给到服务器协议解释器,服务器协议解释器会回应一个FTP应答。并且根据传输过来的FTP命令类型,服务器协议解释器可能需要去启动服务器数据传输功能,其过程包括服务器主动发起建立一个tcp连接(用port口20),通过该连接服务端和客户端就可以进行数据传输了。在数据传输完成后,服务端会将该数据连接关闭掉,直到下一次需要文件传输时才又开启,所以可以看到数据连接是随时开、随时关。而控制连接在被创建后,其会一直保持下去,随时等待用户命名的输入,直到主动断开。

在这里插入图片描述

3.2 报文格式

在FTP协议中,FTP命令FTP应答,是以ASCII码形式的明文传递。FTP命令的一般报文格式是:命令 选项参数 \r\nFTP应答的一般报文格式为:状态码 报文选项 \r\n。先来介绍FTP命令

FTP命令都是34个字节的大写ASCII字符组成,其中一些命令带选项参数。从客户端向服务器发送的FTP命令有很多,在rfc959中有定义。本节介绍一些常用的。

命令                             说明

ABOR                        放弃先前的FTP命令和数据传输
LIST filelist               列表显示文件或目录
PASS password               服务器上的密码
PORT n1,n2,n3,n4,n5,n6      客户端IP地址(n1 .n2 .n3 .n4)和端口(n5 × 256 + n6)
QUIT                        从服务器退出
RETR filename               检索(取)一个文件
STOR filename               存储(放)一个文件
SYST                        服务器返回系统类型
TYPE type                   说明文件类型:A表示ASCII码,I表示二进制类型
USER username               服务器上用户名

FTP应答的状态码是ASCII码形式的3位数字,并且跟有报文选项。应答状态码中每一位数字都有不同的含义。应答状态码第1位第2位的含义如下,第3位给出出错报文的附加含义。

状态码                解释

1yz          正面的初步答复。该操作正在启动,但在发送另一个命令之前需要另一个回复。
2yz          肯定完成回复,可以发送新命令。
3yz          正面的中间答复。命令已被接受,但必须发送另一个命令。
4yz          暂时否定完成回复请求的操作没有发生,但错误情况是暂时的,因此可以稍后重新发出命令。
5yz          永久否定完成回复。 该命令未被接受,不应重试。
x0z          语法错误。
x1z          信息。
x2z          连接。涉及控制或数据连接的回复。
x3z          身份验证和记帐。回复登录或记帐命令。
x4z          未指定。
x5z          文件系统状态。

一些典型的状态码含义如下:

  • 125 数据连接已经打开,数据传输开始
  • 200 命令OK
  • 214 帮助消息(针对用户)
  • 331 用户名OK,需要密码
  • 425 无法打开数据连接
  • 452 写入文件时出错
  • 500 语法错误(无法识别的命令)
  • 501 语法错误(无效参数)。
  • 502 未实现的 MODE 类型。

下面来通过抓实际环境中的网络包,看客户端和服务器的FTP命令FTP应答交互过程。使用前面介绍的windows环境下的"ftp"命令行和FTP服务器进行交互。如下图所示为客户端登录到FTP服务器的抓包过程,客户端ip地址为192.168.213.1,服务端ip地址为192.168.213.136。如图中红框所示,可以看到首先客户端和服务器通过tcp三次握手建立了一条tcp通路,服务端端口号21,客户端端口号是64257,这条通路就是上面所说的控制连接。因为没有进行文件数据传输,所以数据连接尚未建立。

windows环境"ftp"命令行客户端展现的交互过程:

D:\> ftp 192.168.213.136
连接到 192.168.213.136220 (vsFTPd 3.0.3)
200 Always in UTF8 mode.
用户(192.168.213.136:(none)): book
331 Please specify the password.
密码:
230 Login successful.
ftp>

建立好控制连接之后,客户端和服务器就开始了报文交互,如图中的框所示,下面文字也描述了其报文交互过程,并且做了注释。

服务端(192.168.2.2)220 (vsFTPd 3.0.3)                //220,表示服务器准备完成,客户端可以发送命令了。 后面跟的是FTP服务器的版本信息。
客户端(192.168.2.6):OPTS UTF8 ON                       //表示服务器需要切换到UTF8字符集进行工作。
服务端(192.168.2.2)200 Always in UTF8 mode.          //200,表示命令执行成功,后面的提示信息表示已经工作再UTF8模式下了。
客户端(192.168.2.6):USER book                          //指定用户book登录
服务端(192.168.2.2)331 Please specify the password.  //331 表示需要输入密码
客户端(192.168.2.6):PASS 123456                        //客户端输入密码123456
服务端(192.168.2.2)230 Login successful.             //# 230 表示用户登入成功

下图展示了第一个FTP应答报文220 (vsFTPd 3.0.3)\r\n的二进制数据形式,其也印证了FTP报文是以ASCII码明文进行传递的。220 (vsFTPd 3.0.3)\r\n报文的20个字节(包含空格)的ASCII码为32 32 30 20 28 76 73 46 54 50 64 20 33 2e 30 2e 33 29 0d 0a

在这里插入图片描述

3.3 数据连接

上一节看到了控制连接的建立和连接建立之后的客户端和服务器之间的报文交互。本节来看一下数据连接。数据连接有如下三个用途:

  • 从客户向服务器发送一个文件。
  • 从服务器向客户发送一个文件。
  • 从服务器向客户发送文件或目录列表。

这里再强调一下控制连接一直保持到客户端—服务器连接的全过程,但数据连接可以根据需要随时开、随时关。根据FTP数据连接的用途可以看到,在进行文件传输或是查询服务器端文件或目录列表时,需要创建数据连接。数据连接的创建过程如下:

  • 数据连接的创建由客户端控制,因为是客户端发出需要数据连接的命令(获取文件、上传文件或列出目录)。
  • 客户端通常在客户端主机上选择一个临时端口号来结束数据连接。客户端从该端口发出被动打开。
  • 客户端使用PORT命令通过控制连接将此端口号发送到服务器。
  • 服务器接收控制连接上的端口号,并向客户端主机上的该端口发出主动打开。数据连接的服务器端始终使用端口20

下面来进行网络抓包看一下实际的数据连接建立过程。通过windows环境下的"ftp"命令行客户端向FTP服务器请求一个文件123.c来触发数据连接的建立。下图为数据连接的网络抓包过程。客户端通过PORT命令将端口信息(192.168.231.1 227,188、端口号:277*256+188=58230)传到服务端;服务端通过自身20端口和客户端58230端口,主动建立TCP连接,此连接就是为数据连接。文件数据123.c就是通过该连接进行传输。文件数据传输完成后,服务端又会主动发起断开该连接,如下图中红框所示的四次挥手。

windows环境"ftp"命令行客户端展现的交互过程:

ftp> get 123.c
200 PORT command successful. Consider using PASV.
150 Opening BINARY mode data connection for 123.c (13 bytes).
226 Transfer complete.
ftp: 收到 13 字节,用时 0.0013000.00千字节/秒。

在这里插入图片描述

3.4 主动模式

思考一下上一节描述的数据连接会有什么问题?其发起数据连接过程为,客户端通过PORT命令将客户端监听的端口号传递给服务端,服务端通过固定的20端口主动去和客户端监听的端口进行TCP连接,此连接就是数据连接。可以看到如果客户端的防火墙阻止了服务器的主动连接请求,那么数据连接就会失败。所以主动模式有一定缺陷。

上面描述的这种连接模式就是主动模式,主动是相对于服务端来说的。下图示意了主动模式过程,控制连接是客户端发起,数据连接是服务端发起。

在这里插入图片描述

3.5 被动模式

为了解决主动模式所面临的问题,FTP协议也支持被动模式。被动模式的示意图如下图所示:控制连接和数据连接都由客户端主动发起,而且服务端数据连接端口不在是固定端口20,而是被分配了一个临时端口。因为两次连接都是客户端主动发起,所以就不会有防火墙的问题。

在这里插入图片描述

通过网络数据包来看一下被动模式的交互过程。客户端通过发送PASV,表明客户端明确告知FTP服务器它使用被动模式。服务器收到PASV后,会分配一个临时端口号37499(192,168,2,5,146,123,端口号=146*256+123=34799),并通过报文将该端口号通知到客户端。明确好了两端的端口号,客户端就会主动通过TCP三次握手和服务器建立连接,该连接就是数据连接。在文件传输完毕后,服务器通过TCP四次挥手,断开该连接。

在这里插入图片描述

3.6 匿名服务器

上面介绍的客户端向FTP服务器发起连接的过程,第一步基本都需要输入服务器的用户名和密码。但有一些FTP服务器天然就是为了分发软件和共享文件而存在,让每一个人都申请用户名和密码,将非常的不方便。匿名FTP(anonymous FTP)就是为了应对这种场景而出现的。

匿名FTP服务器的实质是:提供服务的机构在它的FTP服务器上建立一个公开账户(一般为anonymous),并赋予该账户访问公共目录的权限。用户想要登录到这些FTP服务器时,无需事先申请用户账户和密码,可以用anonymous作为用户名,用自己的E-mail地址做密码或直接不输入密码,便可登录,获取FTP服务。

ftp.gnu.org就是一个匿名服务器,用于GNU 的软件分发和资料共享。如下是其登录过程,直接用anonymous当作用户名,不需要输入密码。

ftp> open ftp.gnu.org
连接到 ftp.gnu.org。
220 GNU FTP server ready.
200 Always in UTF8 mode.
用户(ftp.gnu.org:(none)): anonymous
230-NOTICE (Updated October 15 2021):
230-
230-If you maintain scripts used to access ftp.gnu.org over FTP,
230-we strongly encourage you to change them to use HTTPS instead.
230-
230-Eventually we hope to shut down FTP protocol access, but plan
230-to give notice here and other places for several months ahead
230-of time.
230-
230----
230-
230-Due to U.S. Export Regulations, all cryptographic software on this
230-site is subject to the following legal notice:
230-
230-    This site includes publicly available encryption source code
230-    which, together with object code resulting from the compiling of
230-    publicly available source code, may be exported from the United
230-    States under License Exception "TSU" pursuant to 15 C.F.R. Section
230-    740.13(e).
230-
230-This legal notice applies to cryptographic software only. Please see
230-the Bureau of Industry and Security (www.bxa.doc.gov) for more
230-information about current U.S. regulations.
230 Login successful.
ftp>

4 总结

  • FTP是一个用于在计算机网络上在客户端和服务器之间进行文件传输的应用层协议。RFC 959定义了FTP协议规范。
  • FTP需要两个TCP连接来完成文件的传输。其中一个称为控制连接,一个称为数据连接
  • 控制连接一直保持到客户端—服务器连接的全过程,但数据连接可以根据需要随时开、随时关
  • 数据连接可以分为主动模式被动模式主动模式有被客户端防火墙阻止的风险。
  • 主动模式FTP使用2021这两个端口,其中20用于数据连接(传递数据),21用于控制连接(传递控制信息)。
  • 如果采用被动模式,具体最终使用哪个端口做数据连接要服务器端和客户端协商决定。
  • FTP报文是以ASCII码明文进行传递的。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/633794.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

算法模板(3):搜索(3):图论提高

图论提高 最小生成树 (1)朴素版prim算法( O ( n 2 ) O(n ^ 2) O(n2)) 适用范围:稠密图易错:注意有向图还是无向图;注意有没有重边和负权边。从一个集合向外一个一个扩展,最开始只…

(文章复现)面向配电网韧性提升的移动储能预布局与动态调度策略(1)-灾前布局matlab代码

参考文献: [1]王月汉,刘文霞,姚齐,万海洋,何剑,熊雪君.面向配电网韧性提升的移动储能预布局与动态调度策略[J].电力系统自动化,2022,46(15):37-45. 1.基本原理 1. 1 目标函数 本文以最恶劣光伏出力场景下的移动储能配置成本与负荷削减成本最小为目标,建…

(数组) 724. 寻找数组的中心下标 ——【Leetcode每日一题】

❓724. 寻找数组的中心下标 难度:简单 给你一个整数数组 nums ,请计算数组的 中心下标 。 数组 中心下标 是数组的一个下标,其左侧所有元素相加的和等于右侧所有元素相加的和。 如果中心下标位于数组最左端,那么左侧数之和视为…

2023-6-9

1.网络训练: 在训练前先要看看读取数据的时间(常见的性能瓶颈)2.import dis dis 是 Python 内置的一个模块,其全称为 “Disassembler for Python bytecode”,用于反汇编 Python 字节码。它可以将 Python 代码编译成字…

视频换天造物实践秒变科幻大片实践记录

视频换天造物实践秒变科幻大片实践记录,过程中遇到些坑,结果还是相当震撼 预装软件: matplotlib scikit-image scikit-learn scipy numpy torch torchvision opencv-python opencv-contrib-python 安装使用的时候可能碰上scikit-image 新版…

傅里叶级数简介

先看动图 将函数f(x) 用 sin(nx) cos(nx) 的形式表示出来的方式就是傅里叶级数 这里有几个使用条件 收敛性:符合迪力克雷收敛条件。简单理解为 f(x) 必须是一个丝滑的曲线。周期性: f(x) 必须是一个周期函数 还有一个基础条件,三角函数具…

element-plus布局排版问题总结(更新ing)

文章目录 el-container空隙修改app组件 el-container空隙 源码-更改了容器的显示&#xff0c;占满屏幕 <template><div class"common-layout"><el-container><el-header><el-row class"el-row1"><el-col :span"12&…

oppo r11 升级8.1系统 图文教程

Time: 2023年6月11日13:39:25 By:MemroyErHero 1 预留一定的空间,存放刷机包. 2 导入刷机包 r11.ozip 到手机上 3 手机文件管理器 打开 r11.ozip 文件 4 点击立即更新即可 5 重要的事情说三遍,刷机过程中 不能关机 不能断电 否则会变成砖头 重要的事情说三遍,刷机过程中 …

cmake 基本使用

目录 CMake都有什么? 使用cmake一般流程为&#xff1a; 1 生成构建系统 使用命令在build外编译代码: cmake基本语法 指定使用最低版本的cmake 指定项目名称 指定生成目标文件的名称 指定C版本 cmake配置文件使用 cmake配置文件生成头文件 版本号定义方法一: 版本号定…

软件测试正在面试银行的可以看下这些面试题

前言 最近呢有很多的小伙伴问我有没有什么软件测试的面试题&#xff0c;由于笔者之前一直在忙工作上的事情&#xff0c;没有时间整理面试题&#xff0c;刚好最近休息了一下&#xff0c;顺便整理了一些面试题&#xff0c;现在就把整理的面试题分享给大家&#xff0c;废话就不多说…

C 语言实现简单工厂模式

文章目录 1. 背景介绍2. 设计实现3. 运行测试4. 总结 1. 背景介绍 印象中&#xff0c;设计模式是由面向对象的语言(C、JAVA)才能完成的&#xff0c;而 C 语言是面向过程的语言&#xff0c;不能实现设计模式。但C 语言中有 函数指针、回调函数 等机制&#xff0c;使用这些机制便…

Java中线程的生命周期

Java中线程的生命周期 Java中线程的声明周期与os中线程的生命周期不太一样&#xff0c;java中线程有6个状态&#xff0c;见下&#xff1a; NEW: 初始状态&#xff0c;线程被创建出来但没有被调用 start() 。RUNNABLE: 运行状态&#xff0c;线程被调用了 start()等待运行的状态…

Elasticsearch:使用 Redis 让 Elasticsearch 更快

Elasticsearch 是一个强大的搜索引擎&#xff0c;可让你快速轻松地搜索大量数据。但是&#xff0c;随着数据量的增长&#xff0c;响应时间可能会变慢&#xff0c;尤其是对于复杂的查询。在本文中&#xff0c;我们将探讨如何使用 Redis 来加快 Elasticsearch 搜索响应时间。 Re…

【数据结构】常见排序算法——常见排序介绍、归并排序、各大排序复杂度和稳定性

文章目录 1.常见排序2.归并排序2.1归并排序基本思想2.2归并排序的实现2.3归并排序特性总结 3.各大排序复杂度和稳定性 1.常见排序 2.归并排序 归并排序&#xff08;MERGE-SORT&#xff09;是建立在归并操作上的一种有效的排序算法,该算法是采用分治法&#xff08;Divide andCon…

商业图表工具推荐,热门商业图表工具有哪些?

在如今的商业环境下&#xff0c;数据分析和可视化是非常重要的一环。不仅可以帮助企业更好地了解自身情况&#xff0c;还能为决策提供有力支持。因此&#xff0c;选择一个好用的商业图表工具对于报表开发人员来说是非常重要的。下面将为大家介绍7款热门商业图表工具&#xff0c…

Mac电脑删除第三方软件工具CleanMyMac X

经常使用Mac的人都知道&#xff0c;Mac除了可以在AppStore下载应用程序&#xff0c;还有许多软件是需要在网页上搜索下载的第三方软件。那么这类第三方软件软件除了下载方式不同之外还有什么是和从App store下载的软件有区别的吗&#xff1f;答案是肯定的&#xff0c;那就是这些…

Docker容器进入的4种方式

Docker容器进入的4种方式 Docker容器进入的4种方式 在使用Docker创建了容器之后&#xff0c;大家比较关心的就是如何进入该容器了&#xff0c;其实进入Docker容器有好几多种方式&#xff0c;这里我们就讲一下常用的几种进入Docker容器的方法。 进入Docker容器比较常见的几种…

带你了解自动化测试只需要一分钟

目前自动化测试并不属于新鲜的事物&#xff0c;或者说自动化测试的各种方法论已经层出不穷&#xff0c;但是&#xff0c;能够明白自动化测试并很好落地实施的团队还不是非常多&#xff0c;我们接来下用通俗的方式来介绍自动化测试…… 首先我们从招聘岗位需求说起。看近期的职业…

软件测试什么样的技术才能拿20K薪资?

年少不懂面试经&#xff0c;读懂已是测试人。 大家好&#xff0c;我叫木江&#xff0c;一名历经沧桑&#xff0c;看透互联网行业百态的测试从业者&#xff0c;经过数年的勤学苦练&#xff0c;精钻深研究&#xff0c;终于从初出茅庐的职场新手成长为现在的测试老鸟&#xff0c;早…

MySQL数据库基础 09

第九章 子查询 1. 需求分析与问题解决1.1 实际问题1.2 子查询的基本使用1.3 子查询的分类 2. 单行子查询2.1 单行比较操作符2.2 代码示例2.3 HAVING 中的子查询2.4 CASE中的子查询2.5 子查询中的空值问题2.5 非法使用子查询 3. 多行子查询3.1 多行比较操作符3.2 代码示例3.3 空…