TFTP协议介绍(细)

TFTF协议简介

TFTP(Trivial File Transfer Protocol,简单文件传输协议)是TCP/IP协议族中的一个用来在客户机与服务器之间进行简单文件传输的协议,提供不复杂、开销不大的文件传输服务,端口号为69。
TFTP通常基于UDP协议而实现,但是也不能确定有些TFTP协议是基于其它传输协议完成的。TFTP协议的设计目的主要是为了进行小文件传输,因此它不具备通常的FTP的许多功能,例如,它只能从文件服务器上获得或写入文件,不能列出目录,不进行认证。
TFTP代码所占的内存较小,这对于较小的计算机或者某些特殊用途的设备来说是很重要的,这些设备不需要硬盘,只需要固化了TFTP、UDP和IP的小容量只读存储器即可。因此,随着嵌入式设备在网络设备中所占的比例的不断提升,TFTP协议被越来越广泛的使用。

TFTP包格式

TFTP共定义了五种类型的包,包的类型由数据包前两个字节确定,我们称之为Opcode(操作码)字段。这五种类型的数据包分别是:

  • 读文件请求包:Read request,简写为RRQ,对应Opcode字段值为1
  • 写文件请求包:Write requst,简写为WRQ,对应Opcode字段值为2
  • 文件数据包:Data,简写为DATA,对应Opcode字段值为3
  • 回应包:Acknowledgement,简写为ACK,对应Opcode字段值为4
  • 错误信息包:Error,简写为ERROR,对应Opcode字段值为5

RRQ和WRQ的数据包格式一样,只不过某些值域设置有差别,剩下的三种数据包格式各不相同。

1.读/写请求包

RRQ和WRQ数据包的格式:

  1. 操作码(2字节),它用来表示当前数据包的类型(取值1表示该数据包是个读请求,2表示该数据包是写请求);
  2. 可变长字段,它用来表示要读取或上传的文件名,它使用ASCII码并以0表示结尾;
  3. Mode,也是可变长字段,用来表示传输文件的数据类型,如果传输的是字符串文件,那么它填写字符串”netascii”,如果传输的是二进制文件,那么它填写字符串”octet”,这些字符串都以0结尾。

其结构如图:

2.文件数据包

传输数据块的DATA数据包,它头2字节也是操作码,取值3用于表示数据包用于数据块传输,接下来的2字节用于表示数据块编号,最后是可变长字段Data,用于装载数据块。

3.回应包

应答ACK数据包,它开始的2字节也是操作码,取值4;接下来2字节表示接收到的数据块编号,

4.错误信息包

错误ERROR数据包,它开始的2字节表示操作码,取值5;接下来2字节表示错误码;最后的是可变长字段,它用字符串的形式描述具体错误。

TFTP的工作流程

TFTP的工作都是由客户端发起一个RRQ或者WRQ开始的。这里以WRQ(写请求)为例,讲述读写的工作过程,以及错误处理等内容。
S表示Server,C表示Client,主要工作过程如下:

  • S在端口为69的UDP上等待C发出写文件请求包
  • C通过UDP发送符合TFTP请求格式的WRQ包给S。从UDP包角度看,该UDP包的源端口由C随意选择,而目标端口则是S的69。
  • S收到C的这个请求包后,需发送ACK给C。对于写请求包,S发送的ACK包确认号为0。
  • C发送DATA数据给S,S接收数据并写文件
  • 当C发送的DATA数据长度小于512字节时,S认为这次WRQ请求完成
  • 当为RRQ请求时,刚好相反

同时,当有多个C向S请求时,在TFTP中,一次请求中所有包的源和目标都由Transfer ID TID来标示。TFTP规定TID值就是UDP包中的源和目标端口。也就是说,一次请求过程中,S和C通过UDP包的源和目标端口来判断这个包是不是发给自己的。

另外,S对于每个请求,都要采用一个不重复的新的UDP端口号作为它的TID,也就是说,S上同时存在的n个请求的TID都将不同。

这里再介绍下TFTP的回复ACK机制。虽然TFTP中有指定的ACK包作为回应,但在普遍意义上,DATA包和ERROR包都可以作为上一次发送包的响应。

一般来说,C发送了一个非结束DATA包给S,如果在超时时间内,C未收到S发送的ACK,则C继续发送这个DATA直到S回复ACK。这种情况是比较好理解的。

但假如S回复了上一个非结束DATA包ACK后,C在S的超时时间内没有发送下一个DATA包,则S将继续发送这个ACK。从这个角度看,S等待的这个新DATA包是对上一次ACK的确认。

TFTP主要工作流程如下图(WRQ)

TFTP的传输模式 

TFTP传输8位数据,传输中有三种模式:

  • Netascii:这是8位的ASCII码形式,一般用来传输字符数据;
  • Octet:这是8位源数据类型,一般用来传输二进制数据;
  • Mail:它将返回的数据直接返回给用户而不是保存为文件,但该模式已经不再支持。

参考链接:

https://blog.csdn.net/qq_45740212/article/details/113034164

猜你喜欢

转载自blog.csdn.net/u012206617/article/details/128153025
今日推荐