CrossFTPFTP 的目标是提高文件的共享性,提供非直接使用远程计算机,使存储介质对用户透明和可靠高效地传送数据。虽然我们也可以手工使用它,但是它的主要作用是 供程序使用的 。
在 FTP 中字节大小有两个:
传输字节不必等于逻辑字节大小,也不必对数据结构进行解释。
控制连接是建立在 USER-PIT 和 SERVER-PI 之间用于交换命令与应答的通信链路。
数据连接是传输数据的全双工连接。传输数据可以发生在 服务器 DTP 和 用户 DTP 之间也可以发生在 两个服务器 DTP 之间。
DTP数据传输过程(DTP)建立和管理数据连接,DTP 可以是主动的也可以
是被动的。
EOREOR 代表记录尾。
NTVNTV 代表网络虚拟终端,它的定义与在 Telnet 协议中的定义一致。
NVFS NVFS 代表网络虚拟文件系统。
FTPFTP 可以传输非连续的文件,这些文件的一部分称为页。
PIPI 代表协议解释器。
服务器 DTP 服务器 DTP 代表一种传输过程,它通常处于“主动”状态,它和侦听端口建立数据连接,它还可以为传输和存储设置参数,并根据 PI 的指令传输数据。当然,DTP 也可以转入“被动”状态。
服务器 FTP 进程服务器 FTP 进程,它是和 用户 FTP 进程一起工作的,它由 PI 和 DTP 组成。至于 用户 FTP 进程则是由 PI,DTP 和 用户接口 组成的。

数据连接是双向的,它不用整个时间都存在。上图中 用户 PI 开始控制连接,控制连接与 Telnet 协议很象。在开始阶段,标准 FTP 命令由 用户 PI 产生并通过控制连接传送到服务器进程。服务器 PI 向 用户 PI 返回标准应答。FTP 命令指定数据连接参数和文件系统操作。用户 DTP 在特定数据端口侦听,服务器开始数据连接并以指定的参数开始数据传输。数据端口不必在开始 FTP 命令的机器上,但用户或 用户 FTP 进程必须确定它在指定的数据端口上侦听。这个数据连接是全双工的。

