利用java实现TFTP协议

2022-07-11 11:50:42   文档大全网     [ 字体: ] [ 阅读: ]

#文档大全网# 导语】以下是®文档大全网的小编为您整理的《利用java实现TFTP协议》,欢迎阅读!
协议,利用,实现,java,TFTP




javaTFTP



-CAL-FENGHAI.Network Information Technology Company.2020YEAR










计算机网络课程设计

利用JAVA实现TFTP协议



号: 名: 提交日期: 绩:







教师签字:





东北大学秦皇岛分校电子信息

2


利用Java编程实现TFTP协议



一、 设计目的与要求:

TFTPTrivial File Transfer Protocol,简单文件传输协议)是TCP/IP协议族中的一个用来在客户机与服务器之间进行简单文件传输的协议,提供不复杂、开销不大的文件传输服务。TFTP承载在UDP上,提供不可靠的数据流传输服务,不提供存取授权与认证制,使用超时重传方式来保证数据的到达。与FTP相比,TFTP的大小要小的多。现在最普遍使用的是第二版TFTPTFTP Version 2,RFC 1350)。

本次设计要求利用JAVA实现TFTP协议的基本功能

二、 设计过程:

1

TFTP协议的原理:

简单文件传输协议是一种用来传输文件的简单协议,运行在 UDP (用户数据报协议)上。TFTP 设计为小而简单容易的运行,因此,它缺乏标准 FTP 协议的许多特征。TFTP 只能从远程服务器上读、写文件(邮件)或者读、写文件传送给远程服务器。它不能列出目录并且当前不提供用户认证

当前 TFTP 3 种传输模式: netASCII 模式即 8 网络ASCII octet,即八位组模式(替代了以前版本的二进制模式),如原始八位字节;邮件模式,这种模式现在已经废止不用了。主机双方也可以自己定义其它模式。

TFTP 协议中,任何一个传输进程都以请求读或写文件开始,同时建立一个连接。如果服务器同意请求,则连接成功,文件就以固定的 512 字节块的长度进行传送。每个数据包都包含一个数据块,在发送下一个包之前,数据块必须得到确认响应包的确认。如果一个数据包的大小小于512字节,则表明传输结束。如果包在网络中丢失,接收端就会超时并重新发送其最后的包(可能是数据也可能是确认响应),这就导致丢失包的发送者重新发送丢失包。通信的双方都是数据的发出者与接收者,一方传输数据接收应答,另一方发出应答接收数据。发送者需要保留一个包在手头用于重新发送,由 LOCK 确认响应保证所有过去的包都已经收到。大部分的错误会导致连接中断,错误由一个错误的数据包引起。这个包不会被确认,也不会被重新发送,因此另一方无法接收到。如果错误包丢失,则使用超时机制。错误主要是由下面三种情况引起的:不能满足请求,收到的数据包内容

1


错误,而这种错误不能由延时或重发解释,对需要资源的访问丢失(如硬盘满)。TFTP在一种情况下不中断连接,这种情况是源端口不正确,在这种情况下,指示错误的包会被发送到源机。这个协议限制很多,这是都是为了实现起来比较方便而进行的。 2

协议结构:

因为TFTP使用UDP,而UDP使用IPIP还可以使用其它本地通信方法。因此一个TFTP包中会有以下几段:本地媒介头,IP头,数据报头,TFTP头,剩下的就是TFTP数据了。TFTPIP头中不指定任何数据,但是它使用UDP中的源和目标端口以及包长度域。TFTP使用的包标记(TID)在这里被用做端口,因此TID必须介于065,535之间。

基本 TFTP 数据报结构:

每个数据包都有一个opcode(2个字节),表示包的类型。包的类型有以下5种:

Opcode 1 2 3 4 5

Command Read Request (RRQ) Write Request (WRQ) File Data (DAT) Data Acknowledge (ACK) Error (ERR)

Description Request to read a file Request to write to a file Transfer of file data

Acknowledgement of file data Error indication

由上表可知,TFTP协议有五种数据包,以下为它们的结构: 1.RRQ/WRQ包:

-------------------------------------------------------------- | Opcode | Filename | 0 | Mode | 0 | --------------------------------------------------------------- 2 bytes string 1 byte string 1 byte

RRQWRQ包(代码分别为12)的格式如上所示。文件名是NETASCII码字符,以0结束。 MODE域包括了字符串"netascii""octet",名称不分大小写。接收到NETASCII格式数据的主机必须将数据转换为本地格式。OCTET模式用于传输文件,这种文件在源机上以8位格式存储。



2


2. DATA包:

-----------------------------------

| Opcode | Block # | Data |----------------------------------- 2 bytes 2 bytes n bytes

