asn浅析--协议的设计

协议是分层的,但是它原本就是分层的吗?或者说它只有分层这一种形式吗?作为一种替代方案,基于消息的模型也一样能工作的很好,不一定要分层,就像很多应用层的协议比如http或者sip那样,基于消息的协议模型中,空间上纵向的层次化为了时间上横向的不同消息,比如有专门寻址的消息,有专门差错控制的消息等等,基于消息的协议同样可以适配各种不同的网络结构以至于最终适配不同的网络设备,只要这些设备都能处理特定的消息即可,但是现在除了应用层外,基本没有基于消息的协议,这里面除了osi分层模型的强大势力以至于分层模型深入人心外还有另一个原因,那就是分层模型是为传输而产生的,而不是为应用产生的,消息模型适合于应用而不适合于传输。
在说更具体的技术原因之前我们先看一个现实中的例子,现实中的交流也是一种通信,我们交流同样需要协议,那么我们看一下我们交流时使用的是什么模型,分层模型还是消息模型,交流无非就是打电话交流,信件交流,面对面交流等等,我们以打电话交流作为例子来看一下,电话的作用就是跨越空间,对于每一路通话,电话的作用就是将一个人语音传输给另一个人,这是固定不变的,但是每一路通话的内容却不一样,电话的最终目的不是传输语音而是使电话一端的人看起来像与另一端的人面对面交流一样,因此电话线路更像一个服务,电话能接通依赖于通信公司,电信局,省级或者国际监管机构,这看起来是一个分层协议,但是当人们“喂”了一声以后,协议就成为基于消息的了,基本采用一问一答的形式,一方能继续说下去的前提是另一方听懂了前一句,如果不是为了特意监听,监听电话通常没有现实意义,因此通话时间以及通话内容基本是属于两个人的,他们俩也没有必要采用一种特殊的语言和语气来让第三人听懂,反观电信局或者监管机构就不是仅仅属于通信双方的,电信传输局并不是仅仅和对端的电信传输局通信,它必须提供可靠传输才能保证运营公司的良好运营,因为它上面还有一个运营公司,所以它不但要与对等端通信,还要对运营公司负责。如果你悟出了这里面的一些东西,那就不必往下看了。
现在看看计算机网络协议。首先看一下计算机网络最重要的两个特性,也是必须实现的两个功能,第一就是传输比特,第二就是比特格式解析,也就是解析比特成需要的消息格式,这就是分层模型的渊源,我们知道网络的最终目的就是异地的终端可以互相通信,那么终端只在乎能否解析比特格式,而不在乎具体怎样传输,于是比特传输对于这个最终目的就不再重要,你可以设计不同的传输线路和规程,只要能使终端解析出比特格式即可,于是就可以实现不同的传输线路,只要它们的实现者能实现一种一致的提供给解析器的比特即可,这就是最初的二层模型,这就是分层协议模型的鼻祖,理解了这个也就理解了最终的osi理论模型以及tcp/ip实际模型,无非就是一个分权分立的过程,从职能角度将通信过程分成了若干部分,每一部分完成特定的功能,为别的功能提供一个特定的,有效的,可靠的,承诺的传输环境,这就是分层模型的重要概念--接口,这种按功能分化一直提供到具体应用,因此可以看出,应用层协议和其下面的协议有着本质的不同,下面的协议本质上是传输协议,除了和对等层通信还要和上层对接,而应用层协议仅仅和对端通信,但是别急,也有例外。
当今的计算机网络编程几乎都是应用层以上的,就协议的数量和灵活性以及语义多样性方面,应用层协议要比底层协议复杂得多,为了可扩展性,另外还有经济方面的原因,人们有自由选择不同的编程语言,这就出现了问题,这是编写底层协议不会面对的问题,底层协议一般集成于OS内核的协议栈中,基本都是用c或者汇编写好的,除了一些驱动程序编写者或者爱好者会偶尔扩展一下外,几乎不需要做改动,由于它们只是传输协议,因此只要它们能提供承诺的服务几乎没有人去理睬它们,你不会为了和恋人通话而去电信局上班为了可以打免费电话吧,即使你去了也不一定能听懂她和另一个男人的通话,看看应用层协议,非常多样,非常复杂,而且非常不稳定,如果你想继续在某一个应用层协议上继续摞新的协议,那么就要考虑一下是继续用分层模型还是用消息模型了,由于不稳定,如果用分层模型,那么如果有一个层次改变了,那么所有的层次都要改,并且协议规范会很复杂,原本就不是服务化的协议非要用固定服务的协议来规范,岂不是自找苦吃?传输协议的格式可以固定,而应用协议的格式多变,固定格式很难协商,消息是一个很好的方式。如果说osi分层模型最佳的产品是tcp/ip的话,那么消息模型最佳的产品就是asn1,asn1通过分离语法规程和协议编码简化了协议的设计和开发,正是协议定义规程和协议编码的一体化才使得应用层开发变得困难,因为应用层协议往往由技术能力扁平化的大部分人员(包括我在内的很多乌合之众)采用无穷多的编程语言来编写,那么如何保证这个协议的开发最简化,bug最少,将编码工作转嫁给asn1编译器是一个解放劳动力的绝佳方式,而这一切之所以能完成,完全是因为asn1定义了一套完整的抽象语法规程,各种语言只要按照规程编码就可以了,然后将代码交给该语言的asn1编译器就可以了,这实际上还是用一个抽象层屏蔽了复杂,如果不理解这一点,那就想一下c语言代替汇编语言从而解放特定机器的编码工作那件事,这里c语言就是特定语言的asn1代码,而汇编语言就是编码好的基于字节的asn1编码。事实证明,asn1非常适合定义消息,因为它是可以自解释的,自解释的原因不是它有智能,而是因为人们定义了一套叫做OID的东西,这个OID也是一个国际标准,它就是自解释时需要查阅的字典,这种基于字典的自
解释完美了解决了分层模型实现复杂多变的应用层协议时所遇到的各种问题。

你可能感兴趣的:(设计)