数据包负载均衡loading-share

session 1 数据包的转发方式
在cisco路由器中数据的交换方式大体被分为三大类:
一、进程交换(Process Switching)
      这是路由器最基本的查询转发方式,一条数据流(Flow)中的第一个包(Packet)将被置入系统缓存(System Buffer)。其目的地址将会拿到路由表中去查询比对,路由器的处理器(CPU or Processer)同时将进行CRC校验,检查包是否正确。然后数据包的二层MAC地址将会被重写,替换为下一跳接口的MAC地址。对这条数据流(Flow)中的第2个、第3个数据包……将会继续这样相同的操作,包括查询路由表、重写MAC地址,CRC校验等。这种方式无疑是延迟最大的,因为它要利用System Buffer以及Processor去处理每个收到的包。并且路由的查询方式是最基本的递归查询,每数据包都要查一次路由表。
      这种基本的进程交换方式下的负载均衡是基于数据包的负载均衡,即当路由器每转发一个数据包时,就进行一次路由表RIB的查询,每查询一次路由表中的路由指针会向下移动一次,每次转发的路径就是路由指针对应的那条路由。
      现在cisco设备默认的交换方式已经不是最基本的进程交换查FIB的路由了,而是快速交换和CEF交换,所以要实现进程交换看到下面的实验现象必须关闭快速转发和CEF转发(目前默认都是CEF,关闭CEF默认是快速交换,关闭快速交换后才是最基本的进程交换),关闭cef是全局的no ip cef即可,关闭快速转发是要在出接口下no ip route-cache关闭出接口的路由缓存。
数据包负载均衡loading-share_第1张图片
R1与R2的f0/0口是12.1.1.0/24,f1/0之间是21.1.1.0/24网络,R2的loopback0是10.0.0.1/24
R1#show ip route
Codes: C - connected, S - static, R - RIP, M - mobile, B - BGP
       D - EIGRP, EX - EIGRP external, O - OSPF, IA - OSPF inter area 
       N1 - OSPF NSSA external type 1, N2 - OSPF NSSA external type 2
       E1 - OSPF external type 1, E2 - OSPF external type 2
       i - IS-IS, su - IS-IS summary, L1 - IS-IS level-1, L2 - IS-IS level-2
       ia - IS-IS inter area, * - candidate default, U - per-user static route
       o - ODR, P - periodic downloaded static route
Gateway of last resort is not set
     21.0.0.0/24 is subnetted, 1 subnets
C       21.1.1.0 is directly connected, FastEthernet1/0
     10.0.0.0/24 is subnetted, 1 subnets
S       10.0.0.0 [1/0] via 21.1.1.2
                 [1/0] via 12.1.1.2
     12.0.0.0/24 is subnetted, 1 subnets            会递归到直连接口
C       12.1.1.0 is directly connected, FastEthernet0/0
在R1上查看路由表,现在是到达10.0.0.0/24网络的路由负载均衡,2条路径10.0.0.0 [1/0] via 21.1.1.2和10.0.0.0 [1/0] via 12.1.1.2(10.0.0.1/24是R2的loopback0的ip)。在进程交换方式下的负载均衡是基于数据包的负载均衡,负载的时候每一个包都会进行一次路由查询,路由对应的指针都会移动。
现在路由指针(*号)对的下一跳是21.1.1.2,也就是下一个数据包的路由会走R1-R2的f1/0链路
R1#show ip route 10.0.0.0 255.255.255.0
Routing entry for 10.0.0.0/24
  Known via "static", distance 1, metric 0
  Routing Descriptor Blocks:
  * 21.1.1.2
      Route metric is 0, traffic share count is 1
    12.1.1.2
      Route metric is 0, traffic share count is 1


