Written on 2008年10月15日 @ 14:37 | by houlihu237 | Tags: 网络互连(第2版)网桥·路由器·交换机和互连协议  

这部分主要介绍面向连接的网络类型,详细介绍了X.25和ATM。虽然X.25已经有点过时,但我认为X.25是可靠的面向连接的网络中的典型。它有很多很美妙的特性—如,源端发送时的序列号,可以和目的端所收到的序列号不一致。当你理解X.25后,就能很容易地理解ATM了。

一般的面向连接的网络
首先,我们先撇开X.25和ATM的特性不谈,先来看看面向连接网络的一般特性。如果A希望与B对话,则A需要先发送一个特殊的呼叫建立包给B,指定B为目的端。在这条路径上的所有路由器,需要根据B的地址来判断该怎样转发这个呼叫建立包。这和在无连接的网络(如IP)中的路由器所面临的问题一样。为了更方便地转发呼叫建立包, 我们为它指定一个呼叫序号,称之为连接标识符(connection identifier)或CI 。这样,数据包就没必要包含源地址和目的地址的信息,而只需附加上CI。为了便于管理,地址(所占字段)将会越来越大。而CI占的位置比较小,因为它们是动态分配的,且只在单条链路范围内有效。CI的值范围是在某条链路上同时能发生的最大会话数,而且CI的分配可以是稠密的。
在下图中,A向B建立一个呼叫。A发送了一个呼叫包,说“源A希望与B发生会话, CI为57”。

A-B呼叫的路由器数据库

?R1判断出它应该把发往B的包向端口c转发。R1选择了端口c上目前不用的CI,比如33,然后发送一个呼叫建立包给R2,说“源A希望与B发生会话,CI为33。”然后R1把项(57)=(c,33)加入它在端口a的数据库中,表明从端口a收到、且CI=57的包应该被送往端口c,且CI=33。R1还在端口c的数据库中加入一项(33)=(a,57),表明从端口c收到的、且CI=33的包应该被送往端口a,且CI=57。
?R2在它的端口a收到了一个CI= 33、目的端为B的呼叫建立包,然后判断出它应该把发往B的包转发到端口d上。R2选择了一个端口d目前不用的CI,比如79。然后在端口a的数据库里添加一项(33)=(d,79),在端口d的数据库里添加一项(79)=(a,33),再向端口d发送呼叫连接包说,“A希望通过端口d与B对话,CI=79。”
?R5在它的端口b上接收到这个呼叫建立包,判断出它应该向端口c转发,然后选择了一个CI= 22。R5在端口b的数据库中添加了一项,(79)=(c,22),在端口c的数据库中添加了一项,(22)=(b,79)。然后R5向端口c发送了一呼叫建立包,说“A希望与B对话,CI=22。”,B将接收到这个包。
当路径建立后,A发送给B的包就只需说明CI=57。当R1从端口a收到这个包时,通过查端口数据库可知,有一项为(57)=(c,33),即从端口a收到、且CI = 57的包应该转发给端口c,且CI=33。R2从端口a收到这个包,然后查到(33)=(d,79),所以把这个包转发给端口d,并且把CI改为79。然后R5从端口b收到这个包后,查数据库知(79)=(c,22),所以R5把这个包转发到端口c上,并把CI改为22。
为什么需要在每一跳时改变CI呢?这是因为很难选择一条路径上所有链路都未使用的序号作为该会话的CI。除了在每次转发包之前,需要重写CI外,其他都不麻烦。
让我们再来看看B是怎样发送包给A的(见下图)

数据从A到B

B发出一个CI=22的包。R5从端口c接收到这个包后,查表知(22)=(b,79),然后把包转发到端口b,把CI改为79。然后R2从端口d收到这个包,由(79)=(a,33)知R2应该把包转发给端口a,CI=33。然后R1从端口c收到该包后,由(33)=(a,57)知应该把包转发给端口a,CI=57。

X.25:可靠的面向连接服务
X.25是由CCITT制定的,后来被ISO修改后采纳为它的面向连接网络层标准,称为ISO 802.8。
X.25并没有规定说怎么建立一个面向连接的服务,它只说明了端节点(X.25中称为DTE)和路由器(X.25中称为DCE)之间的接口要求。
这里主要介绍端节点处的接口要求X.25标准包括3层:
1) 物理层:该层说明了物理层的要求,包括导线的大小和形状,每一针的电压数,每一针上信号代表的意义等。它跟网络层的规格要求并没有联系。
2) 链路层:指定了一个数据链路层协议,包括如何判断一个包的开始和结束、包记数、确认包和加强流控制等等。该层跟网络层的规格要求也没有什么联系。
3) 包层:这是真正的网络层接口,在本节余下部分讨论。

基本思想
在DTE看来,在单一的链路上,必须能同时发生多个到DCE的会话(见下图)。每个会话都需要先被建立,数据能够在会话的两端之间双向传输,会话结束需要被清除。

