5. TFTP Packets (TFTP 数据包)
TFTP 支持五种类型的数据包, 上面都已提到:
| 操作码 (Opcode) | 操作 (Operation) |
|---|---|
| 1 | 读请求 (Read request, RRQ) |
| 2 | 写请求 (Write request, WRQ) |
| 3 | 数据 (Data, DATA) |
| 4 | 确认 (Acknowledgment, ACK) |
| 5 | 错误 (Error, ERROR) |
数据包的 TFTP 头部包含与该数据包关联的操作码.
RRQ/WRQ 数据包
2 bytes string 1 byte string 1 byte
------------------------------------------------
| Opcode | Filename | 0 | Mode | 0 |
------------------------------------------------
Figure 5-1: RRQ/WRQ packet
RRQ 和 WRQ 数据包 (操作码分别为 1 和 2) 具有图 5-1 所示的格式. 文件名是以零字节终止的 netascii 字节序列. 模式字段包含字符串 "netascii", "octet" 或 "mail" (或大小写的任意组合, 如 "NETASCII", "NetAscii" 等) 以 netascii 表示协议中定义的三种模式. 接收 netascii 模式数据的主机必须将数据转换为其自己的格式. Octet 模式用于传输正在传输文件的机器的 8 位格式的文件. 假设每种类型的机器都有一种更常见的单一 8 位格式, 并且选择该格式. 例如, 在 DEC-20 (一台 36 位机器) 上, 这是每个字四个 8 位字节, 有四位损耗. 如果主机接收到 octet 文件然后返回它, 返回的文件必须与原始文件相同. Mail 模式使用邮件收件人的名称代替文件, 并且必须以 WRQ 开始. 否则它与 netascii 模式相同. 邮件收件人字符串应采用 "username" 或 "username@hostname" 的形式. 如果使用第二种形式, 它允许中继计算机进行邮件转发的选项.
上面的讨论假设发送方和接收方都在相同的模式下操作, 但没有理由必须如此. 例如, 可以构建一个存储服务器. 这样的机器没有理由需要将 netascii 转换为其自己的文本形式. 相反, 发送方可能以 netascii 发送文件, 但存储服务器可能只是以 8 位格式存储它们而不进行转换. 另一种情况是 DEC-20 系统上目前存在的问题. netascii 和 octet 都不能访问字中的所有位. 可以为这样的机器创建一种特殊模式, 读取字中的所有位, 但接收方以 8 位格式存储信息. 当从存储站点检索此类文件时, 必须将其恢复为原始形式才能有用, 因此也必须实现反向模式. 用户站点必须记住一些信息才能实现这一点. 在这两个示例中, 请求数据包将向外部主机指定 octet 模式, 但本地主机将处于某种其他模式. TFTP 中没有指定此类机器或应用程序特定模式, 但这与本规范兼容.
也可以为协作主机对定义其他模式, 尽管这必须谨慎进行. 没有要求任何其他主机实现这些. 没有中央机构来定义这些模式或为其分配名称.
DATA 数据包
2 bytes 2 bytes n bytes
----------------------------------
| Opcode | Block # | Data |
----------------------------------
Figure 5-2: DATA packet
数据实际上在图 5-2 所示的 DATA 数据包中传输. DATA 数据包 (操作码 = 3) 具有块号和数据字段. 数据包上的块号从 1 开始, 每个新数据块增加 1. 此限制允许程序使用单个数字来区分新数据包和重复数据包.
数据字段长度为 0 到 512 字节. 如果它是 512 字节长, 则该块不是最后一个数据块; 如果它是 0 到 511 字节长, 则表示传输结束. (有关详细信息, 请参阅正常终止部分.)
除重复 ACK 和用于终止的数据包外, 所有数据包都被确认, 除非发生超时 [4]. 发送 DATA 数据包是对前一个 DATA 数据包的第一个 ACK 数据包的确认. WRQ 和 DATA 数据包由 ACK 或 ERROR 数据包确认, 而 RRQ 和 ACK 数据包由 DATA 或 ERROR 数据包确认.
ACK 数据包
2 bytes 2 bytes
---------------------
| Opcode | Block # |
---------------------
Figure 5-3: ACK packet
图 5-3 描述了 ACK 数据包; 操作码为 4. ACK 中的块号回显被确认的 DATA 数据包的块号. WRQ 由块号为零的 ACK 数据包确认.
ERROR 数据包
2 bytes 2 bytes string 1 byte
-----------------------------------------
| Opcode | ErrorCode | ErrMsg | 0 |
-----------------------------------------
Figure 5-4: ERROR packet
ERROR 数据包 (操作码 5) 采用图 5-4 所示的形式. ERROR 数据包可以是任何其他类型数据包的确认. 错误代码是一个整数, 指示错误的性质. 附录中给出了值和含义的表格. (注意, 本文档的此版本添加了几个错误代码.) 错误消息供人类使用, 应采用 netascii 格式. 与所有其他字符串一样, 它以零字节终止.