漫谈协议的本质与设计——兼论弄清楚陌生领域的一般方法

漫谈协议的本质与设计——兼论弄清楚陌生领域的一般方法

一、协议及其相关概念

1 什么是协议

协议在法律上是“合同”的同义词,在日常用语中有“约定、协约”的意思,当动词时表示“协商、商量”的意思。协议的本质是:相互合作的双方(或多方)经共通商讨后所形成的某种约定,为后续的合作提供一种共通遵循的行为规范,以提高合作效率和规范性。

在计算机领域,协议通常是指网络协议或软件协议,指的是在网络中进行数据交换的双方,所遵循的规则、标准或约定的集合。在不涉及网络通信的单机上,如两个进程或应用之间进行数据交换,通常也会约定一种数据格式及编码解析的方法,这套格式和方法就是一种软件协议。

2 协议举例

  • 合作协议:如劳动合同、股权协议、租房合同、房屋买卖协议等。
  • 战场协议:如冷兵器时代常用来指挥兵团作战布阵的旗语、击鼓、鸣金,以及近现代军队所用的军号等,这些都是军队指挥者和士兵部队进行通信的协议。
  • 网络协议:如TCP/IP,ICMP,BGP,SSL,SIP,HTTP等等。

3 制定协议的目的

在社会生产生活中,制定各种协议的目的是,为集体活动提供一种遵循,以提高合作的秩序性,使得沟通合作更加规范和高效。例如我们团队近期所制定的《早会协议》《周会协议》《分享协议》等等。

在计算机领域内,制定网络协议或软件协议的目的,是为了协作的双方程序能按预想的方式进行正确的数据交换,协议是软件系统能正常工作所必须的。需要注意的是,计算机程序不像人那般智能,人即便没有协议也可以凭借现时的交流来达成某种程度的协作,但程序如果没有实现约定好的协议就无法正常运行。

4 与网络协议有关的几个概念

  • 有效载荷(payload):指在网络通信中,数据包中实际用于记载要传递的信息的数据。通常为了正确传递数据包,要增加一些包头等辅助信息,因此有效载荷率通常是小于1的。

  • 开销(overhead):指在网络通信中,为了正确传输数据,除去有效载荷外的剩余的数据,比如数据包的包头等数据。从上面的定义可以发现,有效载荷+开销就等于全部数据。

  • 字符集:字符集是指各种符号的集合,如英文字母、数字、汉字等等,常见的字符集有ASCII字符集、GB2312字符集、BIG5字符集、 GB18030字符集、Unicode字符集等。

  • 字符编码:把字符集中的字符逐一映射到不同的字节流序列的过程就叫做编码。我们知道在计算机的世界里,一些数据的表示和传递最终都是二进制的01串,因此在计算机领域内,所谓字符编码,就是用不同的01串来表示每个不同的字符。

5 网络知识的圣经:RFC

RFC(Request For Comments)是一系列以编号排定的文件。收集了有关互联网相关信息,以及UNIX和互联网社区的软件文件。RFC文件是由Internet Society(ISOC)赞助发行。基本的互联网通信协议都有在RFC文件内详细说明,RFC享有“网络知识圣经”之美誉。RFC官网

Internet所有技术标准都是以RFC文件形式公布的,但这不是所有的RFC文件。RFC还包括政策研究报告,技术部门的工作总结,研讨会的成果综述和网络使用指南等。每一份RFC文件都有一个唯一的编号,当某一文件产生了更新版本时,就为新的版本指派新的RFC编号。任何用户都可通过E-mai向RFC编委会投寄文稿申请作为RFC文件发表。全套RFC文件由 DDN NIC的 SRI Internet负责维护。

二、衡量协议优劣的标准

当我们学习或设计一种协议时,如何评判这个协议的好坏是很重要的,这需要一个标准。下面是我个人根据过往的经验总结的几个标准。

1 协议复杂度

复杂度指协议表述、学习理解和使用(对软件来说就是程序实现)的难易程度,一般好的协议要遵循简单原则。

