FTP原理及规范
作者:追风剑情 发布于:2024-11-15 11:03 分类:C#
FTP 原理及规范
文件传输协议(File Transfer Protocol,FTP)是在RFC959中说明的。该协议定义了远程计算机系统和本地计算机系统之间传输文件的一个标准。一般来说,传输文件的用户需要先经过认证以后才能登录远程服务器,然后访问远程服务器中的文件。而大多数的FTP服务器往往提供一个GUEST的公共账户来允许未注册用户访问该FTP服务器。
FTP 概述
一般来说,用户联网的首要目的就是实现信息共享,文件传输是信息共享非常重要的一个途径之一。文件传输服务是由FTP应用程序提供的,而FTP应用程序遵循的是TCP/IP中的文件传输协议,它允许用户将文件从一台计算机传输到另一台计算机,并且能保证传输的可靠性。
FTP的主要功能如下:
- 提供文件的共享,包括程序文件和数据文件。
- 支持间接使用远程计算机。
- 使用户不因各类主机文件存储器系统的差异而受影响。
- 利用TCP提供可靠且有效的传输。
FTP 和 HTTP 协议都是文件传送协议,它们都基于TCP协议,但有很大的区别,最大的区别在于FTP使用两个并行的TCP连接发送文件,第一个连接用来发送控制指令,当接收或者发送数据的时候,又打开第二个TCP连接。而 HTTP在双向传输中使用动态端口。因为FTP使用一个独立的控制链接,称FTP为带外(out-of-brand)发送控制信息,而HTTP协议中,同一个TCP连接既用于承载请求和响应头部,也用于承载所发送的文件,所以称 HTTP 为带内(in-brand)发送控制信息。
FTP 工作原理
如果本地用户希望把文件传送到一台远程主机上,或者从这台远程主机上获取一些文件,他需要做的是提供一个登录名和登录密码进行访问。身份信息确认后,他就可以在本地文件系统和远程文件系统之间传送文件。
一个完整的FTP 文件传输需要建立两个TCP连接,一种连接是用于传输TCP命令,称为控制连接;另一种连接是实现真正的文件数据传输,称为数据连接。在FTP中,控制连接在整个会话过程中一直打开着,而数据连接则有可能为每次文件传送请求重新打开。
当客户端提出请求,想要与远程FTP服务器实现文件传输时,它首先向服务器端的TCP端口号21(默认端口)发起一个建立连接的请求,FTP服务器接收来自客户端的请求这就是建立FTP控制连接。
控制连接建立之后,客户端就开始传输文件,这个过程是数据连接,主要分为主动传输模式(Port 模式)和被动传输模式(Passive模式)。PORT(主动)方式的连接过程是:客户端向服务器的FTP端口(默认是21)发送连接请求,服务器接收连接,建立一条命令链路。当需要传送数据时,客户端在命令链路上用PORT命令告诉服务器:"我打开了xXXX端口,你过来连接我”。于是服务器从20端口向客户端的XXxX端口发送连接请求,建立一条数据链路来传送数据。PASV(被动)方式的连接过程是:客户端向服务器的FTP端口(默认是21)发送连接请求,服务器接收连接,建立一条命令链路。当需要传送数据时,服务器在命令链路上用PASV命令告诉客户端:“我打开了XXXX端口,你过来连接我”。于是客户端向服务器的XXXX端口发送连接请求,建立一条数据链路来传送数据。如图6-1所示。
很多防火墙在设置的时候都是不允许接收外部发起的连接的,所以许多位于防火墙后或内网的FTP服务器不支持PASV模式,这是由于客户端无法穿过防火墙打开FTP服务器的端口;而许多内网的客户端不能用PORT模式登陆FTP服务器,因为服务器的TCP 20端口无法和内部网络的客户端建立一个新的连接,造成无法工作。
FTP 数据传输
FTP 的传输方式有以下两种。
1)ASCII 传输方式
假定用户正在复制包含简单ASCII码文本的文件,如果在远程机器上运行的不是UNIX,当文件传输时ftp通常会自动调整文件的内容以便把文件解释成目的计算机存储文本文件的格式。但是常常有这样的情况,用户正在传输的文件包含的不是文本文件,可能是程序、数据库、字处理文件或者压缩文件(尽管字处理文件包含的大部分是文本,其中也包含指示页尺寸、字库等信息的非打印字符)。在复制任何非文本文件之前,需要用binary 命令告诉ftp逐字复制,不要对这些文件进行处理,这也是下面要讲的二进制传输模式。
1)二进制传输模式
在二进制传输中,保存文件的位序,以便原始文件和副本是逐位一一对应的。
如果在ASCII方式下传输二进制文件,由于存在编码与解码过程,这会使传输稍微变慢,也会损坏数据,使文件变得不能用。注意:在大多数计算机上,ASCII方式一般假设每一字符的第一有效位无意义,因为ASCII字符组合不使用它。如果传输二进制文件,所有的位都是重要的。当传输连接的两台计算机是同样的,则二进制方式对文本文件和数据文件都是有效的。
FTP 规范
FTP 规定的每个命令都由 3 到 4 个字母组成,后面是该命令的参数,命令与参数之间用空格隔开。每个命令都以回车换行结束。下面介绍一些常用命令。
1. 访问命令
1)USER 命令
格式:USER <username>
功能:指定登录的用户名,以便服务器进行身份验证。此命令通常是控制连接后第一个发出的命令。另外,如果客户端需要改变登录的用户,也可以重新发送 USER 命令,在这种情况下,原来设置的传输参数不会改变。
2)PASS 命令
格式:PASS <password>
功能:指定用户口令,该命令必须跟在登录用户名命令之后。对于需要用户口令的FTP服务器,它是完成访问控制不可缺少的一步。
3)ACCT 命令
格式:ACCT <account>
功能:指定用户账号。此命令不需要和USER相关,服务器端可以设置客户端账号,也可以限制账户访问权限。
4)REIN 命令
格式:REIN
功能:表示重新初始化用户信息。此命令终止当前USER的传输,同时终止正在传输的数据,然后重置所有参数,并打开控制连接,以便客户端再次发送USER命令。
5)QUIT 命令
格式:QUIT
功能:关闭与服务器的连接。
2. 文件管理命令
1)CWD 命令
格式:CWD <directory>
功能:改变工作目录。此命令使用户可以在不同的目录或数据集下工作而不用改变它的登录或账户信息,传输参数也不变。参数一般是目录名或与系统相关的文件集合。
2)PWD 命令
格式:PWD
功能:返回当前工作目录。
3)MKD 命令
格式:MKD <directory>
功能:在指定路径下创建新目录,参数为表示特定目录的字符串。
4)CDUP 命令
格式:CDUP
功能:回到上层目录。
5)RMD 命令
格式:RMD <directory>
功能:删除指定目录。参数为表示特定目录的字符串。
6)LIST 命令
格式:LIST <name>
功能:返回指定路径下的子目录及文件列表,省略<路径>时,返回当前路径下的文件列表。如果路径名指定一个文件,服务器返回文件的当前信息,参数为空表示用户当前的工作目录或默认目录。
7)NLST 命令
格式:NLST <directory>
功能:返回指定路径下的目录列表,省略<路径>时,返回当前目录。
8)RNFR 命令
格式:RNFR <old path>
功能:重新命名文件,该命令的下一条命令应该用 RNTO 指定新的文件名。
9)RNTO 命令
格式:RNTO <new path>
功能:该命令和 RNFR 命令共同完成对文件的重命名,紧跟在 RNFR 命令后。
10)DELE 命令
格式:DELE <filename>
功能:删除指定路径下的文件。
3. 文件传输命令
1)RETR 命令
格式:RETR <filename>
功能:请求服务器将指定路径内的文件复制到客户端,也就是下载指定的文件。
2)STOR 命令
格式:STOR <filename>
功能:上传一个指定的文件,并将其存储在指定的位置。如果文件已存在,原文件将被覆盖。如果文件不存在,则创建新文件。
4. 模式设置命令
1)PASV 命令
格式:PASV
功能:该命令告诉 FTP 服务器,让 FTP 服务器在指定的数据端口进行监听,进入被动接收请求的状态。这种方式对于有代理服务器的客户端更安全,因为客户端代理服务器不必接收传入的连接。如果未指定任何模式,则 FTP 服务器默认使用 PASV 模式。
注意:由于某些客户端可能会运行防火墙,从而使 PASV 模式对客户端代理服务器不起作用,因此,可将客户端代理服务器配置为使用 PORT 模式。
2)PORT 命令
格式:PORT <address>
功能:该命令告诉 FTP 服务器客户端监听的端口号是 address,让 FTP 服务器采用主动模式连接客户端。
程序员可以对所有 FTP 服务器启用 PORT 模式,也可以仅对特定 FTP 服务器启用此模式。但是要注意,如果客户端代理服务器位于防火墙之后,使 PORT 模式不起作用,则无法启用 PORT 模式,此时可以尝试使用 PASV 模式。
标签: C#
日历
最新文章
随机文章
热门文章
分类
存档
- 2025年3月(4)
- 2025年2月(3)
- 2025年1月(1)
- 2024年12月(5)
- 2024年11月(5)
- 2024年10月(5)
- 2024年9月(3)
- 2024年8月(3)
- 2024年7月(11)
- 2024年6月(3)
- 2024年5月(9)
- 2024年4月(10)
- 2024年3月(11)
- 2024年2月(24)
- 2024年1月(12)
- 2023年12月(3)
- 2023年11月(9)
- 2023年10月(7)
- 2023年9月(2)
- 2023年8月(7)
- 2023年7月(9)
- 2023年6月(6)
- 2023年5月(7)
- 2023年4月(11)
- 2023年3月(6)
- 2023年2月(11)
- 2023年1月(8)
- 2022年12月(2)
- 2022年11月(4)
- 2022年10月(10)
- 2022年9月(2)
- 2022年8月(13)
- 2022年7月(7)
- 2022年6月(11)
- 2022年5月(18)
- 2022年4月(29)
- 2022年3月(5)
- 2022年2月(6)
- 2022年1月(8)
- 2021年12月(5)
- 2021年11月(3)
- 2021年10月(4)
- 2021年9月(9)
- 2021年8月(14)
- 2021年7月(8)
- 2021年6月(5)
- 2021年5月(2)
- 2021年4月(3)
- 2021年3月(7)
- 2021年2月(2)
- 2021年1月(8)
- 2020年12月(7)
- 2020年11月(2)
- 2020年10月(6)
- 2020年9月(9)
- 2020年8月(10)
- 2020年7月(9)
- 2020年6月(18)
- 2020年5月(4)
- 2020年4月(25)
- 2020年3月(38)
- 2020年1月(21)
- 2019年12月(13)
- 2019年11月(29)
- 2019年10月(44)
- 2019年9月(17)
- 2019年8月(18)
- 2019年7月(25)
- 2019年6月(25)
- 2019年5月(17)
- 2019年4月(10)
- 2019年3月(36)
- 2019年2月(35)
- 2019年1月(28)
- 2018年12月(30)
- 2018年11月(22)
- 2018年10月(4)
- 2018年9月(7)
- 2018年8月(13)
- 2018年7月(13)
- 2018年6月(6)
- 2018年5月(5)
- 2018年4月(13)
- 2018年3月(5)
- 2018年2月(3)
- 2018年1月(8)
- 2017年12月(35)
- 2017年11月(17)
- 2017年10月(16)
- 2017年9月(17)
- 2017年8月(20)
- 2017年7月(34)
- 2017年6月(17)
- 2017年5月(15)
- 2017年4月(32)
- 2017年3月(8)
- 2017年2月(2)
- 2017年1月(5)
- 2016年12月(14)
- 2016年11月(26)
- 2016年10月(12)
- 2016年9月(25)
- 2016年8月(32)
- 2016年7月(14)
- 2016年6月(21)
- 2016年5月(17)
- 2016年4月(13)
- 2016年3月(8)
- 2016年2月(8)
- 2016年1月(18)
- 2015年12月(13)
- 2015年11月(15)
- 2015年10月(12)
- 2015年9月(18)
- 2015年8月(21)
- 2015年7月(35)
- 2015年6月(13)
- 2015年5月(9)
- 2015年4月(4)
- 2015年3月(5)
- 2015年2月(4)
- 2015年1月(13)
- 2014年12月(7)
- 2014年11月(5)
- 2014年10月(4)
- 2014年9月(8)
- 2014年8月(16)
- 2014年7月(26)
- 2014年6月(22)
- 2014年5月(28)
- 2014年4月(15)
友情链接
- Unity官网
- Unity圣典
- Unity在线手册
- Unity中文手册(圣典)
- Unity官方中文论坛
- Unity游戏蛮牛用户文档
- Unity下载存档
- Unity引擎源码下载
- Unity服务
- Unity Ads
- wiki.unity3d
- Visual Studio Code官网
- SenseAR开发文档
- MSDN
- C# 参考
- C# 编程指南
- .NET Framework类库
- .NET 文档
- .NET 开发
- WPF官方文档
- uLua
- xLua
- SharpZipLib
- Protobuf-net
- Protobuf.js
- OpenSSL
- OPEN CASCADE
- JSON
- MessagePack
- C在线工具
- 游戏蛮牛
- GreenVPN
- 聚合数据
- 热云
- 融云
- 腾讯云
- 腾讯开放平台
- 腾讯游戏服务
- 腾讯游戏开发者平台
- 腾讯课堂
- 微信开放平台
- 腾讯实时音视频
- 腾讯即时通信IM
- 微信公众平台技术文档
- 白鹭引擎官网
- 白鹭引擎开放平台
- 白鹭引擎开发文档
- FairyGUI编辑器
- PureMVC-TypeScript
- 讯飞开放平台
- 亲加通讯云
- Cygwin
- Mono开发者联盟
- Scut游戏服务器引擎
- KBEngine游戏服务器引擎
- Photon游戏服务器引擎
- 码云
- SharpSvn
- 腾讯bugly
- 4399原创平台
- 开源中国
- Firebase
- Firebase-Admob-Unity
- google-services-unity
- Firebase SDK for Unity
- Google-Firebase-SDK
- AppsFlyer SDK
- android-repository
- CQASO
- Facebook开发者平台
- gradle下载
- GradleBuildTool下载
- Android Developers
- Google中国开发者
- AndroidDevTools
- Android社区
- Android开发工具
- Google Play Games Services
- Google商店
- Google APIs for Android
- 金钱豹VPN
- TouchSense SDK
- MakeHuman
- Online RSA Key Converter
- Windows UWP应用
- Visual Studio For Unity
- Open CASCADE Technology
- 慕课网
- 阿里云服务器ECS
- 在线免费文字转语音系统
- AI Studio
- 网云穿
- 百度网盘开放平台
- 迅捷画图
- 菜鸟工具
- [CSDN] 程序员研修院
- 华为人脸识别
- 百度AR导航导览SDK
- 海康威视官网
- 海康开放平台
- 海康SDK下载
- git download
- Open CASCADE
- CascadeStudio
交流QQ群
-
Flash游戏设计: 86184192
Unity游戏设计: 171855449
游戏设计订阅号
