ILD

tftp
作者:Herbert Yuan 邮箱:yuanjp@hust.edu.cn
发布时间:2018-6-5 站点:Inside Linux Development

标准

RFC 1350: The TFTP Protocol (Revision 2)


Purpose

TFTP是一个非常的简单的协议,用来传输文件。因此被命名为Trivial File Transfer Protocol。它实现在UDP协议之上。它只能从服务器读或者写文件。不能列出目录,也不支持用户认证。


当前支持3种模式:netascii, octet, mail。mail已经过时了,不应当实现或者使用。netascii模式,将lf->cr,lf。cr->cr, nul。


Overview

任何传输以一个请求读或者写文件开始,如果服务器授权这个请求,连接被打开,文件以固定的512字节的块传输。每个数据包包含一个块,数据包必须得到一个ack,才能开始下一次数据传输。小于512字节的数据包表示是最后一个块,将结束传输。如果一个包丢了,发送者可以重传最后一个包(可以是数据或者ACK),发送者只能保留最后一个包用来重传。


大多数错误结束连接,错误通过错误包发送。这个包不需要被ACK,也不需要重传。只有一种错误不引起结束,接收到的包的源端口不正确。此时一个错误包被发送给原主机。


Initial Connection Protocol

通过发送请求(WRQ写请求/RRQ读请求)建立一个传输。WRQ请求,服务器回复一个ACK。RRQ请求,服务器回复第一个数据块。ACK包含一个block number,表示要确认的数据块。每个数据块有一个block number,从1开始增加,每发送一个数据块加1。回复WRQ请求的ACK的block number为0。


为了创建连接,每一端选择自己的TID,该TID就是UDP包的端口。请求主机选择自己的TID,然后发送请求到服务主机的知名TID 69端口。服务器然后选择一个新的自己的TID和请求主机的TID通信,接下来的传输都使用这两个TID,服务器不再使用69端口。


一旦连接建立,如果源TID不匹配,则该包被丢掉,一个error包应该发往不正确的源,同时正常的传输不被干扰。


TFTP Packets

支持5种包

opcodeoperation
1Read request (RRQ)
2Write request (RRQ)
3Data (DATA)
4Acknowledgement (ACK)
5Error (ERROR)


RRQ/WRQ packet

Mode为netascii或者octect,不区分大小写,所以NetAscii也是合法的。


DATA packet

Block从1开始,每发送一个block加1,超过最大值后,绕回到0。

Data从0到512长度,小于512的是最后一个块。


ACK packet

ACK确认一个数据包,或者一个WRQ包。确认数据包时,Block是被确认的数据包的Block,确认WRQ包时,Block为0。


ERROR packet

ERROR可以确认任何其它类型的包。


Normal Termination

最后一个数据包的长度小于512字节,接收者回复ACK后,可以结束它这边的连接,但是估计接收者逗留一段时间,当发送没有收到最后一个ACK时,它会重发数据,此时接收者可在回复一个ACK。发送最后一个数据包的主机,必须等待一个ACK,如果没有收到ACK则超时重发最后一份数据,直到最终超时结束连接。


Premature Termination

如果请求不被授权,或者传输过程发生错误,将发送一个错误包。错误包不会重传,也不会被确认。


Copyright © insidelinuxdev.net 2017-2021. Some Rights Reserved.