2 协议编解码效率

协议的使用,需要双发进行必要编码或解码操作,一般来说,编解码的效率越高越好。

3 协议开销

开销当然越小越好。

4 协议通用性

通用性一般来说,越通用越好,极个别的特殊场景可能会是例外。

三、软件协议的设计

设计一套软件协议,是稍具规模和复杂度的系统所常见的工作。例如一套基于插卡话机的呼叫系统,就需要设计好话机端和服务端的通信协议。下面介绍协议设计的过程、目标和基本原则。

1 设计过程

设计一套协议一般包括下列过程①了解需求 ②双发商讨 ③编写草案 ④公示修订 ⑤发布

2 设计目标

设计协议的过程中,一定要始终牢记协议的目标是什么,最好在了解需求后,明确定义协议的目标。

3 设计原则

从上面对协议优劣标准的介绍就能很容易推导出协议设计的一般原则,具体如下。 (1)简单原则:协议的表达、学习理解要尽可能简洁清晰。 (2)高效原则:编解码实现算法要满足一定的性能要求,协议的开销尽量小。 (3)通用原则:协议的通用性、扩展性要足够好。 (4)其他原则:具体可参考互联网架构原则RFC1958

注重事项

(1)协议的层次性 在计算机领域,软件系统往往都是分层的。例如一台计算机上软件,自底向上有:硬件ROM程序、操作系统、驱动程序、系统程序、应用程序等。不同层次的软件/程序间进行数据交换需要不同的协议。例如操作系统对互联网协议的实现通常称作协议栈,就是因为有不同层次的协议。再如我们最近学习的七号信令系统,它也是一套层次分明的协议栈,从上往下各层为:[TUP|ISUP|(OMAP/MAP/SCCP)]/MTP3/MTP2/MTP1等。

题外话:如何记住七层网络模型(即开放式系统互联通信参考模型OSI/RM)
答:All People Seems To Need Data Processing(所有人看起来都需要数据处理),记住这句话,每个单词的首字母对应了七层模型的每一层。

(2)选择趁手的协议分析工具 在学习或使用网络协议时,一定要有合适的工具,例如各类抓包工具或自己开发的协议编解码分析工具。 这里介绍几个Windows系统下常用的工具,有Sniffer Pro、Natxray、Iris等。

四、讲清楚/弄明白某事物的一般方法

本文对协议的讲解和学习过程,其实遵循了一种通用的方法论,我将其归结为弄清楚一个领域或某个事物的一般套路。简单来说,遵循如下4步,你便可以快速了解一个领域,甚至成为某领域的专家。

1 下定义

在搜集和学习各种资料后,你应该用自己的语言对该事物下一个定义,一个简单准确的定义。

2 做分类

分类是人认知过程中的自发过程,也是人克服记忆容量有限的高效方法。根据心理学的理论,人的短期记忆容量是6~9。一般我们快速记住车牌号或8位座机号码是比较容易的,但要记住手机号就比较困难了,而要记住银行卡号就基本不可能了。这都说明人的记忆容量是极其有限的,但是良好的分类能够帮助我们记住更多东西。

在学习或讲解一个东西时,如果你能遵循合适的依据,对其进行合理的分类,将会达到事半功倍的效果。了解更多分类相关的知识请参与关于分类及分类能力的思考

3 找标准

认识一个新事物时,往往需要评判其好坏优劣或是否有用等,这时就需要一个评判标准。如果你能梳理出一套有用的、业内普遍认可的标准,那说明你对这个领域的认知已经到达足够深入的程度了。

4 明范式

范式是个抽象的概念,简单说就是领域内的大部分专家都认可的一套基础理论、公理及相关的方法、设备等。范式是在该领域内进行深入研究、创造发明、发现等工作的基础和体系。如果你能总结出该领域的范式,那绝对可以称作该领域的专家了。更多有关范式的概念可参阅关于模式、图式和范式的思考

参考资料

分类:
代码人生
标签: