【网络协议】RFC1350-TFTP协议
引言
TFTP(Trivial File Transfer Protocol)即简单文件传输协议,是一种轻量级的文件传输协议,它允许客户端从远程主机获取文件或将文件传输到远程主机,主要用于小文件的传输,特别是在需要简便性而非功能性和安全性的场景下。本文简单介绍tftp的报文结构,传输过程及报文分析。
基本信息
制定组织:互联网工程任务组(IETF)
协议标准:RFC1350
协议层级:应用层协议
协议模型:客户端-服务器模型,采取一应一的机制
传输层协议:UDP,默认是69端口号
报文结构
TFTP支持以下五种包类型
opcode operation
1 Read request (RRQ) //读请求报文,用于客户端请求读取文件。
2 Write request (WRQ) //写请求报文,用于客户端请求写入文件。
3 Data (DATA) //数据报文,包含文件数据块及其序列号。
4 Acknowledgment (ACK) //确认报文,用于确认读写请求报文和数据报文。
5 Error (ERROR) //错误报文,用于报告传输过程出现的错误。
RRQ/WRQ 报文
2 bytes string 1 byte string 1 byte
------------------------------------------------
| Opcode | Filename | 0 | Mode | 0 |
------------------------------------------------
RRQ和WRQ报文的结构如下:
Opcode:两个字节,1表示是RRQ报文,2表示是WRQ报文
Filename:文件名,以ASCII码显示,文件名后跟一个字节的0,作为文件名的结束标记
Mode:传输模式,以ASCII码显示,支持netascii(文本)、octet(八进制)和mail(邮箱地址);文件名后跟一个字节的0,作为文件名的结束标记
DATA 报文
2 bytes 2 bytes n bytes
----------------------------------
| Opcode | Block # | Data |
----------------------------------
DATA报文的结构如下:
Opcode:两个字节,3表示是数据报文
Block#:块编号,2字节的16进制数字,从1开始,用于接收端判断是否丢包以及将报文排序重组
Data:传输数据,支持0~512个字节,当字节为0~511个字节时,代表是最后一个数据块
ACK 报文
2 bytes 2 bytes
---------------------
| Opcode | Block # |
---------------------
确认报文结构如下:
Opcode:两个字节,4表示是确认报文
Block#:块编号,2字节的16进制数字,从0开始,其中0是对写请求报文的确认,大于1的编号是对相同编号数据块的确认
ERROR 报文
2 bytes 2 bytes string 1 byte
-----------------------------------------
| Opcode | ErrorCode | ErrMsg | 0 |
-----------------------------------------
错误报文结构如下
Opcode:两个字节,4表示是错误报文
ErrorCode:错误码,2字节的16进制数字,取值见后续
ErrMsg:错误信息,以ASCII码显示,后跟一个字节的0,作为文件名的结束标记
错误码:
Value Meaning
0 Not defined, see error message (if any).
1 File not found.
2 Access violation.
3 Disk full or allocation exceeded.
4 Illegal TFTP operation.
5 Unknown transfer ID.
6 File already exists.
7 No such user.
TFTP传输过程
上传文件
- 客户端发出写文件请求,并告知文件名,服务端回复确认数据块#0
- 客户端发出数据块#1,服务端回复确认数据块#1
- 客户端发出数据块#N,服务端回复确认数据#N
- 当客户端发出的数据块小于512字节时,知道已发出最后一个数据块,在收到服务端的确认报文后,结束本次传输;当服务端收到第一个小于512字节的数据块,知道已收到最后一个数据块,发出确认报文后,结束本次传输
下载文件
- 客户端发出读文件请求,并告知文件名,服务端回复数据块#1,客户端发出确认数据块#1
- 客户端发出数据块#N,服务端回复确认数据块#N
- 客户端发出数据块#N,服务端回复确认数据#N
- 当服务端发出的数据块小于512字节时,知道已发出最后一个数据块,在收到客户端的确认报文后,结束本次传输;当客户端收到第一个小于512字节的数据块,知道已收到最后一个数据块,发出确认报文后,结束本次传输
测试要点
设备作为tftp客户端,支持上传下载文件,如配置文件、版本文件
设备作为tftp服务端,支持上传下载文件,如配置文件、版本文件
报文实战
上传文件
客户端发出写文件请求,文件名时1M.zip,传输模式是octet
服务端回复确认,数据块编号是0
客户端发出第一个数据块,字节大小是512字节,说明不是最后一个
服务端发出数据块#1的确认报文
一个个数据块传输,直到最后一个数据块
下载文件
客户端发出读文件请求,文件名是testfile1.txt,传输模式是netascii
服务端发出数据块#1,小于512字节,说明是最后一个数据块
客户端发出数据块#1的确认报文,结束传输
推荐使用tftpd64软件搭建tftp客户端和服务端,具体使用方法参考
【手把手教】使用tftpd64上传下载文件-CSDN博客
原创不易,你的支持是我最大的动力,欢迎大家点赞,收藏,关注!