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