X.25网络

在DTE A看来,可以通过3种方式来建立会话。
1) DTE A可以通过发给DCE A一些信息(告诉DCE A的目的DTE地址,比如说DTE B)来开始会话。这跟打电话一样,电话号码就相当于是目的DTE的地址。这种类型的会话称为SVC(交换的虚电路,switched virtual circuit)。
2) DCE A告诉DTE A,某个DTE—如DTE B—请求与A建立一个会话(这相当于你的电话铃响了)。这种类型的会话也是SVC。但在DTE A看来,是一个进入呼叫(incoming call)。
3) 呼叫可以永久建立。这称为PVC(永久虚电路,permanent virtual circuit)。PVC由管理方建立。PVC上的数据传输与前两种方式一致,但是呼叫建立与呼叫清除都不需要,或者最起码来说,对DTE都是不可见的。
在建立的过程中,每个会话都被指定一个虚电路号。这个序号只在DTE和它所连的DCE之间有意义。会话中的另一端的DTE,通常是被指定了另外一个虚电路号。每个数据包的头部包含了一个虚电路号而不是源或者目的DTE的地址。这样做的原因是,虚电路号的长度远远小于DTE地址的长度,而且路由器可以根据较短的虚电路号迅速做出判断。
X.25提供复用机制,即可以同时在一条到DCE的链路上提供多个会话。例如,在源DTE上可能有多个应用程序,每个应用程序都可能通过多个会话与不同的目的端进行通信。每个会话有自己的虚电路号。当DCE发送给DTE一个数据包时,它包含了虚电路号,由此DTE可以判断出这个包该属于哪个会话。同样,当DTE发给DCE一个数据包时,DCE可以通过该包头部的虚电路号判断出它所属于的会话。
正如前面所说的,X.25只定义了DTE与它本地的DCE之间的接口。如果某个网络采用了X.2 5的协议,它必须在DCE之间另外使用一个协议和算法,使得它们之间可以建立路径,传输数据等等。但是这些协议是非标准化的。它们专属于一个X.25网络。

虚电路号
虚电路号实际上是12位长。但在X.25规范中,包格式是逐字节表示,这使得表示12位的字段很困难。所以一般把虚电路号分成两段写。其中一段为4位,标准中称为逻辑信道组号(logical channel group number)。另一段8位,标准中称为为逻辑信道号(logical channel number)。为了简便起见,我把这两段合起来称为呼叫号(call number)。按惯例,呼叫号0留给涉及所有虚电路的控制包(比如说重新开始包,或诊断包)。接下来一段呼叫号为PVC保留,再接下来一段呼叫号为进入呼叫保留(DCE申请的呼叫号,通知它所连接的DTE说有个远程的DTE正在呼叫它)。再往下一段,呼叫号为进入或对外呼叫保留(即可以分配给这两种呼叫模式)。然后再往下一段为对外呼叫保留(DTE初始化该会话,所以需要申请一个呼叫号)。这种惯例可以避免呼叫冲突,比如某个时刻,DTE希望开始一个会话,然后选择了一个呼叫号X,而与此同时,DCE收到一个关于该DTE的进入呼叫,然后也选了X作为呼叫号,通知DTE说“你有一个进入呼叫”。注意:如果在某条链路的两个方向上的VC号互相独立,冲突就不可能发生。

呼叫建立
假定DTE A希望与DTE B进行对话。DTE A选择了一个呼叫号—X,X现在并不为DTE A上的任何呼叫所使用。DTE A向DCE A发出了一个呼叫请求包。见下图显示了该请求包的格式。DTE A把它自己的地址填入呼叫D T E地址字段,把DTE B的地址填入被呼叫DTE地址字段,把X填入呼叫号字段(实际上,它把呼叫号的4位填入组字段,把剩余的8位填入信道字段)。通过某些并未列入标准的机制, DCE A通知DCE B说DTE A希望与DTE B对话。然后DCE B选择了一个呼叫号—Y(Y是目前DTE B上不在使用的某个呼叫号),然后发送了一个进入呼叫包给DTE B。进入呼叫包的格式与呼叫请求包的格式相同。呼叫号通常是不相同的,因为进入呼叫包的呼叫号是由DCE B选定的(只有在很偶然的情况下才会相同,而且如果DCE为进入呼叫指定呼叫号的数字区域与DTE为对外呼叫指定呼叫号的数字区域不重叠,这种情况将永远不会发生)。两个包中其他一些字段也可能不同。比如功能中的包大小也可能不同,因为源DTE与源DCE之间的链路所允许的包大小可能跟目的DTE与目的DCE之间的链路所允许的包大小不同。

x.25呼叫请求包格式

如果DTE B接受了这个呼叫,它发送一个呼叫接收(call accepted)包给DCE B。这个包的呼叫号与刚才DCE B发送给DTE B的进入呼叫包中的呼叫号相同。当DCE B收到这个呼叫接收包后,它通过某种X.25标准之外的方法通知DCE A,DCE A再发送一个呼叫已连接( call connected)的包给DTE A。这个包的呼叫号为X。

