一、前言说明
tftp(Trivial File Transfer Protocol,文件传输协议),是tcp/ip簇中用于客户端和服务端之间进行简单文件交互传输的协议。
下面就tftp的几个知识点进行列举说明:
- 1、 tftp协议的端口号定为69;
- 2、只支持从服务器上获得或写入文件,不能列出目录,也不能进行认证;
- 3、传输时以8位数据为最小单位,每个包定长512个字节,如果不足512字节则表示数据已经传至最后一个包;
- 4、tftp的3种传输模式:netascii(8位的ASCII码形式),octet(8位源数据类型),mail(已不支持)。
!!!本文以octet模式为例进行说明。 - 5、tftp代码中使用UDP。
接下来依次介绍tftp的通讯流程以及代码实现进行tftp的认识和了解。
二、tftp的通讯流程
那么tftp又与UDP有什么改进?服务端和客户端之间又是怎么一个通信流程呢?
2.1、tftp对udp协议的改进
2.1.1、说明
简单来说,TFTP就是在UDP的基础上增加了一个通信协议,该通信协议严格遵守一方发另一方必须答的原则。也就是说WRQ和DATA包由ACK或ERROR数据包确认,而RRQ数据包由DATA或ERROR数据包确认。
同时需要注意的是,TFTP发送端使用的端口号固定为69。
那么什么是WRQ包,RRQ数据包,DATA包,ACK包和ERROR包呢?
2.1.2、WRQ包
WRQ包指的是Write request,即写入请求包。是发送方发起与接收方通信的初始包,作用是发送方向接收方发送写入数据的请求。其数据包的格式为:
其中:
- 1、Opcode:表示该包类型的代码值,这里为WRQ,其代码值为2;
- 2、Filename:表示需要写入的文件名;
- 3、Mode:Mode:根据上面的传输模式,可以填的内容有:”netascii”,”octet”和”mail”,这里名称不分大小写。
2.1.2、RRQ包
RRQ包指的是Read request,即读取请求包。与WRQ一样也是发送方与接收方开始通信的初始包,作用是向接收发发送读取一个文件的请求。其数据格式与WQR一致。唯一的区别就是Opcode的代码值为1。
2.1.3、DATA包
顾名思义DATA包表示的即为数据包,包中含有发送与接收两方的通信时传输的数据内容。DATA包的格式为:
其中:
- 1、Opcode:代表数据的代码值,其值为3;
- 2、Block:代表数据块序号。这里值得一提的是,TFTP中在传输数据时通过这里的数据块序号来判断数据是否有丢失,如果接收方得到的DATA包中的序号不是之前一个DATA包中序号值加1,那么就判断为接收到的数据包有误,返回ERROR包让发送方重新发送。数据块序号从最开始的1开始累加;
- 3、Data:表示数据段,包含传输的数据内容。在TFTP中需要特别注意的是,TFTP根据Data中的数据长度是否小于512字节来判断这一次接收到的数据包是否是最后一个,如果Data段中的数据小于512字节则判断为传输的最后一个包。
2.1.4、ACK包
ACK是体现TFTP协议的重要部分。因为TFTP协议必须要一发一答,所以ACK包用于应答正确的WRQ包和DATA包。其格式为:
Opcode:表示ACk的代码值,值为4;
Block:表示数据块序号,应答WRQ时使用的数据块序号为0,应答DATA时数据块由1开始依次往上累加以确认数据包是否有漏传。
2.1.5、ERROR包
错误包在TFTP中用于应答以上任何出错的类型包。该包中包含出错信息,以供调试人员调试。格式如下:
其中:
- 1、Opcode:ERROR的代码值,其值为5;
-
2、ErrorCode:错误代码值;
1—->文件未找到;
2—->访问非法;
3—->磁盘满或超过分配的配额;
4—->非法的TFTP操作;
5—->未知的传输ID;
6—->文件已经存在;
7—->没有类似的用户; - 3、ErrMsg:错误信息。
至此,TFTP中在UDP上改进的所有包都已经介绍完,接下来介绍这些包的使用,怎么将这些包的一发一答组成TFTP协议。
2.2、TFTP中服务端和客户端间的通讯流程
这一模块主要进行说明读取文件请求和写入文件请求两种情况下发送方和接收方对上面5种类型包的使用,从而实现TFTP协议的传输。
2.2.1、读取文件请求流程
2.2.2、发送数据流程
三、tftp代码示例
TFTP的理论说明完后,下面进行代码实战的说明,说明在附件中:
(代码链接:tftp示例代码)
下一讲,我们进行tftp的进一步拓展,讨论怎么写一个tftp server与uboot中的tftp client进行通信,并实时反馈文件传输进度和文件升级进度。