TFTP协议

说明: 本文是以下文献相关内容的总结
[1] 《TCP/IP详解 卷1:协议》
[2] 《TCP/IP协议族 第4版》
[3] 《计算机网络 第5版》

TFTP(Trival File Transfer Protocal),简单文件传输协议,该协议在熟知端口69上使用UDP服务。TFTP协议常用于无盘工作站或路由器从别的主机上获取引导配置文件,由于TFTP报文比较小,能个迅速复制这些文件。

Notice
1. TFTP协议代码所占用的内存小,其对应的软件也很小,所以能个很容易地放入到无盘工作站的ROM中。
2. TFTP支持ASCII码或二进制传送。

TFTP过程描述
以TFTP客户端向TFTP服务器发送读请求为例,说明整个过程:
1. 服务器使用熟知端口号69被动打开连接;
2. 客户主动打开连接,它使用临时端口作为源端口而将端口69作为目的端口,向服务器进程发送RRQ报文;
3. 服务器主动打开连接,它使用新的临时端口作为源端口,而使用收到的来自客户的临时端口作为目的端口,向TFTP客户进程发送DATA报文(2B操作码,2B数据块的块号K,512B数据);
4. 客户收到服务器的报文后,发送4B的ACK(2B的操作码和2B的数据块号)给TFTP服务器,告诉它之前发送给客户的数据报已经收到;
5. 重复步骤3-4,直到所有请求的数据发送完毕。

总结
1. 从上面的过程可以看出,TFTP是一种类似于停止等待协议(不是真正的停止等待协议,在停止等待协议中,接收方发送的ack表示期望收到的下一个分组,而在TFTP的ACK报文中,ack的块号表示的是本次成功收到的数据块,而不是下一个期望的下一个数据块)。TFTP服务器只有收到客户端的确认报文ACK后才会向客户端接着发送新的数据。
2. 服务器向客户端发送数据的过程中,每次都是发送512B的数据,如果客户进程收到某个DATA报文中数据部分的长度小于512B,说明这是收到的最后一个报文;如果待发送的数据的总长度正好是512的整数倍,这就意味着最后一个数据报的长度正好为512B,此时服务器进程会再次发送一个包含0字节数据的DATA报文(显然,该报文的总长度为4B=2B操作码+2B块号+0B数据);
3. TFTP协议中,用于读文件的连接和用于写文件的连接的建立方式不同:建立读连接的时候,客户首先向服务器发送RRQ读报文,服务器收到该报文后,直接发回给该客户DATA报文,并且包含第一个数据块(块号为1)。而建立写连接的时候,客户首先先服务器发送WRQ写报文,服务器收到该报文后,则发回给客户ACK报文,使用的块号为0;当然上面两种情况如果遇到请求报文出错时,均会发回ERROR报文作为响应。

TFTP五种报文
TFTP五种报文分别是:RRQ,WRQ,DATA,ACK和ERROR。
这里写图片描述

  • RRQ/WRQ:模式字段中,包含两种字符串中的一种,”netascii”表示ASCII文件,”octet”表示二进制文件;对于RRQ,客户向TFTP服务器发送读请求后,服务器返回一个块编号为1的DATA报文;而对于WRQ,客户向TFTP服务器发送写请求后,服务器返回的是块编号为0的ACK报文。总之,不管是RRQ还是WRQ,接收DATA数据的一方(读者)发送ACK确认,而发送DATA数据(写者)的只负责发送数据。
  • DATA报文:由客户或服务器使用(由写者发送),用于传送数据块。所有的块都用数字顺序编码,从1开始。在所有的DATA报文中,这个块必须准确地等于512B,但最后一个块可以小于或等于512B。当发送的DATA报文中数据部分的长度小于512B后,表示DATA报文发送完毕,所以小于数据部分512B的DATA数据报可以作为文件结束的标志。特殊的情况是,当文件中的数据正好是512B的整数倍时,那么发送端必须再发送一个具有数据部分为0B的额外的DATA数据块以表示传输的结束。数据可以采用ASCII码或二进制组来传送。
  • ACK报文:块号表示它所收到的块号(不是下一个期待的块号哈,这与TCP中的ACK序号不同)。特殊情况是,当客户向服务器发送一个WRQ请求后,服务器返回给客户的是一个块号为0的ACK报文,表示服务器已经准备好了接收来自客户的数据报。
  • EEROR报文:ERROR报文既可以有客户发送,也可以由服务器发送,当一条连接(如读连接或写连接)不能建立或在数据传输中出现问题时使用。差错码定义了差错的类型,差错信息是一个可变字节,包含原文中的差错数据。

