
TFP下载抓包分析test.txt octet blksize 1024 timeout 5 tsize 0 0浍喃00 01 74 65 73 74 2E 74 78 74 00 6F 63 74 65 7400 62 6C 6B 73 69 7A 65 00 31 30 32 34 00 74 696D 65 6F 75 74 00 35 00 74 73 69 7A 65 00 30 0030 E4 AB 02 10 E0 AB 02服务器回应blksize 1024 timeout 5 tsize 10 TTP/1.100 06 62 6C 6B 73 69 7A 65 00 31 30 32 34 00 7469 6D 65 6F 75 74 00 35 00 74 73 69 7A 65 00 3130 00 54 54 50 2F 31 2E 31 0D客户端发送00 04 00 00 00 00 00 00 00 00 00 00服务端发送文件内容00 03 00 01 31 31 32 32 33 31 31 32 32 33 00 0000 00 00 00 00 00客户端回应结束任务00 04 00 01 00 00 00 00 00 00 00 00---------------------------------------逐包完整拆解 问题定位你这条抓包有两处明显异常前置 TFTP 操作码定义0x01 RRQ下载请求0x03 DATA文件数据块0x04 ACK确认块0x06 OACK扩展协商应答第 1 包客户端 → MCU 69 端口 RRQ 下载请求十六进制开头00 01内容结构00作为字符串分隔符plaintexttest.txt\0 octet\0 blksize\01024\0 timeout\05\0 tsize\00\0含义客户端要下载test.txt二进制 octet 模式协商参数单块 1024 字节、超时 5 秒tsize 0下载场景客户端不知道文件大小填 0尾部乱码30 E4 AB 02 10 E0 AB 02是包末尾多余垃圾字节无关协议。产生扩展参数原因你代码里设置了transfer.BlockSize 1024TFTP.Net 1.3 只要指定块大小就自动带上 blksize/timeout/tsize无法关闭。第 2 包MCU 随机端口 → 客户端 OACK00 06协商应答plaintextblksize\01024\0 timeout\05\0 tsize\010\0MCU 告知客户端同意使用 1024 块、5 秒超时并且我本地这个文件总大小是10 字节。严重异常点末尾多出TTP/1.1\r垃圾文本正常 OACK 包只包含三组 key-value你报文尾部多了54 54 50 2F 31 2E 31 0DTTP/1.1\r原因单片机发送 UDP 数据包时缓冲区未清空残留了 HTTP 协议字符串污染 TFTP 包。后果部分严格 TFTP 客户端会解析失败、直接超时断开必须修复 MCU 发包缓冲区逻辑。第 3 包客户端 → MCU ACK 0 号块00 04 00 00收到 OACK 之后客户端回复 ACK 0表示认可协商参数等待服务端下发文件数据块。第 4 包MCU → 客户端 DATA 块 100 03 00 0100 03 DATA 包00 01 块编号 1后面31 31 32 32 33...就是文件原始二进制内容总长 10 字节不足 1024代表文件末尾。第 5 包客户端 → MCU ACK 块 100 04 00 01客户端确认完整收到第 1 块数据文件只有 10 字节仅此一块传输直接结束。整体完整交互流程梳理PC 发 RRQ请求下载 test.txt协商 1024 块、5s 超时MCU 回 OACK确认参数告知文件大小 10 字节包尾带 HTTP 垃圾字符 bugPC 回 ACK0准备接收数据MCU 发送 DATA#110 字节文件内容PC 回 ACK1传输完成两个必须修复的问题1、单片机 UDP 发送缓冲区脏数据OACK 尾部多出 TTP/1.1MCU 发送 OACK 前必须清空发送缓存数组不要复用同时处理 HTTP 的缓冲区复用缓冲区且未清零上次 HTTP 数据残留混入 TFTP UDP 包会导致兼容性故障。2、客户端强制产生扩展协商的规避方案只要写了BlockSize1024就会带 OACK方案 A推荐无扩展、无 OACK 包删除transfer.BlockSize 1024使用协议默认 512 字节块此时 RRQ 仅包含test.txt\0 octet\0无 blksize/tsizeMCU 不用处理 06 操作码。TransferMode Octet 删掉 BlockSize 赋值不要手动指定块大小方案 B必须 1024 块只能修改 MCU 代码兼容 OACKMCU 解析 RRQ 逻辑修改先读取文件名读到第一个 0x00再读取 mode 字符串读到第二个 0x00循环向后读取key\0value\0键值对全部丢弃直到整个 UDP 包读完增加0x06 OACK操作码分支能正常组装并回复 OACK 包对比 HTTP 的优势再次凸显HTTP 不存在 UDP 缓冲区复用污染、OACK 协商、端口切换、块确认这套复杂流程TCP 流式收发缓冲区隔离简单不会出现协议数据互相串扰的 bug开发调试成本低非常多。