1 协议介绍:
TFTP (TrivialFileTransferProtocol,简单文件传输协议也称小型文件传输协议)
是一种于1981年在RFC 783中定义的简化的文件传输协议(FTP)。
小型文件传输协议非常简单,透过少量存储器就能轻松实现——这在当时是很重要的考虑因素。所以TFTP被用于引导计算机,例如没有大容量存储器的路由器。现在它仍然被用于在一个网络上主机之间传输小文件,例如从一台网络主机或服务器引导一个远程X Window System终端或其他的瘦客户端。
小型文件传输协议部分基于更早期的文件传输协议,文件传输协议是通用分组协议(PUP Protocol)中的一部分。在TCP/IP协议组早期的工作中,TFTP往往是在一个新的主机类型上首先完成的协议——因为其非常的简单。
最早的小型文件传输协议版本是在RFC 1350之前,显示出相当糟糕的协议缺陷,发现的时候被称为魔术新手症候群。
详细信息:
使用UDP(端口69)作为其传输协议(不像FTP使用TCP端口21)。不能列出目录内容。无验证或加密机制。被用于在远程服务器上读取或写入文件。支持三种不同的传输模式:"netascii","octet"和"mail",前两种符合FTP协议中的"ASCII"和"image(binary)"模式;第三种从来很少使用,当前已经废弃。
因为小型文件传输协议使用UDP协议,就必须自己支持传输和会话的控制。每个通过TFTP传输的文件构成了一个独立的交换。此传输表现为步锁,任何时间网络上仅仅传递一个包(一个数据块或一个首部确认)。由于缺少窗口切换技术,TFTP在有很多潜在连接的情况下仅提供较低的吞吐量。
由于小型文件传输协议缺少安全性,在开放式因特网上传输非常危险,所以普遍仅仅用于私人本地网络。当前TFTP常用于PXE无盘启动,网络设备的设置等。
选项协商后来加到协议中(RFC 2347),已经被协定的选项能对协议的操作进行轻微的更改(特别是更大分块尺寸的使用使得吞吐量略有提高),但协议大体上还是保持不变的。
2 传输模式
数据的存储有不同的格式,磁盘中相同的一块数据,通过不同的存储协议解析,得到的内容是完全不同的,如:磁盘中的一个字节0x65,按照ASCII解析就是字母A,按照数据本身解析就是0x65这个数,两种解析的方式显示的内容完全不同。因此文件在传输的过程中也需要指明数据的表示方式,即传输模式。TFTP协议的传输模式如下所示:
3 协议格式
TFTP基于UDP协议实现,而UDP使用IP。因此一个TFTP包中会有如图1所示的以下几段:本地媒介头,IP头,UDP数据报头,TFTP数据报。TFTP在IP头中不指定任何数据,但是它使用UDP中的源和目标端口以及包长度域。由TFTP使用的包标记(TID)在这里被用做端口,因此TID必须介于0到65,535之间。图中显示了5种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
3.1 读写文件请求包格式
3.1.1 opc(opcode)
功能码,1代表读请求(RRQ),2代表写请求(WRQ)。
RRQ(读请求,Readrequest)报文由客户使用,用来建立一条从服务器读数据的连接。
WRQ(写请求,Writerequst)报文由客户使用,用来建立一条把数据写到服务器的连接,它的格式与RRQ相同。
3.1.2 filename
Filename(文件名字段)说明客户要读或写的位于服务器上的文件,文件名是netascii码字符,以字符串结束符0结束。
3.1.3 mode
Mode(模式字段)是一个ASCII码串netascii或octet(大小写可任意组合),表示文件传输的方式,同样以字符串结束符0结尾。
netascii表示数据是以成行的ASCII码字符组成,以两个字节—回车字符后跟换行字符(称为CR / LF)作为行结束符。
octet模式用于传输文件,这种文件在源机上以8位格式存储。
3.1.4 opt1
第一个选项,使用区分大小写的ascii字符表示,以字符串结束符0结尾。
3.1.5 val1
与第一个选项相关的值,使用区分大小写的ascii字符表示,字符串结束符0结尾。
3.1.6 optN,valN
最后一个选项/值。均是使用区分大小写的ascii字符表示,字符串结束符0结尾。
注:读写请求数据包的最大长度为512字节。
3.1.7 常用的选项
blksize协商数据块大小,默认数据块为512字节,可以协商的值为8~65464字节(RFC23480)。
timeout超时间隔,可以协商的值为1~255秒(RFC2349)。
tsize传输文件的大小(RFC2349)。
3.2 数据包格式
DATA数据包的opcode为3,它还包括有一个数据块号和数据。
数据块号域从1开始编码,每个数据块加1,这样接收方可以确定这个包是新数据还是已经接收过的数据。
数据域从0字节到512字节。如果数据域是512字节则它不是最后一个包,如果小于512字节则表示这个包是最后一个包。如果最后一个包正好为512字节,则再发送一个0字节的包用于表示结束。
扩展协议中,dada域的数据长度可以通过blksize选项协商,从8~65464均可以。如果数据小于协商值,说明这是最后一包数据。
3.3 ACK包格式
ACK包(Acknowledgement)用于确认数据包已收到,和接收到的数据包数据块号相同。ACK包的操作码为4。
当接收方收到一个数据包后,会向发送方发送一个ACK包;而发送方则会在收到一个ACK包后继续发送下一个包。若发送完未能收到ACK包,则会使用超时机制,重新发送刚才的数据包。除了ACK和用于中断的包外,其它的包均需得到确认。发出新的数据包等于确认上次的包。WRQ和DATA包由ACK或ERROR数据包确认,而RRQ数据包由DATA或ERROR数据包确认。写请求的ACK应答数据块号为0。
3.4 错误包格式
用于在失败的情况下回复对端
一个ERROR包的操作码是5。此包可以被其它任何类型的包确认,错误码指定错误的类型。它用于服务器不能处理读请求或写请求的情况。在文件传输过程中的读和写差错也会导致传送这种报文,接着停止传输。差错编号字段给出一个数字的差错码,跟着是一个ASCII表示的差错报文字段,可能包含额外的操作系统说明的信息。
错误的值和错误的意义如下:
0未定义Notdefined,seeerrormessage(ifany).
1文件找不到Filenotfound.
2拒绝访问Accessviolation.
3磁盘满了或者超出了可分配空间Diskfullorallocationexceeded.
4非法TFTP操作IllegalTFTPoperation.
5传输ID未知UnknowntransferID.
6文件不存在Filealreadyexists.
7没有该用户Nosuchuser.
3.5 OACK包格式
3.5.1 opc(opcode)
命令码为6,表示这是选项应答。
3.5.2 opt1
第一个选项应答,从请求帧中直接拷贝。
3.5.3 val1
与第一个选项相关的应答值。
3.5.4 optN,valN
最后一个选项/应答值应答对。
4 TFTP协议的缺陷
传输效率低对于超时机制没有明确说明每包长度固定为512字节,不灵活
5 参考
基于W5500的嵌入式TFTP服务器实现
//09/01/%e5%9f%ba%e4%ba%8ew5500%e7%9a%84%e5%b5%8c%e5%85%a5%e5%bc%8ftftp%e6%9c%8d%e5%8a%a1%e5%99%a8%e5%ae%9e%e7%8e%b0/
文件传输协议---TFTP
/chusiyong/p/11389442.html
TFTP协议
/mjLlm/article/details/82950639
TFTP wiki en (需要*楼*梯*)
/wiki/Trivial_File_Transfer_Protocol
TFTP wiki zh (需要*楼*梯*)
/wiki/%E5%B0%8F%E5%9E%8B%E6%96%87%E4%BB%B6%E4%BC%A0%E8%BE%93%E5%8D%8F%E8%AE%AE