TFTP协议详解

1.参考:

中文讲解:https://www.pianshen.com/article/822220160/
RFC:https://www.rfc-editor.org/rfc/rfc1350
一系列扩展:Updated by: 1782, 1783, 1784, 1785, 2347, 2348, 2349
客户端/服务端示例代码:https://tftpy.sourceforge.net/

2.TFTP协议

TFTP协议全称为简单文件传输协议,它是以UDP为基础的应用层协议。在实现TFTP服务器之前,需要详细理解协议。目前很多介绍TFTP协议的书籍都是参照RFC1350,比如著名的《TCP/IP详解》。然而RFC1350已经被后来RFC2347、RFC2348、RFC2349等所代替,因此我们需要系统的认识一下这些最新的协议。

2.1 TFTP协议简介

1992年,修订版TFTP协议RFC1350发布,这一版本的TFTP协议被广泛使用,《TCP/IP详解卷1》章节15讲解TFTP协议时便是使用的这个版本。
除非一些非常古老的TFTP客户端/服务器软件,目前主流的客户端/服务器软件都会支持TFTP扩展选项,1998年发布的RFC2347定义了TFTP扩展选项。扩展选项可以允许客户端和服务器之间进行协商,以便使用一些额外的功能,比如超时时间、文件大小、数据包大小等等。TFTP扩展选项增加一个新的选项应答(OACK)数据帧,用来应答客户端的选项协商请求,增加一个新的错误码(8),用来指示当进行选项协商出错时,终止数据传输。
1998年颁布的RFC2348定义了数据块大小选项(blksize),同年颁布的RFC2349定义了超时间隔(timeout)和文件大小(tsize)选项。
注:本文所有“字节”均由8bit构成。

2.2 TFTP协议概述

  1. 数据传输起始于一个读取或者写入文件的请求,只有客户端才可以发送这种请求。
  2. 默认情况下,数据以定长512字节传输,如果服务器支持扩展选项,可以使用blksize选项协商数据长度。每个数据包中仅包含一个数据块。只有收到对方的应答数据包,才会发送下一包数据。
  3. 如果一个数据包数据大小小于512字节或小于通过blksize选项协商定的数据长度,表示数据传输结束。
  4. 两台机器进行数据传输时,一台为发送方一台为接收方。发送方发送数据并接收应答,接收方发送应答接收数据。
  5. 大部分的错误会导致连接中断,错误由一个错误的数据包引起,这个包不会被确认,也不会被重新发送。

2.2.1 TFTP 必选字段

TFTP 必选字段只有三个:Opcode、Filename和Mode,在rfc1350中规定:

 2 bytes     string    1 byte     string   1 byte
------------------------------------------------
| Opcode |  Filename  |   0  |    Mode    |   0  |
------------------------------------------------

2.2.2 TFTP 扩展字段

其它字段通过Option Extension进行扩充,在RFC2347中规定;

+-------+---~~---+---+---~~---+---+---~~---+---+---~~---+---+-->
|  opc  |filename| 0 |  mode  | 0 |  opt1  | 0 | value1 | 0 | <
+-------+---~~---+---+---~~---+---+---~~---+---+---~~---+---+-->

>-------+---+---~~---+---+
<  optN  | 0 | valueN | 0 |
>-------+---+---~~---+---+

opt1:扩展名
The first option, in case-insensitive ASCII (e.g., “blksize”).
This is a NULL-terminated ASCII field.
value1:扩展值
The value associated with the first option, in case-insensitive ASCII.
This is a NULL-terminated field.
optN, valueN:扩展可以有N多个,只要请求包不超过512字节的上限;
The final option/value pair. Each NULL-terminated field is specified in case-insensitive ASCII.
The maximum size of a request packet is 512 octets.

2.3 TFTP协议传输模式

TFTP协议支持三种传输模式,分别为:

  • netascii:ASCII文本模式
  • octet:二进制模式,每字节8位
  • mail:现在已经不使用

2.4 TFTP协议数据包种类

TFTP协议支持六种数据包格式,如表2-1所示。
image.png

2.4.1读写请求数据包

RFC2347 规定的TFTP选项字段附加于读请求和写请求数据帧中。
image.png

2.4.1.1常用的选项:blksize

协商数据块大小,默认数据块为512,可以协商的值为8~65464字节(RFC2348)。

2.4.1.2 常用选项:timeout