一个X.25呼叫的基本过程

数据转发
当呼叫建立后,数据交换是全双工的,意味着数据可以同时在两个方向上传输(见下图)。

x.25数据包格式

正如图“X.25数据包格式”所示,数据包有两种格式:一种格式有3位的序列号;另一种有7位的序列号。对某些供应商来说,选择3位还是7位的序列号是在用户预订的时候选定的;另一些供应商则是根据每一个呼叫指定的。但在一个会话的中间,不能在3位和7位的序列号间进行切换。X.25标准允许DTE把Q位用做任何目的。带Q位的数据包送到目的DTE后,仍然保持Q位的设置。Q位的意义取决于运行在DTE上的应用程序对它的解释(Q位代表“qualified”)。M位代表是否“后面还有数据”。该位用于传输比DTE/DCE之间链路所允许的最大包长更大的包。当DTE希望发送一个超过最大包长的包时,它把这个包拆分为几个最大包长允许大小的包,并设置除最后一个包外的其他所有包的M位。当数据到达目的DTE时,它可能被拆成更多的包,如果目的DTE/DCE之间的最大包长更小。目的DTE一个一个地接收这些包,直到收到未设M位的那个包,然后它把收集到的所有包当成从源DTE发送过来的一个巨大的包对待。D位指出了确认(ack)是表示包已经被目的DTE接收还是仅被DCE接收(这是一个网络细节问题,当D位为0时表示包已经被源DCE或目的DCE收到了)。
当DTE希望在某个特定的呼叫上传输时,它发送一个带呼叫号和序列号的数据包—在该呼叫上每发送一个包,序列号增加1。如果DTE同时在好几个呼叫上发送包,各个包上的序列号是不相关的(见下图)。

x.25不同的呼叫,包序号不相关

在某个特定的呼叫上,一个数据包在源DTE上发送时的序列号可能跟它在目的DTE被接收时的序列号不同。首先,假定应用程序的数据大小符合源端和目的端的DTE/DCE之间的链路允许的最大包长要求。在这种情况下,源DTE发送的每个数据包,在目的端接收时仍为单个的包(见下图“源/目的DTE/DCE之间的最大包长相同,序号保持一致”)。现在假设应用程序的数据大小超过了目的端的DTE/DCE之间的链路允许的最大包长。在这种情况下,每个从源发送出来的包被分成几个包到达目的DTE;每个这样的包中,除最后一个包外,其他包都设了M位。当目的DTE收到不带M位的包时,它把收到这个包当成一个完整的包发送给应用程序(见下图“源/目的DTE/DCE之间的最大包长不同,导致序号不一致”)。

源/目的DTE/DCE之间的最大包长相等,序号保持一致

源/目的DTE/DCE之间的最大包长不同,导致序号不一致

如果源端的DTE/DCE之间的链路所允许的最大包长也小于应用程序要发送的数据大小,这会出现类似的情况,不同的是,源DTE将发送一系列的包给源DCE(见下图)。除最后一个包外的所有包都设了M位。

目的DCE必须保存且重组分段

一般说来,如果源端的最大包长与目的端DTE/DCE之间的链路所允许的不同,则包在源DTE发送的序列号与目的端DTE接收时的序列号不同(见下图)。

x.25分段与重组

由于标准中规定,如果包未达到最大包长,就不能设M位(除非同时还设了D位),这可能会引起一个很有趣的现象。也就是如果DTE/DCE之间的链路所允许的最大包长为1024字节,则设了M位的包必须为1024字节长。当源端的DTE/DCE之间的链路所允许的最大包长小于目的端的DTE/DCE之间的链路所允许的最大包长时,就出现了这些问题。当源DTE发送一系列的包时,每个都设了M位(最后一个包除外),目的DCE不能把这些包发送给目的DTE,直到收到满足最大包长的数据量为止。然而,比如说源端的DCE/DTE之间的链路所允许的最大包长为目的端的DCE/DTE之间的链路所允许的最大包长的1/8,则目的DCE要等到收到8个带M位的包以后才能作为一个带M位的包发送给目的DTE。

