跳到主要内容

3.1 数据表示和存储

数据从发送主机的存储设备传输到接收主机的存储设备. 通常需要对数据执行某些转换, 因为两个系统中的数据存储表示不同. 例如, NVT-ASCII在不同系统中具有不同的数据存储表示. DEC TOPS-20通常将NVT-ASCII存储为36位字中左对齐的五个7位ASCII字符. IBM大型机将NVT-ASCII存储为8位EBCDIC代码. Multics将NVT-ASCII存储为36位字中的四个9位字符. 在不同系统之间传输文本时, 希望将字符转换为标准NVT-ASCII表示. 发送和接收站点必须在标准表示和其内部表示之间执行必要的转换.

在具有不同字长的主机系统之间传输二进制数据 (非字符代码) 时, 表示方面会出现不同的问题. 发送方应如何发送数据以及接收方应如何存储数据并不总是清楚的. 例如, 从32位字长系统向36位字长系统传输32位字节时, 可能希望 (出于效率和实用性的原因) 将32位字节右对齐存储在后者系统的36位字中. 无论如何, 用户应该有权指定数据表示和转换功能. 应注意, FTP提供的数据类型表示非常有限. 超出此有限能力的所需转换应由用户直接执行.

3.1.1 数据类型​

FTP中的数据表示由用户指定表示类型来处理. 此类型可以隐式 (如ASCII或EBCDIC) 或显式 (如本地字节) 定义用于解释的字节大小, 称为"逻辑字节大小". 注意, 这与用于通过数据连接传输的字节大小 (称为"传输字节大小") 无关, 两者不应混淆. 例如, NVT-ASCII的逻辑字节大小为8位. 如果类型是本地字节, 则TYPE命令有一个强制性的第二个参数, 指定逻辑字节大小. 传输字节大小始终为8位.

3.1.1.1 ASCII类型​

这是默认类型, 必须被所有FTP实现接受. 它主要用于文本文件的传输, 除非两个主机都发现EBCDIC类型更方便.

发送方将数据从内部字符表示转换为标准8位NVT-ASCII表示 (参见Telnet规范). 接收方将数据从标准形式转换为其自己的内部形式.

根据NVT标准, 应在必要时使用<CRLF>序列来表示文本行的结束. (参见数据表示和存储部分末尾关于文件结构的讨论.)

使用标准NVT-ASCII表示意味着数据必须被解释为8位字节.

ASCII和EBCDIC类型的格式参数在下面讨论.

3.1.1.2 EBCDIC类型​

此类型用于在内部使用EBCDIC字符表示的主机之间进行高效传输.

对于传输, 数据表示为8位EBCDIC字符. 字符代码是EBCDIC和ASCII类型功能规范之间的唯一区别.

行结束符 (与记录结束符相对——参见结构讨论) 在EBCDIC类型中可能很少用于表示结构, 但在必要时应使用<NL>字符.

3.1.1.3 图像类型​

数据作为连续位发送, 传输时打包到8位传输字节中. 接收站点必须将数据存储为连续位. 存储系统的结构可能需要将文件 (或记录结构文件的每条记录) 填充到某个方便的边界 (字节、字或块). 此填充 (必须全为零) 只能出现在文件末尾 (或每条记录末尾), 并且必须有一种方法来识别填充位, 以便在检索文件时可以剥离它们. 填充转换应广泛公布, 以使用户能够在存储站点处理文件.

图像类型用于文件的高效存储和检索以及二进制数据的传输. 建议所有FTP实现接受此类型.

3.1.1.4 本地类型​

数据以第二个强制参数字节大小指定的逻辑字节大小传输. 字节大小的值必须是十进制整数; 没有默认值. 逻辑字节大小不一定与传输字节大小相同. 如果字节大小不同, 则逻辑字节应连续打包, 忽略传输字节边界, 并在末尾进行必要的填充.

当数据到达接收主机时, 它将以依赖于逻辑字节大小和特定主机的方式进行转换. 此转换必须是可逆的 (即, 如果使用相同的参数, 可以检索到相同的文件), 并且应由FTP实现者广泛公布.

例如, 向具有32位字的主机发送36位浮点数的用户可以将该数据作为逻辑字节大小为36的本地字节发送. 接收主机将被期望以可以轻松操作的方式存储逻辑字节; 在此示例中, 将36位逻辑字节放入64位双字应该足够.

在另一个示例中, 一对具有36位字大小的主机可以通过使用TYPE L 36以字为单位相互发送数据. 数据将以8位传输字节发送, 打包方式为9个传输字节携带两个主机字.

3.1.1.5 格式控制​

ASCII和EBCDIC类型还接受第二个 (可选) 参数; 这是为了指示与文件关联的垂直格式控制类型 (如果有). FTP中定义了以下数据表示类型:

字符文件可以出于三个目的之一传输到主机: 用于打印、用于存储和以后检索, 或用于处理. 如果文件用于打印, 接收主机必须知道垂直格式控制的表示方式. 在第二种情况下, 必须能够在主机上存储文件, 然后以完全相同的形式检索它. 最后, 应该能够将文件从一个主机移动到另一个主机, 并在第二个主机上处理文件而不会遇到不必要的麻烦. 单一的ASCII或EBCDIC格式不能满足所有这些条件. 因此, 这些类型有一个第二个参数, 指定以下三种格式之一:

3.1.1.5.1 非打印​

如果省略第二个 (格式) 参数, 这是要使用的默认格式. 所有FTP实现必须接受非打印格式.

