1.简介
TFTP(Trivial File Transfer Protocol,简单文件传输协议)是TCP/IP协议族中的一个用来在客户机与服务器之间进行简单文件传输的协议,提供不复杂、开销不大的文件传输服务。端口号为69。
FTP是一个传输文件的简单协议,它基于UDP协议而实现,但是我们也不能确定有些TFTP协议是基于其它传输协议完成的。此协议设计的时候是进行小文件传输的。因此它不具备通常的FTP的许多功能,它只能从文件服务器上获得或写入文件,不能列出目录,不进行认证,它传输8位数据。传输中有三种模式:netascii,这是8位的ASCII码形式,另一种是octet,这是8位源数据类型;最后一种mail已经不再支持,它将返回的数据直接返回给用户而不是保存为文件。
2.常用工具
windows下工具
tftpd32.exe tftp32工具可以当做client / server tftp32这下载地址!!!
linux下的工具
#tftp 192.168.1.100 put test.txt //上传文件test.txt到服务器192.168.1.100
#tftp 192.168.1.100 get test.txt //下载文件test.txt从服务器192.168.1.100
3.帧格式
帧类型 操作码
读请求帧 1
写请求帧 2
数据帧 3
应答帧 4
错误帧 5
模式 含义
netascii 8位的ASCII码形式
octet 8位源数据类型
mail 已经不再支持,它将返回的数据直接返回给用户而不是保存为文件
错误码 含义
1 File not found. (文件未找到,服务器未找到下载请求中指定的文件)
2 Access violation. (访问违规,程序对于服务器的默认路径没有写权限导致的)
3 Disk full or allocation exceeded. (磁盘已满或超出分配,上传文件时可能会出现这个错误)
4 Illegal TFTP operation. (非法的 TFTP 操作,服务器无法识别 TFTP 包中的操作码)
5 Unknown transfer ID. (未知的传输标识)
6 File already exists. (文件已存在,要上传的文件已存在于服务器中)
7 No such user. (没有该用户)
注意:操作码,块编码等都是大端格式。
通信流程
下载文件
1.客户端向服务端发送读请求帧,告诉服务端要读取哪个文件,使用哪种模式。一般是使用octet模式,很多软件也只支持该模式。
2.服务器收到这个读请求以后,会打开另外一个随机的端口对该请求进行后续服务。
3.服务端检查工作目录下是否存在目标文件,以及文件是否能正常读取。如果文件读取失败会返回给客户端一个错误码为1的错误帧。
4.服务端目标文件读取正常则向客户端发送数据帧,数据帧数据段最大为512字节。
5.客户端收到服务端数据帧,检查块序号是否正确,然后将数据段写入目标文件并发送应答帧。
6.服务端收取应答帧,并检查块序号是否正确,然后继续发送数据帧。
7.步骤4~6不断循环,中间出现错误则向对方发送相应错误帧并退出本次传输。
8.当客户端接收数据帧的数据段长度小于512时,表明传输已完成,客户端发送最后一次应答帧并退出本次传输。服务端收到最后一次应答帧后,读取目标文件长度为0,退出本次传输。
9.也许会有一种极端情况,就是文件的大小正好是 512 字节的倍数,这样的话,最后一个数据包的大小也是 512 个字节,这时服务器发送完包含文件数据的数据包以后,还会额外发送一个包含 0 字节的数据包,作为最后一个数据包,这样就可以保证客户端收到的最后一个数据包的大小总是小于 512 个字节的。也就是说,对于客户端而言,只要它收到的数据包的大小小于 512 个字节,它就认为传输已经结束,它就会关闭连接。
上传文件
1.客户端向服务端发送写请求帧,告诉服务端要上传哪个文件,使用哪种模式。一般是使用octet模式,很多软件也只支持该模式。
2.服务器收到这个写请求以后,会打开另外一个随机的端口对该请求进行后续服务。
3.服务端检查工作目录下是否存在目标文件,如果存在会返回给客户端一个错误码为6的错误帧。
4.服务端向客户端发送应答帧,块编号从0开始。
5.客户端收到服务端应答帧后,检查块序号是否正确,然后读取目标文件并发送数据段。
6.服务端收取数据帧,并检查块序号是否正确,然后继续发送应答帧。
7.步骤5~6不断循环,中间出现错误则向对方发送相应错误帧并退出本次传输。
8.当服务端接收数据帧的数据段长度小于512时,表明传输已完成,服务端发送最后一次应答帧并退出本次传输。客户端收到最后一次应答帧后,读取目标文件长度为0,退出本次传输。
9.也许会有一种极端情况,就是文件的大小正好是 512 字节的倍数,这样的话,最后一个数据包的大小也是 512 个字节,这时客户端发送完包含文件数据的数据包以后,还会额外发送一个包含 0 字节的数据包,作为最后一个数据包,这样就可以保证服务端收到的最后一个数据包的大小总是小于 512 个字节的。也就是说,对于服务端而言,只要它收到的数据包的大小小于 512 个字节,它就认为传输已经结束,它就会关闭连接。
wireshark抓包tftp过程
tftp client put 操作的抓包文件下载
tftp get 操作的抓包文件下载