Chinaunix首页 | 论坛 | 博客
  • 博客访问: 348978
  • 博文数量: 88
  • 博客积分: 907
  • 博客等级: 准尉
  • 技术积分: 1230
  • 用 户 组: 普通用户
  • 注册时间: 2010-01-26 13:27
文章分类

全部博文(88)

文章存档

2017年(1)

2014年(3)

2013年(29)

2012年(21)

2011年(26)

2010年(8)

分类: LINUX

2010-09-11 21:33:26

   这些天公司叫写一个tftp的客服端程序,但是公司让我写成驱动形式,让别人去调用。我经过思考,完全没有必要写成那样,sendto和recvforrm等函数已经做好了一切,我为什么还去把这些函数在封装一次呢,于是我想就写一个应用层的程序(我程序写好了,到现在我也没猜透,为什么叫我用驱动去把这些函数封装一次,可能他、、、、、、),好了,言归正传,我们来说说在应用层怎么写tftp client。
   首先,我们需要知道tftp协议是做什么的吧,不是还写什么呢。其实我觉得大家都是知道的。什么你说你说你不知道,那好,我在这里简单说一下。

       TFTP是一个传输文件的简单协议,通常使用UDP协议而实现,但tftp并没有要求实现的具体协议,在特殊需求的场合可以同tcp实现。此协议设计的时候是进行小文件传输的。因此它不具备通常的FTP的许多功能,它只能从文件服务器上获得或写入文件,不能列出目录,不进行认证,它传输8位数据。传输中有三种模式:netascii,这是8位的ASCII码形式,另一种是octet,这是8位源数据类型;最后一种mail已经不再支持,它将返回的数据直接返回给用户而不是保存为文件。

 

那么tftp的客服端和服务器端是怎么进行通信的呢。那么关系是这么发生的。

 

任何传输起自一个读取或写入文件的请求,这个请求也是连接请求(服务器端的tftp服务器程序,一直在监听69号端口,如果有请求就予以回应)。如果服务器批准此请求,则服务器打开连接,数据以定长512字节传输。每个数据包包括一块数据,服务器发出下一个数据包以前必须得到客户对上一个数据包的确认。如果一个数据包的大小小于512字节,则表示传输结构。如果数据包在传输过程中丢失,发出方会在超时后重新传输最后一个未被确认的数据包。通信的双方都是数据的发出者与接收者,一方传输数据接收应答,另一方发出应答接收数据。大部分的错误会导致连接中断,错误由一个错误的数据包引起。这个包不会被确认,也不会被重新发送,因此另一方无法接收到。如果错误包丢失,则使用超时机制。错误主要是由下面三种情况引起的:不能满足请求,收到的数据包内容错误,而这种错误不能由延时或重发解释,对需要资源的访问丢失(如硬盘满)。TFTP只在一种情况下不中断连接,这种情况是源端口不正确,在这种情况下,指示错误的包会被发送到源机。这个协议限制很多,这是都是为了实现起来比较方便而进行的。通过下边的图片来了解tftp协议的通信流程:

 

 

好了,现在应该来知道一下tftp协议的一些基本概述

 

TFTP协议概述
1.简单文件传送协议(Trivial File Trhansfer Protocol)
2.最初用于引导无盘系统,被设计用来传输小文件
3.基于UDP协议实现,但也可以由其他协议实现
4.不具备FTP的许多功能
5.只能从服务器获取或写入文件,不能列出目录
6.不进行认证

 

数据传输模式
1.netascii:文本模式
2.octet:二进制模式
3.mail:已经不再支持

 

下面最重要了,我们只有知道了,数据包的包头怎么写,我们才能和服务器的tftp server 进行数据交互。

协议结构

基本 TFTP 协议头结构:

16 bits

String

16 bits

String

16 bits

Opcode

Filename

0

Mode

0

Opcode:操作代码或命令。以下为 TFTP 命令:

Opcode

Command

Description

1

Read Request

Request to read a file

2

Write Request

Request to write to a file

3

File Data

Transfer of file data

4

Data Acknowledge

Acknowledgement of file data

5

Error

Error indication

Filename:传送的字段名称。

Mode:数据模式。协议传输的文件数据格式。可以是 NetASCII,也可以是标准 ASCII,八位二进制数据或邮件标准 ASCII

 

我们通过图片来详细看看tftp报文的格式:

 

  

 

好了,知道tftp是做什么的,知道其数据包的包头应该怎么封装,知道刚开始发起连接时 ,使用的是69号端口,一般使用的协议是UDP,知道了这些,就可以写tftp客服端程序了。

下面有程序,我已经测试过了,可以上传和下载程序。如有错误还望指点(执行时参数传递格式为./tftp -d(表示debug) -p(上传) | -g(下载) filename)。  
文件: tftp client.rar
大小: 6KB
下载: 下载
阅读(1766) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~