一、TFTP协议(UDP)
TFTP(Trivial File Transfer Protocol,简单文件传输协议)是TCP/IP协议族中的一个用来在客户端与服务器之间进行简单文件传输的协议,提供不复杂、开销不大的文件传输服务,端口号为69。
TFTP通常基于UDP协议而实现,TFTP协议的设计目的主要是为了进行小文件传输,因此它不具备通常的FTP的许多功能
TFTP代码所占的内存较小,这对于较小的计算机或者某些特殊用途的设备来说是很重要的,这些设备不需要硬盘,只需要固化了TFTP、UDP和IP的小容量只读存储器即可。因此,随着嵌入式设备在网络设备中所占的比例的不断提升,TFTP协议被越来越广泛的使用。
TFTP共定义了六种类型的包,包的类型由数据包前两个字节确定,我们称之为Opcode(操作码)字段。这五种类型的数据包分别是:
读文件请求包:Read request,简写为RRQ,对应Opcode字段值为1
写文件请求包:Write requst,简写为WRQ,对应Opcode字段值为2
文件数据包:Data,简写为DATA,对应 Opcode字段值为3
回应包:Acknowledgement,简写为ACK,对应Opcode字段值为4
错误信息包:Error,简写为ERROR,对应Opcode字段值为5
请求恢复包: Acknowledgement,简写为ACK,对应Opcode字段值为6
RRQ和WRQ数据包的格式:
1. 操作码(2字节),它用来表示当前数据包的类型(取值1表示该数据包是个读请求,2表示该数据包是写请求);
2. 可变长字段,它用来表示要读取或上传的文件名,它使用ASCII码并以 \0 表示结尾;
3. Mode,也是可变长字段,用来表示传输文件的数据类型,如果传输的是字符串文件,那么它填写字符串”netascii”,如果传输的是二进制文件,那么它填写字符串”octet”,这些字符串都以 \0 结尾。
4. 可选字段(timeout、blksize、tsize等,以 \0 结尾)
00 01 (操作码)
31 2e 62 (1.c(文件名), 以 \0 结尾 即 00)
6f 63 74 65 74 (octet(文件传输方式), 以 \0 结尾 即 00)
62 6c 6b 73 69 7a 65 (blksize(每次传输文件大小), 以 \0 结尾 即 00)
35 31 32 (512 (字符串), 以 \0 结尾 即 00)
74 73 69 7a 65 (tsize(文件大小), 以 \0 结尾 即 00)
30 (0(字符串), 以 \0 结尾 即 00)
请求响应包是对请求数据的相应,为可选包,某种情况下是可以不需要的,视具体情况而定。
1. 操作码(2字节)
2. 可选字段(timeout、blksize、tsize等,以 \0 结尾 以及相关的值)
00 06 (操作码)
62 6c 6b 73 69 7a 65 (blksize, 以 \0 结尾 即 00)
35 31 32 (512(字符串), 以 \0 结尾 即 00)
74 73 69 7a 65 (tsize(文件大小), 以 \0 结尾 即 00)
31 39 34 37 (1947(字符串), 以 \0 结尾 即 00)
传输数据块的DATA数据包,
1. 操作码(2字节)
2. 数据包序(2字节)
3. 数据值
00 03 (操作码)
00 01 (block number)
..... (DATA)
回应包是对收到的文件数据进行回应
1. 操作码(2字节)
2. 数据包序(2字节)
00 03 (操作码)
00 01 (block number)
错误ERROR数据包
1. 操作码(2字节)
2. 错误码(2字节)
3. 错误具体原因(可变长)
三、TFTP工作流程
3.1 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请求完成
1. Netascii:这是8位的ASCII码形式,一般用来传输字符数据
2. Octet:这是8位源数据类型,一般用来传输二进制数据
3. Mail:它将返回的数据直接返回给用户而不是保存为文件,但该模式已经不再支持
五、Python实现TFTP协议
https://www.cnblogs.com/wangyong123/articles/17015233.html#_label4