流控制
除了报文序列号(message sequence number ,msg #)之外,每个数据包还有一个确认号(acknowledgement number,ack #),用于确认已收到的包。假定DTE A与DTE B之间有一个会话。当DTE A发送包给DTE B时,DCE A收到的可能是序列号为k的包。当DTE A从DCE A收到一个从DTE B发送过来的包时,它有一个完全不相关的序列号,比如说是j。如果DTE A在该会话中只收到了序列号为j的包,而且DTE A正要在这个会话上发送一个序列号为k的包,它将把该包的msg #字段设为k,把ack #字段设为j。这个协议是对称的。当DCE A发送数据给DTE A时,每个数据包也将包含msg #和ack #。Ack #主要有两个目的:
1) 确认该指定序列号(包括该序列号前面的序列号)的包已经正确收到了。
2) 指出接收者正打算接收指定序列号的包。
如果接收者没有数据需要发送,仅仅是确认已收到的包,它将发送一个接收就绪(receive ready)包,该包中包含了待确认包的序列号。假定DTE不能在该会话上再接收任何数据。再假定该会话的窗口大小为w(在最后一个确认之外,发送方允许发送的包数)。假设现在有一个应用程序正在向用户终端发送数据,而该用户输入了一个“暂停”命令,然后离开去吃午饭。如果此时DTE正好确认了序列号j(通过数据包中的ack #或者通过发送一个确认号为j的接收就绪包),则DCE可以继续发送到序列号j+w,然后就停止发送数据,直到该用户吃完饭回来,并输入命令“重新开始”。除了使用确认来拒绝更多的包发送外,X.25中还有另外的流控机制。节点(包括DTE和DCE)可以发送一个“接收未就绪”(receive not ready)包,它包含一个序列号j,j是最近收到的一个数据包的序列号。这意味着包j已经被正确地收到了,但是DTE不能再继续接收数据了。然后,该节点可以再发送一个包含序列号j的“接收就绪”包。如果该节点在发送了“接收未就绪”包后要开始发送数据,它将在ack #字段内填入j。但是源发送方在接收到这个包以后,依然不能向该节点发送数据,直到它收到“接收就绪”包为止。“接收未就绪”机制起的作用并不大。假定接收方发送了一个序列号为j的接收未就绪包,但是发送方很可能在接收到这个包之前,就已经发送了序列号为j+1的数据包。如果发送方认为接收方抛弃了包j+1,然后在收到接受就绪包后,重发了包j+1,则接收方会认为它收到了重复的包(序列号为j+1的包),导致它要重新创建会话(即将挂断会话)。要使得这个机制能够正确地运行,接收方需要认识到在它确认了j包,且发送了接收未就绪包后还可能接收到w个包。但是如果接收方确实相应地按这个要求来做,接收未就绪包也就失去了意义。不再确认j以后的其他包,与发送带序列号j的接收未就绪的包的作用相同。

功能
有些功能已经被事先约定,然后被DCE手工设置(在DTE看来,并不属于X.25协议)。下面是一些例子。
1) 固定窗口大小,或者可以为每一个会话设置一个窗口大小。
2) 固定包大小,或者可以为每一个会话设置一个包大小。
3) 允许不同会话的吞吐量不同(在75 bps和64 Kbps之间)。
4) 创建一个封闭用户组( closed user group)—指相互之间可以通过X . 2 5网络通信的DTE集合。一个DTE可以同时属于多个封闭用户组。在这种情况下,DCE可以根据DCE上关于DTE所属的封闭用户组的信息以及呼叫请求包上的信息来判断进入呼叫或对外呼叫是否被允许。封闭用户组的编号只在本地特定的DTE/DCE接口之间有效。也就是说,如果DTE A与DTE B同属于一个封闭用户组,则可以用n来代表DTE A,而用m来代表DTE B。
5) 允许无进入呼叫限制。
6) 允许只有进入呼叫限制。
7) 创建最低对外虚电路号,它定义了DTE所选的虚电路号与DCE所选的虚电路号之间的界限。
下面列出了每个会话可选的小工具。注意,在前3种情况下,这种小工具需要事先约定好才能用于每个会话上。
1) 该会话的窗口大小。
2) 最大包长。
3) 吞吐量。
4) 封闭用户组,指定了该会话的封闭用户组。
5) 对方付费(由被叫方付钱)。

呼叫释放
标准的释放连接的方法是,会话中的任何一方DTE通过发送一个清除请求(clear request)给它的DCE,来请求清除会话。然后这个DCE通过网络把请求传输给另一方的DCE,然后再由那个DCE通知DTE说“会话将结束”。当非发起方的DTE确认这个清除请求包后,由它的DCE通过网络通知另一端的DCE,该DCE再通知发起的DTE说对方已确认。当网络检测到某个会话出了问题时,它会采取以下措施:
1) DCE可能发出一个清除请求,导致会话连接中断,而不对未确认的包有何保证。这些包可能已经发送或尚未发送给目的端。
2) DCE可能发出一个重置(reset)的请求,同样不保证未确认包的命运。它保持会话连接,但是包的序列号从0开始记起。
3) 网络可能透明地恢复。(可惜这种情况不太常见)。以下是可能触发上述反应的原因:
1) 该会话所经路由上的某个DCE或者某条链路发生了故障(X.25网络可设计为,当某台路由器发生故障,而大部分还在正常工作时,会话可以重新计算路由)。
2) DTE在该会话上发送了非预期序列号的包,表明DTE与DCE之间已经不能协调工作。还可能是DCE通知DTE说,该DTE上的所有会话都被拆除。这通常是由于DCE重启使得它丢失了当时正在处理的所有会话的状态而引发的。