在另外一种情况下,用户或许希望在两个主机间传送文件,不是两个本地主机。用户在两台主机间建立控制连接,然后规划数据连接。用这种方式,控制信息由 用户 PI 获得,但是数据在 服务器 DTP 之间传送。图 2-4 就是一个例子。
协议要求数据传输在处理时打开控制连接。在完成 FTP 服务后由用户中止控制连接,而服务器具体操作。如果在未接收命令时关闭了控制连接,服务器也会关闭数据传输。FTP 和 Telnet 很有联系,FTP 使用 Telnet 协议进行控制连接,可有两种方法达到目的:
用户 PI 或 服务器 PI 可以在自己的过程中实现 Telnet 协议 的功能;Telnet 模块。实现上,FTP 对 Telnet 协议 的依赖也不多,即使重新实现,代码量也不大。数据连接只传输数据,控制连接传送命令和响应。几个命令是关于在主机间传输数据的,数据传输基本上独立于物理结构的,但是如果在压缩传输模式下流式传输与文件结构有关,文件的属性与表示类型有关。
数据表示是由用户指定的表示类型,它可以是隐含的,也可以是用户指定的。请一定注意:逻辑字节长度与物理字节长度是不同的。
ASCII 类型:这是所有 FTP 必须实现的默认类型,用于传送文本文件。EBCDIC 类型:它是作为 ASCII 的另一种方法在主机间传送数据的数据类型。除了有不同的数据类型外,FTP 还允许有不同的文件结构,下面是三种文件结构:
文件式结构,文件中没有内部结构,文件被看作是二进制流;记录结构,文件是由一系列记录组成的;页结构,文件是由不同的索引页组成的。传送数据机制包括建立连接选择数据参数。用户和 服务器 DTP 有默认数据端口。用户进程默认数据端口和控制连接端口相同。服务器进程默认数据端口和控制连接端口相邻。传输字节大小是 8 位字节。此字节是实际传输字节,但不代表主机内的数据表示。被动数据传输进程在数据端口接收数据,FTP 请求命令决定数据传输的方向。服务器在接收到请求以后,将初始化端口的数据连接。当连接建立后,传输在 DTP 之间传送,服务器 PI 对 用户 PI 返回应答。FTP 实现运行一个默认数据端口,用户 PI 才能改变默认端口。
通过 PORT 命令 可能改变端口,用户可能希望数据在第三方主机上进行其它操作,用户 PI 需要在两个 服务器 PI 上建立连接。一个服务器被告知侦听另一服务器的请求。用户 PI 通过 PORT 命令 通知另一服务器的数据端口。最后双方发送相应的传送命令。通常,服务器负责支持数据连接,初始化并关闭它,除非 用户 DTP 在传输模式下要求关闭连接。服务器在下面情况下关闭数据连接:
EOF 要求中止传送;ABORT 命令;默认数据连接端口:所有 FTP 必须支持默认数据连接,只有 用户 PI 能够初始化非默认端口的使用。
确定非默认数据端口:用户 PI 可以使用 PORT 命令指定非默认端口,它要求服务器方以 PASV 确定非默认数据端口。连接是由双方地址确定的,因此改变一方地址就改变了连接。
有三种传输模式:
所有数据传输必须以一个 EOF 结束,它可以显式给出,也可以通过关闭连接隐式给出。
对于记录文件,所有 EOR 是显式的,包括最后一个记录。对于以页结构传送的文件,使用“最后一页”表示结束。
ASCII 或 EBCDIC 的行结束则 或 指示。这样的转换需要时间,所以相同的系统在传送文本文件时采用二进制或流表示比较合适。
从 用户 PI 到服务器的信道是建立在用户到标记服务器端口间的。用户协议解释器负责发送命令和解释接收的应答;
服务器 PI 解释命令,发送应答,指导 DTP 建立数据连接并传送数据。如果数据传输的第二方是 用户 DTP,通过 用户 FTP 主机的内部协议对它进行控制;
如果第二方是 服务器 DTP,它由 用户 PI 发来的命令经过自己的 PI 控制。
FTP 标准命令在发送命令的时候,总是在命令的最后加上一个回车换行符,在 VC 中用 \r\n 表示。
CDUP(Change to Parent Directory,变为父目录)命令 ,该命令把当前目录改为远程文件系统的父目录。CWD (Change Working Directory,改变工作目录)命令 ,该命令把当前目录改为远程文件系统的指定路径。DELE(Delete,删除)命令,该命令删除服务器站点上在路径名中指定的文件。LIST(List,列表)&& NLST (Name list,名称列表)命令, 这两个命令让服务器向用户发送一份列表。
LIST 发送详细信息,NLST 发送简略信息。MKD(Make directory,创建目录)命令,该命令创建一个在路径名中指定的目录或当前工作目录的子目录。NOOP(Noop,空操作)命令, 该命令让服务器向用户发送一条 OK 应答指令。PASV(Passive,被动)命令 ,该命令告诉服务器在一个特定端口上接听数据。PORT(Port,端口)命令, 该命令为数据连接指定一个 IP 地址和本地端口。它必须紧跟在 PASV 后面使用。PWD (Print Working Directory,显示工作目录)命令,该命令返回服务器上当前工作目录的名称。QUIT(Quit,退出)命令 ,关闭一个控制连接。RETR(Retrieve,检索)命令,该命令让服务器给客户传送一份在路径名中指定的文件的副本。RMD(Remove Directory,删除目录)命令,该命令删除一个在路径名中指定的目录或当前工作目录的子目录。STOR(Store,保存)命令,该命令让服务器接收一个来自数据连接的文件。STOU(Store Unique,存为唯一)命令, 该命令让服务器接收一个来自数据连接的文件,并把这个文件用唯一的名称保存到目的目录中。SYST(System,系统)命令,该命令用于查明服务器上操作系统的类型。TYPE(Parameter type,表达类型)命令, 该命令用于确定数据的传输方式。FTP 应答FTP 命令 的响应是为了对数据传输请求和过程进行同步,也是为了让用户了解服务器的状态。每个命令必须有最少一个响应,如果是多个,它们要易于区别。FTP 响应 由三个数字构成,后面是一些文本。数字带有足够的信息命名 用户 PI 不用检查文本就知道发生了什么。文本信息与服务器相关,用户可能得到不同的文本信息。文本和数字以 间隔,文本后以 Telnet 行结束符结束。
三位数字每位都有一定的意义,第一位确定响应是好的,坏的还是不完全的,通过检查第一位,用户进程通常就能够知道大致要采取什么行动了。如果用户程序希望了解出了什么问题,可以检查第二位,第三位留表示其它信息。
第一位有五个值:
1yz ,确定预备应答2yz ,确定完成应答,要求的操作已经完成,可以执行新命令3yz ,确定中间应答,命令已接受,但要求的操作被停止,停止接受更新的信息4yz ,暂时拒绝完成应答5yz ,永远拒绝完成应答,它与暂时拒绝完成应答的区别就在于错误条件是一时半会不会消失。第二位有六个值:
x0z ,格式错误x1z ,此类应答是为了请求信息的x2z ,此类应答是关于控制和数据连接的x3z ,关于认证和账户登录过程x4z ,未使用x5z ,此类应答是关于文件系统的第三个数字是在第二个数字的基础上对应答内容的进一步细化。
一般来说,数字代码后要有文本信息。实现时应该尽量使用现有的代码,而不要随便添加新的意义不大的代码。
FTP 服务器最小实现