R1#ping 10.0.0.1 repeat 1 
Type escape sequence to abort.
Sending 1, 100-byte ICMP Echos to 10.0.0.1, timeout is 2 seconds:
!
Success rate is 100 percent (1/1), round-trip min/avg/max = 408/408/408 ms
这个数据包就走下一跳为21.1.1.2的路由,再次查看路由指针:
路由指针对应的下一跳是12.1.1.2,也就是下一个数据包的路由会走R1-R2的f0/0链路,这就是基于包的负载均衡
R1#show ip route 10.0.0.1 
Routing entry for 10.0.0.0/24
  Known via "static", distance 1, metric 0
  Routing Descriptor Blocks:
    21.1.1.2
      Route metric is 0, traffic share count is 1
  * 12.1.1.2
      Route metric is 0, traffic share count is 1
      上面就是按照每转发一个数据包路由就跳动一次,实现基于包的负载均衡。可以使用debug ip packet看到现象就是数据从R1到R2的loopback0接口的路由一个包走f0/0一个包走f1/0这样基于每数据包的轮训负载均衡。
      这种每转发一个数据包cpu的进程都要查一次路由表,在有多条路由条目及数据量极大的网络中对设备的负荷是很重的。

      注意:命令debug ip packet仅允许观察进程交换的数据包,和交换机自身接收及发送的数据包、快速交换、CEF交换等的数据包将不被显示出来(因为进程交换走是通过查看路由表项的,而快速转发和CEF转发是通过查看route-cache和CEF相关表项的)。


二、快速交换(Fast switching/Route-cache switching)
      快速交换要优于Process Switching,它采用了路由缓存(Route Cache)来存储关于某条数据流(Flow)的特定路由条目缓存。快速交换只需要对一条数据流(Flow)中的第一个包做Process Switching,并把路由信息存入Cache,所有后续数据包,可以不必再中断System Processor去执行查询等操作,直接查看接口的Route-cache(需要接口ASCII硬件芯片支持)来转发,大大加速了包转发速度。要实现这种转发方式需要关闭CEF并开启快速转发功能。
no ip cef
      出接口下ip route-cache 启用快速转发
      快速转发方式的负载均衡是基于目的ip的,简单说就是每/目标ip在转发过程会形成一条route-cache,后续去往这个目标ip的数据流都走这条cache,理想的状态是不同的目标ip走不同的cache路径实现负载均衡。但是由于数据流本身转发时间的不确定性,会导致可能多个目的ip走同一条cache,形成在一个有2条路径的冗余链路中,两条链路上走的数据包无法达到1:1从而导致其中一条负载过重。
还是以上面的图为例,R2上在loopback0口多配置一个ip:10.0.0.2,查看多目的ip负载方式的现象
首先在R1上ping一下10.0.0.1,再ping一下10.0.0.2,查看路由缓存
R1#show ip cache
IP routing cache 0 entries, 0 bytes
   0 adds, 0 invalidates, 0 refcounts
Minimum invalidation interval 2 seconds, maximum interval 5 seconds,
   quiet interval 3 seconds, threshold 0 requests
Invalidation rate 0 in last second, 0 in last 3 seconds
Last full cache invalidation occurred 00:17:12 ago
Prefix/Length           Age       Interface                Next Hop
10.0.0.1/32           00:04:10   FastEthernet0/0     12.1.1.2
10.0.0.2/32           00:00:17   FastEthernet0/0     21.1.1.2
      可以看到缓存表中分别对应不同的目的ip选择了不同的路径(也有可能两条都走一个缓存条目),这时ping 10.0.0.1和10.0.0.2时在使用命令show ip route 10.0.0.0 255.255.255.0查看路由指针是不会变的,是因为已经不用查找路由表了,而是直接根据cache条目转发了(cache条目是有存在时间)。只有第一个数据包才会进行一次进程路由转发,后续的直接根据cache条目转发了,因此路由指针不会移动了。
clear ip chche 清除route-cache条目

      最优交换(Optimum Switching) 、分布式交换(Distributed Switching)、Netflow交换(Netflow Switching)与快速交换类似,原理都差不多。目前都不用现在都使用CEF交换。


