• FTP服务详解


    FTP

    FTP是File Transfer Protocol(文件传输协议)的英文缩写,用于Internet上的控制文件的双向传输。同时也是一个应用程序。

    Tcp/ip协议中,FTP标准命令TCP端口号为21,Port方式数据端口为20。Ftp协议的任务是从一台计算机将文件传送到另一台计算机,它与这两台计算机所处的位置、连接的方式,甚至是否使用相同的操作系统无关。

    FTP传输使用的是TCP数据包协议,TCP在建立;连接前会先进行三次握手。不过FTP服务器比较麻烦一些,因为FTP服务器使用了两个连接,分别是命令通道与数据通道。因为是TCP数据包,所以这两个连接都需要经过三次握手。

    FTP两个通道(控制通道、数据通道)

    原理:FTP协议使用两个TCP连接,一个是命令链接,用于在FTP客户端和服务器;之间传输命令;另一个是数据链接,用于上传或下载数据。

    控制通道是FTP服务器进行沟通的重要通道,连接FTP,发送FTP指令都是通过控制通道来完成的。

    数据通道是FTP服务器进行文件传输或者列表的通道。

    FTP协议中,控制连接均由客户端发起的,而数据连接有PORT与POSV方式。即主动与被动方式。

    FTP工作的方式(FTP的两种工作模式)

    FTP支持两种模式,一种是主动方式(也称为Standard模式,其FTP的客户端发送PORT命令到FTP服务器),一种是被动方式(也称为Passive模式,其FTP的客户端发送PASV命令带FTP服务器)。

    FTP工作的方式(PORT - 主动模式)

    在这里插入图片描述

    主动模式 – 工作原理

    原理:服务端从20端口主动向客户端发起链接。 控制端口21;数据传输端口20;

    过程:客户端从一个任意的非特权端口N(N>1024)向FTP服务器的命令端口(默认是21)发送请求,服务器接受连接,建立一条命令链路。当需要传送数据时,客户端开始监听端口N+1,并在命令链路上用PORT命令发送N+1端口到FTP服务器,于是服务器会从自己的数据端口(20)向客户端指定的数据端口(N+1)发送连接请求,建立一条数据链路来传送数据

    (Port模式在建立控制通道的时候,首先与FTP服务器的TCP 21端口建立连接,通过这个通道发送命令,客户端需要发送数据的时候在这个通道上发送PORT命令。
    PORT命令包含了客户端用什么端口接收数据。
    在传输数据的时候,服务器端通过自己的TCP 20端口连接至客户端的指定端口发送数据。
    FTP服务端必须与客户端建立一个新的连接用来传送数据。)

    (可以看见这种情况下的连接是客户端向服务器建立控制连接,服务器向客户端建立数据连接。客户端的数据连接和控制连接端口号是大于1024的两个端口号(临时端口),而FTP服务器的数据端口为20,控制端口为21)

    主动模式 – 建立数据连接与控制连接的图解

    在这里插入图片描述

    主动模式 – 抓包并对包分析

    在这里插入图片描述注意事项:主动模式与被动模式其控制管理的连接是一样的,只是数据传输方式,或者说是传输命令,的发起者不一样。主动模式的PORT命令由客户端发起,被动模式的PASV命令由服务器发起。(PORT命令是服务器接到客户端开放的数据连接随机端口后,主动去建立数据连接的;PASV命令是服务器发起的数据连接的随机端口,客户端连接访问该服务端端口,服务器端口是被动连接的。总而言之,主动与被动针对服务器而言的)
    在这里插入图片描述第1817-1819包为tcp的三次握手,服务端端口是21,即ftp控制连接建立。
    第1820包为服务器应答客户端报文,220;服务器就绪,附加参数为服务端ftp版本号;
    第1821包为客户端向服务器端发送确认包;
    在这里插入图片描述
    第1935包为客户端发送发送请求认证用户名,命令USER,参数实际用户名;
    第1936包为服务器端的确认包;
    第1937包为服务端对客户端USER命令的应答,331;要求密码;
    第1938包为客户端的确认包;
    第2056包为客户端向服务器传送密码,命令PASS;后跟明文密码;
    第2057包为服务器端的确认包;
    第3030包为服务器对客户端PASS命令的应答,230;登录成功;
    第3031包为客户端的确认包;
    第3032包为客户端向服务器请求系统版本的命令; SYST命令;
    第3033为服务器的TCP ACK回应包;
    第3034包为服务端对客户端SYST命令的应答,215;系统名称;
    第3035包为客户端的确认包;
    (特别注意:在密码确认后要进行传输类型转换操作,执行passive命令)
    第8147包为客户端向服务器请求数据传输类型,命令TYPE,参数I,表示是二进制;
    第8148包为服务器对客户端TYPE命令的应答,200;协商数据传输的类型是二进制;
    在这里插入图片描述
    第8150包为客户端通过PORT命令来告诉服务器端,想用PORT主动方式传输数据;
    第8151包为服务端收到命令后,对客户端PORT命令进行应答,200;协商成功,同意使用该模式;
    第8152包为客户端向服务器通过STOR命令向服务器发送文件名,是FTP协议中的上传命令,可以针对文件和目录,在此是根目录下的文件l。(RETR命令是FTP的下载命令);
    第8053-8155包为建立数据连接的过程,服务器端主动连接客户端;
    第8156包为服务器对客户端STOR命令的应答,150;可以发送数据;
    第8157包为客户端向服务器发送传输了14比特数据;
    第8158与8159包为客户端断开数据连接与服务器端对客户端断开数据连接的确认;
    第8160与8161包为服务器断开数据连接与客户端对服务器端断开数据连接的确认;
    第8182包为服务器回应客户端数据传输完成,226;完成传输;
    在这里插入图片描述第8333包为客户端通过QUIT命令向服务器发送退出请求;
    第8334包为服务器对客户端QUIT命令的应答,221;再见。

    FTP工作的方式(PASV - 被动模式)

    在这里插入图片描述

    被动模式 – 工作原理

    原理:服务端在指定范围内某个端口被动等待及客户端链接。 控制端口21;数据传输端口 随机

    过程:客户端从一个任意的非特权端口N(N>1024)向FTP服务器的命令端口(默认是21)发送请求,服务器接受连接,建立一条命令链路。当需要传送数据时,客户端在命令链路上用PASV命令发送。于是服务器会开启一个任意的非特权端口P(P>1024),并在命令链路上把端口发送给客户端,然后客户端从自己的数据端口(N+1)向服务器的数据端口(P)发送连接请求,建立一条数据链路来传送数据。

    (FTP服务器收到Pasv命令后,随机打开一个临时端口(也叫自由端口,端口号大于1023小于65535)并且 通知客户端在此端口上传送数据的请求,客户端连接服务器此端口然后FTP将通过这个端口进行数据的传送,这个时候FTP服务器不在需要建立一个新的和客户端直接爱你的连接。)
    (可以看见这种情况下的连接都是客户端向服务器发起的。其服务端的数据端口是临时端口,而不是常规的20)

    被动模式 – 建立数据连接与控制连接的图解

    在这里插入图片描述

    被动模式 – 抓包并对包分析

    在这里插入图片描述值得注意的是:本地访问自己搭建的ftp,wireshark根本捕获不到ftp数据包,这是因为,wireshark捕获的网卡的数据包,本地访问本地必然没有经过无线网卡。所以我找了两个跨网段的机器进行了测试,捕获ftp数据包。
    在这里插入图片描述第738-740包为tcp的三次握手,服务端端口是21,即ftp控制连接建立。
    在这里插入图片描述第741包为服务器应答客户端报文,220;服务器就绪,附加参数为服务端ftp版本号;
    第1053包为客户端发送发送请求认证用户名,命令USER,参数实际用户名;
    第1055包为服务端对客户端USER命令的应答,331;要求密码;
    第1372包为客户端向服务器传送密码,命令PASS;后跟明文密码;
    第2405包为服务器对客户端PASS命令的应答,230;登录成功;
    在这里插入图片描述第2407包为客户端向服务器请求系统版本的命令;
    第2408为服务器的TCP ACK回应包;
    第2409包为服务端对客户端SYST命令的应答,215;系统名称;
    在这里插入图片描述在2723之前执行put命令,上传文件;
    第2723包为客户端向服务器请求数据传输类型,命令TYPE,参数I,表示是二进制;
    第2724包为服务器对客户端TYPE命令的应答,200;协商数据传输的类型是二进制;
    第2726包为客户端通过PASV命令来告诉服务器端,想用PASV方式传输数据;
    第2727包为服务端收到命令后,在服务端建立一个数据端口69*256+131=17795端口监听,并把这个数据端口号返回给客户端;
    在这里插入图片描述第2728-2730包,客户端发起的三次握手,去连接服务器端的17795这个数据端口,准备进行数据传输;
    在这里插入图片描述第2731包为客户端向服务器通过STOR命令向服务器发送文件名,是FTP协议中的上传命令,可以针对文件和目录,在此是根目录下的文件l。(RETR命令是FTP的下载命令);
    第2732包为服务器对客户端STOR命令的应答,150;可以发送数据;
    在这里插入图片描述第2733-2735为数据传输的过程,客户端向服务器传输文件的内容。因为在此处文件内容为空(读者可以在文件内输入部分内容,查看效果);
    第2736包为服务器回应客户端数据传输完成,226;完成传输; 在这里插入图片描述第2885包为客户端通过QUIT命令向服务器发送退出请求;
    第2886包为服务器对客户端QUIT命令的应答,221;再见。

    FTP连接虚拟主机连接不上的原因有哪些

    1.由于用户名或密码不正确,文件传输协议连接失败。为了服务器,的安全,许多虚拟主机禁止匿名连接。如果用户名或密码错误,ftp连接将失败。

    2.虚拟主机的域名解析问题导致ftp连接失败。

    检查您使用的IP地址是否与我们公司用户后台订单中提供的IP地址一致;

    3.是你关闭了FTP使用的端口导致的吗

    FTP默认需要20和21端口,但是大量用户使用局域网。因此,服务器将使用大量1024到6000的动态端口。您不能禁止任何文件传输协议使用的端口,否则文件传输协议将无法正常工作。

    4.有防火墙吗

    防火墙设置将导致FTP服务器连接失败,因此您可以关闭或重置防火墙,然后再次连接以查看连接是否成功。如果安装了防火墙,请检查端口21是否打开,并允许与外部服务器链接进行互通(通常,如果防火墙的安全级别设置为高,则拒绝与外部服务器互通,因此请将防火墙的安全级别修改为中等以下);

    5.虚拟主机不稳定,停机导致ftp连接失败。

    当您租用的虚拟主机关闭时,您无法连接到FTP。您可以使用PING命令来测试FTP服务器是否处于正常状态。

    6.短时间频繁连接FTP导致连接失败。

    如果您的FTP链接的最后一行提示:530notloggedin,则当前只允许2个会话。然后FTP链接断了,说明你链接太多了。您的原始登录记录在服务器缓存中。一般请等30分钟再试。

    7.7时提示SOCKET错误。FTP登录。

    如果您上传文件时系统提示套接字错误,请检查您是否在软件的编辑菜单的连接中选择使用防火墙设置和PASV模式设置。如果您之前选择了这些选项,您可以取消这两个选项并重新连接它们。如果您的计算机上安装了诺顿等防病毒软件,请暂时关闭它。

    FTP工具一般分为FLASHFXP、LEAPFTP、CuteFTP,统称FTP三剑客,多为中文版和破解版。使用FTP连接虚拟主机上传网站程序,简单方便

    FTP返回码/响应码:

    (响应代码 / 解释说明)

    • 110 新文件指示器上的重启标记

    • 120 服务器准备就绪的时间(分钟数)

    • 125 打开数据连接,开始传输

    • 150 打开连接

    • 200 成功

    • 202 命令没有执行

    • 211 系统状态回复

    • 212 目录状态回复

    • 213 文件状态回复

    • 214 帮助信息回复

    • 215 系统类型回复

    • 220 服务就绪

    • 221 退出网络

    • 225 打开数据连接

    • 226 结束数据连接

    • 227 进入被动模式(IP 地址、ID 端口)

    • 230 登录完成

    • 250 文件行为完成

    • 257 路径名建立

    • 331 要求密码

    • 332 要求帐号

    • 350 文件行为暂停

    • 421 服务关闭

    • 425 无法打开数据连接

    • 426 结束连接

    • 450 文件不可用

    • 451 遇到本地错误

    • 452 磁盘空间不足

    • 500 无效命令

    • 501 错误参数

    • 502 命令没有执行

    • 503 错误指令序列

    • 504 无效命令参数

    • 530 未登录网络

    • 532 存储文件需要帐号

    • 550 文件不可用

    • 551 不知道的页类型

    • 552 超过存储分配

    • 553 文件名不允许

    其他:【由于文件内容过长,因此分开写】
    FTP环境搭建及使用实例–linux系统(使用shell脚本或者使用配置文件)

    参考链接:
    1.https://pan.baidu.com/s/1UqgzyHNR_r7I8N88wcTBWw?pwd=pr3o
    提取码:pr3o
    2.https://blog.csdn.net/weixin_46470342/article/details/107316434

  • 相关阅读:
    js滚动条触底加载更多#js懒加载数据#步骤条布局懒加载
    Java Integer.toBinaryString()方法具有什么功能呢?
    python协程学习
    软考高级系统架构设计师系列论文真题五:论软件架构评估
    PHP:Shuttle Sort穿梭排序(附完整源码)
    TCP连接的关键之谜:揭秘三次握手的必要性
    空间滤波-高斯低通滤波器
    微信小程序介绍
    我从小公司跳槽到字节,居然拿到了offer
    推动解决新能源电车充电不便的难题
  • 原文地址:https://blog.csdn.net/weixin_42167759/article/details/126982364