首页 > 编程笔记 > TCP/IP笔记 阅读:853

如何将文件上传到TFTP服务器?

上传文件指的是客户端将本地上的文件上传到 TFTP 服务器上。下面介绍客户端如何进行文件上传,以及上传时所涉及的各类型数据包。

工作流程

客户端会向 TFTP 服务器发送请求写入(WRQ)数据包,指明要写入的文件。如果 TFTP 服务器允许该文件的写入,就返回一个 ACK 确认包,该包的编号为 0。客户端收到服务器的确认包以后,就开始向服务器写入文件。

文件数据以定长 512 字节进行传输,与 RRQ 包的传输方式一样,传输的每一个文件数据包都会得到服务器返回的确认包,并且数据包的数据编号也是从 1 开始。其工作流程如图所示。

上图中显示了客户端向 TFTP 服务器上传文件信息的工作流程,每个步骤含义介绍如下:
  1. 客户端向 TFTP 服务器发送写入请求(WRQ)。
  2. 服务器收到客户端的 WRQ 请求后,同意该请求,返回 ACK 确认包。这里的确认包的数据编号为 0。
  3. 客户端收到请求的确认包以后,得知服务器已经同意文件上传。客户端开始进行文件上传,向服务器发送文件信息数据。首先发送第 1 个 DATA 包,大小为 512 字节,此时包的数据编号为 1,因为步骤(2)中已经使用了数据编号 0。
  4. 服务器收到客户端发来的数据编号为 1 的 DATA 包,并进行确认,向客户端发送数据编号为 1 的 ACK 包。
  5. 客户端收到第 1 个 DATA 包返回的 ACK 包后,继续向服务器发送第 2 个 DATA 包,大小为 512 字节,此时的数据编号为 2。
  6. 服务器对第 2 个 DATA 包进行确认,向客户端发送数据编号为 2 的 ACK 包。
  7. 客户端收到第 2 个 DATA 包返回的 ACK 包后,继续向服务器发送第 3 个 DATA 包,大小小于 512 字节,此时的数据编号为 3。
  8. 服务器收到发来第 3 个的 DATA 包,发现包大小小于 512 字节,就认为客户端已经将文件的数据信息全部发送给了自己(服务器),表示上传完成。服务器对最后的 DATA 数据包进行确认,向客户端发送数据编号为 3 的 ACK 包。

构建 WRQ 包

为了能够更清晰地了解 TFTP 上传文件的整个过程,下面演示该操作。

在 netwox 工具中,编号为 166 的模块可以将客户端的文件上传到 TFTP 服务器上。其语法格式如下:

netwox 166 -i IP -f file1 -F file2

参数说明:
【实例】已知 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) 抓包,并查看上传文件整个过程产生的数据包,如图所示。

上图中,第 4~11 个数据包为上传文件整个过程的数据包。第 4 个数据包为客户端构建的 WRQ 请求包。通

过包的基本信息可以看到,源 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)包,如图所示。

通过包的基本信息可以看到,源 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 包的确认包。此时完成了上传文件的整个过程。

编程帮,一个分享编程知识的公众号。跟着站长一起学习,每天都有进步。

通俗易懂,深入浅出,一篇文章只讲一个知识点。

文章不深奥,不需要钻研,在公交、在地铁、在厕所都可以阅读,随时随地涨姿势。

文章不涉及代码,不烧脑细胞,人人都可以学习。

当你决定关注「编程帮」,你已然超越了90%的程序员!

编程帮二维码
微信扫描二维码关注

所有教程

优秀文章