Skip to content

第五章 文本化:好协议产生好实践

5.1 文本的重要性

文本流是非常有用的通用格式,因为人们无需专门工具就可以很容易地读写和编辑文本流,这些格式是透明的。

同时,正是文本流的限制帮助了强化封装,因为文本流不鼓励内容丰富、编码结构密集的复杂表达,也不提倡程序互相干涉内部状态。

当你很想设计一个复杂的二进制文件格式,或一个复杂的二进制应用协议时,通常,明智的做法是躺下来等待这种感觉过去。如果担心性能问题,就在应用协议之上或之下的某个层面压缩文本协议流,最终产生的设计会比二进制协议更干净,性能可能也更好。

使用二进制协议的唯一正当理由是:如果要处理大批量数据集,因而确实关注能否在介质上获得最大位密度,或是非常关心将数据转化为芯片核心结构所必须的时间或指令开销。大图像和多媒体数据的格式有时可以算作是前者的例子,对时延有严格要求的网络协议有时则可以算是后者的例子。

5.1.1 实例分析:Unix 口令文件格式

在许多操作系统中,验证用户登录并开始用户会话所必需的用户数据都是不透明的二进制数据库。相反,在Unix中,这种数据是文本文件,采用一行一条、字段用冒号分隔的记录格式。

5.1.2 实例分析:.newsrc 格式

5.1.3 实例分析:PNG 图像文件格式

PNG(可移植网络图形)是位图图形的一种文件格式。PNG 更像 GIF,而不像 JPEG,其不同之处在于采用了无损压缩,并为艺术线条(lineart)和图标而不是照片图像的应用程序进行了优化。

PNG格式是二进制文件格式中一个经过周密设计的优秀例子。既然图形文件包含了大量的数据,如果像素数据用文本格式来存储的话,尺寸和网络下载时间都会显著提高,因此二进制格式非常合适。传输经济性是要考虑的主要问题,透明性则牺牲了。但是,设计者对互用性非常谨慎,PNG格式指定了字节顺序、整数的字长、优先顺序和字段间的填充。

PNG文件由一系列字节块(chunk)构成,每个都是自描述格式,以块类型名和块长度开头。由于这种组织形式,PNG不需要版本号。随时都可以增加新的块类型;块类型名称中的第一个字母告知使用PNG的软件当前块是否可被安全忽略。

PNG文件头同样值得研究。它设计得非常聪明,能使各种常见的文件损坏情况(如7位传输连接,或 CR 字符和 LF 字符的损坏)很容易被发现。

PNG标准精确全面,编写得非常好,可以作为如何撰写文件格式标准的范例来使用。

5.2 数据文件元格式

5.3 应用协议设计

所有将数据文件格式设计成文本格式的好理由同样适用于应用程序专有协议的设计。

5.3.1 实例分析:SMTP

5.3.2 实例分析:POP3

5.3.3 实例分析:IMAP

5.4 应用协议元格式

5.4.1 经典的互联网应用元协议

5.4.2 作为通用应用协议的 HTTP

5.4.3 BEEP:块可扩展交换协议

5.4.4 XML-RPC,SOAP 和 Jabber