中断
X.25还提供一种能力,使得DTE可以在会话中发送一个单一的包(1~32个字节的数据),该包将被尽可能快地送给目的DTE,而不需要等到前面发送的数据先被发送到目的端。中断(interrupt)包不受流控制,因此即使目的端已经发送过接收未就绪包,中断包也能发送给目的端。中断确认(interrupt confirmation)包用于确认中断包。一个DTE只有在DCE(通过中断确认包)通知它说,目的DTE已经确认了前一个中断包后,才能发送第2个中断包。

在网络内部实现X.25
在本节中,我们将讨论实现X.25保证的服务接口的两种方法:所有的包按顺序进行传输,不重复,也不丢失,否则会话结束。有些X.25提供前一种策略,另一些提供后一种策略。

电路方法
在这个方法里,需要先进行呼叫建立过程,正如图7 - 1所示的那样,在沿着该路径的所有路由器里创建状态。在利用这种方式创建的X.25网络里,路由器为经过它的每一个已创建的会话保留一定的缓冲区。如果新来了一个呼叫请求,而呼叫映射数据库已满,或者所有的缓冲区都已被保留,则这个呼叫请求将被拒绝(类似于打电话时遇到的线路忙音)。由于呼叫数目是有限的,因此网络可以为会话提供一定的服务质量保证。当网络的服务量达到一定程度时,新的呼叫请求将被拒绝,但已在进行的会话服务不会受影响。这和无连接服务的宗旨正好相反,在无连接服务中,所有的用户都可以公平地享受性能降级的服务。在用该方式建立的X.25网络中,路由器通常保留它所发送的数据包,直到下一跳的路由器确认了该包。因此,如果该路径上某路由器发生了故障,网络将无法恢复丢失的包。在这种情况下,网络将终止该会话或者重新开始该会话,否则它无法保证100%的可靠性。

基于数据报的可靠连接方法
提供X.25接口的另外一种方法是,建立一个无连接的网络,但是在连向端节点的路由器中增加一些代码。附加的代码有点像提供全服务的运输层协议。当某个路由器,R1,收到了它所连接的端节点(E1)发来的一个呼叫请求(假设目的地址为E2,呼叫号为x)时, R1在它的路由数据库中查找连到E2的路由器R2。然后, R1建立一个到R2的连接,它们之间的端到端服务保证了从R1发送的包可以按顺序被R2接收,且可保证不被丢失,也不重复,或者乱序。除了R与R2之外,没有其他的路由器关心E1与E2之间的会话。可以在网络内部实现负载均衡(load splitting),该会话过程中的不同包经过的路由也可能不同。R2会暂时保留这个包,直到在它前面的包都已到达。而R1会保留它所发送的包,直到收到R2对该包的确认信息。

比较
在第2种建立X.25接口的策略中,并没有做服务保证。只要端路由器能留出有效的空间来保持端到端连接的状态信息,网络就可以保持这个会话。并不需要保留中间路由器的缓冲区,包可能会被这些中间路由器抛弃,但是源路由器可以重发这些包。根据第2种策略建立的网络能够处理更多的会话,因为它可以共享缓冲区和带宽等资源。而在第1种策略中,当发生传输拥塞时,为某个特定的会话(如果它现在不在传输数据)所保留的资源将被浪费。第1种方法所建立的网络可以让路由器更迅速且方便地转发包,因为路由器是根据较短的呼叫号来进行判断的,而不必通过较长的网络层地址来判断。在第2种方法中,如果中间的路由器或者链路发生了故障,可以寻找一个新的路由器来替代它。路由算法可以适应新的拓扑结构,而路由也可以重新计算。虽然在这个调整的过程中,包有可能丢失,但是如果源路由器没有接收到包的确认信息,它会重发包。

异步传输模式
ATM代表异步传输模式(Asynchronous Transfer Mode)。为什么这么称呼呢?电话公司已经习惯于每隔一段时间为每个呼叫发送一部分数据的模式了。如果在数据前面增加足够的头部信息,使得它可以自我描述,数据就可以按原样被完整传输,而不必遵从固定的时间间隔。虽然在数据前面增加头部信息会增加开销,但是这可以让数据传输更加灵活。大多数的应用程序都不是按固定速率来传输数据的。ATM允许突发数据传输,也允许数据的按需传输。这就是为什么称它为异步的原因。ATM重新使用了包交换。ATM把交换信元的盒子称为交换机,虽然它和路由器并没有什么太大区别。它们需要路由算法,做出转发决定。最大的不同是,在ATM中转发IP包时,你需要先建立路径,指定虚电路号。然后交换机就可以根据虚电路号(而不是目的地址)来判断该如何转发包了。ATM是一种面向连接的数据报服务。还有其他一些跟ATM有关的概念,如LANE(局域网仿真)、MPOA(基于ATM的多协议)、基于ATM的经典IP等等。

