一、简介
文件传输协议(File Transfer Protocol,FTP)是用于在网络上进行文件传输的一套标准协议,是工作在应用层的协议,使用TCP进行传输。
FTP允许用户以文件操作的方式(如文件的增、删、改、查、传送等)与另一主机相互通信。然而, 用户并不真正登录到自己想要存取的计算机上面而成为完全用户, 可用FTP程序访问远程资源, 实现用户往返传输文件、目录管理以及访问电子邮件等等, 即使双方计算机可能配有不同的操作系统和文件存储方式。
二、环境
用户可以通过网络访问远程服务器上的文件,无需直接登录到远程服务器。同时,管理员可以轻松管理和配置用户的访问权限,以确保安全和有效的文件访问。
三、原理
1、工作原理
1.1 通道:FTP分为控制连接和数据连接,也叫命令通道和数据通道。
1.2 控制连接(命令通道):
用于传送控制命令和响应信息,一般使用TCP协议的21端口。这个连接在整个FTP Session阶段一直保持打开状态。
1.3 数据连接(数据通道):
用于实际文件传输,可以是从客户端到服务器(用于上传文件)或者从服务器到客户端(用于下载文件)的TCP连接。数据连接针对每个文件传输任务临时建立并关闭,可以使用TCP协议的20端口或大于1024的随机端口。
2、控制连接(命令通道)的建立(客户端和服务器均为FileZilla)
2.1 客户端向服务器的FTP端口(默认21,服务器可设置)发起TCP连接请求(三次握手)。
2.2 服务器接受连接请求,建立TCP连接,向客户端发送"220 Service ready"消息,表示服务端就绪。
2.3 客户端会尝试向服务器发起加密数据连接(TLS、SSL、SSH等),如果不支持,服务器会回502 Explicit TLS authentication not allowed表示不支持TLS连接。如果不支持加密连接,默认情况下客户端和服务器之间会建立明文的不安全数据连接。
2.4 客户端发送"USER username"命令,将用户名发送给服务器。
2.5 服务器响应"331 Username ok, need password"提示需要密码。
2.6 客户端发送"PASS password"命令,将密码发送给服务器。
2.7 服务器验证用户名和密码,如果通过,响应"230 Login succeeded"。
2.8 客户端发送SYST命令,检查服务器系统类型
2.9 服务器响应215 UNIX类型(也有其他,我这里是该类型)
2.10 客户端发送FEAT命令,查询服务器支持的特性
2.11 服务器响应211,列出支持的feature
到此基本上的控制连接就建立了,在这之后,客户端就可以向服务器发送PWD、CWD、TYPE等控制命令进行文件传输控制。
状态: 正在连接 192.168.2.80:21...
状态: 连接建立,等待欢迎消息...
响应: 220-FileZilla Server 中文版 0.9.60 beta
响应: 220-written by Tim Kosse (tim.kosse@filezilla-project.org)
响应: 220 Please visit https://filezilla-project.org/
命令: AUTH TLS
响应: 502 Explicit TLS authentication not allowed
命令: AUTH SSL
响应: 502 Explicit TLS authentication not allowed
状态: 不安全的服务器,不支持 FTP over TLS。
命令: USER username
响应: 331 Password required for ljj
命令: PASS *
响应: 230 Logged on
命令: SYST
响应: 215 UNIX emulated by FileZilla
命令: FEAT
响应: 211-Features:
响应: MDTM
响应: REST STREAM
响应: SIZE
响应: MLST type*;size*;modify*;
响应: MLSD
响应: UTF8
响应: CLNT
响应: MFMT
响应: EPSV
响应: EPRT
响应: 211 End
状态: 已登录
3、数据连接(数据通道)的建立
3.1 命令通道建立后,默认会获取当前工作目录,客户端发送PWD获取当前工作目录
3.2 服务器返回当前工作目录,这里是根目录
3.3 客户端发送TYPE I,设置为二进制传输模式,还有其他模式,例如ASCII(TYPE A)、本地(TYPE L)等
3.4 服务器回复200,表示设置成功。
3.5 对于主动模式:
3.5.1 客户端发送PORT(h1,h2,h3,h4,p1,p2)命令,通知服务器自己打开的数据端口信息。
3.5.2 服务器解析PORT命令,获取客户端的IP地址和端口号,其中h1到h4是客户端IP地址,h5和h6代表客户端的端口号(p1 * 256 + p2)。
3.5.3 服务器主动向解析的主机和端口发起连接请求,客户端接收连接请求,建立数据连接。
16:51:32 状态: 读取“/***/***”的目录列表...
16:51:32 命令: CWD /***/***
16:51:32 响应: 250 CWD successful. "/***/***" is current directory.
16:51:32 命令: PWD
16:51:32 响应: 257 "/***/***" is current directory.
16:51:32 命令: PORT 192,168,2,81,213,225
16:51:32 响应: 200 Port command successful
16:51:32 命令: MLSD
16:51:32 响应: 150 Opening data channel for directory listing of "/jlshao/jlshao"
16:51:32 响应: 226 Successfully transferred "/***/***"
16:51:32 状态: 列出“/***/***”的目录成功
3.6 对于被动模式:
3.6.1 客户端发送PASV命令
3.6.2 服务器回应227 Entering Passive Mode (h1,h2,h3,h4,p1,p2)命令,携带者自己的IP和端口信息。
3.6.3 客户端解析服务器的回应,,获取服务器的端口号,其中h1到h4是服务器的IP地址,h5和h6代表服务器的端口号(p1 * 256 + p2),向服务器的端口发起连接请求,服务器被动接收连接请求,建立数据连接。
命令: PASV
响应: 227 Entering Passive Mode (192,168,2,80,196,113)
命令: MLSD
响应: 150 Opening data channel for directory listing of "/"
响应: 226 Successfully transferred "/"
状态: 列出“/”的目录成功
主动和被动模式的概念是相对于服务器来说的,服务器主动发起连接请求是主动模式,被动接收连接请求是被动模式。
四、抓包分析(被动模式举例)
命令: STOR 11-2.jpg
响应: 150 Opening data channel for file upload to server of “/11-2.jpg”
响应: 226 Successfully transferred “/11-2.jpg”
状态: 文件传输成功,传输了 463,472 字节 (用时1 秒)
状态: 开始下载 /11-2.jpg
命令: PASV
响应: 227 Entering Passive Mode (192,168,2,80,243,60)
命令: RETR 11-2.jpg
响应: 150 Opening data channel for file download from server of “/11-2.jpg”
响应: 226 Successfully transferred “/11-2.jpg”
状态: 文件传输成功,传输了 463,472 字节 (用时1 秒)
1、连接
1、第一阶段:
三次握手,建立TCP连接,客户端随机端口向服务器端口21发起连接。
2、第二部分:
连接完成服务器会发送欢迎消息。
3、第三部分:
建立命令通道(具体查看前面的3章节原理中的控制连接部分),客户端发送用户名、密码,验证通过,服务器回复230登陆成功
4、第四部分:
4.1 客户端向服务器确认类型以及支持的特性,列出当前的目录,同时建立数据通道,这里是被动模式,客户端发送PASV,服务器回应227 (192,168,2,80,196,113)携带自己的IP地址和监听端口信息给客户端,等待客户端的连接。
通过服务器携带的信息可以计算出,服务器监听端口为50289,。通过三次握手进行数据通道的建立
4.2 之后服务器在被动模式下执行MLSD(Machine List Directory)列出当前目录信息,从左边可以看到当前目录有一个文件16-2note.gif,一个文件夹jlshao。
4.3 此次数据交换完成,服务器发起关闭通道请求,完成一次数据交互。
2、上传、下载
上传:
1、第一部分的红框是上传,可以看到也是建立了被动模式的数据通道,服务器的携带信息中端口计算后为58607,同时注意左上角的TCP包的序号为3,一会儿连起来看。
2、客户端发送STOR 文件名命令,服务器回应响应码150表示"File status okay; about to open data connection.",意思是文件状态良好,即将打开数据连接。这个响应告诉客户端,服务器已经准备好接受文件数据,并且将在数据通道上等待数据传输。
3、传输完成服务器回应226传输成功。
4、下面是数据通道传输的信息,可以看到TCP序号是4,连接的端口是58607
传输完成服务器关闭此次数据通道连接
下载:
1、第三部分的红框是下载,可以看到也是建立了被动模式的数据通道,服务器的携带信息中端口计算后为62268,同时注意左上角的TCP包的序号为3,一会儿连起来看。
2、下载与上传过程相同,唯一不同的是命令是RETY。这里也是和上文中提到的下载数据通道的端口62268相同,但是左边的TCP包序号是6,中间短了5。因为一开始的图片中,第二部分有一个列出当前目录的操作,所以略过了该部分。
3、最后传输完成也是会关闭此次数据通道的连接。
总结:上述抓包记录可以看出,每一次文件交互都会打开一个数据通道
五、总结
1、FTP分为两个通道,数据通道和命令通道,命令通道用于命令交互,数据通道用于数据交互。
2、传输模式分为被动模式和主动模式,主动被动是从服务器的角度出发来说的。
3、那么多选文件上传多个文件是会打开一个通道呢,还是一个文件一个通道呢?
此次总结只是个人学习记录分享,仅供参考,错误的地方可以评论指点。