1. TFTP协议概述
TFTP(Trivial File Transfer Protocol)是一种轻量级的文件传输协议,专为资源受限的嵌入式系统和网络设备设计。作为一名嵌入式开发工程师,我经常在路由器固件升级和单片机程序烧录场景中使用TFTP。与FTP相比,TFTP最大的特点是完全基于UDP协议实现,协议栈内存占用通常不超过10KB,这使得它能够在仅有几十KB内存的嵌入式设备上稳定运行。
在嵌入式开发中,我们选择TFTP通常基于三个核心考量:
- 协议实现简单,适合资源受限的MCU(如STM32F103系列)
- 无需复杂的安全认证,适合封闭的本地网络环境
- 支持块传输和重传机制,保证基础的文件传输可靠性
注意:由于缺乏加密机制,TFTP绝对不能在互联网环境下传输敏感数据。我们在工业现场使用时,会配合物理隔离的专用网络。
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. TFTP协议工作原理详解
2.1 协议通信流程
TFTP采用典型的请求-响应模式,整个传输过程包含五种类型的报文:
- RRQ(读请求):客户端发起文件读取请求
- WRQ(写请求):客户端发起文件写入请求
- DATA(数据包):包含512字节文件数据
- ACK(确认):对接收数据块的确认
- ERROR(错误):传输异常通知
以固件升级为例的典型交互流程:
bash复制设备端 -> 服务器: RRQ "firmware.bin" (opcode=1)
服务器 -> 设备端: DATA block#1 (opcode=3)
设备端 -> 服务器: ACK block#1 (opcode=4)
服务器 -> 设备端: DATA block#2
设备端 -> 服务器: ACK block#2
...
服务器 -> 设备端: DATA block#N (size<512表示结束)
2.2 超时与重传机制
由于UDP不可靠的特性,TFTP实现了应用层的可靠性保障:
- 默认等待ACK超时时间为5秒(可配置)
- 最大重传次数通常设为5次
- 采用"锁步协议"(每个DATA必须收到对应ACK后才发下一个)
在STM32实现时,我通常会这样处理超时:
c复制#define TFTP_TIMEOUT 5000 // 5秒超时
uint32_t last_send_t