三、CEF交换(cisco快速转发)
       Cisco CEF是最为高效的一种三层协议,很多人容易对CEF产生误解,所以我们仍然要说明它的来原。CEF采用了基于硬件的平台,它不仅仅是将数据都存入System Buffer,而是将整个路由表、拓扑表,arp表全部进行“预存”,只要路由表、拓扑表中存在的条目,无论是否有数据请求发往其目的地址,都会提前预读取,预设置缓存。具体来说它是通过全用转发信息表(FIB)和邻接表来实现的,它事先从路由表中获取路由信息并存储在转发信息库(FIB)中,当任何数据包需要这些信息时可以立即使用。FIB包括路由表中的所有目标网络,它们可以随着网络拓扑的变化而调整。CEF使用一个单独的数据表--邻接关系表,为FIB的每个表项维护第二层转发信息。邻接关系表由arp表信息构成,(这些信息可以由IP、ARP或IPv6邻居发现协议学习到)。
       FIB和邻接表是在数据包转发之前建立的,当有新的数据请求发送时,不需要CPU去查询路由表了,而是直接根据FIB表和邻接表中的条目进行转发了,因此路由指针也不会变动。
       在CEF中负载均衡方式有两种:基于包转发、基于目的ip转发(默认)与route-cache相同,但是CEF的负载不会像cache那样出现数据流量不均衡的情况,因为cef是基于一种源ip+目的ip的hash算法来选择负载通道的,而不是像快速交换那样通过route-cache来选择数据包的负载路径的,cef最大支持16个负载路径,上图为例有两条链路做负载冗余,那么这两条链路就被分别分成8个负载通道,而数据包走哪一条通道完全是由源ip+目的ip进行hash进行计算得出的,完全保证了冗余链路流量分担均衡。
1、查看cef的负载方式和负载通道:show ip cef 10.0.0.0 255.255.255.0 internal    隐藏命令在设备上打?没用
R1#show ip cef 10.0.0.0 255.255.255.0 internal
10.0.0.0/24, version 13, epoch 0, per-destination sharing   默认的目的ip负载方式
0 packets, 0 bytes
  via 21.1.1.2, 0 dependencies, recursive
    traffic share 1
    next hop 21.1.1.2, FastEthernet1/0 via 21.1.1.2/32
    valid adjacency
  via 12.1.1.2, 0 dependencies, recursive
    traffic share 1
    next hop 12.1.1.2, FastEthernet0/0 via 12.1.1.2/32
    valid adjacency
  0 packets, 0 bytes switched through the prefix
  tmstats: external 0 packets, 0 bytes
           internal 0 packets, 0 bytes
  Load distribution: 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 (refcount 1)
  Hash  OK  Interface                 Address         Packets
  1     Y   FastEthernet1/0           21.1.1.2              0                           去往10.0.0.1的第一个包hash后走通道1
  2     Y   FastEthernet0/0           12.1.1.2              0                           去往10.0.0.2的第一个包hash后走通2    
  3     Y   FastEthernet1/0           21.1.1.2              0                           去10.0.0.1的第二个包hash走通道3     
  4     Y   FastEthernet0/0           12.1.1.2              0                           去10.0.0.2的第二个包hash后走通道4
  5     Y   FastEthernet1/0           21.1.1.2              0                            。。。。依次走,根据不同的目的ip地
  6     Y   FastEthernet0/0           12.1.1.2              0                            址走相同的路由但是走路由中不同的虚
  7     Y   FastEthernet1/0           21.1.1.2              0                            拟负载通道,这是基于目的ip的cef负载
  8     Y   FastEthernet0/0           12.1.1.2              0                            通过源和目的ip的hash计算出走的通道
  9     Y   FastEthernet1/0           21.1.1.2              0
  10    Y   FastEthernet0/0           12.1.1.2              0
  11    Y   FastEthernet1/0           21.1.1.2              0
  12    Y   FastEthernet0/0           12.1.1.2              0
  13    Y   FastEthernet1/0           21.1.1.2              0
  14    Y   FastEthernet0/0           12.1.1.2              0
  15    Y   FastEthernet1/0           21.1.1.2              0
  16    Y   FastEthernet0/0           12.1.1.2              0
  refcount 6
      两条链路分成了16条负载通道(逻辑上的),每条用8条负载通道。上面没有看到数据库包的数量是因为没有开启cef的负载通道数据流的统计功能,要开启这个功能也是一条隐藏命令来实现:
      注意这个命令是开启负载通道的统计,要开启普通转发通道(cef表项)的数据统计可以使用ip cef accounting后面?来查看支持的非隐藏命令。