文件不需要包含垂直格式信息. 如果传递给打印机进程, 该进程可以假定间距和边距的标准值.

通常, 此格式将用于用于处理或仅用于存储的文件.

3.1.1.5.2 TELNET格式控制​

文件包含ASCII/EBCDIC垂直格式控制 (即<CR>, <LF>, <NL>, <VT>, <FF>), 打印机进程将适当地解释这些控制. <CRLF> (恰好是这个序列) 也表示行结束.

3.1.1.5.3 回车控制 (ASA)​

文件包含ASA (FORTRAN) 垂直格式控制字符. (参见RFC 740附录C; 以及ACM通信, 第7卷, 第10期, 第606页, 1964年10月.) 在根据ASA标准格式化的行或记录中, 第一个字符不打印. 相反, 它应用于确定在打印其余记录之前应发生的纸张垂直移动.

ASA标准规定以下控制字符:

字符垂直间距
空格纸张向上移动一行
0纸张向上移动两行
1纸张移到下一页顶部
+不移动, 即重叠打印

显然, 打印机进程必须有某种方式来区分结构实体的结束. 如果文件具有记录结构 (见下文), 这不是问题; 记录将在传输和存储期间明确标记. 如果文件没有记录结构, 则使用<CRLF>行结束序列来分隔打印行, 但这些格式效应器被ASA控制覆盖.

3.1.2 数据结构​

除了不同的表示类型外, FTP还允许指定文件的结构. FTP中定义了三种文件结构:

  • 文件结构 (file-structure) - 没有内部结构, 文件被视为连续的数据字节序列
  • 记录结构 (record-structure) - 文件由顺序记录组成
  • 页结构 (page-structure) - 文件由独立的索引页组成

如果未使用STRUcture命令, 文件结构是要假定的默认值, 但所有FTP实现必须接受"文本"文件 (即TYPE为ASCII或EBCDIC的文件) 的文件结构和记录结构. 文件的结构将影响文件的传输模式 (参见传输模式部分) 以及文件的解释和存储.

文件的"自然"结构将取决于哪个主机存储文件. 例如, 源代码文件通常以固定长度记录存储在IBM大型机上, 但在DEC TOPS-20上存储为字符流, 例如由<CRLF>分隔成行. 如果在如此不同的站点之间传输文件要有用, 必须有某种方式让一个站点识别另一个站点对文件的假设.

由于某些站点自然是面向文件的, 而其他站点自然是面向记录的, 如果将具有一种结构的文件发送到面向另一种结构的主机, 可能会出现问题. 如果将具有记录结构的文本文件发送到面向文件的主机, 则该主机应根据记录结构对文件应用内部转换. 显然, 此转换应该是有用的, 但它也必须是可逆的, 以便可以使用记录结构检索相同的文件.

在将具有文件结构的文件发送到面向记录的主机的情况下, 存在主机应使用什么标准将文件划分为可以在本地处理的记录的问题. 如果需要此划分, FTP实现应使用行结束序列 (ASCII的<CRLF>, 或EBCDIC文本文件的<NL>) 作为分隔符. 如果FTP实现采用此技术, 则必须准备好在使用文件结构检索文件时反转转换.

3.1.2.1 文件结构​

如果未使用STRUcture命令, 文件结构是要假定的默认值.

在文件结构中, 没有内部结构, 文件被视为连续的数据字节序列.

3.1.2.2 记录结构​

所有FTP实现必须接受"文本"文件 (即TYPE为ASCII或EBCDIC的文件) 的记录结构.

在记录结构中, 文件由顺序记录组成.

3.1.2.3 页结构​

为了传输不连续的文件, FTP定义了页结构. 此类型的文件有时称为"随机访问文件"甚至"有洞文件". 在这些文件中, 有时有与整个文件相关的其他信息 (例如文件描述符), 或与文件的某个部分相关的信息 (例如页访问控制), 或两者都有. 在FTP中, 文件的各部分称为页.

为了提供各种页大小和相关信息, 每个页都带有页头发送. 页头具有以下已定义字段:

头长度 (Header Length)
页头中的逻辑字节数, 包括此字节. 最小头长度为4.

页索引 (Page Index)
此文件部分的逻辑页号. 这不是此页的传输序列号, 而是用于标识文件此页的索引.

数据长度 (Data Length)
页数据中的逻辑字节数. 最小数据长度为0.

页类型 (Page Type)
此页的类型. 定义了以下页类型:

  • 0 = 最后一页 (Last Page)
    用于指示分页结构传输的结束. 头长度必须为4, 数据长度必须为0.

  • 1 = 简单页 (Simple Page)
    这是没有页级关联控制信息的简单分页文件的正常类型. 头长度必须为4.

  • 2 = 描述符页 (Descriptor Page)
    此类型用于传输整个文件的描述性信息.

  • 3 = 访问控制页 (Access Controlled Page)
    此类型包括用于具有页级访问控制信息的分页文件的附加头字段. 头长度必须为5.

可选字段 (Optional Fields)
可以使用更多头字段来提供每页控制信息, 例如每页访问控制.

所有字段的长度为一个逻辑字节. 逻辑字节大小由TYPE命令指定. 有关页结构的更多详细信息和具体情况, 请参见附录I.

关于参数的注意事项: 如果要使检索的版本与最初传输的版本相同, 则必须使用相同的参数存储和检索文件. 相反, 如果用于存储和检索文件的参数相同, FTP实现必须返回与原始文件相同的文件.