U-boot中TFTP 解释

简介: 一、      概述       U-boot中的TFTP用于发送较小的文件。下层使用UDP协议,发送使用UDP 69端口,每次发送的最大分组为512 Bytes。发送双方采用超时重传机制。

一、      概述

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

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

            tftp  MemoryAddress  FileName

    其中MemoryAddress为放入文件的内存首地址,FileName为传送文件的文件名

二、      使用TFTP

使用TFTP传送文件的步骤: 

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

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

NetServerIPTFTP服务器的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协议中各种包的结构:

img_96016eeffa2bb875a548a21dd2dff124.jpg
1.TFTP协议中包结构


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

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

TFTP_RRQ(包的类型)

请求文件名

0

“octet”(传输模式)

0

“timeout”(超时重传机制)

0

TIMEOUT(超时重传等待时间)

 

ACK(确认帧)结构:

TFTP_ACK

确认的包的编号

(4)主要函数及作用 

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

static __inline__ void store_block (unsigned block, uchar * src, unsigned len);

/* 根据预先设定的地址load_addr决定将首地址为src,长度为lenblock个数据块写入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 的整数倍,发送完后再发一个空包。

客户端程序流程:

客户端设定NetOurIP NetServerIPBootFile 变量的值。

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

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

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

3设定超时处理函数为TftpTimeout

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

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

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

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

 

img_cd236e6863f9d5eb0f7f3565dae03e43.jpg
2.TFTP流程

相关实践学习
深入解析Docker容器化技术
Docker是一个开源的应用容器引擎,让开发者可以打包他们的应用以及依赖包到一个可移植的容器中,然后发布到任何流行的Linux机器上,也可以实现虚拟化,容器是完全使用沙箱机制,相互之间不会有任何接口。Docker是世界领先的软件容器平台。开发人员利用Docker可以消除协作编码时“在我的机器上可正常工作”的问题。运维人员利用Docker可以在隔离容器中并行运行和管理应用,获得更好的计算密度。企业利用Docker可以构建敏捷的软件交付管道,以更快的速度、更高的安全性和可靠的信誉为Linux和Windows Server应用发布新功能。 在本套课程中,我们将全面的讲解Docker技术栈,从环境安装到容器、镜像操作以及生产环境如何部署开发的微服务应用。本课程由黑马程序员提供。     相关的阿里云产品:容器服务 ACK 容器服务 Kubernetes 版(简称 ACK)提供高性能可伸缩的容器应用管理能力,支持企业级容器化应用的全生命周期管理。整合阿里云虚拟化、存储、网络和安全能力,打造云端最佳容器化应用运行环境。 了解产品详情: https://www.aliyun.com/product/kubernetes
目录
相关文章
|
Linux C语言 Windows
荔枝派Zero(全志V3S)一键镜像烧录(windows和linux下)
搞到了一块荔枝派Zero,其CPU为全志V3S, ARM Cortex-A7, 最高1.2GHz,不得不说这小东西能达到这么高的主频真是让我大为震撼,废话不多说,先让其跑起来,证明板子是好的
1240 0
|
前端开发 算法 数据安全/隐私保护
在前端对登录密码进行加密,md5+盐值
在前端对登录密码进行加密,md5+盐值
1110 0
|
7月前
|
监控 Linux 调度
【赵渝强老师】Docker容器的资源管理机制
本文介绍了Linux CGroup技术及其在Docker资源管理中的应用。通过实例演示了如何利用CGroup限制应用程序的CPU、内存和I/O带宽使用,实现系统资源的精细化控制,帮助理解Docker底层资源限制机制。
699 7
|
网络协议 网络安全 网络架构
不会这10个抓包技巧,就不要在网工圈里混了!
不会这10个抓包技巧,就不要在网工圈里混了!
871 1
|
算法 Linux 调度
Docker的资源限制实战篇
本文详细介绍了如何利用Docker对容器的资源进行限制,包括内存和CPU的使用。文章首先概述了资源限制的重要性及其在Linux系统中的实现原理,并强调了不当设置可能导致的风险。接着,通过一系列实战案例展示了如何具体设置容器的内存限制,包括硬性限制、动态调整以及软限制等。最后,文章还提供了限制容器CPU访问的具体方法和示例,如指定容器使用的CPU核心数和基于`--cpu-shares`参数对CPU资源进行分配。通过这些实践,读者可以更好地理解和掌握Docker资源管理技巧。
1435 14
Docker的资源限制实战篇
|
存储 Java 数据库
密码专辑:对密码加盐加密,对密码进行md5加密,封装成密码工具类
这篇文章介绍了如何在Java中通过加盐和加密算法(如MD5和SHA)安全地存储密码,并提供了一个密码工具类PasswordUtils和密码编码类PasswordEncoder的实现示例。
538 10
密码专辑:对密码加盐加密,对密码进行md5加密,封装成密码工具类
|
安全 Linux 网络安全
使用D盾扫描Linux主机Webshell
使用D盾扫描Linux主机Webshell
1050 0
使用D盾扫描Linux主机Webshell
|
开发框架 Java .NET
Webshell分类
Webshell分类
367 2
|
缓存 Linux iOS开发
【C/C++ 集成内存调试、内存泄漏检测和性能分析的工具 Valgrind 】Linux 下 Valgrind 工具的全面使用指南
【C/C++ 集成内存调试、内存泄漏检测和性能分析的工具 Valgrind 】Linux 下 Valgrind 工具的全面使用指南
3099 1
|
关系型数据库 MySQL Shell
深入了解Linux /etc/passwd文件
深入了解Linux /etc/passwd文件
1331 0

热门文章

最新文章