ip cef accounting load-balance-hash                 开启负载虚拟通道的hash计算统计,开启后在使用:
R1#show ip cef 10.0.0.0 255.255.255.0 internal 就可以在ping 10.0.0.1/10.0.0.2后看到数据包所走的虚拟通道。
R1#show ip cef 10.0.0.0 255.255.255.0 internal
10.0.0.0/24, version 13, epoch 0, per-destination sharing   默认的目的ip负载方式
0 packets, 0 bytes
  via 21.1.1.2, 0 dependencies, recursive
    traffic share 1
    next hop 21.1.1.2, FastEthernet1/0 via 21.1.1.2/32
    valid adjacency
  via 12.1.1.2, 0 dependencies, recursive
    traffic share 1
    next hop 12.1.1.2, FastEthernet0/0 via 12.1.1.2/32
    valid adjacency
  0 packets, 0 bytes switched through the prefix
  tmstats: external 0 packets, 0 bytes
           internal 0 packets, 0 bytes
  Load distribution: 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 (refcount 1)
  Hash  OK  Interface                 Address         Packets
  1     Y   FastEthernet1/0           21.1.1.2              1                           去往10.0.0.1的第一个包hash后走通道1
  2     Y   FastEthernet0/0           12.1.1.2              1                           去往10.0.0.2的第一个包hash后走通2    
  3     Y   FastEthernet1/0           21.1.1.2              1                           去10.0.0.1的第二个包hash走通道3     
  4     Y   FastEthernet0/0           12.1.1.2              1                           去10.0.0.2的第二个包hash后走通道4
  5     Y   FastEthernet1/0           21.1.1.2              1                            。。。。依次走,根据不同的目的ip地
  6     Y   FastEthernet0/0           12.1.1.2              1                            址走相同的路由但是走路由中不同的虚
  7     Y   FastEthernet1/0           21.1.1.2              0                            拟负载通道,这是基于目的ip的cef负载
  8     Y   FastEthernet0/0           12.1.1.2              0                            通过源和目的ip的hash计算出走的通道
  9     Y   FastEthernet1/0           21.1.1.2              0
  10    Y   FastEthernet0/0           12.1.1.2              0
  11    Y   FastEthernet1/0           21.1.1.2              0
  12    Y   FastEthernet0/0           12.1.1.2              0
  13    Y   FastEthernet1/0           21.1.1.2              0
  14    Y   FastEthernet0/0           12.1.1.2              0
  15    Y   FastEthernet1/0           21.1.1.2              0
  16    Y   FastEthernet0/0           12.1.1.2              0
  refcount 6

 使用ping一个包来查看数据包在负载通道中所使用的通道。


2、修改CEF转发方式的负载均衡方式,CEF转发分别支持基于包的转发和基于目的ip的转发:
需要在出接口修改CEF交换的负载方式
R1(config)#interface f0/0
R1(config-if)# ip load-sharing per-packet                 使CEF基于包负载
R1(config-if)# ip load-sharing per-destination          使CEF基于目标ip负载
修改后不会立即生效,因为cef表项没有刷新,需要刷新一次CEF表项:
clear ip cef * prefix-statistics
全局模式下修改负载方式不起作用的,必须在接口下修改负载方式。
接口下关闭cef:no ip cef ?
补充:1、基于包的负载在NAT和有防火墙的情况下会有问题。

          2、查看cef转发负载路径命令show ip cef exact-route 源ip 目的ip


你可能感兴趣的:(数据包负载均衡loading-share)