注意:从上面的报文格式中可以看出,TFTP报文没有差错检验和字段,所以接收端检验数据是否出现差错的唯一方法是通过分组该TFTP数据报的UDP首部中的检验和字段。

流量控制
TFTP流量控制采用的是停止等待协议。TFTP使用DATA报文发送数据块,并等待ACK报文的确认。若在超时之前发送端就收到了确认,它就发送下一个块。这样,实现流量控制的方法是在发送下一个数据块之前,必须要保证收到了上一个数据块的ACK报文。

  • 客户从服务器读文件:当客户打算向服务器读文件时,先发送RRQ报文,若无问题,服务器就直接发送块号为1的DATA报文(即第一个数据块就直接发送过去了)。

  • 客户向服务器写文件(就是存储文件):当客户打算写文件时,先发送WRQ报文,若无问题,服务器就响应块号为0的ACK报文(不是DATA报文,因为此时服务器是数据接收方,只能发送ACK,同时注意第一个ACK的块编号是0,这样就可以通知客户,我同意了你的写请求)。客户在收到该确认后,就是用块号为1发送第一个数据块给服务器。

差错控制
TFTP的差错机制与其他协议不同,它是对称的,因为TFTP协议在发送端和接收端都使用了计时器。也就是说,客户和服务器两端,一方使用了DATA报文计时器(发送端),另一方使用ACK报文计时器(接收端)。若发送端丢失了数据报文,在计时器到期时发送端就重传该数据报文;若接收端丢失了ACK报文,在超时时接收端就重传该ACK报文。

差错控制常用于这四种情况:报文受损、报文丢失、确认丢失和报文重复。

  • 报文受损:当数据块出现差错(通过差错检验,得靠UDP首部)时,接收端能够检测出来并丢弃该报文。发送端等待确认,超时后就重传该数据报。
  • 报文丢失:若数据报丢失了,它就用于不能到达接收方,而确认页不会发出。发送端在超时之后,就会重传该数据报。
  • 确认丢失:确认丢失了,则可能发生两种情况:一是接收端的计时器比发送端的计时器先到期,则接收方重传确认;若发送端的计时器先到期,则发送端重传该数据。
  • 报文重复:接收端通过块编号可以检测出数据块的丢失。若数据块重复了,接收端就简单地将其丢弃。

sorcerer’s apprentice bug
Sorcerer’s apprentice buy可以翻译为“魔法师学徒的错误”(或魔术新手综合征),这个名称来自一个动画人物,这个人不经心地对一个拖把施加魔法,结果这个拖把连续地复制它自己。若分组的ACK报文没有丢失而是延迟了,则会发送这种错误。
数据分组发生这种错误的原因分析:
发送端发送一个分组出去后,会启动该分组的DATA计时器;接收方收到该分组后就会发送一个ACK数据报,并启动一个ACK计时器。发送端收到该ACK报文之前,它会按照一定的时间间隔(由发送端的计时器决定)重发该数据块,直到收到该数据块的ACK报文为止。现在假设出现这么一种情况,发送端将DATA分组发送出去后,接收方收到该数据并发回一个ACK数据报,但是ACK在路上走着,并没有丢失(只是走得很慢)。当发送端的DATA计时器到期了都还没有收到ACK分组时,发送端就会认为DATA数据包已经丢失了,就会重发该数据报。发出去没过多久却收到了之前那个数据报的ACK分组。这回发送端才发送下一个数据报,这样导致的结果就是每一个成功发送的DATA都要发送两次,而每一个成功的ACK也要发回两次。这一现象就称为“魔术新手综合症”。

原文地址:http://blog.csdn.net/jxh_123/article/details/26505761

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值