帧中继技术,在有些时候似乎比较容易让人感到模糊,今天来谈一下它的几个基本概念,DLCI、二层映射以及三种接口类型。

一、DLCI
在谈DLCI前,先稍微介绍一下帧中继,帧中继是一种使用了包交换方式的标准的广域网技术。简单来说,就是为用户建立了一条端到端之间的虚拟电路连接,中间经过的帧中继云网络对于用户来说是透明的,用户用起来就感觉跟租用物理专线差不多,但是租用帧中继服务就比租用物理专线便宜得多。帧中继常用于分公司与总公司之间的连接。
帧中继的链路分为两种。一种是临时的虚拟链路,叫做SVC(Switching Virtual Circuit)交换虚链路;另一种是永久的虚拟链路,叫做PVC(Permanent Virtual Circuit)。SVC跟PVC的主要区别在于,SVC是节点之间只在需要进行数据传送的时候才建立逻辑连接,而PVC则是一直保持着连接状态。目前基本上使用的都是PVC。
既然帧中继技术使用的是虚拟链路来实现节点之间的专线连接,帧中继交换云网络中有那么多的虚拟链路,显然需要给各个不同的虚链路做上标记以作区分,而DLCI号就是为了这个功能而产生的,它就是打在帧中继虚链路上的标记。下面是一个简单的帧中继图例:
上图的意思是,R2是帧中继交换机,R1和R3之间通过R2的帧中继链路来进行连接。图例中的两个数字103和301,就是用来标记该链路的DLCI号。这个图例说明了帧中继中的虚链路与DLCI号之间的对应关系,就是端到端的虚链路中,并不是只使用一个DLCI号来作为标记,而是每一段虚拟链路都对应着一个DLCI号。
要注意的一点是,DLCI号只在本段物理链接范围内具有唯一性。用上图来说明一下这句话的意思会比较好理解。那就是,在R1到R2这一段物理链接里,可能R1与R2之间存在多条虚链路,也就存在着多个DLCI号,但在这一段链接范围内,不同的虚链路的DLCI号是不同的。在这里,根据DLCI号就可以区分出对应的虚链路,这就是它的唯一性。而在端到端的虚链路中(比如说R1到R3的虚链路),不同段的虚链路是允许使用相同DLCI号。而且DLCI号的范围只能从16——1007中选择,数量有限。这里也许会容易引发疑问,如果使用了相同的DLCI号,那要怎么区分每一条虚链路呢?如果R1到R2,R3到R2都使用103这个DLCI号,那不是容易混淆么?如果单凭DLCI号的话,确实是无法区分。但不要忘了,帧中继交换机上还有“interface”这个基本概念。不同的接口加上DLCI号,这两个参数一起,就可以让它区分出不同的虚链路了。需要注意的是,DLCI号是运营商分配的,不是我们自己随便定义的,所以不能在自己的设备上随便配置一个。

帧中继网络的帧结构跟以太网帧结构不同的其中一处是:以太网使用MAC作为二层地址进行帧的封装,而帧中继网络则使用DLCI号来作为二层地址进行帧的封装。

下图是帧中继的帧结构:
如图可见,其中的Q.922 Adress里面包含的就是DLCI,跟以太网帧封装不同的是,不存在源地址和目的,这里就只有一个DLCI号。

结合帧中继的帧封装以及前面提及到的DLCI跟链路的关系,就可以知道,当用户的路由器进行帧中继封装时,封装对应的DLCI号就会发送至相应的虚链路中(路由器如何知道不同的DLCI号对应着谁呢?这就要靠反向ARP查询或者是配置静态映射了,下面会提到),当帧中继交换机接收到后,根据帧中继交换机里面设置的对应关系(该对应表需要运营商手动配置),发送到对应接口的虚链路。数据在帧中继网络中就是这样进行传递的。