信元大小
可能关于ATM最怪异的一件事就是它的包(在ATM里称为信元)大小了,只有48字节的数据,另外还有5字节的头部。48个字节长使大家都不称心,法国PTT认为信元大小应该不超过32个字节,否则需要采取回音抑制(时延主要是由于等待数据填满信元或由于传播时延引起)。传输数据的用户则希望有更大的信元,至少要128字节。主要有两个原因:一是对小信元来说,5字节的信元头部浪费较大;对48字节的数据量而言,头部开销超过了总需求的10%。另一个原因是,交换机并不能足够迅速地判断转发方向,因而小信元的ATM网络会更多地受交换速度的影响,而不是传输速度。如果交换速度真的成为ATM网络的瓶颈,你可以靠把信元包大小扩大一倍而得到两倍的吞吐量。讨论的结果是,信元的大小应该位于64~128字节之间,这样交换的速度就不会成为网络的限制因素了。所以委员会妥协为48字节,大到足以需要对它进行回音抑制,又小到让传输数据的用户和法国PTT一样不开心。

虚电路和虚路径
ATM在概念上跟X.25差不多。虚电路的建立过程正如图“A-B呼叫的路由器数据库”所示,在每个交换机上建立呼叫映射数据库,指定该虚电路所对应的端口,以及对外连接的标识符。
ATM信元头部的连接标识符有两个复杂性。
?它被分成为两个部分:VPI(虚路径标识)和VCI(虚电路标识)。VCI为16位。VPI为12位。
?在端节点与交换机之间与在两个交换机之间看起来不同。在端节点与交换机之间有4位被留作一般流控制(generic flow control),委员会认为这可能会在将来用到。由于一般流控制用掉了VPI中的4位,所以在端节点的VPI字段为8位。除了让规格说明看起来更麻烦一些以外,保留4位并没有什么影响,因为端节点只需要VCI字段就够了。
那什么是VPI呢?在高速的骨干网中,可能同时有几百万个会话。把VPI和VCI分开可以避免让骨干网上的路由器跟踪在它上面进行的成百万个独立的会话。骨干网上的路由器只需根据VPI字段来判断。可能同时有几千个VC在使用同一个VP,但是交换机可以把这些VC做为一整个单元看待。在骨干网外,交换机把整个字段(VPI和VCI)做为一个联合字段,并不分开判断。VP交换意味着只根据VPI字段来进行交换。VC交换意味着根据整个字段(VPI和VCI)来交换。比较VP和VC的一种方法是把云图上的每一个连接点当成一个逻辑端口(见下图)。为了转发包到某个逻辑端口,需要选定一个实际的端口和正确的VPI。

作为本地端口的VIP

在【一般的面向连接的网络】中所描述的普通的VC交换中,如果S1从端口b收到一个CI=17的目的为D的呼叫建立请求,S1需要判断它应该向哪个端口转发,还需要选择一个未用的CI。在上图所示的情况中,应该为“端口” e。发送包到端口e需要选择一个该云图中实际的端口,然后再选一个VPI。这有3种情况:
? 在该云图内的交换是普通的VP交换,CI就是12位的VPI。
? 在该云图外的交换是普通的VC交换,CI是由VPI和VCI共同组成的28位的字段。
? 位于边缘位置的交换机做VC交换,CI为由VPI和VCI共同组成的28位的字段。但是面向云图内部的“端口”由实际的物理端口号和VPI共同定义,为了使输出CI的VPI端口等于输出VPI ,需要先选定输出CI。
在下图中,假定S1从端口a收到了一个CI=89的呼叫建立包,其目的端可以通过S6到达。再假设现在S1已经有了一条到S6的虚路径,S1上的转发端口为c,VPI=187(如果还不存在S1到S6的虚路径,则创建一条)。在骨干网内的连接标识为VPI。VCI被忽视,且不做更改。符号“x.y”表示VPI和VCI独立,这一般用于骨干网的入口或出口处的交换机上。符号“x.”用于骨干网内部的交换机上,表示它们仅仅查看VPI字段(把VPI作为CI)。而不带点的数字,比如说“z”则用于骨干网外的交换机上,把整个VPI+VCI当成一个CI来看待。S1收到一个VCI字段为89的呼叫建立请求。然后S1通过查看目的端地址知道,它需要把这个包通过S6 才能传给目的端。此时S1已经有一条到S6的虚路径(VPI = 187)。S1需要在(端口c,VPI187)(对外端口,outgoing port)上选择一个未被使用的VCI,假定是42。然后S1把89映射到(c,187.42)上。这时VCI =42在整个骨干网内保持不变,且被交换机忽视,直到离开骨干网。但是VPI在骨干网中的每一跳都会改变。S1与S6都需要考虑VCI和VPI(因为它们为入口交换机和出口交换机)。

骨干网内,交换只基于VPI进行

