00. 目录
文章目录
01. tftp协议简介
TFTP(Trivial File Transfer Protocol,简单文件传输协议)是TCP/IP协议族中的一个用来在客户机与服务器之间进行简单文件传输的协议,提供不复杂、开销不大的文件传输服务,端口号为69。
TFTP通常基于UDP协议而实现,但是也不能确定有些TFTP协议是基于其它传输协议完成的。TFTP协议的设计目的主要是为了进行小文件传输,因此它不具备通常的FTP的许多功能,例如,它只能从文件服务器上获得或写入文件,不能列出目录,不进行认证。
TFTP代码所占的内存较小,这对于较小的计算机或者某些特殊用途的设备来说是很重要的,这些设备不需要硬盘,只需要固化了TFTP、UDP和IP的小容量只读存储器即可。因此,随着嵌入式设备在网络设备中所占的比例的不断提升,TFTP协议被越来越广泛的使用。
02. tftp包格式
2.1 tftp包格式概述
TFTP共定义了六种类型的包,包的类型由数据包前两个字节确定,我们称之为Opcode(操作码)字段。这五种类型的数据包分别是:
-
读文件请求包:Read request,简写为RRQ,对应Opcode字段值为1
-
写文件请求包:Write requst,简写为WRQ,对应Opcode字段值为2
-
文件数据包:Data,简写为DATA,对应Opcode字段值为3
-
回应包:Acknowledgement,简写为ACK,对应Opcode字段值为4
扫描二维码关注公众号,回复: 16891512 查看本文章 -
错误信息包:Error,简写为ERROR,对应Opcode字段值为5
RRQ和WRQ的数据包格式一样,只不过某些值域设置有差别,剩下的三种数据包格式各不相同。
-
请求恢复包: Acknowledgement,简写为ACK,对应Opcode字段值为6
2.2 读/写请求包(RRQ/WRQ=1/2)
RRQ和WRQ数据包的格式:
\1. 操作码(2字节),它用来表示当前数据包的类型(取值1表示该数据包是读请求,2表示该数据包是写请求);
\2. 可变长字段,它用来表示要读取或上传的文件名,它使用ASCII码并以 \0 表示结尾;
\3. Mode,也是可变长字段,用来表示传输文件的数据类型,如果传输的是字符串文件,那么它填写字符串”netascii”,如果传输的是二进制文件,那么它填写字符串”octet”,这些字符串都以 \0 结尾。
\4. 可选字段(timeout、blksize、tsize等,以 \0 结尾)
数据抓包分析
协议分析
00 01 (操作码)
31 2e 63 00 (1.c(文件名), 以 \0 结尾 即 00)
6f 63 74 65 74 00 (octet(文件传输方式), 以 \0 结尾 即 00)
62 6c 6b 73 69 7a 65 00 (blksize(每次传输文件大小), 以 \0 结尾 即 00)
35 31 32 00 (字符串), 以 \0 结尾 即 00)
74 73 69 7a 65 00 (tsize(文件大小), 以 \0 结尾 即 00)
30 00 (0(字符串), 以 \0 结尾 即 00)
2.3 数据包(DATA=3)
传输数据块的DATA数据包,
\1. 操作码(2字节)
\2. 块编号(2字节)
\3. 数据
数据抓包分析
协议分析
00 03 (操作码)
00 01 (block number)
..... (DATA)
2.4 回应包(ACK=4)
回应包是对收到的文件数据进行回应
\1. 操作码(2字节)
\2. 数据包序(2字节)
数据抓包分析
协议分析
00 04 (操作码)
00 01 (block number)
2.5 错误信息包(Error=5)
错误ERROR数据包
\1. 操作码(2字节)
\2. 错误码(2字节)
\3. 错误具体原因(可变长)
2.6 请求响应包(ACK=6)
请求响应包是对请求数据的响应,为可选包,某种情况下是可以不需要的,视具体情况而定。
\1. 操作码(2字节)
\2. 可选字段(timeout、blksize、tsize等,以 \0 结尾 以及相关的值)
数据抓包分析
协议分析
00 06 (操作码)
62 6c 6b 73 69 7a 65 00 (blksize, 以 \0 结尾 即 00)
35 31 32 00 (512(字符串), 以 \0 结尾 即 00)
74 73 69 7a 65 00 (tsize(文件大小), 以 \0 结尾 即 00)
31 39 34 37 00 (1947(字符串), 以 \0 结尾 即 00)
03. tftp工作过程
3.1 tftp下载过程
下图为TFTP请求下载的过程图,上传与下载本质上是文件的传输方向不一样。
3.2 tftp上传过程
TFTP的工作都是由客户端发起一个RRQ或者WRQ开始的。这里以WRQ(写请求)为例,讲述读写的工作过程,以及错误处理等内容。
\1. server在端口为69的UDP上等待client发出写文件请求包
\2. client通过UDP发送符合TFTP请求格式的WRQ包给server。从UDP包角度看,该UDP包的源端口由client随意选择,而目标端口则是server的69。
\3. server收到client的这个请求包后,需发送ACK给client。对于写请求包,server发送的ACK包确认号为0。
\4. client发送DATA数据给server,server接收数据并写文件
\5. 当client发送的DATA数据长度小于512字节时,server认为这次WRQ请求完成
04. TFTP的传输模式
\1. Netascii:这是8位的ASCII码形式,一般用来传输字符数据
\2. Octet:这是8位源数据类型,一般用来传输二进制数据
\3. Mail:它将返回的数据直接返回给用户而不是保存为文件,但该模式已经不再支持
05. 讨论
1.tftp服务介绍
1)TFTP(Trivial File Transfer Protocol,简单文件传输协议)是TCP/IP协议族中的一个用来在客户机与服务器之间进行简单文件传输的协议,提供不复杂、开销不大的文件传输服务。
2)tftp服务的端口号为69。
3)TFTP是一个传输文件的简单协议,它基于UDP协议而实现,但是我们也不能确定有些TFTP协议是基于其它传输协议完成的。
4)此协议设计的时候是进行小文件传输的。因此它不具备通常的FTP的许多功能,它只能从文件服务器上获得或写入文件,不能列出目录,不进行认证,它传输8位数据。
5)传输中有三种模式:
1》netascii,这是8位的ASCII码形式;
2》另一种是octet,这是8位源数据类型;
3》最后一种mail已经不再支持,它将返回的数据直接返回给用户而不是保存为文件。
2.tftp传输过程
1)任何传输起自一个读取或写入文件的请求,这个请求也是连接请求。
2)如果服务器批准此请求,则服务器打开连接,数据以定长512字节传输。
3)每个数据包包括一块数据,服务器发出下一个数据包以前必须得到客户对上一个数据包的确认。
4)如果一个数据包的大小小于512字节,则表示传输结束。如果数据包在传输过程中丢失,发出方会在超时后重新传输最后一个未被确认的数据包。
5)通信的双方都是数据的发出者与接收者,一方传输数据接收应答,另一方发出应答接收数据。
6)大部分的错误会导致连接中断,错误由一个错误的数据包引起。这个包不会被确认,也不会被重新发送,因此另一方无法接收到。如果错误包丢失,则使用超时机制。
7)错误主要是由三种情况引起的:
1》不能满足请求。
2》收到的数据包内容错误,而这种错误不能由延时或重发解释。
3》对需要资源的访问丢失(如硬盘满)。
8)TFTP只在一种情况下不中断连接,这种情况是源端口不正确,在这种情况下,指示错误的包会被发送到源机。
3.tftp特点
1)由于TFTP使用UDP,而UDP使用IP,IP可以还使用其它本地通信方法。因此一个TFTP包中会有以下几段:本地媒介头,IP头,数据报头,TFTP头,剩下的就是TFTP数据了。
2)TFTP在IP头中不指定任何数据,但是它使用UDP中的源和目标端口以及包长度域。
3)由于TFTP使用的包标记(TID)在这里被用做端口,因此TID必须介于0到65,535之间。
4)TFTP头中包括两个字节的操作码,这个码指出了包的类型,大体上的TFTP包格式为:| Local Medium | Internet | Datagram | TFTP |
4.tftp优点
1)TFTP可用于UDP环境;比如当需要将程序或者文件同时向许多机器下载时就往往需要使用到TFTP协议。
2)TFTP代码所占的内存较小,这对于较小的计算机或者某些特殊用途的设备来说是很重要的,这些设备不需要硬盘,只需要固化了TFTP、UDP和IP的小容量只读存储器即可。当电源接通后,设备执行只读存储器中的代码,在网络上广播一个TFTP请求。网络上的TFTP服务器就发送响应,其中包括可执行二进制程序。设备收到此文件后将其放入内存,然后开始运行程序。这种方式增加了灵活性,也减少了开销。
5.初始链接
1)初始连接时候需要发出WRQ(请求写入远程系统)或RRQ(请求读取远程系统),收到一个确定应答,一个确定可以写出的包或应该读取的第一块数据。
2)通常确认包包括要确认的包的包号,每个数据包都与一个块号相对应,块号从1开始而且是连续的。因此对于写入请求的确定是一个比较特殊的情况,因此它的包的包号是0。
3)如果收到的包是一个错误的包,则这个请求被拒绝。
4)创建连接时,通信双方随机选择一个TID,因为是随机选择的,因此两次选择同一个ID的可能性就很小了。
5)每个包包括两个TID,发送者ID和接收者ID。这些ID用于在UDP通信时选择端口,请求主机选择ID的方法上面已经说过了,在第一次请求的时候它会将请求发到TID 69,也就是服务器的69端口上。应答时,服务器使用一个选择好的TID作为源TID,并用上一个包中的TID作为目的ID进行发送。这两个被选择的ID在随后的通信中会被一直使用。
6)下例是一个写入的例子,其中WRQ,ACK和DATA代表写入请求,确认和数据。
1》主机A向主机B发出WRQ,其中端口为69。
2》B机向A机发出ACK,块号为0,包括B和A的TID
此时连接建立,第一个数据包以序列号1从主机开始发出。以后两台主机要保证以开始时确定的TID进行通信。
如果源ID与原来确定的ID不一样,这个包会被认识为发送到了错误的地址而被抛弃。错误的包是被发送到正确端口的,但是包本身有错误。
设想发送方发出一个请求,这个请求在网络的那个设备中被复制成两个包,接收方先后接收到两个包。接收方会认为为这是两个独立的请求,会返回两个应答。
当这两个应答其中之一被接收到时,连接已经建立。第二个应答再到达时,这个包会被抛弃,而不会因为接收到第二个应答包而导致第一个建立的连接失败。
6.正常终止
1)传输的结束由DATA数据标记,其包括0-511个字符。这个包可以被其它数据包确认。
2)接收方在发出对最后数据包的确认后可以断开连接,当然,适当的等待是比较好的,如果最后的确定包丢失可以再次传输。
3)如果发出确认后仍然收到最后数据包,可以确定最后的确认丢失。发送最后一个DATA包的主机必须等待对此包的确认或超时。
4)如果响应是ACK,传输完成。如果发送方超时并不准备重新发送并且接收方有问题或网络有问题时,发送也正常结束。当然实现时也可以是非正常结束,但无论如何连接都将被关闭。
7.早终结
如果请求不能被满足,或者在传输中发生错误,需要发送ERROR包。这仅是一种传输友好的方式,这种包不会被确认也不会被重新传输,因此这种包可能永远不会被接收到。因此需要用超时来侦测错误。
8.TFTP数据包
TFTP支持五种类型的包,已经说明这五种类型的包:
包头中包括了这个包所指定的操作码。
opcode operation
1.Read request (RRQ)
2.Write request (WRQ)
3.Data (DATA)
4.Acknowledgment (ACK)
5.Error (ERROR)
9.tftp命令
man tftp
tftp - Trivial File Transfer Protocol client
tftp是一个客户端,是一个不重要轻量级的文件传输协议,用于传输文件到远程主机上或从远程机器上下载数据。
tftp [-4][-6][-v][-l][-m mode] [host [port]] [-c command]
10.in.tftpd命令
man in.tftpd
tftpd - Trivial File Transfer Protocol server
in.tftpd [options...] directory...
11.tftp实现
tftp包有:tftp,tftp-server
rpm -ql tftp
/usr/bin/tftp
/usr/share/doc/tftp-0.49
/usr/share/doc/tftp-0.49/CHANGES
/usr/share/doc/tftp-0.49/README
/usr/share/doc/tftp-0.49/README.security
/usr/share/doc/tftp-0.49/README.security.tftpboot
/usr/share/man/man1/tftp.1.gz
rpm -ql tftp-server
/etc/xinetd.d/tftp
/usr/sbin/in.tftpd
/var/lib/tftpboot(库)
/usr/share/doc/tftp-server-0.49
/usr/share/doc/tftp-server-0.49/CHANGES
/usr/share/doc/tftp-server-0.49/README
/usr/share/doc/tftp-server-0.49/README.security
/usr/share/doc/tftp-server-0.49/README.security.tftpboot
/usr/share/man/man8/in.tftpd.8.gz
/usr/share/man/man8/tftpd.8.gz