计算机网络课程设计利用JAVA实现TFTP协议学号:姓名:提交日期:成绩:教师签字:东北大学秦皇岛分校电子信息系计算机网络课程设计——利用JAVA实现TFTP协议东北大学秦皇岛分校电子信息系第1页利用Java编程实现TFTP协议一、设计目的与要求:TFTP(TrivialFileTransferProtocol,简单文件传输协议)是TCP/IP协议族中的一个用来在客户机与服务器之间进行简单文件传输的协议,提供不复杂、开销不大的文件传输服务。TFTP承载在UDP上,提供不可靠的数据流传输服务,不提供存取授权与认证机制,使用超时重传方式来保证数据的到达。与FTP相比,TFTP的大小要小的多。现在最普遍使用的是第二版TFTP(TFTPVersion2,RFC1350)。本次设计要求利用JAVA实现TFTP协议的基本功能。二、设计过程:1、TFTP协议的原理:简单文件传输协议是一种用来传输文件的简单协议,运行在UDP(用户数据报协议)上。TFTP被设计为小而简单容易的运行,因此,它缺乏标准FTP协议的许多特征。TFTP只能从远程服务器上读、写文件(邮件)或者读、写文件传送给远程服务器。它不能列出目录并且当前不提供用户认证。当前TFTP有3种传输模式:netASCII模式即8位网络ASCII码;octet,即八位组模式(替代了以前版本的二进制模式),如原始八位字节;邮件模式,这种模式现在已经废止不用了。主机双方也可以自己定义其它模式。在TFTP协议中,任何一个传输进程都以请求读或写文件开始,同时建立一个连接。如果服务器同意请求,则连接成功,文件就以固定的512字节块的长度进行传送。每个数据包都包含一个数据块,在发送下一个包之前,数据块必须得到确认响应包的确认。如果一个数据包的大小小于512字节,则表明传输结束。如果包在网络中丢失,接收端就会超时并重新发送其最后的包(可能是数据也可能是确认响应),这就导致丢失包的发送者重新发送丢失包。通信的双方都是数据的发出者与接收者,一方传输数据接收应答,另一方发出应答接收数据。发送者需要保留一个包在手头用于重新发送,由LOCK确认响应保证所有过去的包都已经收到。大部分的错误会导致连接中断,错误由一个错误的数据包引起。这个包不会被确认,也不会被重新发送,因此另一方无法接收到。如果错误包丢失,则使用超时机制。错误主要是由下面三种情况引起的:不能满足请求,收到的数据包内容错误,而这种错误不能由计算机网络课程设计——利用JAVA实现TFTP协议东北大学秦皇岛分校电子信息系第2页延时或重发解释,对需要资源的访问丢失(如硬盘满)。TFTP只在一种情况下不中断连接,这种情况是源端口不正确,在这种情况下,指示错误的包会被发送到源机。这个协议限制很多,这是都是为了实现起来比较方便而进行的。2、协议结构:因为TFTP使用UDP,而UDP使用IP,IP还可以使用其它本地通信方法。因此一个TFTP包中会有以下几段:本地媒介头,IP头,数据报头,TFTP头,剩下的就是TFTP数据了。TFTP在IP头中不指定任何数据,但是它使用UDP中的源和目标端口以及包长度域。由TFTP使用的包标记(TID)在这里被用做端口,因此TID必须介于0到65,535之间。基本TFTP数据报结构:每个数据包都有一个opcode(2个字节),表示包的类型。包的类型有以下5种:OpcodeCommandDescription1ReadRequest(RRQ)Requesttoreadafile2WriteRequest(WRQ)Requesttowritetoafile3FileData(DAT)Transferoffiledata4DataAcknowledge(ACK)Acknowledgementoffiledata5Error(ERR)Errorindication由上表可知,TFTP协议有五种数据包,以下为它们的结构:1.RRQ/WRQ包:--------------------------------------------------------------|Opcode|Filename|0|Mode|0|---------------------------------------------------------------2bytesstring1bytestring1byteRRQ和WRQ包(代码分别为1和2)的格式如上所示。文件名是NETASCII码字符,以0结束。而MODE域包括了字符串netascii或octet,名称不分大小写。接收到NETASCII格式数据的主机必须将数据转换为本地格式。OCTET模式用于传输文件,这种文件在源机上以8位格式存储。计算机网络课程设计——利用JAVA实现TFTP协议东北大学秦皇岛分校电子信息系第3页2.DATA包:-----------------------------------|Opcode|Block#|Data|-----------------------------------2bytes2bytesnbytes数据在数据包中传输,其格式如上图所示。数据包的opcode为3,它还包括有一个数据块号和数据。数据块号域从1开始编码,每个数据块加1,这样接收方可以确定这个包是新数据还是已经接收过的数据。数据域从0字节到512字节。如果数据域是512字节则它不是最后一个包,如果小于512字节则表示这个包是最后一个包。如果最后一个包正好为512字节,则再发送一个0字节的包用于表示结束。3.ACK包:-----------------------|Opcode|Block|-----------------------2bytes2bytesACK包用于确认数据包已收到。ACK包的操作码为4,它的格式如上图所示。当接收方收到一个数据包后,会向发送方发送一个ACK包;而发送方则会在收到一个ACK包后继续发送下一个包。若发送发未能收到ACK包,则会使用超时机制,重新发送刚才的数据包。除了ACK和用于中断的包外,其它的包均需得到确认。发出新的数据包等于确认上次的包。WRQ和DATA包由ACK或ERROR数据包确认,而RRQ数据包由DATA或ERROR数据包确认。4.ERROR包-----------------------------------------------|Opcode|ErrorCode|ErrMsg|0|-----------------------------------------------2bytes2bytesstring1byte一个ERROR包的操作码是5,它的格式如上所示。此包可以被其它任何类型的包确认。错误码指定错误的类型。计算机网络课程设计——利用JAVA实现TFTP协议东北大学秦皇岛分校电子信息系第4页错误的值和错误的意义如下图所示。错误信息是供程序员使用的。错误码说明0未定义,请参阅错误信息(如果提示这种信息的话)1文件未找到2访问非法3磁盘满或超过分配的配额4非法的TFTP操作5未知的传输ID(端口号)6文件已经存在7没有此用户3、TFTP协议的工作流程图如下:启动TFTP服务器监听69端口,初始化缓冲区是否有请求?开始接收请求,并分析收到的数据的操作码y操作码为RRQ还是WRQ?写文件(对客户端来说就是上传)读文件(对客户端来说是下载)WRQRRQ1计算机网络课程设计——利用JAVA实现TFTP协议东北大学秦皇岛分校电子信息系第5页写文件:出错信息发送0号ACK等待接受分析buffer得到客户端要上传的文件名及mode判断文件是否存在?超时?分析接收到数据的操作码操作码为DAT?重发ACK读取数据块号block号是否是期待的(即最近发送的ACK号+1与数据块号一致)?重发ACK读取数据21ynynny计算机网络课程设计——利用JAVA实现TFTP协议东北大学秦皇岛分校电子信息系第6页读取数据ACK号++接收到的数据块号=1?建立文件将读取的数据写入文件发送ACK将读取的数据写入文件发送ACK上传结束三刚写入文件的数据块长度512?刚写入文件的数据块长度512?跳出上传模块三122ynyynn计算机网络课程设计——利用JAVA实现TFTP协议东北大学秦皇岛分校电子信息系第7页读文件:判断文件是否存在?错误信息计算剩余文件长度n读取512byte数据打包发送n512?分析buffer得到客户端要上传的文件名及mode等待ACK超时?错误信息操作码为ACK?接收到数据的操作码重发数据包接收到的ACK是否正确?重发数据包下移512byteblock号+1等待ACK读取nbyte数据打包发送超时?接收的ACK是否正确?重发数据包读文件结束1133344ynynyynnnyynynn计算机网络课程设计——利用JAVA实现TFTP协议东北大学秦皇岛分校电子信息系第8页4、详细设计说明:1)系统整体树形图:2)本程序中的一些重要的函数:(a)客户端中用来发送和接受文件的函数:(b)服务器端中主要的处理函数:计算机网络课程设计——利用JAVA实现TFTP协议东北大学秦皇岛分校电子信息系第9页3)关键代码:计算机网络课程设计——利用JAVA实现TFTP协议东北大学秦皇岛分校电子信息系第10页计算机网络课程设计——利用JAVA实现TFTP协议东北大学秦皇岛分校电子信息系第11页计算机网络课程设计——利用JAVA实现TFTP协议东北大学秦皇岛分校电子信息系第12页5、程序运行结果:1)运行服务器端程序,启动TFTP服务(如下图):2)运行客户端程序(如下图):计算机网络课程设计——利用JAVA实现TFTP协议东北大学秦皇岛分校电子信息系第13页6、测试:上传:下载:计算机网络课程设计——利用JAVA实现TFTP协议东北大学秦皇岛分校电子信息系第14页三、总结:通过本次程序设计,完成了用JAVA编程实现TFTP协议的基本功能的预期要求。我们大量地查阅了相关的资料,学习了TFTP协议的基本知识,了解了它的工作原理及应用。而后我们在实现TFTP协议功能的基础上,利用JAVA插件实现友好的用户界面,完成了数据包传输的直观显示。在此过程中,我们受益匪浅。利用这次程序设计,不仅更加深入地理解了计算机网络的相关知识,而且对网络编程以及客户机服务器模型也有了更深入的了解。在这次程序设计完成中我们深刻体会到集体的力量是多么强大,也充分挖掘了我们对陌生事物认识和学习的潜能。可视化的程序结果不仅美观,而且直接简化了发起传输时的操作,使之更具有操作性。当然,此程序还有很多可以改进的地方。比如,可采用多线程来模拟多个客户端同时访问服务器的情况,以检测传输的可靠性。