数据在数据包中传输,其格式如上图所示。数据包的opcode3,它还包括有一个数据块号和数据。数据块号域从1开始编码,每个数据块加1,这样接收方可以确定这个包是新数据还是已经接收过的数据。数据域从0字节到512字节。如果数据域是512字节则它不是最后一个包,如果小于512字节则表示这个包是最后一个包。如果最后一个包正好512字节,则再发送一个0字节的包用于表示结束。

3.ACK包: -----------------------

| Opcode | Block |----------------------- 2 bytes 2 bytes

ACK包用于确认数据包已收到。ACK包的操作码为4,它的格式如上图所示。当接收方收到一个数据包后,会向发送方发送一个ACK包;而发送方则会在收到一个ACK包后继续发送下一个包。若发送发未能收到ACK包,则会使用超时机制,重新发送刚才的数据包。除了ACK和用于中断的包外,其它的包均需得到确认。发出新的数据包等于确认上次的包。WRQDATA包由ACKERROR数据包确认,而RRQ数据包由DATAERROR数据包确认。

4.ERROR

-----------------------------------------------

| Opcode | ErrorCode | ErrMsg | 0 |----------------------------------------------- 2 bytes 2 bytes string 1 byte

一个ERROR包的操作码是5,它的格式如上所示。此包可以被其它任何类型的包确认。错误码指定错误的类型。

错误的值和错误的意义如下图所示。错误信息是供程序员使用的。

3


错误码 0 1 2 3 4 5 6 7

说明

未定义,请参阅错误信息(如果提示这种信息的话) 文件未找到 访问非法

磁盘满或超过分配的配额 非法的TFTP操作 未知的传输ID (端口号) 文件已经存在 没有此用户

3TFTP协议工作流程图如下:



监听69端口,初始化缓冲区



1



写文件:

4

写文件(对客户端来说就是上

读文件(对客户端来说是下载)

开始

启动TFTP服务器

是否有请求?

y

接收请求,并分析收到的数据的

WR

操作码为RRQ还是

RRQ


1

分析buffer得到客户端要上传的文件名及mode

y

出错信息

判断文件是否存在?

n

发送0

2

等待接受

y

n

超时?

分析接收到数据的操作码

重发ACK

操作码为DAT

读取数据块

block号是否是期待的(即最近发送的ACK+1与数据块号一致)

y

n 重发ACK



读取数据



5


读取数据

ACK++

y

建立文件

接收到的数据块号

=1

n

将读取的数据写入文件

将读取的数据写入文件

发送ACK

发送ACK

刚写入文件的数据块长<512 n

y

上传结束

y

刚写入文件的数据块长<512

n

跳出上传模

2

2

1



读文件:

6






分析buffer得到客户端要上传的文件名及mode

n

错误信息

判断文件是否存在?

4

y

计算剩余文件长

y

n<512

读取n byte数据打包发

等待ACK

等待ACK

n

读取512byte数据打包发

3

接收到数据的操作码

n

超时?

y

错误信息

y

超时?

n

y

操作码为

1

重发数据包

n

接收的ACK是否正确?

n

重发数据包

n

下移512byte

3

重发数据包

block+1

1

接收到的ACK

否正确?

y

y

读文件结束

3



4、详细设计说明:

1

系统整体树形图:

7

4






2 本程序中的一些重要的函数:

a)客户端中用来发送和接受文件的函数:



b)服务器端中主要的处理函数:



3

关键代码:

8


9


10




11






5、程序运行结果:

1 运行服务器端程序,启动TFTP服务(如下图):



2)运行客户端程序(如下图):





12


6、测试: 上传:



下载:



13




三、 总结

通过本次程序设计,完成了用JAVA编程实现TFTP协议的基本功能的预期要求。我们大量地查阅了相关的资料学习TFTP协议的基本知识,了解了它的工作原理及应用。而后我们在实现TFTP协议功能的基础上,利用JAVA插件实现友好的用户界面,完成了数据包传输的直观显示。

在此过程中,我们受益匪浅。利用这次程序设计,不仅更加深入地理解了计算机网络的相关知识,而且对网络编程以及客户机服务器模型也有了更深入的了解。在这次程序设计完成中我们深刻体会到集体的力量是多么强大,也充分挖掘了我们对陌生事物认识和学习的潜能。可视化的程序结果不仅美观,而且直接简化了发起传输时的操作,使之更具有操作性。

当然,此程序还有很多可以改进的地方。比如,可采用多线程来模拟多个客户端同时访问服务器的情况,以检测传输的可靠性。

14


本文来源:https://www.wddqxz.cn/8b9a381932126edb6f1aff00bed5b9f3f90f72ec.html

相关推荐