3.4 传输模式 (Transmission Modes)
传输数据的下一个考虑因素是选择适当的传输模式。有三种模式: 一种格式化数据并允许重启过程; 一种还压缩数据以实现高效传输; 一种以很少或没有处理的方式传递数据。在最后一种情况下, 模式与结构属性交互以确定处理类型。在压缩模式中, 表示类型确定填充字节。
所有数据传输都必须以文件结束 (EOF) 完成, 该文件结束可以显式声明或通过关闭数据连接来隐含。对于具有记录结构的文件, 所有记录结束标记 (EOR) 都是显式的, 包括最后一个。对于以页结构传输的文件, 使用"最后一页 (Last-Page)" 页类型。
注意: 在本节的其余部分, 除非明确说明, 否则字节表示"传输字节"。
为了标准化传输, 发送主机将其内部行尾或记录结束表示法转换为传输模式和文件结构规定的表示, 接收主机将执行到其内部表示法的逆转换。IBM主机记录计数字段可能在另一个主机上不被识别, 因此记录结束信息可以在流模式中作为两字节控制代码传输, 或在块或压缩模式描述符中作为标记位传输。没有记录结构的ASCII或EBCDIC文件中的行尾应分别用<CRLF>或<NL>指示。由于这些转换对某些系统意味着额外的工作, 传输非记录结构文本文件的相同系统可能希望使用二进制表示和流模式进行传输。
FTP中定义了以下传输模式:
3.4.1 流模式 (STREAM MODE)
数据作为字节流传输。对使用的表示类型没有限制; 允许记录结构。
在记录结构文件中, EOR和EOF将各自由两字节控制代码指示。控制代码的第一个字节将全为1, 即转义字符。第二个字节的低位为1, 其他位为0表示EOR, 第二个低位为1表示EOF; 即, 字节的值为1表示EOR, 值为2表示EOF。EOR和EOF可以通过打开两个低位 (即值3) 在传输的最后一个字节上一起指示。如果要将全1的字节作为数据发送, 则应在控制代码的第二个字节中重复。
如果结构是文件结构, 则EOF由发送主机关闭数据连接指示, 所有字节都是数据字节。
3.4.2 块模式 (BLOCK MODE)
文件作为一系列数据块传输, 前面有一个或多个头字节。头字节包含计数字段和描述符代码。计数字段指示数据块的总长度 (以字节为单位), 从而标记下一个数据块的开始 (没有填充位)。描述符代码定义: 文件中的最后一个块 (EOF) 记录中的最后一个块 (EOR), 重启标记 (参见错误恢复和重启部分) 或可疑数据 (即, 正在传输的数据怀疑有错误且不可靠)。最后一个代码不用于FTP内的错误控制。它源于交换某些类型数据 (例如, 地震或天气数据) 的站点希望发送和接收所有数据, 尽管存在本地错误 (例如"磁带读取错误"), 但要在传输中指示某些部分是可疑的。此模式允许记录结构, 并且可以使用任何表示类型。
头由三个字节组成。在24位头信息中, 16个低位应表示字节计数, 8个高位应表示描述符代码, 如下所示。
块头 (Block Header)
+----------------+----------------+----------------+
| Descriptor | Byte Count |
| 8 bits | 16 bits |
+----------------+----------------+----------------+
描述符代码由描述符字节中的位标志指示。已分配了四个代码, 其中每个代码编号是字节中相应位的十进制值。
| 代码 | 含义 |
|---|---|
| 128 | 数据块结束是EOR |
| 64 | 数据块结束是EOF |
| 32 | 数据块中的可疑错误 |
| 16 | 数据块是重启标记 |
通过此编码, 特定块可能存在多个描述符编码条件。可以标记所需数量的位。
重启标记嵌入在数据流中, 作为在控制连接上使用的语言中表示可打印字符的8位字节的整数 (例如, 默认--NVT-ASCII)。在重启标记内不得使用<SP> (空格, 在适当的语言中)。
例如, 要传输六字符标记, 将发送以下内容:
+--------+--------+--------+
|Descrptr| Byte count |
|code= 16| = 6 |
+--------+--------+--------+
+--------+--------+--------+
| Marker | Marker | Marker |
| 8 bits | 8 bits | 8 bits |
+--------+--------+--------+
+--------+--------+--------+
| Marker | Marker | Marker |
| 8 bits | 8 bits | 8 bits |
+--------+--------+--------+
3.4.3 压缩模式 (COMPRESSED MODE)
有三种类型的信息要发送: 常规数据, 以字节字符串发送; 压缩数据, 由复制或填充组成; 以及控制信息, 以两字节转义序列发送。如果发送n>0字节 (最多127) 的常规数据, 则这n个字节前面有一个字节, 其最左位设置为0, 最右7位包含数字n。
字节字符串 (Byte String):
1 7 8 8
+-+-+-+-+-+-+-+-+ +-+-+-+-+-+-+-+-+ +-+-+-+-+-+-+-+-+
|0| n | | d(1) | ... | d(n) |
+-+-+-+-+-+-+-+-+ +-+-+-+-+-+-+-+-+ +-+-+-+-+-+-+-+-+
^ ^
|---n bytes---|
of data
字符串包含n个数据字节 d(1),..., d(n)
计数n必须为正。
要压缩数据字节d的n个复制的字符串, 发送以下2个字节:
复制字节 (Replicated Byte):
2 6 8
+-+-+-+-+-+-+-+-+ +-+-+-+-+-+-+-+-+
|1 0| n | | d |
+-+-+-+-+-+-+-+-+ +-+-+-+-+-+-+-+-+
n个填充字节的字符串可以压缩为单个字节, 其中填充字节随表示类型而变化。如果类型是ASCII或EBCDIC, 填充字节是<SP> (空格, ASCII代码32, EBCDIC代码64)。如果类型是Image或Local byte, 填充是零字节。
填充字符串 (Filler String):
2 6
+-+-+-+-+-+-+-+-+
|1 1| n |
+-+-+-+-+-+-+-+-+
转义序列是双字节, 第一个是转义字节 (全零), 第二个包含块模式中定义的描述符代码。描述符代码的含义与块模式中相同, 并适用于后续字节字符串。
压缩模式对于在非常大的网络传输上以少量额外CPU成本获得增加的带宽很有用。它可以最有效地用于减少打印机文件的大小, 例如由RJE主机生成的打印机文件。