如何将文件上传到TFTP服务器?
上传文件指的是客户端将本地上的文件上传到 TFTP 服务器上。下面介绍客户端如何进行文件上传,以及上传时所涉及的各类型数据包。
文件数据以定长 512 字节进行传输,与 RRQ 包的传输方式一样,传输的每一个文件数据包都会得到服务器返回的确认包,并且数据包的数据编号也是从 1 开始。其工作流程如图所示。
上图中显示了客户端向 TFTP 服务器上传文件信息的工作流程,每个步骤含义介绍如下:
在 netwox 工具中,编号为 166 的模块可以将客户端的文件上传到 TFTP 服务器上。其语法格式如下:
【实例】已知 TFTP 服务器的 IP 地址为 192.168.59.135,本地文件 Test-keep.txt 大小为 1226 字节。使用 netwox 工具将该文件上传到 TFTP 服务器上。具体步骤如下:
1) 上传文件,上传后的文件命名为 keep.txt,执行命令如下:
2) 抓包,并查看上传文件整个过程产生的数据包,如图所示。
上图中,第 4~11 个数据包为上传文件整个过程的数据包。第 4 个数据包为客户端构建的 WRQ 请求包。通
过包的基本信息可以看到,源 IP 地址为 192.168.59.133,目标 IP 地址为 192.168.59.135,Info 列中的信息为 Write Request。
在 Trivial File Transfer Protocol 部分显示了报文格式,含义如下:
3) 第 5 个数据包是服务器返回的确认(ACK)包,如图所示。
通过包的基本信息可以看到,源 IP 地址为 192.168.59.135,目标 IP 地址为 192.168.59.133,Info 列中的信息为 Acknowledgement。
在报文字段信息中可以看到,Block 值为 0,表示该确认包的数据编码为 0。
4) 第 6 个数据包为客户端向服务器上传文件时,发送数据信息的第一个 DATA 包,如图所示。
通过包的基本信息可以看到,源 IP 地址为 192.168.59.133,目标 IP 地址为 192.168.59.135,Info 列中的信息为 Data Packet。
在报文字段信息中可以看到,此时数据编码为 1,传输的数据大小为 512 字节。
5) 第 7 个数据包为服务器返回给客户端的确认包,是对客户端发来的 DATA 包的确认,如图所示。
通过包的基本信息可以看到,源 IP 地址为 192.168.59.135,目标 IP 地址为 192.168.59.133,Info 列中的信息为 Acknowledgement。
在报文字段中可以看到,数据编码为 1,表示该包是第 1 个 DATA 包的确认包。
6) 第 8 个数据包为客户端第 2 次给服务器发送的 DATA 包,如图所示。
通过包的基本信息可以看到,源 IP 地址为 192.168.59.133,目标 IP 地址为 192.168.59.135,Info 列中的信息为 Data Packet。
在报文字段信息中,数据编码为 2,说明这是发送的第 2 个 DATA 包,数据大小为 512 字节。第 9 个数据包为服务器返回的确认包。
7) 第 10 个数据包为客户端向服务器发送的最后一个 DATA 包,如图所示。
该包的 Info 信息中可以看到(last)字样,表示这是上传文件时发送文件信息的最后一个 DATA 包,在报文字段中可以看到,该 DATA 包的大小为 202。
第 11 个数据包为服务器对客户端发送的最后一个 DATA 包的确认包。此时完成了上传文件的整个过程。
工作流程
客户端会向 TFTP 服务器发送请求写入(WRQ)数据包,指明要写入的文件。如果 TFTP 服务器允许该文件的写入,就返回一个 ACK 确认包,该包的编号为 0。客户端收到服务器的确认包以后,就开始向服务器写入文件。文件数据以定长 512 字节进行传输,与 RRQ 包的传输方式一样,传输的每一个文件数据包都会得到服务器返回的确认包,并且数据包的数据编号也是从 1 开始。其工作流程如图所示。
- 客户端向 TFTP 服务器发送写入请求(WRQ)。
- 服务器收到客户端的 WRQ 请求后,同意该请求,返回 ACK 确认包。这里的确认包的数据编号为 0。
- 客户端收到请求的确认包以后,得知服务器已经同意文件上传。客户端开始进行文件上传,向服务器发送文件信息数据。首先发送第 1 个 DATA 包,大小为 512 字节,此时包的数据编号为 1,因为步骤(2)中已经使用了数据编号 0。
- 服务器收到客户端发来的数据编号为 1 的 DATA 包,并进行确认,向客户端发送数据编号为 1 的 ACK 包。
- 客户端收到第 1 个 DATA 包返回的 ACK 包后,继续向服务器发送第 2 个 DATA 包,大小为 512 字节,此时的数据编号为 2。
- 服务器对第 2 个 DATA 包进行确认,向客户端发送数据编号为 2 的 ACK 包。
- 客户端收到第 2 个 DATA 包返回的 ACK 包后,继续向服务器发送第 3 个 DATA 包,大小小于 512 字节,此时的数据编号为 3。
- 服务器收到发来第 3 个的 DATA 包,发现包大小小于 512 字节,就认为客户端已经将文件的数据信息全部发送给了自己(服务器),表示上传完成。服务器对最后的 DATA 数据包进行确认,向客户端发送数据编号为 3 的 ACK 包。
构建 WRQ 包
为了能够更清晰地了解 TFTP 上传文件的整个过程,下面演示该操作。在 netwox 工具中,编号为 166 的模块可以将客户端的文件上传到 TFTP 服务器上。其语法格式如下:
netwox 166 -i IP -f file1 -F file2
参数说明:- -i 选项指定 TFTP 服务器的 IP 地址。
- -f 选项指定本地的文件名称。
- -F 选项指定本地文件上传到服务器后的文件名称。
【实例】已知 TFTP 服务器的 IP 地址为 192.168.59.135,本地文件 Test-keep.txt 大小为 1226 字节。使用 netwox 工具将该文件上传到 TFTP 服务器上。具体步骤如下:
1) 上传文件,上传后的文件命名为 keep.txt,执行命令如下:
root@daxueba:~# netwox 166 -i 192.168.59.135 -f Test-keep.txt -F keep.txt
执行命令后没有任何输出信息,但是会成功将文件上传到 TFTP 服务器上。2) 抓包,并查看上传文件整个过程产生的数据包,如图所示。
过包的基本信息可以看到,源 IP 地址为 192.168.59.133,目标 IP 地址为 192.168.59.135,Info 列中的信息为 Write Request。
在 Trivial File Transfer Protocol 部分显示了报文格式,含义如下:
Trivial File Transfer Protocol Opcode: Write Request (2) #操作码, 这里值为2, 表示是一个WRQ请求 DESTINATION File: keep.txt #上传后的文件名 Type: octet #数据格式为octet
3) 第 5 个数据包是服务器返回的确认(ACK)包,如图所示。
在报文字段信息中可以看到,Block 值为 0,表示该确认包的数据编码为 0。
4) 第 6 个数据包为客户端向服务器上传文件时,发送数据信息的第一个 DATA 包,如图所示。
在报文字段信息中可以看到,此时数据编码为 1,传输的数据大小为 512 字节。
5) 第 7 个数据包为服务器返回给客户端的确认包,是对客户端发来的 DATA 包的确认,如图所示。
在报文字段中可以看到,数据编码为 1,表示该包是第 1 个 DATA 包的确认包。
6) 第 8 个数据包为客户端第 2 次给服务器发送的 DATA 包,如图所示。
在报文字段信息中,数据编码为 2,说明这是发送的第 2 个 DATA 包,数据大小为 512 字节。第 9 个数据包为服务器返回的确认包。
7) 第 10 个数据包为客户端向服务器发送的最后一个 DATA 包,如图所示。
第 11 个数据包为服务器对客户端发送的最后一个 DATA 包的确认包。此时完成了上传文件的整个过程。
所有教程
- C语言入门
- C语言编译器
- C语言项目案例
- 数据结构
- C++
- STL
- C++11
- socket
- GCC
- GDB
- Makefile
- OpenCV
- Qt教程
- Unity 3D
- UE4
- 游戏引擎
- Python
- Python并发编程
- TensorFlow
- Django
- NumPy
- Linux
- Shell
- Java教程
- 设计模式
- Java Swing
- Servlet
- JSP教程
- Struts2
- Maven
- Spring
- Spring MVC
- Spring Boot
- Spring Cloud
- Hibernate
- Mybatis
- MySQL教程
- MySQL函数
- NoSQL
- Redis
- MongoDB
- HBase
- Go语言
- C#
- MATLAB
- JavaScript
- Bootstrap
- HTML
- CSS教程
- PHP
- 汇编语言
- TCP/IP
- vi命令
- Android教程
- 区块链
- Docker
- 大数据
- 云计算