找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 7405|回复: 0
打印 上一主题 下一主题
收起左侧

TFTP简单文件服务 工作原理及测试 :-)

[复制链接]
跳转到指定楼层
楼主
ID:91350 发表于 2015-10-30 11:44 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
   


这几年一直以来从未做过什么TCP UDP更上一层的应用,HTTP早在N年前碰过之后再也不想碰了。前几天搞定了嵌入式文件系统之后,就开始了TFTP的文件传输。诚然我还是“拿来主义”get了一个tftp文件,然后加入工程中把文件系统的接口弄好,就开始阅读源代码和测试。

我不否认自己写,更不否认拿来主义,只要是可以用稳定都可吧。拿来主义就是一点不好,有些实现看不懂看不到。自己写的好处在于每个环节尽在自己掌握了。不过拿来主义可以提高对代码的阅读能力和效率。一旦看透了作者的意图基本就变成了自己的东西了。难分伯仲。

一、TFTP的工作原理:
1、建立一个UDP使他在69端口监听。(我一度认为TFTP就是在69上传输的,其实并不是)
2、建立一个对69端口数据的解析函数。process_tftp_request
3、解析69端口的数据,取出文件名和是什么请求(读/写文件)
4、建立一个用于传输文件的UDP端口(测试时最好绑定到指定端口,以观察控制块的状态)
5、分别处理读文件和写文件。(以读文件为例子)
6、利用文件系统打开总目录。然后搜索这个文件,文件有则打开。
7、建立一个TFTP控制块,主要控制文件块的大小。并从文件中读取512字节,发送第一块512字节的数据到客户端。
8、等待客户端的ACK确认和序号匹配。然则继续发送下一块512字节的数据。
9、重复8,直到读出的块的大小小于512字节,此时文件已经读取完毕了,因为小于512字节了/发送出去LAST
10、等待LAST的ACK之后确认LAST就好。
11、杀掉文件传输控制块,释放TFTP控制块。
12、结束

显然TFTP并不是在69上传文件,而是使用别的随机的端口传输,69只是负责取出请求类型和文件名。

二、问题和解决
1、测试中主要发现在4-8M压力测试时TFTP不能正常相应。压力撤出后TFTP无法使用。
2、69端口并发资源消耗。是其他的需要内存的得不到内存。
针对两种问题,进行分别的限制,
第一种问题最后证实是TFTP没有加超时机制,
1)、造成问题的原因是控制块在进行收发时没有对ACK进行检测,我在程序ACK的回复上加上了时隙采样,
添加250MS的trm函数对ACK进行检测。如果正常则超时事件发生,如果客户端和服务器之间的通信收到某种
原因的打断则报告超时事件。
2)、超时事件的处理上纠结了一些时间,最后的解决办法是第一步向客户端发送一帧timeoutTFT错误帧,然后
关闭文件流UDP端口,再释放控制块。最后注册回调函数到69端口。
第二种问题要限制连接服务器的客户端数量。
1)、69端口是否有数据,如果有数据则注销69端口的回调函数为NULL,
2)、进行正常的TFTP操作和处理。
3)、TFTP传输完毕后重新注册69的回调函数,
这样就可以避免当一台主机在传输文件,又来了一个连接造成的资源损耗,保证TFTP是独享的。

三、测试
1、硬件连接:CPU外接2G TF卡+100/10M 以太网+2*DS18B20
1)、2只1820负载采集温度数据写入文件中
2)、UDP打印出来\TCP作为命令解析和控制 使用TFTP下载TF卡上的温度表文件。
2、CMD命令


tftp -i IP[addr] GET/PUT filename
3、连接建立

4、第一块文件数据流开始下载

5、客户端对第一块数据的ACK

6、最后一块数据接收

7、最后一块数据ACK接收确认

8、PC下载文件结束

9、确认异常(最后一条就是加入TIMEOUT后的报告)


10、下载速度(和CPU主频、文件系统的IO、驱动程序IO、还有网络环境诸多因素有关,其中网络因素是主变量了,最高到过200K看来已经极限,局域网传点小型文件够用了。)
路由器小局域网

公司局域网


四、后续接口和pull request
1)、完善一下和文件系统的接口,独立出来方便接入不同的文件系统。
2)、文件说明和函数搞一下,(我是野路子)
3)、提交共享代码。让更多人一起测试一起找BUG/微笑

谨以此文送给最近郁闷的老王!!! /微笑



分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖 顶 踩
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表