二、二层映射
从上面我们知道了DLCI是什么,以及它的作用,现在我们就来了解怎样用DLCI。要让帧中继能够正常使用DLCI,就意味着末端节点必须要知道它自己在什么时候用哪个DLCI号来封装,以及帧中继交换机必须知道它自己对于哪个接口的DLCI应该发往对应的哪一个接口的DLCI上。只有这样,才算是构成了一个完整的帧中继网络。
对于用户路由器(末端节点),它要知道自己在何时使用哪个DLCI号的话,有两种方法,一种是动态的,即反向ARP,(inverse-arp);另一种是DLCI静态配置。
1.反向ARP。这个概念其实在以太网环境下也很常见,本意就是通过二层地址查找三层IP地址。在帧中继环境下,就是指通过DLCI号来查找与之对应的IP地址。在帧中继环境中,帧中继交换机会向用户路由器发送数据包,里面含有跟用户路由器关联的DLCI号信息,这时路由器就知道了它自己有哪些DLCI号,但是还不知道DLCI号对应哪些IP地址,于是反向ARP查询就派上用场了。我们来看看反向ARP查询是如何工作的:当配置好接口的IP地址和帧中继封装后,接口默认开启了反向ARP查询的功能。路由器A会自动发出arp inverse-request来进行查询,大意是“谁在××这个DLCI号上面啊?”,然后该查询经过帧中继交换机的传递,到达另一端用户路由器B上,路由器B对该查询做出响应,返回一个arp inverse-reply进行回应,大意是“我的IP是×××,我在这个DLCI号上面!”,然后路由器A就知道了这个DLCI号对应的IP地址了,这就算是得到了一条DLCI与IP之间的映射。
下面两个图分别是ARP的反向查询和回应。
反向ARP查询

对反向ARP查询的回应

2.DLCI静态配置。其实就是在接口上手动配置DLCI和IP的映射关系,跟我们平时手动添加的静态ARP映射差不多。命令比较简单,就是“frame-relay map ip ×.×.×.× DLCI号 broadcast”。该命令中,IP地址是远端IP,DLCI号则是本地的DLCI号,加上这个broadcast参数的意思是允许发送广播和组播。这样就创建了一条能够让DLCI号跟对应的IP地址关联起来的静态映射。


三、帧中继的接口类型
帧中继有三种接口类型,分别是物理接口(physical)、多点子接口(multipoint)、点对点子接口(point-to-point)。
物理接口,其实就是不配置任何子接口下的默认接口模式。当路由器收到了来自帧中继交换机的DLCI信息,它就会对所有与之关联的虚拟链路进行反向ARP查询,从而建立起DLCI与IP之间的映射表。这种情况下,物理接口不需要做任何配置,即可与对端连通。
多点子接口,可以认为是一个具有跟物理接口同样作用的子接口。这意味着,当启用多点子接口的时候,他也是默认启用反向ARP功能,并且可以连接多条虚拟链路。但是,由于他是子接口,它无法像物理接口一样自动对DLCI号进行反向ARP查询。这是因为子接口根本不知道自己可以拥有哪些虚拟链路,他不知道自己有哪些DLCI号!所以就要对该子接口配置DLCI号,在子接口下面输入“frame-relay interface-dlci ××”,配置了DLCI号之后,反向ARP才知道对哪些DLCI号发送查询请求,然后查询过程就跟物理接口一样。
点对点子接口,顾名思义,就是说该子接口只有一条虚拟链路与之连接。由于是子接口,所以它也需要配置DLCI号才能正常工作。点对点子接口默认是不启用反向ARP功能的,这是因为他知道与之连接的只有一条链路,它形成的不是DLCI与IP的映射条目,而是点对点接口跟DLCI的映射。

值得注意的是,上面提到的点对点跟多点子接口的区别,在ping对端IP地址的时候,抓包就会体现出来:点对点子接口对于任意的IP地址都会发出ping包,而多点子接口只会对ARP映射表上有的IP地址发出ping包,当它ping其他IP的时候,是没有ping包发出来的。