网络协议工程
上QQ阅读APP看本书,新人免费读10天
设备和账号都新为新人

1.2 协议工程

由于计算机网络和分布式系统的分布性、并发性、实时性、异步性、多样性、不移定性等,造成了协议的复杂性。协议的复杂性不仅意味着协议开发的难度大、开发周期长、潜在错误多,而且协议开发过程中的任何一点错误都将危及网络或系统的稳定性、可靠性、安全性,以及互通性和互操作性。因此,我们不能凭工程直觉方法来设计高质量的协议,而且协议实现后纠正协议描述错误的代价是十分可观的。在这种情况下,需要用合适的方法、技术和计算机辅助工具来设计和维护协议。20世纪70年代未人们开始用形式化的方法描述通信协议。1981年,在软件工程思想的基础上,Piatkowski首先提出了“协议工程”的概念[7]。经过20多年的发展,协议工程取得了很大进展,对计算机网络研究给予了理论上的指导和技术上的支持。目前协议工程已经逐步形成了较为完整的研究体系。协议工程学用形式化方法描述协议设计和维护中的各个过程,它是以协议软件为研究对象的软件工程,而且建立了一套比一般软件工程方法更为严格、更为数学化的理论和方法。一体化(Integrated)、形式化(Formal)的协议开发过程称为协议工程。协议工程的目的是减少协议开发过程中潜在的错误,提高协议开发的效率,促进协议标准化的发展。

所谓“一体化”,是指协议描述、验证、实现和测试等技术前后衔接,并在同一个开发系统中完成[2]。在以往的协议开发过程中,各个阶段并不互相衔接,各个阶段的研究人员做完自己的事情就不再管别的事情了。协议设计者凭自己的经验和智慧设计出协议,用自然语言进行描述,经过他人审定或模拟之后,就予以公布。而协议验证者只对自己感兴趣的协议采用某种方法和理论对其进行验证,一般也不会将验证结果反馈给设计者。有许多协议公布后至今还没有人对其正确性进行过验证。协议实现者往往根据自己的环境和要求修改协议,协议实现之后不再考虑实现与协议规范是否一致。协议的测试往往由协议实现者自己进行(这实际上是一种程序调试)。

所谓“形式化”,是指形式描述技术(FDT,Formal Description Technique)贯穿于协议开发的各个阶段,使得协议的研究开发可以独立于非形式的自然语言文本和最终实现代码,避免协议验证测试的复杂性。当用形式描述技术将协议描述出来后,协议的验证、自动实现、测试就可以在一个集成化的协议工程系统中进行了。

在协议工程中,网络协议的开发过程包括协议的设计、描述、验证、实现、性能分析和测试等几个阶段,如图1-1所示。

图1-1 网络协议工程活动

在协议工程过程中,协议主要有以下5种表现形式:

(1)非形式描述文本(Informal Specification)。用自然语言和图表表述的协议,易读易懂,但不严密,可能存在二义性。

(2)形式描述文本(Formal Specification)。用形式描述技术描述的协议,严密、无二义性,可符号执行,可转换成程序设计语言程序。

(3)与机器无关的源程序代码(Machine-independent Source Code)。由形式描述文本翻译过来的程序设计语言(如C,Pascal)程序。协议本身有一定的抽象性,即协议没有指明这个协议在某个机器上或某个操作系统上怎样实现。正因为协议本身是抽象的,它才适合用形式化方法来描述。

(4)实现代码(Implementation Codes)。这是协议实现的最终代码。一般与机器无关的源程序代码只占最终实现代码的一部分(约50%)。其他的代码,如缓冲区分配、系统输入输出操作等,都是与机器或操作系统有关的。这些内容一般不在协议文本中描述。

(5)测试集(Test Suite)。这是一组关于协议测试步骤和测试数据的文件,由协议的形式描述文本产生。测试集一般是用另外一种语言描述的。

与协议工程的各个阶段相对应,协议工程主要涉及以下几种技术。

1.协议设计

我们将“根据协议的需求说明构造协议的非形式描述文本(经过非形式的验证分析)”这一过程称为“协议设计”,而将“协议的设计、形式描述、验证、实现、测试、运行”这一全过程称为“协议开发”,即协议开发是指协议工程活动的全过程。需要说明的是,也有的文献将协议设计定义为“从协议的需求说明到协议的形式描述文本,并经过严格验证和性能分析”这一过程,或定义为协议工程活动的全过程,即相当于“协议开发”。

协议设计是协议开发的第一步,它包括:协议环境分析(用户需求、协议运行环境的特性、工作模式)、协议的功能设计、协议组织形式的确定、协议元素的构造、协议文本的编制等几项工作。协议设计质量的好坏直接关系到开发出来的协议性能、功能是否能满足用户需求的一个重要因素。协议设计阶段的结果是非形式描述协议文本。