第一步 在服务器端运行 FTP 服务器端程序,等待用户发出连接请求,在客户端运行 FTP 客户端程序。
第二步 当客户端向服务器端发出传输文件请求时,通过 Internet 在两者之间先后建立了两个 TCP 连接:“控制连接”和“数据连接”
第三步:然后进入文件传输阶段,用户和服务器之间通过“数据连接”来传输文件,通过“控制连接”来传送一些控制命令。
第四步:当文件传送完毕时,关闭“控制连接”和“数据连接”,此时恢复初始状态。
FTP 这种文件传输协议,它支持两种模式,一种方式叫做 PORT(也就是 Active,主动方式),一种是 Passive (也就是 PASV,被动方式)。 Port 模式 FTP 的客户端发送 PORT 命令到 FTPserver。Passive 模式 FTP 的客户端发送 PASV 命令到 FTP Server。
Standard 模式
Standard 模式FTP 客户端首先和 FTP Server 的 TCP 21 端口建立连接,通过这
个通道发送命令,客户端需要接收数据的时候在这个通道上发送 PORT 命令。 PORT 命令包含了客户端用什么端口接收数据。在传送数据的时候,服务器端通过自己的 TCP 20 端口发送数据。 FTP server 必须和客户端建立一个新的连接用来传送数据。
Passive 模式
Passive 模式在建立控制通道的时候和 Standard 模式类似,当客户端通过这个通道发送 PASV 命令的时候,FTP server 打开一个位于 1024 和 5000 之间的随机端口并且通知客户端在这个端口上传送数据的请求,然后 FTP server 将通过这个端口进行数据的传送,这个时候 FTP server 不再需要建立一个新的和客户端之间的连接。
Telnet 协议 是 TCP/IP 协议族 中的一员,是 Internet 远程登陆服务的标准协议。应用 Telnet 协议能够把本地用户所使用的计算机变成远程主机系统的一个终端。TELNET Protocol 的目的是提供一个相对通用的,双向的,面向八位字节的通信方法。它主要的目标是允许接口终端设备的标准方法和面向终端的相互作用。可以预见到,此协议也可被用于终端到终端的通信和处理到处理的通信(分布式计算)。
Winsock 编程原理
CrossFTPcrossftpserver 网站:
http://www.crossftp.com/crossftpserver.htm
http://www.crossftp.com/index.htm
如果需要免费的 FTP 客户端,只求顺手对功能要求不多,CrossFTP 值得一试。安装程序只有 2-3 MB 的 CrossFTP 涵盖了所有 FTP 客户端应有的基础功能,经典两栏视图,还有多标签、密码保护、批量传输等特性。
CrossFTP 支持 FXP ,FTPS,WebDav,Sun Cloud Storage 和 Amazon S3 。