TFTP协议全称为TrivialFileTransferProtocol。目标是在UDP之上上建立一个类似于FTP的但仅支持文件上传和下载功能的传输协议,所以它不包含FTP协议中的目录操作和用户权限等内容。
与FTP相似,TFTP传输过程中也有传输模式之分,模式的意思是如何解释数据包里的内容,比如是字符串还是二进制等。目前有三种模式:
本分析以RFC为主,结合Ethereal截包软件。TFTP服务器使用CiscoTFTPServer。客户器使用CiscoTFTPClient。
TFTP共定义了五种类型的包格式,格式的区分由包数据前两个字节的Opcode字段区分,分别是:
从图2.2可以看出,虽然RFC中描述的读写文件请求包中并未明确包含option字段,但由于Mode项表示的是一个字符串,故可以把相关内容组合成一个字符串数组放到Mode段里边。
从图2.4可以看出,该包的包号由Block字段给出,目前该包号为
1,最大值为,轮流使用。数据包的起始包号从1开始。
另外,TFTP规定,DATA包中数据大小最大为512字节。当DATA包中数据字节小于512时,就表示这是读写文件数据的最后一个包了,我们姑且可称之为结束DATA包。
ACK中的包号为锁确认的数据包的包号,例如数据包的包号为100,则该ACK包的包号也为100。
TFTP规定,ERROR包不会重传也不需要确认,所以有可能对方收不到ERROR包,TFTP建议采用某种ERROR包超时处理机制,但并没有给出具体信息。
TFTP的工作都是由客户端发起一个RRQ或者WRQ开始的。这里分别以WRQ和RRQ为例,讲述读写的工作过程,以及错误处理等内容。
在TFTP中,一次请求中所有包的源和目标都由TransferID(TID)来标示。TFTP规定TID值就是UDP包中的源和目标端口。也就是说,一次请求过程中,S和C通过UDP包的源和目标端口来判断这个包是不是发给自己的。
以WRQ为例,C向S的69端口发送一个文件请求包,这个文件请求包中UDP的源端口号为C的TID(假设C选择作为它的TID),目标端口为69(这个时候由于请求还未接受,所以这次请求的UDP包中目标端口不是TID)。S收到这个请求后,将另外采用一个UDP端口(应该另启动了一个UDPSocket)假设为来回复这个请求的ACK。这样,这个回复的UDP包的源端口就是S的TID(=),目标就是C的UDP端口(TID=)。以后,这次请求的后续所有包都在端口为和中来往。
上述过程隐含了一定程度上的容错处理。例如,C收到一个TID不是的包,则认为这个包是错误的。
另外,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的确认。
UDP实际上没有连接的概念。但从上面分析的RRQ和WRQ看,S在69端口上等待请求,而且S总是生成一个新的UDP来完成和C的交互。这个过程和TCP的listen以及ept非常类似。所以TFTP把这种交互也称作connection。只不过这种连接是隐含在请求中的。
一般情况下,连接的建立由一次成功的请求来发起,当最后一个DATA包发送完毕并且ACK回复了后,则连接正常关闭。在传输过程中,如果出现错误,假设S向C发送了一个ERROR包,如果C收到ERROR包,则连接关闭。如果C没有收到ERROR包,则需要启动ERROR超时检测机制。需要强调的是对于ERROR包,S和C都不会重传也不需要ACK确认。
TFTP建议在连接正常关闭的情况,S可在发送确认结束DATA包的ACK后稍等片刻后再关闭连接。例如,当C发送结束DATA包后,S回复ACK后再等一段时间才关闭。再次等待时间中,如果ACK包丢失,C将再次发送结束DATA包或者超时处理。S如果又收到一次结束DATA包后,就知道ACK包丢失了。S可以关闭连接也可以再次发送ACK包。
整体上来说,TFTP的一个重要特点就是简单及易于实现,这也是设计TFTP协议的一个初衷。
根据上面这两个流程图,可以很容易实现TFTP的客户端和服务器端,具体的超时重传和错误处理机制,可以自己设计并实现。
阿拉神农:/s/1Am7u7a0vPEVA0gMY9e0Xmw?pwd=dfyu提取码:dfyu被百度清掉了。用这个吧
1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。