这样做的结果是,每一条VP上可以同时有64000个VC(16位值),骨干网内的交换机所维护的表可以显著变小,因为它们只需根据VP进行判断,而不必考虑VC。我们一般把ATM网络划分为两种类型:一种是属于用户的,称为消费者(customer);另一种是起骨干网作用的,称为供应者(provider)。消费者ATM网络一般根据28位的VPI+VCI进行路由判断,而供应者ATM网络则是根据VPI进行路由判断。在边界上,连接这两种网络类型的交换机需要根据28位的CI(由(VPI,VCI)对组成)来判断,实际上也就是28位的VPI+VCI。在以上两种ATM的交换机之间建立链路前,它们需要就以下事项进行协商:
?VCI与VPI中最大活动位数。一般取更小的位数。
?能支持的最多VC和VP数。一般取较小的数,该数不超过在该链路上任何时刻都使用的VC或VP的数目。
?最大允许的VPI序号。这跟你能支持的最多VP数不同。比如说可以允许VPI序号为1000,但是在该链路上同一时刻最多只支持50个活动的VP。
?交换的VC的最大和最小的VCI序号。比最小序号更小的数字保留给默认的VCI或者永久虚电路(PVC)。由于交换的VP从1开始计数,所以没必要为VPI指定最小的序号。
正如在大多数的供应者ATM网络里所实现的那样,VP都不是动态建立的。它们通常为PVC,由手工建立且永久保留。这使得在消费者ATM网络看来,供应者ATM网络就像一大束点对点链路组成的网络,每一条链路都是一条VP,且占用ATM头部信息的VPI字节。消费者ATM网络可以选择通过手工或者通过路由协议来配置VP与目的端之间的映射关系。我认为通过路由协议来进行配置是较文明的做法。现在我们一般使用PNNI(private network-to-network interface,一种用于ATM上的类似于IS-IS的链路状态协议)来解决这个问题。

ATM服务种类
ATM定义了几种服务类型。
?CBR:恒定比特率(constant bit rate)。数据按恒定的速度进行收发。网络提供保留的带宽和服务保证。
?UBR:未定比特率( unspecified bit rate)。数据接收不受约束,如果带宽够用,则发送,否则抛弃。网络不提供预留带宽和服务保证。
?ABR可用比特率( available bit rate)。与UBR类似,但是网络提供拥塞反馈。如果端节点对该反馈做出了适当的反应,可认为该网络能减少由于拥塞造成的数据丢失。
? V B R:可变的比特率(variable bit rate)。与CBR类似,带宽在非高峰期被保留。它允许高峰不受限制(数据突发容忍)。VBR又被分为RT(实时)和NRT(非实时)两种类型,对于RT-VBR类型的网络需要更关心交付时间。

ATM信元头部格式
下图显示了ATM的信元头部格式。
? 前4位既可以为VPI的一部分(如果该信元在两个交换机之间传输时),也可以作为保留字段(称为一般流控制,如果信元在端节点与交换机之间传输时)。

ATM的信元格式

? 接下来24位为VPI/VCI字段(见【虚电路和虚路径】)。
? 有效负载类型(payload type)为3位的字段。第1位为0表示是数据,为1表示是ATM的控制信息。第2位表示是否发生拥塞。最后一位由AAL 5定义,表示是否为包的最后一个信元。

在ATM信源中有效负载类型字段所定义的值

? CLP(信元丢失优先级)=1表示该信元将在CLP=0的信元之前被抛弃。这个标识位可由端节点或者交换机来设置。如果某个VC按超出允许的速度发送数据,可以设置这个标识符。在带宽允许的情况下,超出部分的数据可以被发送,但是如果网络负载较大时,超出的数据会被设为CLP = 1等待抛弃。
? 最后一个字节是信元头部信息的前4个字节的CRC校验码。

连接的建立与释放
ATM把这个称为发信号(signaling)。它的作用与X.25中类似。发信号与发送ATM信元类似,不同的是,它们固定使用VCI=5(VPI=0)。这个V CI=5(与VPI=0)被保留,数据不能用VCI=5进行发送。发信号的信息超过了48个字节,因此它们在AAL 5上进行传输(见【ATM适应层】)。

