tftp是一个传输文件的简单协议,它是基于UDP协议实现的,端口号为69.服务器启动tftp后,客户端就可以通过tftp从服务器下载文件。在嵌入式开发中,可利用tftp协议下载Linux内核到开发板运行。
TFTP的工作都是由客户端发起一个读请求包RRQ或者写请求包WRQ开始的。两者过程如下(S表示Server,C表示Client):
1.WRQ工作流程
①S在端口为69的UDP上等待C发出写文件请求包;
②C通过UDP发送符合TFTP请求格式的WRQ包给S。从UDP包角度看,该UDP包的源端口由C随意选择,而目标端口则是S的69。
③S收到C的这个请求包后,需发送ACK给C。对于写请求包,S发送的ACK包确认号为0。
④C发送DATA数据给S,S接收数据并写文件;
⑤当C发送的DATA数据长度小于512字节时,S认为这次WRQ请求完成。
2.RRQ的工作流程
①S在端口为69的UDP上等待C发出读文件请求包;
②C通过UDP发送符合TFTP请求格式的RRQ包给S;
③S收到C的这个请求包后,将直接发送DATA包给C,这个DATA包中含S选择的TID作为UDP的源端口和C的TID作为UDP目标端口,起始包号为1;
④C接收来自S的DATA包并回复ACK。直到请求完成。
任何传输起自一个读取或写入文件的请求,这个请求也是连接请求。如果服务器批准此请求,则服务器打开连接,数据以定长512字节传输。每个数据包包括一块数据,服务器发出下一个数据包以前必须得到客户对上一个数据包的确认。如果一个数据包的大小小于512字节,则表示传输结束。如果数据包在传输过程中丢失,发出方会在超时后重新传输最后一个未被确认的数据包。
tftp报文格式为:
共有五种,分别为读请求包、写请求包、数据包、回应包、错误信息包。
实现协议之前,先对以前的网络协议代码进行完善。
①网卡收到数据包,对该数据包的类型进行判断识别
②根据数据包的类型进行相应处理
③完善ARP协议:若得到的数据包是ARP包,则判断是ARP请求包还是应答包,然后做出相应处理(这里需要设置DM9000的RX Control Register的ALL位,该位默认为0,表示不接收广播包)。
tftp协议的实现总流程为:
①开发板发送ARP请求包获得服务器MAC地址
②开发板发送tftp的读请求包请求从服务器下载文件
③服务器广播发送ARP请求包查询开发板的MAC地址
④开发板发送ARP应答包响应服务器
⑤服务器发送数据包给开发板
⑥开发板响应服务器,返回一个响应包
⑦重复进行⑤⑥,直至发送完毕。