一 实验背景
之前一段时间专门研究了固件升级的方法,主要是通过网页或者上位机软件实现远程固件升级。最近正好在研究TFTP简单文件传输协议,于是我就尝试给设备添加联网功能,通过TFTP实现网络更新固件,而后发现这种升级方式所占设备内存小,可以穿越多数***,并且不需要去设备现场,在办公室通过网络就能将成千上万用户或设备的固件升级,简单高效。
其实现在很多设备都已经具有网络固件升级功能,例如我们经常用到的电视机顶盒、家用无线路由器等设备。很多设备升级内核都是通过TFTP协议上传的,因为TFTP实现非常的简单,比如自己家里用的路由器就可以通过TFTP协议升级。
TFTP是TCP/IP协议族中的一个用来在客户机与服务器之间进行简单文件传输的协议,基于UDP协议实现,端口号为69。通过TFTP协议,可以实现网络中两台计算机之间的文件上传与下载,如文件备份,为无盘工作站下载引导文件,下载初始化代码到打印机、集线器和路由器。当然,还有就是我们本次用到的对设备进行固件升级。
TFTP协议是专为小文件传输设计的,提供不复杂、开销不大的文件传输服务,缺乏标准 FTP 协议的许多特征。TFTP 只能从远程服务器上读、写文件(邮件)或者读、写文件传送给远程服务器。它不能列出目录并且当前不提供用户认证。当前 TFTP 有 3 种传输模式: netASCII 模式即 8 位 网络ASCII码 ;octet即八位组模式;邮件模式,这种模式现在已经废止不用了。主机双方也可以自己定义其它模式。
TFTP基于UDP协议实现,而UDP使用IP。因此一个TFTP包中会有如图1所示的以下几段:本地媒介头,IP头,UDP数据报头,TFTP数据报。TFTP在IP头中不指定任何数据,但是它使用UDP中的源和目标端口以及包长度域。由TFTP使用的包标记(TID)在这里被用做端口,因此TID必须介于0到65,535之间。图中显示了5种TFTP报文格式,每个报文格式TFTP报文的头两个字节表示操作码。之后对于不同的报文格式存在差异。
图1 TFTP报文格式
下面分别对每个报文包进行分析:
RRQ和WRQ包的报文格式如表1所示。
RRQ/WRQ包 | ||||
Opcode | Filename | 0 | Mode | 0 |
2 bytes | string | 1 byte | string | 1 byte |
表1 RRQ和WRQ包的报文格式
RRQ(读请求)报文由客户使用,用来建立一条从服务器读数据的连接。WRQ(写请求)报文由客户使用,用来建立一条把数据写到服务器的连接,它的格式与RRQ相同,RRQ包的操作码为1,WRQ包的操作码为2。Filename(文件名字段)说明客户要读或写的位于服务器上的文件,文件名是NETASCII码字符,以0结束。Mode(模式字段)是一个ASCII码串netascii或octet(大小写可任意组合),同样以0字节结束。netascii表示数据是以成行的ASCII码字符组成,以两个字节—回车字符后跟换行字符(称为CR / LF)作为行结束符。 OCTET模式用于传输文件,这种文件在源机上以8位格式存储。在使用MAIL模式时,用户可以在FILE处使用接收人地址,这个地址可以是用户名或用户名@主机的形式,如果是后一种形式,允许主机使用电子邮件传输此文件。如果使用MAIL类型,包必须以WRQ开始,否则它与NETASCII完全一样。
DATA包的报文格式如表2所示。
DATA包 | ||
Opcode | Block | 0 |
2 bytes | 2 bytes | Data |
表2 DATA包的报文格式
DATA数据包的opcode为3,它还包括有一个数据块号和数据。数据块号域从1开始编码,每个数据块加1,这样接收方可以确定这个包是新数据还是已经接收过的数据。数据域从0字节到512字节。如果数据域是512字节则它不是最后一个包,如果小于512字节则表示这个包是最后一个包。如果最后一个包正好为512字节,则再发送一个0字节的包用于表示结束。
ACK包的报文格式如表3所示。
ACK包 |
|
Opcode | Block |
2 bytes | 2 bytes |
表3 ACK包的报文格式
ACK包用于确认数据包已收到。ACK包的操作码为4。当接收方收到一个数据包后,会向发送方发送一个ACK包;而发送方则会在收到一个ACK包后继续发送下一个包。若发送完未能收到ACK包,则会使用超时机制,重新发送刚才的数据包。除了ACK和用于中断的包外,其它的包均需得到确认。发出新的数据包等于确认上次的包。WRQ和DATA包由ACK或ERROR数据包确认,而RRQ数据包由DATA或ERROR数据包确认。
ERROR包的报文格式如表4所示。
继续阅读:http://www.iwiznet.cn/blog/?p=7512
文章评论(0条评论)
登录后参与讨论