计算机网络课程设计
利用 JAVA 实现 TFTP 协议
学 号:
姓 名:
提交日期:
成 绩:
教师签字:
东北大学秦皇岛分校电子信息系
计算机网络课程设计——利用 JAVA 实现 TFTP 协议
利用 Java 编程实现 TFTP 协议
一、 设计目的与要求:
TFTP(Trivial File Transfer Protocol,简单文件传输协议)是 TCP/IP 协议族中的一
个用来在客户机与服务器之间进行简单文件传输的协议,提供不复杂、开销不大的文件传输
服务。TFTP 承载在 UDP 上,提供不可靠的数据流传输服务,不提供存取授权与认证机制,使
用超时重传方式来保证数据的到达。与 FTP 相比,TFTP 的大小要小的多。现在最普遍使用的
是第二版 TFTP(TFTP Version 2,RFC 1350)。
本次设计要求利用 JAVA 实现 TFTP 协议的基本功能 。
二、 设计过程:
1、TFTP 协议的原理:
简单文件传输协议是一种用来传输文件的简单协议,运行在 UDP (用户数据报协议)上。
TFTP 被设计为小而简单容易的运行,因此,它缺乏标准 FTP 协议的许多特征。TFTP 只能从
远程服务器上读、写文件(邮件)或者读、写文件传送给远程服务器。它不能列出目录并且
当前不提供用户认证。
当前 TFTP 有 3 种传输模式: netASCII 模式即 8 位 网络 ASCII 码 ;octet,即八位
组模式(替代了以前版本的二进制模式),如原始八位字节;邮件模式,这种模式现在已经
废止不用了。主机双方也可以自己定义其它模式。
在 TFTP 协议中,任何一个传输进程都以请求读或写文件开始,同时建立一个连接。如
果服务器同意请求,则连接成功,文件就以固定的 512 字节块的长度进行传送。每个数据包
都包含一个数据块,在发送下一个包之前,数据块必须得到确认响应包的确认。如果一个数
据包的大小小于 512 字节,则表明传输结束。如果包在网络中丢失,接收端就会超时并重新
发送其最后的包(可能是数据也可能是确认响应),这就导致丢失包的发送者重新发送丢失
包。通信的双方都是数据的发出者与接收者,一方传输数据接收应答,另一方发出应答接收
数据。发送者需要保留一个包在手头用于重新发送,由 LOCK 确认响应保证所有过去的包都
已经收到。大部分的错误会导致连接中断,错误由一个错误的数据包引起。这个包不会被确
认,也不会被重新发送,因此另一方无法接收到。如果错误包丢失,则使用超时机制。错误
主要是由下面三种情况引起的:不能满足请求,收到的数据包内容错误,而这种错误不能由
东北大学秦皇岛分校电子信息系
第 1页
计算机网络课程设计——利用 JAVA 实现 TFTP 协议
延时或重发解释,对需要资源的访问丢失(如硬盘满)。TFTP 只在一种情况下不中断连接,
这种情况是源端口不正确,在这种情况下,指示错误的包会被发送到源机。这个协议限制很
多,这是都是为了实现起来比较方便而进行的。
2、协议结构:
因为 TFTP 使用 UDP,而 UDP 使用 IP,IP 还可以使用其它本地通信方法。因此一个 TFTP
包中会有以下几段:本地媒介头,IP 头,数据报头,TFTP 头,剩下的就是 TFTP 数据了。TFTP
在 IP 头中不指定任何数据,但是它使用 UDP 中的源和目标端口以及包长度域。由 TFTP 使用
的包标记(TID)在这里被用做端口,因此 TID 必须介于 0 到 65,535 之间。
基本 TFTP 数据报结构:
每个数据包都有一个 opcode(2 个字节),表示包的类型。包的类型有以下 5 种:
Opcode
Command
Description
1
2
3
4
5
Read Request (RRQ)
Request to read a file
Write Request (WRQ)
Request to write to a file
File Data (DAT)
Transfer of file data
Data
(ACK)
Acknowledge
Acknowledgement of file data
Error (ERR)
Error indication
由上表可知,TFTP 协议有五种数据包,以下为它们的结构:
1.RRQ/WRQ 包:
--------------------------------------------------------------
| Opcode | Filename | 0 | Mode
| 0 |
---------------------------------------------------------------
2 bytes
string
1 byte
string
1 byte
RRQ 和 WRQ 包(代码分别为 1 和 2)的格式如上所示。文件名是 NETASCII 码字符,以
0 结束。 而 MODE 域包括了字符串"netascii"或"octet",名称不分大小写。接收到 NETASCII
格式数据的主机必须将数据转换为本地格式。OCTET 模式用于传输文件,这种文件在源机上
以 8 位格式存储。
东北大学秦皇岛分校电子信息系
第 2页
计算机网络课程设计——利用 JAVA 实现 TFTP 协议
2. DATA 包:
-----------------------------------
| Opcode | Block # | Data |
-----------------------------------
2 bytes 2 bytes n bytes
数据在数据包中传输,其格式如上图所示。数据包的 opcode 为 3,它还包括有一个数据
块号和数据。数据块号域从 1 开始编码,每个数据块加 1,这样接收方可以确定这个包是新
数据还是已经接收过的数据。数据域从 0 字节到 512 字节。如果数据域是 512 字节则它不是
最后一个包,如果小于 512 字节则表示这个包是最后一个包。如果最后一个包正好为 512 字
节,则再发送一个 0 字节的包用于表示结束。
3.ACK 包:
-----------------------
| Opcode | Block |
-----------------------
2 bytes 2 bytes
ACK 包用于确认数据包已收到。ACK 包的操作码为 4,它的格式如上图所示。当接收方收到
一个数据包后,会向发送方发送一个 ACK 包;而发送方则会在收到一个 ACK 包后继续发送
下一个包。若发送发未能收到 ACK 包,则会使用超时机制,重新发送刚才的数据包。除了
ACK 和用于中断的包外,其它的包均需得到确认。发出新的数据包等于确认上次的包。WRQ
和 DATA 包由 ACK 或 ERROR 数据包确认,而 RRQ 数据包由 DATA 或 ERROR 数据包确认。
4.ERROR 包
-----------------------------------------------
| Opcode | ErrorCode | ErrMsg | 0 |
-----------------------------------------------
2 bytes
2 bytes
string 1 byte
一个 ERROR 包的操作码是 5,它的格式如上所示。此包可以被其它任何类型的包确认。错误
码指定错误的类型。
东北大学秦皇岛分校电子信息系
第 3页
计算机网络课程设计——利用 JAVA 实现 TFTP 协议
错误的值和错误的意义如下图所示。错误信息是供程序员使用的。
错误码
说明
0
1
2
3
4
5
6
7
未定义,请参阅错误信息(如果提示这种信息的
话)
文件未找到
访问非法
磁盘满或超过分配的配额
非法的 TFTP 操作
未知的传输 ID (端口号)
文件已经存在
没有此用户
3、TFTP 协议的工作流程图如下:
开始
启动 TFTP 服务器
监听 69 端口,初始化缓冲区
1
是 否 有 请
求?
y
接收请求,并分析收到的数据的操
WRQ
RRQ
操作码为 RRQ
还是 WRQ?
写文件(对客户端
来说就是上传)
读文件(对客户
端来说是下载)
东北大学秦皇岛分校电子信息系
第 4页
计算机网络课程设计——利用 JAVA 实现 TFTP 协议
写文件:
1
y
出错信息
分析 buffer 得到客户端
要上传的文件名及 mode
判断文件是否
存在?
n
发送 0 号 ACK
等待接受
2
重发 ACK
y
超时?
n
分析接收到数
据的操作码
操作码为 DAT?
读取数据块
block 号是否是期待的
(即最近发送的 ACK 号
+1 与数据块号一致)?
y
读取数据
n
重发 ACK
东北大学秦皇岛分校电子信息系
第 5页
计算机网络课程设计——利用 JAVA 实现 TFTP 协议
读取数据
ACK 号++
接收到的数据块号
=1?
y
y
y
上传结束
跳出上传模
1
建立文件
将读取的数
据写入文件
发送 ACK
刚写入文件
的数据块长
度<512?
n
2
n
将读取的数
据写入文件
发送 ACK
刚写入文件
的数据块长
度<512?
n
2
东北大学秦皇岛分校电子信息系
第 6页
计算机网络课程设计——利用 JAVA 实现 TFTP 协议
读文件:
n
错误信息
3
接收到数据
的操作码
操作码为 ACK?
n
重发数据包
分析 buffer 得到
客户端要上传的
文件名及 mode
4
y
n
判断文件是否
存在?
读取 512byte
数据打包发
等待 ACK
计算剩余文件长
y
n<512?
读取 n byte 数
据打包发送
等待 ACK
n
y
y
超时?
错误信息
超时?
y
1
n
重发数据包
接收到的 ACK 是否
正确?
y
n
下移 512byte
n
n
接收的 ACK
是否正确?
y
读文件结束
重发数据包
3
block 号+1
1
3
4
东北大学秦皇岛分校电子信息系
第 7页