说明
之前介绍了以太网二层封装在TCP/IP协议里面工作的过程,其实除了EtherⅡ的封装以外,二层封装还有PPP、FR等许多协议,这里注意介绍两个常用到的,PPP和FR,FR其实在实际中用的并不多了,但是在RS的考试中,任然是必考点,不过这里主要介绍在路由信息有的情况下,二层封装的重要性以及工作过程,为了后续的动态路由协议在FR情况下的不同情况做准备。PPP这里主要介绍下它们协商的过程和一些特性,其余的没什么的了,其实,在卷一中根本没提及过PPP,因为Cisco默认封装的是HDLC,不像H3C和HW一样,默认为PPP。
PPP:Point-to-Point protocol,点对点协议
建立、配置及测试数据链路层的链路控制协议 (LCP,Link control Protocol)。它允许通信双方进行协商,以确定不同的选项
其实,PPP协议主要在NA的课程中会涉及到,但是,NP和IE都不会在将PPP的协议了,我们都知道PPP协议有两个控制协议,一个为LCP,一个为NCP。
协议 0021 IP数据报文
协议 C021 链路控制数据
协议 8021 网络控制数据
针对不同的网络层协议的网络控制协议(NCP :Network Control Protocol) 当前定义的有网络层有IP、OSI、AppleTalk.
PPP好处 : 1、支持同步与异步链路
2、支持验证,安全性有保证
3、支持IP地址的协商,扩展性比较灵活。
4、通过LCP来控制链路的建立
5、通过NCP来支持多种网络层协议
根据图上定义的IP,并且封装类型为PPP,我们都知道PPP会协商出32位主机路由,通过抓包来分析,它们怎么协商的。
LCP:当接口UP的时候,两端设备会通过LCP向对方发送配置信息报文 (Configure Request),一旦收到一个配置成功信息的包(Configure-Ack ),那么就完成了LCP的建立,如果有验证的话,那么会携带在LCP的字段里面,对方回复了ACK后,就开始交换验证需要的参数,来完成LCP的认证,最后建立LCP的连接 。
先看最开始的4个抓包,分别为两个Request,两个ACK。
展开内容查看。
code:为Request,注意Options:为0x0x0c5a0c,在查看对应的ACK信息
对应的ACK信息,code :ACK,Option也为 0x0x0c5a0c。
这里为双向的,也就是LCP的建立是双方都进行确认的,如果有PAP或者CHAP认证的话,也会在LCP阶段进行完成。
NCP:负责上层网络协议的选择或者多个协议,如果是IP网络的话,那么就会发送 IPCP的 (Configure Request)信息,包含自己的IP地址,当对端收到以后,会回复一个(configure ACK),表示收到了,同时还会记录在路由表中,由于没有携带子网掩码,所以默认为32位主机路由。
cdp信息可以忽略掉,是Cisco默认发送的,除了CDP外,有两队request,也有两队ACK。
大部分信息跟LCP的内容一致,只是opions包含的是自己的接口IP地址。
ACK的内容也基本上一样,只是对应的Options是回应这个IP的。 当回应以后,就会把这个IP地址作为主机路由出现在路由表中。
关闭主机路由的特性,在有时候,我们不希望它出现主机路由,那么可以通过在接口下输入 no peer neighbor-route,总有人说关闭后,主机路由还在,这是因为PPP的两个控制阶段已经协商完毕,这时候必须让它们重新协商才行,就是shutdown接口,然后在开启。
这样,主机路由就消失了。
keepalive:在建立后,PPP会每10s发送一次keealive包,来探测对方的存在,通过LCP的Echo request,那么对方必须回复一个Echo reply来确认双方存在,如果3个包还没有收到回复,那么就会断开连接。这也是PPP为什么能作于计费的一个特性。
帧中继 : Frame relay :在数据链路层用简化的方法传送和交换数据单元的快速分组交换技术。
帧中继特点 : 1、帧中继协议以帧的形式传递数据信息
2、帧中继协议是面向连接的交换技术
3、帧中继可以在一条物理链路上提供多虚链路
4、帧中继链路层完成统计复用、帧透明传输和错误检测等功能
5、帧中继提供一套合理的带宽管理和防止拥塞的机制
IP地址信息、接口信息如图所示。
一:帧中继交换机的搭建
Cisco-FR(config)#frame-relay switching :开启FR交换机功能
Cisco-FR(config)#interface s1/0
Cisco-FR(config-if)#encapsulation frame-relay :封装帧中继
Cisco-FR(config-if)#frame-relay intf-type dce :FR的类型为DCCE
Cisco-FR(config-if)#frame-relay route 102 interface s1/1 201 做静态映射,带有DLI 102的数据包从s1/1的201出去
Cisco-FR(config-if)#frame-relay route 103 interface s1/2 301 静态映射,带有DLCI 103的数据包从S1/2 301出去
Cisco-FR(config-if)#clock rate 64000 在GNS3或小凡上不需要敲入,但是在PT和真机都需要
Cisco-FR(config-if)#no shutdown
Cisco-FR(config)#interface s1/1
Cisco-FR(config-if)#encapsulation frame-relay
Cisco-FR(config-if)#frame-relay intf-type dce
Cisco-FR(config-if)#clock rate 64000
Cisco-FR(config-if)#frame-relay route 201 interface s1/0 102
Cisco-FR(config-if)#no shutdown
Cisco-FR(config)#interface s1/2
Cisco-FR(config-if)#encapsulation frame-relay
Cisco-FR(config-if)#frame-relay intf-type dce
Cisco-FR(config-if)#frame-relay route 301 interface s1/0 103
Cisco-FR(config-if)#clock rate 64000
Cisco-FR(config-if)#no shutdown
二、客户端配置帧中继的接入端
Cisco-R1(config)#int s1/0
Cisco-R1(config-if)#encapsulation frame-relay
Cisco-R1(config-if)#frame-relay map ip 12.1.1.2 102 broadcast
Cisco-R1(config-if)#frame-relay map ip 12.1.1.3 103 broadcast
Cisco-R2(config)#int s1/0
Cisco-R2(config-if)#encapsulation frame-relay
Cisco-R2(config-if)#frame-relay map ip 12.1.1.1 201 broadcast
Cisco-R3(config)#int s1/0
Cisco-R3(config-if)#encapsulation frame-relay
Cisco-R3(config-if)#frame-relay map ip 12.1.1.1 301 broadcast
注意:这里接口都是没有shutdown的,注意是为了等会查看帧中继之间的协商过程
boardcost参数的含义:在帧中继中,依靠的是DLCI号来传递的,那么本身不具备有广播的能力,这个参数的含义是,一旦加上了这个参数的PVC,一个广播或者组播的数据过来,那么就会像这些有boardcost参数的PVC下都复制一份发送出去,来实现广播和组播的效果。也就是把一个广播变成多个单播发送出去。
三:分析FR与接入端直接的协商过程,以及map下的各种状态。
Cisco-FR上的每个PVC的状态都是inacive的,表示接入端的静态映射或者接口出现了故障问题
1、开启Cisco-R1的s1/0接口,抓包分析接入端和FW的端口协商状态
LMI:Local Management interface 本地管理接口:在帧中继中与路由器之间,路由器(DTE)发送status enquiry(探测请求包) 而帧中继的一般为DCE 回复status,来保证双方是否链路正常{这里注意的是,发送请求包只能是DTE端,而DCE只能回复。这也是为什么帧中继交换知道客户的链路正常和DLCI号(在enquiry中会携带)
携带了DLCI号,但是,不知道为什么用wirehark抓包显示是错误的。
再次看,FW上PVC的状态
注意:这里active是针对output DLCI号,这里102和103的都为active了。
再看,Cisco-R1上PVC的状态
都为inacive状态,为什么? 因为FW上面针对102去往201,103去往301的状态为inactive,也就是说201和301的PVC接入端链路出现了问题,或者没有正确配置静态映射,导致在staus enquiry中携带的DLC与帧中继的DLCI号对应上。
inactive状态:对端的链路出现了故障
deleted状态:本地静态指定的DLCI号不在帧中继中存在。
问题来啦,那么Cisco-R1是怎么知道对方出现了故障或者配置不正确呢?
其实,很简单,是FW告诉Cisco-R1的。
帧中继每30s,会把自己PVC status发送给路由器,当路由器收到后,如果本地静态指定了DLCI号 与帧中继发送过来的一致,那么就会处于两个状态,一个为inactive,这个状态是因为帧中继中映射的出方向处于inactive的状态,所以觉得也没有必要发送数据过去,当对端处于active时,那么本地状态也会为active。
抓包里面携带了PVC的status,但是,DLCI的HIGH和LOW不知道为什么是这样现实。
还可以通过debug frame-reply lmi 查看
status 0x00代表active,如果是0x02的话,就代表inactive
3、LMI的类型
LMI:也有三种类型 cisco | ansi | q933a 如果没有指定是通过协商来决定的,当一个接口up的时候,会同时发送这三种类型的LMI给帧中继,优先Cisco,最终协商的是cisco。LMI的类型是针对Cisco-FR来说的,也就是说FW指定了为什么,那么协商的时候就是指定的类型,否则默认是cisco
把Cisco-R1的LMI类型改为ansi,再次抓包
Cisco-FR(config-if)#frame-relay lmi-type ansi
接入端发送了一个enquiry的请求,类型为LMI ,但是FW回应的是Q.933 的Staus,紧接着接入端也发送Q.933的enquiry的请求了。
四:invrse ARP的工作原理
也许在配置帧中继的时候,最喜欢敲的一个命令就是no arp frame-relay和no frame-relay inverse-arp,是否真的有必要敲这句话呢?
其实,可以发现我在配置帧中继的时候,没有敲过这句话,因为接入端只要配置了静态map的时候,那么它就不会发送inverse ARP来动态获取DLCI号了。
Cisco-R1(config-if)#no frame-relay map ip 12.1.1.2 102 broadcast
Cisco-R1(config-if)#no frame-relay map ip 12.1.1.3 103 broadcast
这时候,把Cisco-R1的静态映射给去掉,然后,在Cisco-R2和Cisco-R1抓包,查看是否会发送ARP请求 (在Cisco-R1上之前抓包查看过,只有enquiry的包,没有ARP,因为它有静态map存在。)
这时候,就是简单的Cisco-R1——-FR———–Cisco-R2,都通过ARP获取映射,来分析下原理
inverse ARP 原理:当Cisco-R1封装了FR,接口UP的时候,就会发送LMI的探测包,当收到帧中继的LMI回复的时候,这个回复包会携带这个接口属于的DLCI号,这时候Cisco-R1就会发送inverse ARP请求,请求的内容包含 发送者的硬件地址为0,源IP为Cisco-R1目的硬件地址(任意值) 目的IP为0.0.0.0 DLCI号为102(FR通过LMI回复包得到),然后发送到FR上,FR查看本地DLCI对应关系,102置换成201,发送给Cisco-R2 ,Cisco-R2也收到了LMI的回复包,知道DLCI号为201,当收到ARP请求时候,它就知道去往Cisco-R1走201出去,并且会回复ARP请求,源地址为自己,硬件地址还是为0,目的地址为Cisco-R1,目的硬件地址为任意值,通过DLCI号 201发送出去,FR收到后 对应DLCI映射关系,从102发出,到达Cisco-R1,Cisco-R1就会在动态的在map中显示去往Cisco-R2 从DLCI号102出去,状态为active dynamic。 Cisco-R2获取去往Cisco-R1的原理也是一样的,并且Cisco-R1 与 Cisco-R2 几乎同时发起inverse ARP请求。 在实际环境中除了Full Mash环境,否则不要用inverse ARP,会造成DLCI与地址解析错误,显示为0.0.0.0与DLCI号的显示,解决办法,关闭no frame-rely inverse-arp no arp frame-rely 然后保存 重启。 clear frame-relay inarp 也无效。这也是RS CCIE考试中容易遇到的问题。
案例分析:二层封装的重要性
这个也是这次要说明的主题,其实很多人都有个误区,认为只要学习到对方的路由,就会认为数据包能够正常转发了,之前分析过在以太网环境下,如果通过ARP获取的MAC地址信息不对的话,那么不管是否有路由存在,那么通信是不正常的。
环境很简单,运行RIPv2,在Cisco-R2与Cisco-R3上面只有一个静态map就是关于Cisco-R1的12.1.1.1的,现在的测试就是,当RIP收敛完全以后,是否能ping通3.3.3.3。 配置省略了,这里主要讨论封装问题。
发现路由已经收敛完成了。
不同,为什么? 我们可以发现关于3.3.3.3的下一跳是12.1.1.3,而Cisco-R2本身就一个静态map关于12.1.1.1的,所有在有路由的情况下,它想发送数据包出去,但是二层封装的时候,发现没有关于12.1.1.3的封装信息,也就是DLCI号。
通过debug信息,它提示encapsulaion failed,封装失败。
解决办法就是在Cisco-R2和Cisco-R3上在添加静态映射,这里注意DLCI号是可以复用的,也就是说,12.1.1.1和12.1.1.3都是从201发送出去,至于对方是否转发这数据包,Cisco-R2本身是不关心的,它只看是否有映射。 当前,这里Cisco-R1是有Cisco-R3的映射的,所以,Cisco-R1代为转发了。
Cisco-R2(config-if)#frame-relay map ip 12.1.1.3 201 broadcast
Cisco-R3(config-if)#frame-relay map ip 12.1.1.2 301 broadcast
这个问题,很容易在动态路由协议中出现的,包括OSPF、EIGRP、RIP、ISIS(它还需要映射CLNS地址)
总结:这次只要介绍了二层封装,关于PPP和FR的协商过程,和一些主要的地方, 特别是需要明白二层封装的重要性,只有这样才会在以后的工作中或者考试中快速的进行排错。
本文首发于公众号:网络之路博客