使用mac系统中自带的tftp服务端

由于调试一些设备,可能需要使用到tftp服务(这些设备上只有tftp客户端,用以更新程序做调试用)。mac上有自带的tftp服务端软件。 配置和开启操作如下:

vi /System/Library/LaunchDaemons/tftp.plist 修改其中的tftp共享的根目录。在ProgramArguments下面的array中。默认的值是 /private/tftpboot。

启动tftp:
$ sudo launchctl load -F /System/Library/LaunchDaemons/tftp.plist

关闭tftp:
$ sudo launchctl unload -F /System/Library/LaunchDaemons/tftp.plist

如果要设置为开机自动启动和自动关闭, 则将-F参数替换为 -w参数。

(全文完)

TFTP协议初探

最近我们正在调研一个手机应用中,上传文件的断点续传的方式。有同学提议参考一下TFTP协议的实现。由于最近一个“非底层不技术”的耻辱,我决定认真的去阅读TFTP的官方协议文档。以后对于使用或调研的任何东西,都要进行彻底的原理和底层实现的学习。

TFTP是一个非常非常简单的文件传输协议。它的名字是Trivial File Transfer Protocol的缩写。它的最新RFC文档编号是1350.可以从http://www.ietf.org/rfc下载文档。

它被设计为基于UDP协议之上。它很简单,没有FTP的许多特性。只有最简单的文件传输功能,不能列出目录,身份认证等。传输支持3种模式,ascii,octec和已被废弃的mail。文件以512字节固定大小的block为单位进行传输。每一个数据包传输一个block的内容。并且必须等收到ack后才能继续下一个数据包的传输。小于512字节的数据包标志着本次传输的完成。任何一个数据包,如果在网络层传输的过程中丢失,都会导致接受方发生timeout,而重新发送上一个数据包(可能是ack也可能是数据包),这样就导致了最初发送方重新发送丢失了的数据包。(这个地方我有一点小疑问,按照文档中描述的说法,这个timeout应该是2端都可能发生的,而不仅仅是发送数据的一方,没有收到上一个数据的ack,就重发数据。猜测这个可能是个优化,以避免由于ack本身丢失,小包丢失导致大包重发的现象。但是这一优化需要设置好超时时间,两端不能相同,不是很确定)。 一个对协议较有经验的同学说,这个协议的定义是双向timeout,但是实现中可能都是单向timeout。比如永远不会重发ack包,而发送data包的一段,如果没收到ack而timeout,就重发上一个data数据。

任何传输都由读或写一个文件开始,并建立connection。传输过程中大部分的error都会导致这个connection的中断。比如收到错误的package等等。中断连接之前有可能会发送一个error message。但是另一端有可能没有收到这个error message,而就不会感知到connection被中断。因此就需要一个timeout时间来detect这种问题。

(未完待续)