当研究开放系统中的信息交换时,往往使用实体(entity)这一较为抽象的名词表示任何可发送或接收信息的硬件或软件进程。在许多情况下,实体就是一个特定的软件模块。

协议是控制两个对等实体(或多个实体)进行通信的规则的集合。协议在语法方面的规则定义了所交换的信息的格式;而协议在语义方面的规则就定义了发送者或接受者所要完成的操作,例如,在何种条件下数据必须重传或丢弃;协议在同步方面的规则定义了收发双方的时序关系,即在一定条件下应当发生什么事件。

在协议的控制下,两个对等实体间的通信使得本层能够向上一层提供服务。要实现本层协议,还需要使用下面一层所提供的服务。

一定要弄清楚,协议和服务在概念上是很不一样的。

首先,协议的实现保证了能够向上一层提供服务。使用本层服务的实体只能看见服务而无法看见下面的协议。也就是说,下面的协议对上面的实体是透明的。

其次,协议是“水平的”,即协议是控制对等实体之间通信的规则。但服务是“垂直的”,即服务是由下层向上层通过层间接口提供的。另外,并非在一个层内完成的全部功能都称为服务。只有那些能够被高一层实体“看得见”的功能才称之为“服务”。上层使用下层所提供的服务必须通过与下层交换一些命令,这些命令在OSI中称为服务原语。

在同一系统中相邻两层的实体进行交互(即交换信息)的地方,通常称为服务访问点SAP(Service Access Point)。服务访问点SAP是一个抽象的概念,它实际上就是一个逻辑接口,有点像邮政信箱(可以把邮件放入信箱和从信箱中取走邮件),但这种层间接口和两个设备之间的硬件接口(并行的或串行的)并不一样。OSI把层与层之间交换的数据的单位称为服务数据单元SDU(Service Data Unit),它可以与协议数据单元PDU不一样。例如,可以是多个SDU合成为一个PDU,也可以是一个SDU划分为几个PDU。

这样,在任何相邻两层之间的关系可概括为图1-20所示的那样。这里要注意的是,第n层的两个“实体(n)”之间通过“协议(n)”进行通信,而第n+1层的两个“实体(n+1)”之间则通过另外的“协议(n+1)”进行通信(每一层都使用不同的协议)。第n层向上面的第n+1层所提供的服务实际上已包括了在它以下各层所提供的服务。第n层的实体对第n+1层的实体就相当于一个服务提供者。在服务提供者的上一层的实体又称为“服务用户”,因为它使用下层服务提供者所提供的服务。

1-20相邻两层之间的关系

计算机网络的协议还要一个很重要的特定,就是协议必须把所有不利的条件事先都估计到,而不能假定一切都是正常的和非常理想的。例如,两个朋友在电话中约好,下午3时在某公园门口碰头,并且约定“不见不散”。这就是一个很不科学的协议,因为任何一方临时有急事来不了而又无法通知对方时(如对方的电话或手机都无法接通),则另一方按照协议就必须永远等待下去。因此,看一个计算机网络协议是否正确,不能只看在正常情况下是否正确,而且还必须非常仔细地检查这个协议能否应付各种异常情况。

下面是一个有关网络协议的非常著名的例子。

【例如1-1】占据东、西两个山顶的蓝军1或蓝军2打不过白军,但蓝军1和蓝军2协同作战则可战胜白军。现蓝军1拟于次日正午向白军发起攻击。于是用计算机发送电话给蓝军2.但通信线路很不好,电文出错或丢失的可能性较大(没有电话可使用)。因此要求收到电文的友军必须送回一个确认电文。但此确认电文也可能出错或丢失。试问能否设计出一种协议使得蓝军1和蓝军2能够实现协同作战因而一定(即100%而不是99.999…%)取得胜利?

【解】蓝军1先发送:“拟于明日正午向白军发起攻击。请协同作战和确认。”

假定蓝军2收到电文后发回了确认。

然而现在蓝军1和蓝军2都不敢下决心进攻。因为,蓝军2不知道此确认电文对方是否正确地收到了。如未正确收到,则蓝军1必定不敢冒然进攻。在此情况下,自己单方面发起进攻肯定要失败。因此,必须等待蓝军1发送“对确认的确认”。

假定蓝军2收到了蓝军1发来的确认。但蓝军1同样关心自己发出的确认是否已被对方正确地收到。因此还要等待蓝军2的“对确认的确认的确认”。

这样无限循环下去,蓝军1和蓝军2都始终无法确定自己最后发出的电文对方是否已经收到(图1-21)。因此,在本例题给出的条件下,没有一种协议可以使蓝军1和蓝军2能够100%地确保胜利。

图1-21无限循环的协议

这个例子告诉我们,看似非常简单的协议,设计起来要考虑的问题还是比较多的。