协议设计涉及很多技术,如差错控制技术、流量控制技术、连接管理技术、路由选择技术等。协议设计还必须遵循一些基本原则,如结构化、模块化等。

本书将在第2章中重点介绍与协议设计有关的概念、技术和方法。

2.协议形式描述技术

通信系统行为的复杂性增大了行为描述的难度,人们必须借助一种语言或一种技术来准确地描述系统行为。在过去,人们习惯使用自然语言进行协议描述(用自然语言写协议的规格说明或规范),其优点是:表达能力强、可读性好、方便;但缺点是:不严格、不精确、结构不好、没有描述标准和有二义性,且从自然语言描述的协议到协议的实现一般要手工进行,很难进行协议实现、测试的自动化和协议验证。由于不同的人对协议描述的理解不一样,因此这样设计出的协议不但不能保证不同协议实现之间的互连,甚至还可能得出错误的协议。

相对于自然语言而言,形式描述语言有严格的语法和语义定义,可以更准确、简明地描述协议的特征。采用形式描述技术的最终目的是:为开发者提供一种分析的方法;作为对开发结果验证的基础;为设计人员和应用人员提供交流途径;作为开发文档能在将来再开发时使用。因此理想的形式描述技术应该既能描述系统的行为特征,又能进行操作。在系统需求分析和设计阶段,它应该是一种描述语言,在系统实现阶段它应该是一种编程语言。

形式描述技术是将协议工程各阶段在技术上衔接起来的纽带,因此它对协议工程的发展将起决定性作用。形式描述技术涉及两个研究课题:第一,用什么样的数学模型或逻辑模型表示协议,以便获得抽象的协议模型;第二,设计基于一种或多种数学逻辑模型的形式描述语言(FDL)。

比较著名的形式描述模型有:有限状态机(FSM,Finite State Machine)、Petri网(PetriNet)、时态逻辑(TL,Temporal Logic)、通信系统演算(CCS,Calculus of Communication System)、形式文法(FG,Formal Grammar)、过程语言(PL,Procedural Language)等。比较著名的形式描述语言有:ISO制定的ESTELLE和LOTOS,CCITT制定的SDL,对象管理组织(OMG)制定的统一建模语言(UML)等。

3.协议验证技术

协议验证是指对协议本身的逻辑正确性进行校验的过程,其目的是在协议开发的早期最大限度地检测和纠正协议错误和缺陷,如死锁、活锁等。协议验证技术和形式描述技术是同步发展的,它也是协议工程技术中研究最早、最深入的课题,使用的技术方法多种多样。

在进行协议实现之前还要进行以下工作:①在语法和语义方面进行验证;②进行计算机模拟。这样经过反复修改后,就可得到正确的协议规范。在此基础上再进一步得出可执行的协议目标代码。

一般来说,协议的验证主要包括以下内容:可达性分析、死锁和活锁检测、协议的有界性和完整性检查、协议的动作序列检查、通道溢出检查等。目前,主要有两类协议验证方法:模型检查(model checking)和演绎验证(deductive verification)。演绎验证方法的原理是:用一组公理描述要分析的协议,而将要分析或证明的协议性质用定理来表示,然后用公理及相关的逻辑推理规则来证明期望的描述协议性质的定理。而在模型检查方法中,不是用一组公理来表示要验证的协议,而是直接给出协议的模型,协议的性质则用一组逻辑表达式来表示,然后验证协议模型是否满足指定的逻辑表达式。模型检查最常用的技术是可达性分析,它包括状态穷举、状态随机枚举、状态概率枚举等方法。这种方法要解决的一个重要问题就是状态空间爆炸,而定理证明方法则不存在这个问题。其他的验证方法,如模拟则通过一些模拟试验来测试协议的各种性质。

4.协议实现技术

协议实现是指由协议规范到可执行的协议目标代码的过程。协议的实现必须满足协议规范的要求,以及针对具体应用需要提供的附加机制。

协议实现的自动化是协议工程的主要目的之一,但完全自动化几乎是不可能的,因为协议不是针对某种机器或某种特定环境而设计的,且协议实现者还要处理很多协议设计中没有说明的技术问题。在形式化描述协议规范时,可采用下述两个步骤来帮助实现过程的部分自动化:

(1)利用翻译程序将协议的形式描述文本转换成程序设计语言(如C语言)的与机器无关的源代码。

(2)手工编写与机器有关的、在协议规范中没有描述的问题的处理代码。

