第 1 章 - Azure RTOS NetX Duo TFTP 简介

日常文件传输协议 (TFTP) 是为文件传输而设计的轻量型协议。 与更可靠的协议不同,TFTP 不会执行大量的错误检查,而且它是一个停止和等待协议,所以性能也可能会受到限制。 发送 TFTP 数据包后,发送方等待接收方返回 ACK。 尽管这很简单,但它确实会限制总体 TFTP 吞吐量。 借助 TFTP 包,主机可以通过 IP 网络使用 TFTP 协议。

TFTP 要求

若要正常运行,NetX Duo TFTP 包的 TFTP 客户端部分需要已创建 IP 实例。 此外,必须在同一个 IP 实例上启用 UDP。 NetX Duo TFTP 包的客户端部分没有进一步的要求。

NetX Duo TFTP 包的 TFTP 服务器部分有几个附加要求。 首先,它需要对众所周知的 UDP 端口 69 的完全访问权限,该端口用于处理所有客户端 TFTP 请求。 TFTP 服务器还设计为与 FileX 嵌入式文件系统配合使用。 如果 FileX 不可用,用户可以将使用的 FileX 部分移植到他们自己的环境中。 本指南后面的几部分将对此进行讨论。

TFTP 文件名

TFTP 文件名应采用目标文件系统的格式。 它们应为以 NULL 结尾的 ASCII 字符串,如果需要,还应该包含完整的路径信息。 在 NetX Duo TFTP 实现中,没有指定对 TFTP 文件名大小的限制。

TFTP 消息

TFTP 拥有一种非常简单的机制,用于打开、读取、写入和关闭文件。 UDP 标头下的 TFTP 标头基本上为 2-4 个字节。 TFTP 文件打开消息的定义具有以下格式:

oooof...f0OCTET0

其中:

  • oooo 2 字节操作码字段
    0x0001 -> 打开以进行读取
    0x0002 -> 打开以进行写入

  • f…f n 字节文件名字段

  • 0 1-字节 NULL 终止字符

  • 八进制数 用于指定二进制传输的 ASCII“八进制数”

  • 0 1-字节 NULL 终止字符

TFTP 写入、确认和错误消息的定义略有不同,定义如下:

oooobbbbd…d

其中:

  • oooo 2 字节操作码字段
    0x0003 -> 数据包
    0x0004 -> 确认上次读取
    0x0005 -> 错误条件

  • bbbb 2 字节块号字段 (1-n)

  • d…d n 字节数据字段

  • 0x0001(读取)文件名 0 OCTET 0

  • 0x0002(写入)文件名 0 OCTET 0

TFTP 通信

TFTP 服务器使用众所周知的 UDP 端口 69 来侦听客户端请求。 TFTP 客户端套接字可绑定到任何可用的 UDP 端口。 包含要上传或下载的文件的数据包有效负载以 512 字节块发送,直到最后一个包含 < 512 字节的数据包。 因此,包含小于 512 字节的数据包将指示文件的结尾。 事件的一般顺序如下:

TFTP 读取文件请求:

  1. 客户端发出带有文件名的“打开以进行读取”请求并等待来自服务器的答复。

  2. 如果文件大小小于 512 字节,则服务器将发送文件的前 512 个字节或更少的字节。

  3. 对于超过 512 字节的文件,客户端将接收数据、发送 ACK,并等待服务器的下一个数据包。

  4. 当客户端收到小于 512 个字节的数据包时,序列将结束。

TFTP 写入请求:

  1. 客户端发出带有文件名的“打开以进行写入”请求,并等待来自服务器的块号为 0 的 ACK。

  2. 当服务器准备好写入文件时,它将发送一个块号为 0 的 ACK。

  3. 客户端向服务器发送文件的前 512 个字节(对于小于 512 个字节的文件,字节更少),并等待返回 ACK。

  4. 在写入字节后,服务器将发送 ACK。

  5. 当客户端完成写入小于 512 个字节的数据包时,序列将结束。

TFTP 服务器会话计时器

TFTP 服务器的客户端请求槽数量有限。 如果出现要删除的客户端会话,则无法重复使用该槽。 但是,如果启用了 NX_TFTP_SERVER_RETRANSMIT_ENABLE 选项,NetX Duo TFTP 服务器会创建一个会话计时器,用于监视其每个客户端会话的超时。 当会话超时到期后,将终止该会话并关闭任何打开的文件。 这样,“槽”便可用于另一个 TFTP 客户端请求。

若要设置超时,请调整配置选项 NX_TFTP_SERVER_RETRANSMIT_TIMEOUT,默认为 200 计时器时钟周期。 检查会话超时的间隔时间由 NX_TFTP_SERVER_TIMEOUT_PERIOD 设置,默认为 20 计时器时钟周期。

当 TFTP 客户端上传(写入)文件到 TFTP FileX 媒体,需要刷新媒体,这样便可以将数据从 TFTP 服务器 RAM 磁盘写入基础媒体(TFTP 客户端磁盘内存)。 如果应用程序不想关闭 TFTP 服务器,可以使用 fx_media_flush 服务完成此操作。

但是,在关闭 TFTP 服务器后,如果应用程序不能进一步用于 FileX 媒体,则应该使用 fx_media_close 服务关闭媒体。 这会将文件数据刷新回 TFTP 客户端磁盘,关闭打开的文件并将目录信息更新到媒体。

本章的“小型示例”部分对此作了演示。

用于更新 FileX 媒体的第三个选项通过 FX_FAULT_TOLERANT 或 FX_FAULT_TOLERANT_DATA 选项编译 FileX 库,而不是显式使用 FileX 服务。 如果已定义,FileX 会自动将写入请求传递到媒体驱动程序。 这些选项可能会限制性能,但可以提供更大的保护,防止丢失文件数据或丢失群集。 有关此和 FileX 的常规详细信息,请参阅 Express 逻辑 FileX 用户指南。

TFTP 多线程支持

可以从多个线程同时调用 NetX Duo TFTP 客户端服务。 但是,对于特定 TFTP 客户端实例的读取或写入请求应通过同一个线程依次执行。

TFTP RFC

NetX Duo TFTP 符合 RFC1350 和相关 RFC。