超时间隔,可以协商的值为1~255秒(RFC2349

2.4.1.3常用选项:tsize

传输文件的大小(RFC2349

2.4.2 Data数据包

image.png

2.4.3 ACK数据包

image.png

2.4.4 ERROR数据包

image.png

2.4.5 OACK包格式:

image.png

3.TFTP客户端/服务器设计注意事项

  1. 只能是客户端发送读写请求,读写请求数据包中可能附带选项信息。在读写请求数据包中可能有很多个选项,但一个选项只能出现一次。选项出现的顺序并不重要。
  2. 如果服务器支持读写请求数据包中的选项,服务器会使用选项应答(OACK)响应。OACK中包含服务器能够支持的选项以及该选项对应的值,绝对不可以包含客户端没有使用的选项。如果客户端请求的某些选项服务器不支持,则在OACK中忽略这些选项。如果客户端请求的某些选项值服务器不能支持,服务器可以在OACK中将这些选项值替换为自己支持的或者发送一个错误包,错误码为8,以终止数据传输。
  3. 如果客户端只请求一个选项,并且该选项没有被服务器应答,客户端必须忽略这个选项,服务器必须表现的像从未收到过这个请求一样。如果客户端请求多个选项,服务器应答了部分请求选项,则客户端必须使用那些服务器已经应答的选项,忽略服务器没有应答的选项。
  4. 当客户端向服务器发送带选项的读请求数据包,服务器可能返回三种响应:
    1. OACK:应答读请求和选项
    2. DATA:应答读请求,无选项
    3. ERROR:请求被拒绝
  5. 当客户端向服务器发送带选项的写请求数据包,服务器可能返回三种响应:
    1. OACK:应答写请求和选项
    2. ACK:应答写请求,无选项
    3. ERROR:请求被拒绝
  6. 如果一个服务器不支持协商选项,它很可能会忽略掉客户端读写请求数据包中的选项字段。在这种情况下,对于读请求,服务器应该返回DATA数据包;对于写请求应该返回ACK数据包。但如果某些服务器返回一个ERROR数据包,客户端应该重新发送一个读写请求,并且这个读写请求中不包含任何选项信息。
  7. 客户端应答OACK可能有两种方式,如果是读请求,则以ACK(数据块号设置为0)应答;如果是写请求,则以第一个数据块进行应答,数据块大小适应协商的值。如果客户端要拒绝OACK,它应该发送ERROR数据包,其错误码为8。
  8. 服务器应保留发送的数据,直到下一帧正确到来,这样做是为了客户端响应超时后,重发最后一包数据。
  9. 注意:
    1. 服务器不能请求选项,所有选项由客户端发起。
    2. 如果客户端接收到的OACK中包含未请求的选项,客户端应该发送一个ERROR数据包,错误码为8。

3.1 TFTP服务器实现

通过本文章节2对TFTP协议的分析可以看出,实现一个可用的TFTP客户端/服务器并无特别之处。但这里我们要实现一个健壮的、具有良好错误提示的TFTP服务器。
TFTP服务器的设计流程图如图3-3所示。
TFTP服务器要有良好的容错能力,对于接收的数据包要有一定的分析能力,能够剔除非法数据、重复数据等。在设计FTFP过程中,需要识别写入的文件名以及文件大小,防止写入非法文件或者过大的文件。过大的文件会覆盖相邻区域的Flash数据,会造成不可恢复的错误。
对于客户端传送过来的读写请求中,可能包含协商选项信息,由于我们事先并不知道客户端会传送多少个协商选项,因此需要将读写请求数据包进行完整的分析。对于支持的tsize选项和blksize选项,会记录选项的值,为校验文件大小以及回送OACK做准备,对于不支持的选项,直接忽略掉。将所有选项分析完成后,需要将支持的选项和选项值放到OACK包中回送给客户端。如果客户端传输来的读写请求中并没有协商选项,则直接返回ACK数据包,其中的数据包号字段设置为0。
对于客户端传送来的Data数据包,则需要校验数据长度和数据包号。校验数据包号可以在客户端发送不正确数据包号时告知客户端下一包应该发送什么样的正确数据包,或者在客户端发送重复数据包时,服务器端不会重复的将数据写入Flash。
考虑到实际现场环境可能非常恶劣,客户端发送的数据或者服务器应答的数据可能会丢失,因此一个健壮的TFTP服务器必须要有超时重传机制。为了在超时后重传最后一包数据,因此服务器必须额外开辟一个缓冲区用来保存最近一次发送的数据。
由于TFTP数据包基于UDP协议,数据包最大不超过560字节,而且以太网底层具有CRC32校验、IP层和UDP层具有累加和校验,这次校验足够将传输过程中的错误数据识别出来,因此在实现TFTP服务器的过程中,并不需要增加额外的校验。
image.png
图3-3 TFTP服务器设计流程图

  • 1
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值