例如,采用有限状态机描述协议规范时,可自动生成程序框架。然后,完善生成的程序框架。对于采用抽象语法表示法ASN.1描述PDU的规范,由于ASN.1使用有规则的编码系统,故其编码和译码功能可自动完成。已有的工具能解释ASN.1描述的协议,或者能对某个协议专用的编码和译码例程生成源程序。

限于篇幅,本书对协议实现技术不做介绍,有兴趣的读者可参考文献[2]

5.协议测试技术

验证一个新的协议实现,通常要做多项测试。一般主要考虑以下两个方面:

(1)协议一致性测试。即检测新协议实现是否能满足该协议规范所规定的所有要求。

(2)对协议实现的评价。核对新实现的包括性能参数在内的其他性质。

其中,协议一致性测试是协议工程活动中重要的一环。如果协议实现通过了一致性测试,则说明该协议实现与其他同样通过一致性测试的协议实现可在同一个全局系统中很好地协调工作。因此,协议一致性测试要做到两点:彻底性和标准化。“彻底性”是指必须彻底测试所实现的协议,而“标准化”是指使用的测试集必须是标准的。

一致性测试以形式描述为基础,测试系统的设计和测试序列的生成是协议一致性测试要解决的两大问题。测试系统设计重点解决测试方法和测试系统的体系结构问题。而测试序列的产生要解决测试的“彻底性”和“标准化”问题,以及测试序列的形式描述和自动生成问题。测试序列发生器可以产生各种可能发生的情况组合,以测试所实现的协议是否在各种正常和非正常情况下均能正确工作。

国际标准化组织(ISO)发布了“开放系统互连一致性测试方法和框架(ISO 9646)”来指导一致性测试工作,并为许多常用的标准协议制定了相应的一致性测试序列。例如,X.25 DTE一致性测试(ISO 8882)、运输层标准协议一致性测试(ISO 10025)、会话层协议一致性测试序列(ISO 10168)等。

一致性测试是协议工程技术中难度最大的、实现起来最困难的一个课题。本书将在第7章讨论一致性测试问题。

协议的性能主要包括吞吐量和时延。协议性能分析的目的是改善协议机制,提高执行效率。可用数学分析方法和模拟方法来进行,两者都基于排队论和概率论。本书不涉及此课题。

如同软件开发完成交付用户使用后,还有一个软件维护的过程,协议开发完成后也要进行协议维护。协议维护是指对已运行的协议的修改、补充等,涉及纠正协议实现中的错误、更新协议文本,甚至提出全新协议,故协议的维护可能需要对以上系列协议工程活动做一致性的修改。一个良好的设计有助于降低维护成本。

当出现不兼容的协议体系结构时,例如,基于OSI/RM的网络与基于TCP/IP的网络间互连,需两个体系结构相互转换。协议转换器的开发会碰到服务定义、综合、描述、验证、性能分析、直接实现和测试等类似的问题。

在协议工程技术中,协议设计技术、形式描述技术、一致性测试技术是协议开发中用得最多的技术,而协议验证技术则由于实施起来比较困难,不如前几种技术应用得广泛。

讨论题

1-1 探讨“协议工程”和“软件工程”的区别与联系。

1-2 查阅有关“协议工程”的文献,探讨以下几个问题:

(1)“协议工程”的定义;

(2)比较、分析不同文献中对有关“网络协议工程”活动描述的异同点;

(3)比较、分析不同文献中有关协议设计的含义,并说明你的观点。

1-3 选择一个你熟悉的协议作为例子来说明网络协议的三要素。

本章参考文献

[1] Berezin S. Model Checking and Theorem Proving: A Unified Framework. PhD. Thesis:CMU-CS-02-100, 2002

[2] 龚正虎. 计算机网络协议工程. 长沙:国防科技大学出版社,1993

[3] 古天龙,蔡国永. 网络协议的形式化分析与设计. 北京:电子工业出版社,2003

[4] Lai R, Jirachiefpattana A. Communication Protocol Specification and Verification. Dutch:Kluwer Academic Publishers, 1998

[5] 罗军舟,沈俊,顾冠群. 从Petri网到形式描述技术和协议工程. 软件学报,2000, 11(5): 606~615

[6] 倪鹏云. 计算机网络系统结构分析. 北京:国防工业出版社,2000

[7] Piatkowski T F. An Engineering Discipline for Distributed Protocol Systems. In Proceedings of IFIP Workshop on Protocol Testing-Towards Proof, 1981

[8] Rudin H. Protocol Engineering: A Critical Assessment. Protocol Specification, Testing and Verification VIII, 1998

[9] Sarikaya B. Principles of Protocol Engineering and Conformance Testing. Ellis Horwood Limited, 1993

[10] 谢希仁,陈鸣,张兴元. 计算机网络. 北京:电子工业出版社,1994