MFTP协议

  • 格式:doc
  • 大小:41.50 KB
  • 文档页数:3

MFTP协议
2007年4月29日
9:58
1.定义
MFTP(Multicast File Transfer Protocol,组播文件传输协议)是一个简单的实现一对多组播的文件传输协议。

它建立在UDP(User Datagram Protocol,用户数据报)基础之上。

MFTP 很简单,并易于实现。

它的唯一功能就是将一个文件从一台主机传送到多台主机。

与FTP 相比,MFTP要简单的多,它不能列目录,也没有用户身份验证功能。

和其他的Internet
协议一样,MFTP协议传送的数据是以8位数据作为一个字节进行处理的。

MFTP协议现在只支持二进制格式数据的传输。

2.协议概述
多播组的建立、加入和维护不是由本协议规定的。

任何传输的都是从发送主机的一个准备请求开始的,接受主机收到后,发送准备好信号。

发送主机将文件分成若干个固定长度数据包进行传送,数据包的大小由发送方在准备请求中决定,在传输过程中不能改变。

小于指定长度或长度为零的数据包是文件的最后一个数据包。

接收组中有一个接收主机被指定为主要接受者,主要接收者要为收到的每一个数据包回送一个收到通知。

发送主机要收到上一个数据包的收到通知,才会发送下一个数据包。

其他接收主机不发送收到通知。

主要接收者接收完毕后,发送者选择另一个接收着作为新的主要接收者。

如果包在传输的过程中丢失,发送者将不能收到正确的相应,在一段时间后,发送者将重传上一个包(包括数据包和收到通知)。

很多错误可能导致传输结束,如果有错误发生,有错误的一方将发出一个错误包,然后结束传输。

错误包不需要收到通知,也不需要重传。

3.与其它协议的关系。

MFTP是基于UDP之上的协议,UDP又是基于Internet协议之上的。

所以,一个MFTP包应该包括Internet头、UDP头和MFTP头。

另外,在本地网络传输时,可能还包括本地网络需要的头信息。

一个完整的包的内容依次为:本地头、Internet头、UDP头、MFTP头、MFTP数据。

MFTP头由两个字节的操作码组成,操作码和不同类型包的格式将在下一节中讨论。

4.MFTP包
因为MFTP协议不是一个公开的标准协议,而且,在可预见的将来,它也只在Windows
操作系统上实施。

所以,为了提高效率,MFTP的数据格式与很多Internet协议不同,MFTP 使用的全部是结构化格式,数据是“大头”格式。

MFTP包用操作码指出不同的包类型。

所有传输的第一步都是由发送方向多播地址发送一个nTimes=0的RRQ包,RRQ包的格式见下:
struct RRQ {
WORD opc = 1; //操作码
DWORD nTimes; //同一文件的第几次RRQ信号,第一次为0
DWORD nAddress; //Server的IP地址,用于接收确认包
WORD nPort; //控制端口,Server用于接收确认包的端口号
DWORD nFileLength; //文件长度,不大于nPacketSize*nPacketCount
WORD nPacketSize; //数据包大小,每个包不大于65536
WORD nPacketCount; //数据包个数,不大于65536
char* sFilename[255]; //文件名,以“\0”结尾的字符串,不长于255字节}
所有的接收方收到RRQ包以后,都要向RRQ包中指定的地址和端口返回RDY包,表示已经准备好接收文件,RDY包格式如下:
struct RDY {
WORD opc = 2; //操作码
DWORD nServerAddress; //接收方的IP地址,用于接收MRQ包
WORD nControlPort; //接收方用于接收MRQ包的端口号
}
发送方在收到第一个RDY包后,指定这个接收方为主要接收者,并向主要接收者发送一个MRQ包,MRQ包的格式如下:
struct MRQ {
WORD opc = 3; //操作码
BYTE master = 1; //主要接收者为1,其他接收者为0
}
发送方在收到其他的RDY包后,也需要向相应的接收者发送MRQ包,不过master要置为0,其他接收者收到的MRQ包格式如下:
struct MRQ {
WORD opc = 3; //操作码
BYTE master = 0; //主要接收者为1,其他接收者为0
}
主要接收者收到MRQ包以后,向发送方发送编号为0的ACK包, ACK包的格式如下:struct ACK {
WORD opc = 5; //操作码
WORD nID; //第一个确认包为0
}
发送方根据收到的ACK包的nID值,向组播地址发送编号为(nID+1)的DATA包,DATA包格式如下:
struct DATA {
WORD opc = 4; //操作码
WORD nID; //DATA包编号,第一个包为1
WORD nPacketSize; //DATA包中实际的的数据长度
char* data[PACKETSIZE]; //PACKETSIZE为RRQ包中规定的数据包大小
}
主要接收者收到编号为nID的DATA包后,要回送一个编号为nID的ACK包。

其他的接收者收到DATA包后,不会送任何信息。

主要接收者在收到所有的DATA包后,送出最后一个ACK包,并结束接收。

发送者在收到主要接收者发出的最后一个ACK包以后,向组中广播nTimes=nTimes+1的RRQ 包,所有没有收到所有数据包的接收者向发送者发送RDY包。

发送者向最先返回RDY包的接收者发送master=1的MRQ包。

接收者收到MRQ包之后,成为新的主要接收者。

新的主要接收者根据RRQ中规定的数据包数目检查自己是否有没有收到的数据包,如果有编号为n 的数据包没有收到,向发送方发送nID=n-1的ACK包。

如果全收到了,则发送nID=数据包总数的ACK包,并结束接收。

5.错误处理和重发策略
MFTP采用双方坚持重发的重发策略,如果发送和接收者中的任何一方没有收到期望的包,则将自己上一次发送的包进行重发。

如果发送方向某个接收者发送master=1的MRQ包后,没有收到ACK包,则不向这个接收者发送MRQ包,而转向另外一个接收者。

如果接收或者发送者出现错误,发送ERR包,ERR包不坚持重发。

ERR包格式如下:
struct ERR {
WORD opc = 7; //操作码
WORD nErrorCode; //错误代码
}。