本文档说明选择性数据包丢弃 (SPD) 机制,以及如何对其进行监控和调整。
注意:本文档不说明如何对Cisco 12000系列Internet路由器上show interfaces输出中的输入丢包数量不断增加的问题进行故障排除。有关此问题的详细信息,请参阅 Cisco 12000 系列互联网路由器上输入丢弃故障排除。
有关文档规则的信息,请参阅 Cisco 技术提示规则。
本文档没有任何特定的前提条件。
本文档中的信息基于以下软件和硬件版本:
Cisco 7200系列路由器
Cisco 7500 系列路由器
Cisco 12000 系列互联网路由器
所有版本的 Cisco IOS® 软件
本文档中的信息都是基于特定实验室环境中的设备创建的。本文档中使用的所有设备最初均采用原始(默认)配置。如果您是在真实网络上操作,请确保您在使用任何命令前已经了解其潜在影响。
选择性数据包丢弃 (SPD) 是管理路由处理器 (RP) 的进程级别输入队列的机制。 SPD 的目标是在进程级别队列拥塞期间向路由协议数据包及其他重要的数据流控制“第 2 层”Keepalive 提供优先级。
以往在 Cisco 7x00 和非 Cisco Express Forwarding (CEF) 7500 系统等平台上,为了填充快速交换缓存,大量中转数据包由路由处理器转发。因此,在这种情况下要求 SPD 为路由协议数据包确定高于共享相同队列的中转数据包的优先级。
目前,在 Cisco 12000 系列互联网路由器和运行 CEF 的 7500 上,只有发往路由器本身的数据流才发送到进程级别。在这种情况下,当管理数据流(例如简单网络管理协议 (SNMP))存在时或当发送到 RP 的 Denial of Service (DoS) 攻击发生时,SPD 用于确定路由协议数据包的优先级。
在 Cisco 12000 系列上,当线卡确定传入数据包需要传送到 RP 进行处理时,数据包通过交换机矩阵(如 Cisco 信元)传输,并最终由 Cisco 信元分段和重组 (CSAR) 现场可编程门阵列 (FPGA) 接收。
其目的是处理交换机矩阵和 RP CPU 之间的数据流,这是执行 SPD 检查的地方。这适用于 IP 数据包、无连接网络服务 (CLNS) 数据包、第 2 层 Keepalive 和传送到 RP 的类似数据包。SPD 进行两种检查,并有可能丢弃处于以下两种状态之一的数据包:
SPD 状态检查
输入队列检查
RP 的 IP 进程队列分为两部分:常规数据包队列和优先级队列。常规数据包队列中放置的数据包要进行 SPD 状态检查,而优先级队列中放置的数据包不进行该检查。符合优先级数据包队列条件的数据包是高优先级数据包(例如 IP 优先级 6 或 7 的数据包),决不应丢弃。不过,可基于 SPD 状态根据常规数据包队列的长度丢弃不符合要求的数据包。常规数据包队列有三种状态,因此,为低优先级数据包提供的服务可能不同:
正常:队列大小 <= 最小值
RANDOM DROP:最小值 <= 队列大小 <= 最大值
FULL DROP:最大值 <= 队列大小
在 NORMAL 状态下,不丢弃格式正确和不正确的数据包。
在 RANDOM DROP 状态下,随机丢弃格式正确的数据包。如果配置了主动模式,则丢弃所有格式不正确的数据包;否则,将其视为格式正确的数据包。
注意:这些随机丢包称为SPD刷新。基本上,当接口过载时,将进行刷新。缓冲未命中会导致刷新计数器递增。
在 FULL DROP 状态下,丢弃所有格式正确和不正确的数据包。这些最小值(默认值 73)和最大值(默认值 74)是从机箱上的最小保持队列派生的,但可以使用全局命令 ip spd queue min-threshold 和 ip spd queue max-threshold 覆盖。
SPD 可以配置为两种不同模式:正常(默认)和主动。这两种模式之间的唯一差别是路由器如何说明无效 IP 数据包的原因(无效校验和、不正确的版本、不正确的报头长度和不正确的数据包长度)。 处于主动模式和 Random drop 状态时,SPD 将丢弃格式不正确的 IP 数据包。可以使用 ip spd mode aggressive 命令配置主动模式。
注意:由于格式错误的IP数据包被入口线卡直接丢弃,并且这些数据包不会传送到千兆路由处理器(GRP),因此Cisco 12000系列互联网路由器上未实施主动模式。 因此,此特定平台上不需要主动模式。
输入队列按硬件接口进行维护,在所有子接口间共享。如果没有 SPD,如果输入队列已满,则在接收到数据包时会丢弃所有数据包。默认输入队列大小是 75,可使用 hold-queue [size] in 接口配置命令按接口配置。输入队列的数据包数量可在 show interfaces 命令的“input queue”字段中看到。
router#show interfaces pos 3/0 POS3/0 is up, line protocol is up Hardware is Packet over SONET Internet address is 137.40.55.2/24 MTU 4470 bytes, BW 2488000 Kbit, DLY 100 usec, rely 255/255, load 1/255 Encapsulation PPP, crc 32, loopback not set Keepalive not set Scramble disabled LCP Open Open: IPCP, CDPCP, OSICP, TAGCP Last input 00:00:01, output 00:00:00, output hang never Last clearing of "show interface" counters 2w3d Queueing strategy: fifo Output queue 0/40, 0 drops; input queue 0/75, 0 drops 30 second input rate 9000 bits/sec, 0 packets/sec 30 second output rate 0 bits/sec, 0 packets/sec 456292 packets input, 917329913 bytes, 0 no buffer Received 0 broadcasts, 0 runts, 0 giants, 0 throttles 0 parity 0 input errors, 0 CRC, 0 frame, 0 overrun, 0 ignored, 0 abort 112046977 packets output, 32078928095 bytes, 0 underruns 0 output errors, 0 applique, 3 interface resets 0 output buffer failures, 0 output buffers swapped out 1 carrier transitions
注意:减小一个接口上的输入队列大小可能导致所有其他接口上出现大量输入丢弃。请确保最小输入保持队列大小至少为 75。
即使使用 SPD,正常 IP 数据包的行为也不会更改;不过,因为 SPD 按 IP Precedence 字段识别路由协议数据包,所以将为路由协议数据包指定较高的优先级。因此,如果 IP Precedence 设置为 6,将为该数据包指定优先级。
SPD 通过允许软件超出正常输入队列限制范围将这些数据包排列到进程级别输入队列,从而确定这些数据包的优先级。允许超出正常限制范围的数据包数称为 SPD Headroom,默认值为 100,这表示如果输入保持队列的大小低于 175,则不丢弃高优先级数据包(输入队列默认大小 + SPD Headroom 大小)。
自 Cisco IOS 软件版本 12.0(22)S 开始,Cisco 12000 系列互联网路由器的 SPD Headroom 默认值为 1000,以适应更大的 SP 网络。这缘于以下事实:边界网关协议 (BGP) 对等体用于不断增加的大量邻居,以通告在以更快速度不断增加的接口上不断增加的大量路由。只清除 BGP 经常会导致单个接口上发生成千上万次输入队列丢弃,这可能严重影响收敛时间。
SPD Headroom 可以使用 spd headroom 命令进行配置。其当前级别可在 show spd 或 show ip spd 命令的输出中看到。
Router#show spd Headroom: 1000, Extended Headroom: 10 Router#show ip spd Current mode: normal Queue min/max thresholds: 73/74, Headroom: 1000, Extended Headroom: 10 IP normal queue: 0, priority queue: 0. SPD special drop mode: none
注意:IP正常队列的大小也可以通过show ip spd命令进行监控。
非 IP 数据包(例如无连接网络服务中间系统到中间系统 (CLNS ISIS) 数据包、点对点协议 (PPP) 数据包和高级数据链路控制 (HDLC) Keepalive),近来由于成为第 2 层(而不是第 3 层)而被视为具有正常优先级。此外,在第 3 层或者更高层运行的内部网关协议 (IGP) 已具有高于正常 IP 数据包的优先级,但与 BGP 数据包的优先级相同。因此,在 BGP 收敛期间或在 BGP 活动非常频繁期间,经常会丢弃 IGP Hello 和 Keepalive,从而造成 IGP 邻接断开。
IGP 和链路稳定性比 BGP 稳定性更差但更重要,因此现在为这些数据包指定最高优先级,并指定默认值为 10 个数据包的扩展 SPD Headroom。这意味着,如果输入保持队列的大小低于 185(输入队列默认大小 + SPD Headroom 大小 + SPD 扩展 Headroom),则不丢弃这些数据包。
扩展 SPD Headroom 可以使用 spd extended [size] 命令进行配置,其当前级别可以在 show spd 或 show ip spd 命令的输出中看到。
Router#show ip spd Current mode: normal Queue min/max thresholds: 73/74, Headroom: 100, Extended Headroom: 10 IP normal queue: 0, priority queue: 0. SPD special drop mode: none
注意:在Cisco 12000系列Internet路由器上,HDLC和PPP Keepalive数据包以及CLNS ISIS路由协议数据包被视为高优先级,并且自Cisco IOS软件版本12.0(12)S1起可能会在扩展SPD头室中入队。自Cisco IOS软件版本12.0(18)S,所有IGP数据包也可以在扩展SPD头室中入队。
在 Cisco IOS 软件版本 12.0(22)S 之前,默认值是:
输入队列大小 = 75
SPD Headroom 大小 = 100
扩展 Headroom 大小 = 10
在 Cisco IOS 软件版本 12.0(22)S 之后,默认值是:
输入队列大小 = 75
SPD Headroom 大小 = 1000
扩展 Headroom 大小 = 10
在第一种情况下,如下所示:
具有常规优先级的 IP 数据包可以排队至默认队列限制 (75)
高优先级 IP 数据包可以排队至默认队列限制 + spd_headroom(根据 Cisco IOS 软件版本为 175 或 1075)
CLNS、IGP 和 LC Keepalive 数据包可以排队至默认队列限制 + spd_headroom + spd_ext_headroom(根据 Cisco IOS 软件版本为 185 或 1085)。
下面是关于 SPD 的一些其他提示/信息:
默认情况下,SPD 状态为“on”。 它可以通过 spd enable global 命令启用/禁用。
最初,SPD 仅可用于 Packet Over Sonet (PoS) 接口。
在 Cisco IOS 软件版本 12.0(21)S 之前,在 Cisco 12000 系列 Internet 路由器上安装的千兆以太网线卡(引擎 1 和引擎 2)和快速以太网线卡上,SPD 不起作用。输入保持队列必须增加才能存储多余的数据包。
在 Cisco 7200/7500 系列路由器上,自 Cisco IOS 软件版本 12.1(1)、12.1(1)T 和 12.0(9)ST 开始,非 FIFO(先进先出)队列的 SPD 刷新(丢弃)计数器可以在 show interfaces 命令的输出中看到,并且自 12.2(7)、12.2(7)T 和 12.1(7)E 开始,FIFO 队列的该计数器也可以在该输出中看到。在其他版本和在 Cisco 12000 系列 Internet 路由器上,此计数器只能通过键入 show interface switching 命令看到。例如,show interface pos 0/1 switching 命令可用于查看 SPD 刷新、主动丢弃和优先级。
示例如下:
7500_Router#show interfaces FastEthernet0/0/0 is up, line protocol is up Hardware is cyBus FastEthernet Interface, address is 0090.9282.7000 (bia 0090) MTU 1500 bytes, BW 100000 Kbit, DLY 100 usec, rely 255/255, load 1/255 Encapsulation ARPA, loopback not set Keepalive set (10 sec) Full-duplex, 100Mb/s, 100BaseTX/FX ARP type: ARPA, ARP Timeout 04:00:00 Last input 00:00:01, output 00:00:01, output hang never Last clearing of "show interface" counters never Queueing strategy: fifo Output queue 0/40, 0 drops; input queue 0/75, 0 drops, 0 flushes 30 second input rate 4000 bits/sec, 9 packets/sec 30 second output rate 0 bits/sec, 0 packets/sec 2628397 packets input, 546327119 bytes, 0 no buffer Received 0 broadcasts, 0 runts, 0 giants, 0 throttles 0 input errors, 0 CRC, 0 frame, 0 overrun, 0 ignored 0 watchdog, 0 multicast 0 input packets with dribble condition detected 264792 packets output, 225434458 bytes, 0 underruns 0 output errors, 0 collisions, 20 interface resets 0 babbles, 0 late collision, 0 deferred 22 lost carrier, 0 no carrier 0 output buffer failures, 0 output buffers swapped out