3、TFTP协议:TFTP工作原理、TFTP与FTP的区别、TFTP报文格式、TFTP的可靠性机制(超时重传)

聊到网络启动,TFTP 是个绕不开的老伙计。说白了,它就是 FTP 的“轻量版”,专门为那些资源紧张的场景设计的。我最早接触它是在调试嵌入式设备的时候,那会儿板子上的内存小得可怜,跑个完整的 FTP 服务器简直是奢望。嗯,TFTP 就是干这个的。

3.1 TFTP 工作原理

TFTP 的工作方式非常“直男”。它基于 UDP 协议,端口号固定是 69。整个传输过程分为三步:建立连接、数据传输、连接终止。

你想想看,它不像 TCP 那样需要三次握手。客户端直接发一个读请求(RRQ)或写请求(WRQ)给服务器。服务器收到后,直接开始传数据。整个过程就像两个人面对面喊话——简单粗暴。

核心流程:

  • 客户端发送 RRQ/WRQ 到服务器 69 端口
  • 服务器分配一个临时端口(通常是 69 以上的随机端口)进行数据传输
  • 数据以 512 字节为一块进行传输
  • 最后一块数据如果小于 512 字节,表示传输结束

这里有个细节我提醒你注意:TFTP 的每个数据包都需要确认。发一块,等一个 ACK,再发下一块。这跟 TCP 的滑动窗口完全不同,效率虽然低,但在网络启动这种简单场景下完全够用。

3.2 TFTP 与 FTP 的区别

很多新手容易把这两个搞混。我当年也犯过这个错——在项目里用 TFTP 传大文件,结果慢得让人抓狂。后来才明白,这两个协议的设计初衷就完全不同。

对比项 TFTP FTP
传输层协议 UDP(无连接) TCP(面向连接)
端口号 69 20(数据)、21(控制)
认证机制 无 用户名/密码
传输效率 低(停等协议) 高(滑动窗口)
适用场景 网络启动、嵌入式设备 文件服务器、大文件传输
可靠性 超时重传(应用层实现) TCP 保证

我个人习惯这样区分:FTP 是“正规军”,功能全面但开销大;TFTP 是“游击队”,轻装上阵但能力有限。你想想看,PXE 网络启动为什么选 TFTP?因为那时候客户端连操作系统都没有,哪来的 FTP 客户端库?

3.3 TFTP 报文格式

TFTP 的报文结构非常简洁。一共就五种报文类型:RRQ(读请求)、WRQ(写请求)、DATA(数据)、ACK(确认)、ERROR(错误)。

咱们直接看报文格式:

操作码(2字节) + 内容(可变长度)

操作码定义:
01 - RRQ(读请求)
02 - WRQ(写请求)
03 - DATA(数据)
04 - ACK(确认)
05 - ERROR(错误)

RRQ/WRQ 格式:
操作码 | 文件名(字符串) | 0 | 模式(字符串) | 0

DATA 格式:
操作码 | 块编号(2字节) | 数据(0-512字节)

ACK 格式:
操作码 | 块编号(2字节)

ERROR 格式:
操作码 | 错误码(2字节) | 错误信息(字符串) | 0

实战经验:我曾经调试过一个奇怪的问题——TFTP 传输到一半总是卡住。抓包一看,发现是文件名末尾的 0 字节被截断了。TFTP 对字符串的终止符非常敏感,少一个 0 字节,整个请求就解析失败。所以写代码时一定要记得在文件名后面补上 \0。

3.4 TFTP 的可靠性机制(超时重传)

TFTP 跑在 UDP 上,UDP 本身不保证可靠传输。那 TFTP 怎么保证数据不丢?答案就是——超时重传。

它的机制其实很简单:

  1. 发送方发出一个数据块后,启动一个定时器
  2. 如果在规定时间内收到 ACK,就发下一块
  3. 如果超时没收到 ACK,就重传当前数据块
  4. 重传次数有限制(通常是 5 次),超过就报错终止

为什么会这样设计?因为 TFTP 的“停等协议”决定了它一次只能处理一个数据块。你想想看,如果发出去 10 块数据,其中第 5 块丢了,接收方怎么知道该确认哪一块?所以干脆简单点——发一块,等一块。

避坑指南:我曾经在项目中遇到过一个问题——TFTP 传输大文件时频繁超时重传。排查后发现是网络中存在丢包,而 TFTP 的超时时间默认是 5 秒。对于高延迟链路,这个时间太短了。我的建议是:如果要在跨网段场景下用 TFTP,适当调大超时时间,或者干脆换 FTP。

另外,TFTP 还有一个“魔术数字”——块编号从 1 开始,到 65535 循环。如果文件大到需要超过 65535 个块,块编号会回绕。嗯,这里要注意:有些老旧的 TFTP 实现处理不好回绕,会导致传输失败。所以 TFTP 更适合传小文件,比如 PXE 启动用的内核镜像和 initrd。

3.5 TFTP 知识体系图

下面这张图帮你理清 TFTP 的核心脉络:

TFTP 协议 工作原理 基于 UDP,端口 69 RRQ/WRQ → DATA → ACK 512 字节数据块 与 FTP 的区别 UDP vs TCP 无认证 vs 用户名密码 轻量 vs 功能丰富 报文格式 5 种操作码 RRQ/WRQ/DATA/ACK/ERROR 字符串以 0 结尾 可靠性机制(超时重传) 停等协议:发一块等一块 超时重传,默认 5 秒 重传上限 5 次 块编号 1-65535 循环

这张图把 TFTP 的四个核心知识点串起来了。你从上往下看:TFTP 基于 UDP 工作,报文格式简单,与 FTP 各有侧重,可靠性靠超时重传来保证。每个环节都环环相扣。

个人建议:如果你在配置 PXE 网络启动环境,TFTP 服务器建议用 dnsmasq 或者 tftp-hpa。这两个实现都很成熟,对 RFC 1350 的兼容性最好。我踩过坑——有些第三方 TFTP 服务器对块编号回绕的处理有问题,传大文件时会莫名其妙中断。

好了,TFTP 的核心内容就这些。它虽然简单,但在网络启动这个领域里,地位无可替代。你想想看,没有 TFTP,PXE 启动的第一步——下载引导程序——都完成不了。所以别看它老,它可一点都不落伍。

可可精品资料库