ATM适应层
由于只靠48个字节来发送数据很不方便,人们在ATM上定义几种不同的ATM接口。这一层被称为AAL(ATM Adaptation Layer, ATM适应层)。对于某个VC,它所使用的AAL类型在呼叫建立时就已经声明。AAL 0就是直接的ATM。AAL 1是恒定比特率的ATM(即CBR)。AAL 2类似于AAL 1,但为可变比特率。委员会关于这方面的设计是不完全的,但他们仍将它标准化并宣称设计是完全的,好像因此就不会有人注意到实际上是不可实现的。AAL 3和AAL 4被定义用于数据传送,最终它们被统一成一个AAL,称为AAL3/4。但这东西不但复杂,而且效率低下。所以计算机工业界设
计了AAL 5。AAL 3/4在AAL 5定义前被用于某些场合,但是现在看起来AAL 3/4已经给淘汰了。
1. AAL1
AAL 1从源端以恒定比特率接收数据,然后再以恒定比特率发给目的端。由于它必须在基于ATM或者其他类似的网络上进行传输,这当中可能会发生时延、丢失等情况。AAL 1通过缓存数据来平滑时延,通过给信元编号来检测数据是否丢失,而不是仅仅把丢失的数据从数据流中截去。它把ATM的有效负载(48字节)中的第一个字节作为自己的控制信息,用剩下的47个字节来传输数据。第一个字节包含以下内容:
? C:用做信令位,比如是基于应用的数据流中的某种标志。
? Seq :3位的序号。
? SNP :4位的序号保护字段, 3位的C R C编码,1位的奇偶校验位。
注意:由于只有3位的序号编码,当同时丢失8个连续的信元时,AAL 1可能无法检验出错误。
2. AAL3/4
AAL 3/4试图提供一种服务,使得你可以按需发送不限大小的数据报。但它用起来很复杂,效率又低,因此人们进一步发展了AAL 5,AAL 3/4就几乎被淘汰了。不管怎么说,让我们来看看它是怎么工作的。
? 在你希望发送的数据报上加上头部和尾部。头部长4个字节。它包括以下内容:一个字节永远设为0;一个标志字节,它可以为任意值,但要求头部与尾部的值一致,以免发生两个信元意外地连接在一起的情况; 2字节用来存储长度,表明缓冲区的大小(数据大小+头部大小+尾部大小+填充字节数)。尾部的内容与头部类似。它包含一个无用的字节,接下来2字节存储信元中数据的长度,然后是一个标志字节,值与头部的对应标志字节相同。如果尾部不是按3 2位对齐的话,需要在数据与尾部之间加填充字节。
? 现在,你已经给待传输的数据加上了头部、尾部以及填充字节,然后把它们按44字节切成几段。每一段加上4字节的附加信息后填入ATM的信元中。4字节的附加信息包括2字节的头部和2字节的尾部。头部中的2位表示该信元为数据的开始信元、结束信元、中间信元还是整个包。接下来4位为序号,然后10位委员会保留为在单一虚电路上发送多个信元,但好像并没有人在AAL3/4中用到过它们。尾部中的6位用来表示数据长度(一般说来是44,但如果是最后一个信元,数据可能不足44个字节),接着10位是该信元的CRC编码。
3. AAL5
计算机工业界并不喜欢AAL2和AAL 3/4。他们进一步设计了一种新的AAL,ATM论坛接受
并把它标准化为AAL5。
AAL 5和AAL 3/4一样,允许传输任意大小的数据包。它在待发送的包上添加填充字符,并在其后面附加上8字节的尾部。添加填充字符的原因是为了让整个数据(待发送包大小+填充字符+尾部大小)为48字节的倍数(ATM的信元数据大小)。尾部中有2个字节并未定义( ATM论坛喜欢把头部和尾部的大小定义为2的幂),另外2字节存储待发送包的大小,剩下4字节为CRC编码。当包被包装好后,把它按48字节分段,然后发送出去。AAL 5较好的一点是,它并没有占用ATM的信元数据(而AAL 1占了1字节, AAL 3/4用了4字节),但AAL 5在ATM信元的头部中用1位来表示“包的结束”。由于AAL 3/4对每一个信元都进行CRC校验,你可能会认为AAL 3/4的检错性能较好。但实际上AAL5的4字节CRC编码的效果,要比AAL 3/4为每个信元留10位的CRC校验要好得多。如果你只传输一个坏的信元,为每个信元独立地进行CRC可能会很有好处,但是如果AAL3/4中某个信元发生了错误,整个包都需要重传。所以实际上,无论从哪个方面讲,AAL5都要比AAL3/4好得多。而且由于它支持可变比特率,它还可以代替AAL 2的工作。因此实际上,实用的AAL只有两种: AAL 1和AAL 5。

相关文章:

网络接口:服务模型  (2008-10-14 9:51:32)

集线器、交换机、虚拟局域网与快速以太网  (2008-10-14 1:7:40)

源路由网桥  (2008-10-13 11:36:14)

透明网桥  (2008-10-12 23:2:39)

影响网桥和路由器的数据链路层问题  (2008-10-10 13:25:50)

网络的基本概念  (2008-10-8 20:41:29)

  1. 0 Response to “面向连接的网络:X.25和ATM”

Post a Comment

◎欢迎参与讨论,请在这里发表您的看法、交流您的观点。

About Me

成功的定义就是:每天在各方面持续不断地进步一点点.
欢迎有共同爱好的朋友相互交流。 邮箱:houlihu237@126.com
QQ:383153740 手机:13750888314

Find entries :
实用电子书籍 小学教育光盘
图像处理教程 淘宝相关服务
淘宝店铺装修 网络营销推广
图像图像设计 其他相关服务