一、      概述

U-boot中的TFTP用于发送较小的文件。下层使用UDP协议,发送使用UDP 69端口,每次发送的最大分组为512 Bytes。发送双方采用超时重传机制。数据传输模式为octet模式( 二进制模式 )。

在U-boot中使用tftp功能可以使用如下命令:

tftp  MemoryAddress  FileName

其中MemoryAddress为放入文件的内存首地址,FileName为传送文件的文件名(文件需放在tftp默认目录下)。

二、      使用TFTP

使用TFTP传送文件的步骤: 

1 使用时已经初始化以下变量:

NetOurIP (本机IP地址,定义在Net.c文件)

NetServerIP(TFTP服务器的IP地址,定义在Net.c文件)

BootFile (需要传送文件的文件名,定于在Tftp.c)

NetOurGatewayIP (本机的网关地址)

NetOurSubnetMask (本机子网掩码)

2 调用TftpStart 函数开始文件传送。

三、      TFTP实现

(1)客户端状态

TFTP使用一个变量TftpState来描述TFTP客户端可能的5种状态:

状态

说明

STATE_RRQ

发出读取请求,正等待批准

STATE_DATA

正在接收数据

STATE_TOO_LARGE

文件太大

STATE_BAD_MAGIC

Bad magic number

STATE_OACK

收到OACK帧

(2)包类型 

使用TFTP传送的包分为6种类型:

类型

说明

TFTP_RRQ

请求读取文件

TFTP_WRQ

请求写文件

TFTP_DATA

数据包

TFTP_ACK

确认包

TFTP_ERROR

包含出错信息的包

TFTP_OACK

option acknowledge,当服务器超时未收到客户端的ACK帧时,主动发出一个OACK帧

(3)各种包结构 

TFTP协议中各种包的结构:


图1.TFTP协议中包结构

具体到U-boot中客户端发送的各种包的结构:

RRQ(请求读的包的结构):

TFTP_RRQ(包的类型)

请求文件名

0

“octet”(传输模式)

0

“timeout”(超时重传机制)

0

TIMEOUT(超时重传等待时间)

ACK(确认帧)结构:

TFTP_ACK

确认的包的编号

(4)主要函数及作用 

U-boot中与tftp协议有关的文件有tftp.c与tftp.h文件,主要函数包括:

static __inline__ void

store_block (unsigned block, uchar * src, unsigned len);

/* 根据预先设定的地址load_addr决定将首地址为src,长度为len的block个数据块写入flash 或写入内存*/

static void

TftpSend (void) ;

/* 根据TftpState变量的不同值发送不同的 Tftp包 (使用UDP协议发送) */

static void

TftpHandler (uchar * pkt, unsigned dest, unsigned src, unsigned len) ;

/* 处理收到的Tftp包 */

static void

TftpTimeout (void);

/* 超时处理函数 */

void

TftpStart (void);

/* 初始化各个需要的数据 然后开始发送TFTP读请求 */

(5) 流程 

TFTP总体流程:

首先客户端发出读写请求。如果服务器批准此请求,则打开连接,并第一个数据包。客户端收到数据包后发回确认,而服务器发出下一个数据包以前必须得到客户对上一个数据包的确认。如果数据包在传输过程中丢失,服务器方会在超时后重新传输最后一个未被确认的数据包。

发送的数据包一般为512字节,如果一个数据包小于 512 字节,则表示这个包是最后一个包,如果发送的数据正好是 512 的整数倍,发送完后再发一个空包。

客户端程序流程:

<1>客户端设定NetOurIP 、NetServerIP、BootFile 变量的值。

<2>调用TftpStart函数,TftpStart函数完成如下的6步工作:

1若BootFile为空,则使用默认文件名;否则使用BootFile为传送的文件名。

2比较客户端和服务器的子网地址,判断两者是否在同一个子网内。

3设定超时处理函数为TftpTimeout 。

4设置处理接收到的TFTP包的函数为TftpHandler。

5初始化服务器端口、本机端口、超时次数为0、初始状态为RRQ

6调用TftpSend函数发送TFTP读取请求。

<3> TftpSend函数根据TftpState 发送不同的包,同时TftpHandler函数根据包的类型和当前客户端的状态(TftpState) 处理接收到的包。


图2.TFTP流程

过程

最新文章

  1. 构建自己的PHP框架--实现Model类(2)
  2. transformjs:让天下没有难做的生意!不对,是特效!
  3. nginx(4、缓存)
  4. [git]git 分支
  5. 在Linux下写一个简单的驱动程序
  6. cookie转CookieCollection
  7. Oracle函数面试题
  8. C语言--函数
  9. Echarts数据可视化series-radar雷达图,开发全解+完美注释
  10. LeetCode(117):填充同一层的兄弟节点 II
  11. Centos 6.9下部署Oracle 11G数据库环境的操作记录
  12. awk、sed、grep三大shell文本处理工具之grep的应用
  13. NC 5的开发环境起不了客户端
  14. 菜鸟调错(五)——jetty运行时无法保存文件
  15. 牛客第六场 J.Heritage of skywalkert(On求前k大)
  16. Git配置用户名密码
  17. linux菜鸟笔记
  18. mp4网页播放代码,有声音无图像的解决办法~
  19. $.each $.map 和 $().each $().map
  20. 线程及同步的性能 – 线程池/ ThreadPoolExecutors/ ForkJoinPool

热门文章

  1. mysql only_full_group_by
  2. 吴裕雄--天生自然 PYTHON3开发学习:函数
  3. 吴裕雄--天生自然 PYTHON3开发学习:循环语句
  4. 黑马eesy_15 Vue:04.综合案例(前端Vue实现)
  5. linux epoll 任务队列多线程模型
  6. iso镜像文件的挂载和yum库的搭建
  7. dw通过iis运行asp网站总结
  8. 吴裕雄--天生自然 JAVA开发学习:序列化
  9. 绿洲作业第一周 - 美术Art work
  10. 隐马尔可夫随机场HMM