Cisco路由器转发数据包时常用的五种交换方式
进程交换(Process Switching)
这是一种最基本的交换模式,在这种模式下,一条数据流(Flow)中的第一个包(Packet)将被置入系统缓存(System Buffer)。其目的地址将会拿到路由表中去查询比对,路由器的处理器(CPU or Processer)同时将进行CRC校验,检查包是否正确。然后数据包的二层MAC地址将会被重写,替换为下一跳接口的MAC地址。对这条数据流(Flow)中的第2个、第3个数据包……将会继续这样相同的操作,包括查询路由表、重写MAC地址,CRC校验等。这种方式无疑是延迟最大的,因为它要利用System Buffer以及Processor去处理每个收到的包。但是我们仍然有机会使用这种交换方式,比如在进行基于数据包的负载均衡,或是debug ip packet时。因为默认情况下,思科路由器会启用Fast Switching或Optimum Switching或是CEF Switching,而不是Process Switching,所以我们只能通过:no ip route-cache来禁用Fast Switching,这在另一种意义上正是开启Process Switching。
命令:R1(config-if)#no ip route-cache //启用进程交换(禁用快速交换)
注意:命令debug ip packet仅允许观察进程交换的数据包,将启用进程交换,所有数据包都被送至进程记录,CEF交换、快速交换等的数据包将不被显示出来。
快速交换(Fash Switching)/路由缓存交换(Route-Cache Switching)
快速交换要优于Process Switching,它采用了路由缓存(Route Cache)来存储关于某条数据流(Flow)的特定信息,当然会包括诸如目的MAC地址,目的接口等内容。这时我们只需要对一条数据流(Flow)中的第一个包做Process Switching,并把信息存入Cache,所有后续数据包,可以不必再中断System Processor去执行查询等操作,直接从Cache中提取目的接口,目的MAC地址等,这样大大加速了包转发速度。Fast Switching在某些资料上可能被称为Route-Cache Switching。思科1600、1700、2500、2600系列路由器的Ethernet、Fast Ethernet、Serial接口默认采用的就是Fast Switching。
命令:R1(config-if)#ip route-cache //启用快速交换
R1#show ip cache //查看快速交换
最优交换(Optimum Switching) 和 分布式交换(Distributed Switching)
这两种交换模式,从原理上来讲都与Fast Switching极为相似,比如Optimum Switching其实采用了一种经过优化的交换缓存(Optimumed Switching Cache),它的速度要较平常Cache要快。Distributed Switching需要使用Versatile Interface Card这种硬件卡,又称VIP Card。它会自已保存一份Route Cache,这样查询时就不必等待使用共享的系统缓存(Shared System Buffer)了,无论相对于Fast Switching还是Optimum Switching来讲,都是比较快的。这两种模式一般只在思科高端设备上有所应用,比如7200系列的路由器或12000系列的路由器。
命令:R1(config-if)#ip route-cache optimum //启用最优交换
R1(config-if)#ip route-cache distributed //启用分布式交换
R1#show ip cache optimum //查看最优交换
Netflow交换(Netflow Switching)
这种模式是最值得参考的,它完全基于其它Switching Mode,重点在于对流经的数据包进行计费、监控、网管。但值得提的是,这种模式也要存储相关信息,据统计大致65536条数据流(Flow)会耗费4MB的System Buffer。
命令:R1(config-if)#ip route-cache flow //启用Netflow交换
R1#show ip cache flow //查看Netflow交换缓存
R1(config)#ip flow-export //将Netflow审计的数据包转发到指定设备
Cisco特快交换(Cisco Express Forwarding)
Cisco CEF是最为高效的一种三层协议,很多人容易对CEF产生误解,所以我们仍然要说明它的来原。CEF采用了基于硬件的平台,它不仅仅是将数据都存入System Buffer,而是将整个路由表、拓扑表,以及所有的下一跳地址、MAC地址全部进行“预存”,只要路由表、拓扑表中存在的条目,无论是否有数据请求发往其目的地址,都会提前预读取,预设置缓存。具体来说它是通过全用转发信息表(FIB)和邻接表来实现的,它事先从路由表中获取信息并把信息存储在转发信息库(FIB)中,当任何数据包需要这些信息时可以立即使用。FIB包括路由表中的所有目标网络,它们可以随着网络拓扑的变化而调整。CEF使用一个单独的数据表--邻接关系表,为FIB的每个表项维护第二层转发信息。邻接关系表由第二层信息构成,(这些信息可以由IP、ARP或IPv6邻居发现协议学习到)。FIB和邻接表是在数据包转发之前建立的,当有新的数据请求发送时,就不需要CPU去查询路由表转发一次后把信息存入缓存,或查询目的接口,目的MAC地址等信息,而是直接从缓存中读取,从而使转发速度得以大大提高。
IPv4、IPv6关于负载均衡和CEF的说明:
1.对于IPv4,CEF支持基于目标网络的负载均衡和基于数据包的负载均衡;
对于IPv6,CEF仅支持基于目标网络的负载均衡。
2.IPv4缺省的交换模式是CEF;
Ipv6缺省的交换模式是Process Switching。
2.针对IPv4可以使用ip cef激活CEF;
而对IPv6,必须先启用ip cef ,再使用ipv6 cef激活CEF。
3.可以通过show ip cef / show ipv6 cef 查看路由器是否启用CEF。
命令:R1(config)#ip cef //用来为所有接口激活CEF(全局配置命令)
R1(config-if)#no ip route-cache cef //可以选择性地在某些接口上屏蔽CEF(接口子命令)
R1#show ip cef //查看路由器是否启用CEF,CEF全部信息
R1#show ip cef detail //查看CEF全部详细信息
R1#show ip cef int se0/0 //查看CEF特定接口信息
R1#show ip cef int se0/0 detail //查看CEF特定接口详细信息
R1#show cef int //查看使用了哪一种负载均衡模式,CEF全部功能信息
R1#show cef int s0/0 //查看使用了哪一种负载均衡模式,CEF特定接口功能信息
注意:(no) ip cef是一个全局命令,当在接口下使用(no) ip cef时,自动跳转为全局命令。当使用no ip cef时,则关闭了所有接口的CEF,ip route-cache cef不起作用。
负载均衡
负载均衡的两种分类
等价负载均衡(Equal-Cost Load Sharing):是将流量均等地分布到多条度量相同的路径上;
非等价负载均衡(Unequal-Cost Load Sharing):是将报文分布到不同度量的多条路径上。各条路径上分布
的流量和路由开销成反比。开销越低的路径分配的流量越多。
说明:只有EIGRP支持非等价负载均衡,最多支持对6条路径的非等价负载均衡;可以通过差异变量(Variance)来确定哪些路由在非等价负载均衡中是可以使用的;并且可以通过设置最大路径数决定使用某几条链路。
负载均衡的两种方式:
基于目标网络的负载均衡 ip load-sharing per-destination;
基于数据包的负载均衡 ip load-sharing per-packet。
基于目标网络的负载均衡 ip load-sharing per-destination
基于目标网络的负载均衡允许路由器使用多条路径来负载均衡,它是根据目标网络中的目的地址分配负载量的。并且它可以确保数据包总是使用相同的路径,并按照它们发送的顺序到达目的地址。这种方式的负载均衡最适用于需要数据包按照某种顺序到达的应用。例如,有两个网络A、B,A-B间存在两条路径,那么从A去往B地的第一个目标的报文走第一条路径,去往B的第二个目标的报文走第二条路径,去B的第三个目标的报文走第一条路径,依此类推……随着目标网络地址数量的增加,负载均衡会变得更加有效。大多情况下路由器都采用这种负载均衡方式,并且它也是Cisco CEF使用的缺省负载均衡方式。
基于目标网络的负载均衡和Cisco CEF:准确来讲,CEF是按照源、目的地址对(Hash出一个值)进行负载均衡。相同源、目的地址对的流量都会从同一个接口出站,而不同源、目的地址对的流量可能会从下一个接口出站。
命令:R1(config-if)#ip load-sharing per-destination //基于目标网络的负载均衡
基于数据包的负载均衡 ip load-sharing per-packet
使用基于数据包的负载均衡的路由器可以在多条链路上连续发送数据包,而不用考虑主机或用户的具体情况。这种负载均衡采用轮转机制来确定每个数据包走哪条路径到达目的地址。缺点是不能确保每一个数据包遵循相同的路径,将导致数据包无序到达。这对某些应用来说是不能接受的(如VoIP)。假设去往某一目标网络的报文走的第一条链路,当路由器又收到去往该网络的报文后,将从第二条链路上发送,依此类推……(假设各条链路是等价的),如果链路代价不同的话,路由器将会按照代价比例来分配各链路的流量分配。例如,在一条高代价链路上发送一个报文,可能低代价的链路上就会发送三个报文。当路由器采用非默认交换方式时,即处于进程交换模式时,将采用这种负载均衡。通过使用此方式在不均衡的数据流量需要在多条路径上进行负载均衡是非常重要的。
命令:R1(config-if)#ip load-sharing per-packet //基于数据包的负载均衡
负载均衡和Cisco CEF
1.CEF缺省的负载均衡方式是基于目的网络的负载均衡,IPv4缺省的交换模式是CEF,Ipv6缺省的交换模式是
Process Switching。
2.CEF事先从路由表中获取信息并把信息存储在转发信息表中(FIB),当数据包需要这些信息时可以立即使用。
FIB包括路由表中的所有目标网络,如果路由表稳定且不发生改变,那么FIB也不会变化。
3.CEF使用一个单独的数据表--邻接关系表,为FIB的每个表象维护第二层转发信息。邻接关系表由第二层信息构
成,例如,这些信息可以通过ARP或IPv6邻居发现协议学习到。
4.FIB和邻接关系表是在数据包转发之前建立的。
5.CEF在缺省的情况下是基于目标进行负载均衡,这实际上是按照源目地址对进行负载均衡。所有发往特定目标
地址的流量只要源地址相同都会从相同的接口出站,而不同源地址对的流量可能从下一个接口出站。
6.基于数据包的负载均衡是交换IPv4数据包的另一种方式。
7.对于IPv6,CEF仅支持基于目标网络的负载均衡方式。
8.基于数据包的负载均衡方式意味着在不同的链路上发送数据包,即使在路径等代价、目标相同的情况下也是
样。如果路径代价不同,那么可能会在高、低代价路径上按照代价比例进行分流。
9.基于数据包的负载均衡方式可以更加均匀地分布流量。但是数据包选择不同的路径去往目标网络会引起非顺序
到达。对于某些应用来说,这是不能接受的,例如VoIP.
10.为了确定CEF功能是否在路由器上被全局开启,可以使用命令show ip cef和show ipv6 cef。如果缺省情况下
CEF没有被打开,针对IPv4可以使用命令ip cef ,而对IPv6来说,必须先打开IPv4的CEF,然后使用命令
ipv6 cef打开此功能。
11.在IPv4下,命令ip load-sharing per-packet可以打开基于数据包的负载均衡功能,如果需要打开基于目标
地址的负载均衡,可以使用ip load-sharing per-destination命令。你可以使用命令show cef interface来
检查使用了哪一种负载均衡模式,该命令可以给出在这个接口上配置的CEF信息。
12.路由器通常根据入站接口和源与目的地址类型确定是否使用CEF交换。对于考虑使用CEF的路由器来说,出站
接口交换模式必须配置为CEF,如果接口上配置了CEF,那么CEF将尝试交换数据包。否则,CEF会把数据包交
付给仅次于最好的可用交换方法去处理。对于IPv4,这种方法是快速交换,而在IPVv6中叫进程交换
(Process Switching)。
13.你可以使用命令show cef interface {interface}和show ipv6 cef {interface} detail来验证在接口上CEF
功能是否被打开。
基于目标网络的负载均衡和快速交换
1.IOS在配置快速交换的出站接口上执行基于目标网络的负载均衡,某路由器上IOS的缺省交换模式是快速交换。
2.快速交换的工作方式如下:
1>当路由器为第一个去往特定目标的数据包进行交换处理时,路由器将执行路由表查询并选择出站接口;
2>然后获取有关被选接口的数据链路信息(如ARP表),最后封装数据包并发送;
3>前面获取的路由和数据链路信息被输入到快速交换的高速缓冲中;
4>一旦去往相同目的地的后续数据包进入路由器,高速缓冲中的信息使路由器不必查找路由表和ARP高速冲,
就可以立即交换数据包。
3.快速交换意味着所有去往指定目的地址的数据包都从相同的接口被发送出去,因此交换时间和处理器的占用率
会大大降低。当去往相同网络内不同主机的数据包进入路由器且还存在一条可选路由时,路由器会在另一条路
径(非可选路由,也就是原来的那条)上发送数据包到目的地。因此路由器能够做得最好的就是基于目标网络的
负载均衡。
基于数据包的负载均衡和进程交换
进程交换(Process Switching)即使对于每个数据包,路由器都要进行路由表查询和接口选择,然后再查询数据链路信息。因为每一个为数据包确定路由的进程都是相互独立的,所以不会强制去往相同目标网络的所有数据包使用相同的接口。正如许多设计选择一样,基于数据包的均分负载也是要付出代价的。这种方式虽然使流量的分布比前一种方式更均匀,但是快速交换的较低交换时间和处理器占用的优点也随之丧失了。为了在接口上打开进程交换功能,可以在IPv4下使用命令no ip route-cache。对于IPv6什么也不需要做,因为缺省情况下该功能是打开的。
哪一种交换方法会被用到?
1.IOS首先基于入站接口的配置和源与目的地址类型来决定交换模式;如果接口上配置了CEF,不管出站接口上配
置是什么,数据包都会被CEF交换;
2.如果入站接口上没有配置CEF,那么IOS会处理并转发数据包,并根据出站接口的配置,后续的数据包或者被快
速交换,或者被进程交换。
3.如果入站接口的CEF功能被打开,IOS将只使用CEF交换数据包。否则出站接口的配置会确定交换方法。注意,
如果在出站接口上打开CEF功能的同时又在入站接口上配置进程交换或快速交换,那么快速交换将被使用。
4.只有在入站接口上配置了CEF,它才会起作用。对于IPv4,尽管出站接口上打开了CEF功能,但是起作用的还是
快速交换。
5.有些时候后即使打开了CEF,但是并没有使用CEF交换数据包(例如访问列表的日志功能被打开和数据包将被记录
下来)。那么数据包将被送交仅次于最快的交换方法,例如IPv4下使用快速交换,在IPv6下使用进程交换。
网上这方面的知识比较少,本人手头上的资料有限,忙了两天,实验一直做不清楚,累死了~不详之处请见谅!