此产品的文档集力求使用非歧视性语言。在本文档集中,非歧视性语言是指不隐含针对年龄、残障、性别、种族身份、族群身份、性取向、社会经济地位和交叉性的歧视的语言。由于产品软件的用户界面中使用的硬编码语言、基于 RFP 文档使用的语言或引用的第三方产品使用的语言,文档中可能无法确保完全使用非歧视性语言。 深入了解思科如何使用包容性语言。
思科采用人工翻译与机器翻译相结合的方式将此文档翻译成不同语言,希望全球的用户都能通过各自的语言得到支持性的内容。 请注意:即使是最好的机器翻译,其准确度也不及专业翻译人员的水平。 Cisco Systems, Inc. 对于翻译的准确性不承担任何责任,并建议您总是参考英文原始文档(已提供链接)。
本文介绍 IP 多播的常见问题和解决方案。
本文档没有任何特定的要求。
本文档不限于特定的软件和硬件版本。
当您排除组播路由故障时,主要关注点是源地址。组播具有“逆向转发” (RPF) 检查这一功能。当组播数据包到达接口时,RPF 进程会执行检查以确保此传入接口是单播路由所使用的传出接口,以便访问组播数据包的源。此 RPF 检查进程将防止出现环路。组播路由不会转发数据包,除非数据包的源通过了 RPF 检查。数据包通过此 RPF 检查后,多播路由将仅根据目标地址转发数据包。
与单播路由一样,组播路由也具有多种可用的协议,例如协议无关组播密集模式 (PIM-DM)、PIM 稀疏模式 (PIM-SM)、距离矢量组播路由协议 (DVMRP)、组播边界网关协议 (MBGP) 和组播源发现协议 (MSDP)。 本文档中的各案例研究将引导您完成针对各种问题的故障排除过程。您将了解用于快速查明问题的命令,以及用于解决问题的方法。这里列出的案例研究适用于各种协议,除非特别说明。
本节介绍如何解决常见的 IP 组播 RPF 故障问题。我们以下面的网络图为例。
在此图中,组播数据包从IP地址为1.1.1.1的服务器进入路由器75a的E0/0,并发送到组224.1.1.1。这称为(S,G)或(1.1.1, 224.1.1.1)。
直接连接到路由器 75a 的主机将接收该多播馈送,但直接连接到路由器 72a 的主机不会进行接收。首先,输入 show ip mroute 224.1.1.1 命令,以查看路由器 75a 的运行情况。该命令将检查组地址 224.1.1.1 的多播路由 (mroute):
75a#show ip mroute 224.1.1.1 IP Multicast Routing Table Flags: D - Dense, S - Sparse, C - Connected, L - Local, P - Pruned R - RP-bit set, F - Register flag, T - SPT-bit set, J - Join SPT M - MSDP created entry, X - Proxy Join Timer Running A - Advertised via MSDP Timers: Uptime/Expires Interface state: Interface, Next-Hop or VCD, State/Mode (*, 224.1.1.1), 00:01:23/00:02:59, RP 0.0.0.0, flags: D Incoming interface: Null, RPF nbr 0.0.0.0 Outgoing interface list: Ethernet0/1, Forward/Sparse-Dense, 00:01:23/00:00:00 (1.1.1.1, 224.1.1.1), 00:01:23/00:03:00, flags: TA Incoming interface: Ethernet0/0, RPF nbr 0.0.0.0 Outgoing interface list: Ethernet0/1, Forward/Sparse-Dense, 00:01:23/00:00:00
由于路由器在 PIM 密集模式(D 标志表示路由器处于密集模式)下运行,因此请忽略 *,G 条目并关注 S,G 条目。此条目告诉您,组播数据包来自地址为1.1.1.1的服务器,该服务器发送到组播组224.1.1.1。这些数据包进入Ethernet0/0接口并从Ethernet0/1接口转发出去。这是一个完美的方案。
输入 show ip pim neighbor 命令,以查看路由器 72a 是否将上游路由器 (75a) 显示为 PIM 邻居:
ip22-72a#show ip pim neighbor PIM Neighbor Table Neighbor Address Interface Uptime Expires Ver Mode 2.1.1.1 Ethernet3/1 2d00h 00:01:15 v2
show ip pim neighbor 命令输出中显示 PIM 邻居关系正常。
输入 show ip mroute 命令,以查看路由器 72a 是否具有正确的 mroute:
ip22-72a#show ip mroute 224.1.1.1 IP Multicast Routing Table Flags: D - Dense, S - Sparse, B - Bidir Group, s - SSM Group, C - Connected, L - Local, P - Pruned, R - RP-bit set, F - Register flag, T - SPT-bit set, J - Join SPT, M - MSDP created entry, X - Proxy Join Timer Running, A - Candidate for MSDP Advertisement, U - URD, I - Received Source Specific Host Report, Z - Multicast Tunnel Y - Joined MDT-data group, y - Sending to MDT-data group Outgoing interface flags: H - Hardware switched, A - Assert winner Timers: Uptime/Expires Interface state: Interface, Next-Hop or VCD, State/Mode (*, 224.1.1.1), 00:10:42/stopped, RP 0.0.0.0, flags: DC Incoming interface: Null, RPF nbr 0.0.0.0 Outgoing interface list: Ethernet3/1, Forward/Dense, 00:10:42/00:00:00 Ethernet3/2, Forward/Dense, 00:10:42/00:00:00 (1.1.1.1, 224.1.1.1), 00:01:10/00:02:48, flags: Incoming interface: Ethernet2/0, RPF nbr 0.0.0.0 Outgoing interface list: Ethernet3/1, Forward/Dense, 00:01:10/00:00:00 Ethernet3/2, Forward/Dense, 00:00:16/00:00:00 ip22-72a#
通过 show ip mroute 224.1.1.1 命令可以发现,传入接口为 Ethernet2/0 而不是预期的 Etheret3/1。
输入 show ip mroute 224.1.1.1 count 命令,以查看此组的任何组播流量是否到达路由器 72a 以及后续情况:
ip22-72a#show ip mroute 224.1.1.1 count IP Multicast Statistics 3 routes using 2032 bytes of memory 2 groups, 0.50 average sources per group Forwarding Counts: Pkt Count/Pkts per second/Avg Pkt Size/Kilobits per second Other counts: Total/RPF failed/Other drops(OIF-null, rate-limit etc) Group: 224.1.1.1, Source count: 1, Packets forwarded: 0, Packets received: 471 Source: 1.1.1.1/32, Forwarding: 0/0/0/0, Other: 471/471/0 ip22-72a#
从 Other 计数中可以看到流量由于 RPF 故障而被丢弃:total 471 drops, due to RPF failure – 471…
输入 show ip rpf <source> 命令以查看是否发生 RPF 错误:
ip22-72a#show ip rpf 1.1.1.1 RPF information for ? (1.1.1.1) RPF interface: Ethernet2/0 RPF neighbor: ? (0.0.0.0) RPF route/mask: 1.1.1.1/32 RPF type: unicast (static) RPF recursion count: 0 Doing distance-preferred lookups across tables ip22-72a#
Cisco IOS® 以这种方式计算 RPF 接口。可能的 RPF 信息来源包括单播路由表、MBGP 路由表、DVMRP 路由表和静态 Mroute 表。在计算 RPF 接口时,主要使用管理距离来确定 RPF 计算过程所依据的信息源。具体规则如下:
在所有以前的 RPF 数据源中搜索源 IP 地址的匹配项。使用共享树时,将使用 RP 地址而不是源地址。
如果找到多个匹配路由,则使用管理距离最短的路由。
如果管理距离相等,则使用以下优先顺序:
静态多播路由
DVMRP 路由
MBGP 路由
单播路由
如果某个路由在同一个路由表中有多个条目,则使用最长的匹配路由。
show ip rpf 1.1.1.1 命令输出表明 RPF 接口为 E2/0,但传入接口应该是 E3/1。
输入 show ip route 1.1.1.1 命令,以了解导致 RPF 接口未正常运行的原因。
ip22-72a#show ip route 1.1.1.1 Routing entry for 1.1.1.1/32 Known via "static", distance 1, metric 0 (connected) Routing Descriptor Blocks: * directly connected, via Ethernet2/0 Route metric is 0, traffic share count is 1
从此 show ip route 1.1.1.1 命令的输出中可以看到有一个静态 /32 路由,它导致选择了错误的接口作为 RPF 接口。
进一步输入一些调试命令:
ip22-72a#debug ip mpacket 224.1.1.1 *Jan 14 09:45:32.972: IP: s=1.1.1.1 (Ethernet3/1) d=224.1.1.1 len 60, not RPF interface *Jan 14 09:45:33.020: IP: s=1.1.1.1 (Ethernet3/1) d=224.1.1.1 len 60, not RPF interface *Jan 14 09:45:33.072: IP: s=1.1.1.1 (Ethernet3/1) d=224.1.1.1 len 60, not RPF interface *Jan 14 09:45:33.120: IP: s=1.1.1.1 (Ethernet3/1) d=224.1.1.1 len 60, not RPF interface
数据包在 E3/1 上传入,这是正确的。但是,这些数据包将被丢弃,因为这不是单播路由表用于执行 RPF 检查的接口。
注意:调试数据包具有一定危险。数据包调试操作将触发组播数据包的进程交换,这会占用大量 CPU 资源。此外,数据包调试还会产生大量输出,由于向控制台端口输出过慢,从而可能导致将路由器完全挂起。要特别注意,必须在调试数据包前禁止将日志记录输出到控制台,并允将许日志记录转到内存缓冲区。为此,需配置 no logging console 和 logging buffered debugging。可以使用 show logging 命令查看调试结果。
您可以更改单播路由表以满足此要求,也可以添加静态 mroute 以强制组播从特定接口进行 RPF,而不用管单播路由表状态如何。添加静态多播路由:
ip22-72a(config)#ip mroute 1.1.1.1 255.255.255.255 2.1.1.1
此静态 mroute 声明,要到达 RPF 的地址 1.1.1.1,请使用 2.1.1.1 作为下一跳(即从接口 E3/1 传出)。
ip22-72a#show ip rpf 1.1.1.1 RPF information for ? (1.1.1.1) RPF interface: Ethernet3/1 RPF neighbor: ? (2.1.1.1) RPF route/mask: 1.1.1.1/32 RPF type: static mroute RPF recursion count: 0 Doing distance-preferred lookups across tables
show ip mroute 和 debug ip mpacket 的输出正常,show ip mroute count 中发送的数据包数量增加,并且主机 A 接收数据包。
ip22-72a#show ip mroute 224.1.1.1 IP Multicast Routing Table Flags: D - Dense, S - Sparse, C - Connected, L - Local, P - Pruned R - RP-bit set, F - Register flag, T - SPT-bit set, J - Join SPT M - MSDP created entry, X - Proxy Join Timer Running A - Advertised via MSDP Timers: Uptime/Expires Interface state: Interface, Next-Hop or VCD, State/Mode (*, 224.1.1.1), 00:01:15/00:02:59, RP 0.0.0.0, flags: DJC Incoming interface: Null, RPF nbr 0.0.0.0 Outgoing interface list: Ethernet3/1, Forward/Sparse-Dense, 00:01:15/00:00:00 Ethernet3/2, Forward/Sparse-Dense, 00:00:58/00:00:00 (1.1.1.1, 224.1.1.1), 00:00:48/00:02:59, flags: CTA Incoming interface: Ethernet3/1, RPF nbr 2.1.1.1, Mroute Outgoing interface list: Ethernet3/2, Forward/Sparse-Dense, 00:00:48/00:00:00 ip22-72a#show ip mroute 224.1.1.1 count IP Multicast Statistics 3 routes using 2378 bytes of memory 2 groups, 0.50 average sources per group Forwarding Counts: Pkt Count/Pkts per second/Avg Pkt Size/Kilobits per second Other counts: Total/RPF failed/Other drops(OIF-null, rate-limit etc) Group: 224.1.1.1, Source count: 1, Packets forwarded: 1019, Packets received: 1019 Source: 1.1.1.1/32, Forwarding: 1019/1/100/0, Other: 1019/0/0 ip22-72a#show ip mroute 224.1.1.1 count IP Multicast Statistics 3 routes using 2378 bytes of memory 2 groups, 0.50 average sources per group Forwarding Counts: Pkt Count/Pkts per second/Avg Pkt Size/Kilobits per second Other counts: Total/RPF failed/Other drops(OIF-null, rate-limit etc) Group: 224.1.1.1, Source count: 1, Packets forwarded: 1026, Packets received: 1026 Source: 1.1.1.1/32, Forwarding: 1026/1/100/0, Other: 1026/0/0 ip22-72a# ip22-72a#debug ip mpacket 224.1.1.1 *Jan 14 10:18:29.951: IP: s=1.1.1.1 (Ethernet3/1) d=224.1.1.1 (Ethernet3/2) len 60, mforward *Jan 14 10:18:29.999: IP: s=1.1.1.1 (Ethernet3/1) d=224.1.1.1 (Ethernet3/2) len 60, mforward *Jan 14 10:18:30.051: IP: s=1.1.1.1 (Ethernet3/1) d=224.1.1.1 (Ethernet3/2) len 60, mforward
本节介绍如何解决因生存时间 (TTL) 值递减为零而无法转发 IP 组播数据包这一常见问题。由于多播应用的情况较多,因此这个问题很常见。这些组播应用主要针对LAN使用而设计,因此将TTL设置为低值甚至1。以此网络图为例。。
在上图中,路由器 A 不会将数据包从源转发到路由器 B 的直连接收器。查看路由器 A 上的 show ip mroute 命令的输出,以查看组播路由状态:
ROUTERA#show ip mroute IP Multicast Routing Table Flags: D - Dense, S - Sparse, C - Connected, L - Local, P - Pruned R - RP-bit set, F - Register flag, T - SPT-bit set, J - Join SPT M - MSDP created entry, X - Proxy Join Timer Running A - Advertised via MSDP Timers: Uptime/Expires Interface state: Interface, Next-Hop or VCD, State/Mode (*, 224.0.1.40), 00:00:01/00:00:00, RP 0.0.0.0, flags: DJCL Incoming interface: Null, RPF nbr 0.0.0.0 Outgoing interface list: Ethernet0/1, Forward/Sparse-Dense, 00:00:01/00:00:00 (*, 224.1.1.1), 00:00:02/00:02:57, RP 0.0.0.0, flags: D Incoming interface: Null, RPF nbr 0.0.0.0 Outgoing interface list: Ethernet0/1, Forward/Sparse-Dense, 00:00:02/00:00:00
可以忽略输出中的 224.0.1.40,因为所有路由器都加入此 Auto-RP 发现组。但224.1.1.1没有列出源。除“*”、“224.1.1.1”外,您还应看到“1.1.1.1、224.1.1.1”。
输入 show ip rpf 命令以查看这是否是 RPF 问题:
ROUTERA#show ip rpf 1.1.1.1 RPF information for ? (1.1.1.1) RPF interface: Ethernet0/0 RPF neighbor: ? (0.0.0.0) - directly connected RPF route/mask: 1.1.1.0/24 RPF type: unicast (connected) RPF recursion count: 0 Doing distance-preferred lookups across tables
从输出中,可以看到这不是 RPF 问题。RPF 检查正确表明 E0/0 对应于源 IP 地址。
使用 show ip pim interface 命令检查接口上是否配置了 PIM:
ROUTERA#show ip pim interface Address Interface Version/Mode Nbr Query DR Count Intvl 1.1.1.2 Ethernet0/0 v2/Sparse-Dense 0 30 1.1.1.2 2.1.1.1 Ethernet0/1 v2/Sparse-Dense 2 30 2.1.1.2
输出一切正常,因此这不是问题所在。使用 show ip mroute active 命令检查路由器是否可识别任何活动流量:
ROUTERA#show ip mroute active Active IP Multicast Sources - sending >= 4 kbps
输出内容表明,路由器无法识别任何活动流量。
ROUTERA#debug ip mpacket IP multicast packets debugging is on
也许接收方未发送组224.1.1.1的任何互联网组管理协议(IGMP)报告(加入)。您可以使用show ip igmp group命令:
ROUTERB#show ip igmp group IGMP Connected Group Membership Group Address Interface Uptime Expires Last Reporter 224.0.1.40 Ethernet1/1 00:34:34 never 2.1.1.2 224.1.1.1 Ethernet1/2 00:30:02 00:02:45 3.1.1.2
224.1.1.1 已在 E1/2 加入,这是正确的。
PIM 密集模式是一个泛洪和修剪协议,因此没有加入,但是有嫁接。由于路由器 B 未从路由器 A 接收到泛洪,因此它并不知道向何处发送嫁接。
您可以使用嗅探器捕捉和 show ip traffic 命令进行检查以查看是否是 TTL 问题:
ROUTERA#show ip traffic IP statistics: Rcvd: 248756 total, 1185 local destination 0 format errors, 0 checksum errors, 63744 bad hop count 0 unknown protocol, 0 not a gateway 0 security failures, 0 bad options, 0 with options
输出中显示了 63744 次不良跳数。每次键入此命令时,坏跳计数都将增加。这明确表示,发送方在 TTL 为 1(路由器 A 将其递减为零)的情况下发送数据包。这导致坏跳计数字段不断增加。
要解决此问题,您需要增大 TTL。这要在发送方的应用级别进行设置。有关详细信息,请参阅您的多播应用说明手册。
完成设置后,路由器 A 将如下所示:
ROUTERA#show ip mroute IP Multicast Routing Table Flags: D - Dense, S - Sparse, C - Connected, L - Local, P - Pruned R - RP-bit set, F - Register flag, T - SPT-bit set, J - Join SPT M - MSDP created entry, X - Proxy Join Timer Running A - Advertised via MSDP Timers: Uptime/Expires Interface state: Interface, Next-Hop or VCD, State/Mode (*, 224.0.1.40), 01:16:32/00:00:00, RP 0.0.0.0, flags: DJCL Incoming interface: Null, RPF nbr 0.0.0.0 Outgoing interface list: Ethernet0/1, Forward/Sparse-Dense, 01:16:32/00:00:00 (*, 224.1.1.1), 00:28:42/00:02:59, RP 0.0.0.0, flags: D Incoming interface: Null, RPF nbr 0.0.0.0 Outgoing interface list: Ethernet0/1, Forward/Sparse-Dense, 00:28:42/00:00:00 (1.1.1.1, 224.1.1.1), 00:19:24/00:02:59, flags: TA Incoming interface: Ethernet0/0, RPF nbr 0.0.0.0 Outgoing interface list: Ethernet0/1, Forward/Sparse-Dense, 00:19:24/00:00:00
这是您希望的输出。
在路由器 B 上,您会看到:
ROUTERB#show ip mroute IP Multicast Routing Table Flags: D - Dense, S - Sparse, C - Connected, L - Local, P - Pruned R - RP-bit set, F - Register flag, T - SPT-bit set, J - Join SPT M - MSDP created entry, X - Proxy Join Timer Running A - Advertised via MSDP Timers: Uptime/Expires Interface state: Interface, Next-Hop or VCD, State/Mode (*, 224.0.1.40), 01:23:57/00:00:00, RP 0.0.0.0, flags: DJCL Incoming interface: Null, RPF nbr 0.0.0.0 Outgoing interface list: Ethernet1/1, Forward/Sparse-Dense, 01:23:57/00:00:00 (*, 224.1.1.1), 01:19:26/00:02:59, RP 0.0.0.0, flags: DJC Incoming interface: Null, RPF nbr 0.0.0.0 Outgoing interface list: Ethernet1/1, Forward/Sparse-Dense, 01:19:26/00:00:00 Ethernet1/2, Forward/Sparse-Dense, 01:19:26/00:00:00 (1.1.1.1, 224.1.1.1), 00:17:46/00:02:59, flags: CTA Incoming interface: Ethernet1/1, RPF nbr 2.1.1.1 Outgoing interface list: Ethernet1/2, Forward/Sparse-Dense, 00:17:46/00:00:00
本节介绍如何解决因 TTL 阈值设得过低而使 IP 组播流量无法到达接收方这一常见问题。我们以下面的网络图为例。
在上图中,接收方无法接收来自源的组播数据包。源和路由器 75a 之间可能有多个路由器。首先查看路由器 75a,因为它直接连接到接收方。
ip22-75a#show ip mroute 224.1.1.1 IP Multicast Routing Table Flags: D - Dense, S - Sparse, C - Connected, L - Local, P - Pruned R - RP-bit set, F - Register flag, T - SPT-bit set, J - Join SPT M - MSDP created entry, X - Proxy Join Timer Running A - Advertised via MSDP Timers: Uptime/Expires Interface state: Interface, Next-Hop or VCD, State/Mode (*, 224.1.1.1), 00:32:05/00:02:59, RP 0.0.0.0, flags: DJC Incoming interface: Null, RPF nbr 0.0.0.0 Outgoing interface list: Ethernet0/1, Forward/Sparse-Dense, 00:08:17/00:00:00 (1.1.1.1, 224.1.1.1), 00:01:02/00:01:57, flags: CTA Incoming interface: Ethernet0/0, RPF nbr 0.0.0.0 Outgoing interface list: Ethernet0/1, Forward/Sparse-Dense, 00:01:02/00:00:00
输出显示路由器75a将数据包从以太网接口0/1转发出去。为了确保路由器75a转发数据包,请仅为此源组和组播组打开debug:
ip22-75a#configure terminal Enter configuration commands, one per line. End with CNTL/Z. ip22-75a(config)#access-list 101 permit udp host 1.1.1.1 host 224.1.1.1 ip22-75a(config)#end ip22-75a#debug ip mpacket 101 IP multicast packets debugging is on for access list 101 ip22-75a# *Jan 17 09:04:08.714: IP: s=1.1.1.1 (Ethernet0/0) d=224.1.1.1 len 60, threshold denied *Jan 17 09:04:08.762: IP: s=1.1.1.1 (Ethernet0/0) d=224.1.1.1 len 60, threshold denied *Jan 17 09:04:08.814: IP: s=1.1.1.1 (Ethernet0/0) d=224.1.1.1 len 60, threshold denied
调试消息表明,路由器 75a 不会转发组播数据包,因为已达到 TTL 阈值。查看路由器配置,看看是否可以找到原因。下面的输出表明了问题所在:
interface Ethernet0/1 ip address 2.1.1.1 255.255.255.0 ip pim sparse-dense-mode ip multicast ttl-threshold 15
路由器的 TTL 阈值为 15,但这并不意味着任何大于 15 的 TTL 都不会予以发送。事实恰恰相反。应用程序以TTL 15发送。到到达路由器75a时,组播数据包的TTL小于15。
ip multicast ttl-threshold <value> 命令意味着 TTL 低于指定阈值(本例中为 15)的任何数据包都不会进行转发。此命令通常用于提供边界,以防止内部组播流量从内联网流出。
使用此命令的 no 形式删除 ip multicast ttl-threshold <value> 命令(将恢复为默认 TTL 阈值 0),或者降低 TTL 阈值以便流量可以通过。
本节介绍组播源的等价路径如何导致意外 RPF 行为。此外,还介绍如何配置 IP 组播以避免此行为。我们以下面的网络图为例。
在此图中,路由器 75b 有三个等价路径返回到源 (1.1.1.1),并且它选择作为 RPF 链路的链路并非您预期的首选链路。
当面对指向源的多个等价路径时,IP 多播会选择其独立多播协议 (PIM) 邻居具有最高 IP 地址的接口作为传入接口,然后将修剪发送给其他链路上的 PIM 邻居。
要更改 IP 组播选为其传入接口的接口,可采取以下任一项操作:
只在希望多播流经的接口上配置 PIM,这意味着要牺牲多播冗余。
更改子网,以使最高 IP 地址位于您希望作为多播主链路的链路上。
创建一个指出首选组播接口的静态组播路由 (mroute),这意味着您将失去组播冗余。
为举例说明,我们将创建一个静态多播路由。
在安装静态mroute之前,您会在此输出中看到,路由表有三条等价路由用于源地址1.1.1.1。RPF信息表示RPF接口为E1/3:
ip22-75b#show ip route 1.1.1.1 Routing entry for 1.1.1.0/24 Known via "ospf 1", distance 110, metric 20, type intra area Redistributing via ospf 1 Last update from 3.1.1.1 on Ethernet1/2, 00:26:21 ago Routing Descriptor Blocks: * 4.1.1.1, from 10.0.119.66, 00:26:21 ago, via Ethernet1/3 Route metric is 20, traffic share count is 1 2.1.1.1, from 10.0.119.66, 00:26:21 ago, via Ethernet1/1 Route metric is 20, traffic share count is 1 3.1.1.1, from 10.0.119.66, 00:26:21 ago, via Ethernet1/2 Route metric is 20, traffic share count is 1 ip22-75b#show ip rpf 1.1.1.1 RPF information for ? (1.1.1.1) RPF interface: Ethernet1/3 RPF neighbor: ? (4.1.1.1) RPF route/mask: 1.1.1.0/24 RPF type: unicast (ospf 1) RPF recursion count: 0 Doing distance-preferred lookups across tables ip22-75b#show ip mroute 224.1.1.1 IP Multicast Routing Table Flags: D - Dense, S - Sparse, C - Connected, L - Local, P - Pruned R - RP-bit set, F - Register flag, T - SPT-bit set, J - Join SPT M - MSDP created entry, X - Proxy Join Timer Running A - Advertised via MSDP Timers: Uptime/Expires Interface state: Interface, Next-Hop or VCD, State/Mode (*, 224.1.1.1), 01:30:34/00:02:59, RP 0.0.0.0, flags: DJC Incoming interface: Null, RPF nbr 0.0.0.0 Outgoing interface list: Ethernet1/4, Forward/Sparse-Dense, 01:30:34/00:00:00 Ethernet1/1, Forward/Sparse-Dense, 01:30:35/00:00:00 Ethernet1/2, Forward/Sparse-Dense, 01:30:35/00:00:00 Ethernet1/3, Forward/Sparse-Dense, 00:24:22/00:00:00 (1.1.1.1, 224.1.1.1), 01:30:35/00:02:59, flags: CT Incoming interface: Ethernet1/3, RPF nbr 4.1.1.1 Outgoing interface list: Ethernet1/1, Prune/Sparse-Dense, 01:30:35/00:02:32 Ethernet1/4, Forward/Sparse-Dense, 01:30:35/00:00:00 Ethernet1/2, Prune/Sparse-Dense, 00:24:22/00:02:42
配置静态 mroute 后,此输出中显示,RPF 接口已更改为 E1/1:
ip22-75b#configure terminal Enter configuration commands, one per line. End with CNTL/Z. ip22-75b(config)#ip mroute 0.0.0.0 0.0.0.0 2.1.1.1 ip22-75b(config)#end ip22-75b#show ip rpf 1.1.1.1 RPF information for ? (1.1.1.1) RPF interface: Ethernet1/1 RPF neighbor: ? (2.1.1.1) RPF route/mask: 1.1.1.1/0 RPF type: static mroute RPF recursion count: 0 Doing distance-preferred lookups across tables ip22-75b#show ip route 1.1.1.1 Routing entry for 1.1.1.0/24 Known via "ospf 1", distance 110, metric 20, type intra area Redistributing via ospf 1 Last update from 3.1.1.1 on Ethernet1/2, 00:26:21 ago Routing Descriptor Blocks: * 4.1.1.1, from 10.0.119.66, 00:26:21 ago, via Ethernet1/3 Route metric is 20, traffic share count is 1 2.1.1.1, from 10.0.119.66, 00:26:21 ago, via Ethernet1/1 Route metric is 20, traffic share count is 1 3.1.1.1, from 10.0.119.66, 00:26:21 ago, via Ethernet1/2 Route metric is 20, traffic share count is 1 ip22-75b#show ip mroute 224.1.1.1 IP Multicast Routing Table Flags: D - Dense, S - Sparse, C - Connected, L - Local, P - Pruned R - RP-bit set, F - Register flag, T - SPT-bit set, J - Join SPT M - MSDP created entry, X - Proxy Join Timer Running A - Advertised via MSDP Timers: Uptime/Expires Interface state: Interface, Next-Hop or VCD, State/Mode (*, 224.1.1.1), 01:31:29/00:02:59, RP 0.0.0.0, flags: DJC Incoming interface: Null, RPF nbr 0.0.0.0 Outgoing interface list: Ethernet1/4, Forward/Sparse-Dense, 01:31:29/00:00:00 Ethernet1/1, Forward/Sparse-Dense, 01:31:30/00:00:00 Ethernet1/2, Forward/Sparse-Dense, 01:31:30/00:00:00 Ethernet1/3, Forward/Sparse-Dense, 00:25:17/00:00:00 (1.1.1.1, 224.1.1.1), 01:31:30/00:02:59, flags: CT Incoming interface: Ethernet1/1, RPF nbr 2.1.1.1, Mroute Outgoing interface list: Ethernet1/4, Forward/Sparse-Dense, 01:31:30/00:00:00 Ethernet1/2, Prune/Sparse-Dense, 00:25:17/00:01:47 Ethernet1/3, Prune/Sparse-Dense, 00:00:31/00:02:28
本节提供一个解决方案,解决有关如何配置 IP 组播以在所有可用等价路径上实现负载均衡这一常见问题。我们以下面的网络图为例。
注意:在通过隧道在等价路径上加载拆分的 IP 组播流量之前,请配置 CEF 每数据包负载平衡,否则 GRE 数据包将不会按数据包进行负载平衡。有关在组播环境中执行负载分流的其他方法,请参阅通过 ECMP 拆分 IP 组播流量。
在此图中,路由器 75b 有三条返回到源 (1.1.1.1) 的等价路径。 您希望在全部三条链路上均衡多播流量。
如多条等价路径导致意外 RPF 行为一节中所述,协议无关组播 (PIM) 仅会选择一个接口用于进行 RPF 检查,并删除其他接口。这意味着不会进行负载均衡。要进行负载均衡,需要从冗余链路中删除 PIM 并在路由器 75a 与路由器 75b 之间创建一条隧道。然后您可以在链路级别进行负载均衡,并且 IP 将通过隧道运行。
下面是隧道的配置。
路由器 75a |
---|
interface Tunnel0 ip address 6.1.1.1 255.255.255.0 ip pim sparse-dense-mode tunnel source Ethernet0/0 tunnel destination 5.1.1.1 ! interface Ethernet0/0 ip address 1.1.1.2 255.255.255.0 ip pim sparse-dense-mode ! interface Ethernet0/1 ip address 2.1.1.1 255.255.255.0 ! interface Ethernet0/2 ip address 3.1.1.1 255.255.255.0 ! interface Ethernet0/3 ip address 4.1.1.1 255.255.255.0 |
路由器 75b |
---|
interface Tunnel0 ip address 6.1.1.2 255.255.255.0 ip pim sparse-dense-mode tunnel source Ethernet1/4 tunnel destination 1.1.1.2 ! interface Ethernet1/1 ip address 2.1.1.2 255.255.255.0 ! interface Ethernet1/2 ip address 3.1.1.2 255.255.255.0 ! interface Ethernet1/3 ip address 4.1.1.2 255.255.255.0 ! interface Ethernet1/4 ip address 5.1.1.1 255.255.255.0 ip pim sparse-dense-mode ! ip mroute 0.0.0.0 0.0.0.0 Tunnel0 |
配置隧道后,输入 show ip mroute 命令以查看组的组播路由 (mroute):
ip22-75a#show ip mroute 224.1.1.1 IP Multicast Routing Table Flags: D - Dense, S - Sparse, C - Connected, L - Local, P - Pruned R - RP-bit set, F - Register flag, T - SPT-bit set, J - Join SPT M - MSDP created entry, X - Proxy Join Timer Running A - Advertised via MSDP Timers: Uptime/Expires Interface state: Interface, Next-Hop or VCD, State/Mode (*, 224.1.1.1), 02:40:31/00:02:59, RP 0.0.0.0, flags: D Incoming interface: Null, RPF nbr 0.0.0.0 Outgoing interface list: Tunnel0, Forward/Sparse-Dense, 00:20:55/00:00:00 (1.1.1.1, 224.1.1.1), 02:40:32/00:03:29, flags: TA Incoming interface: Ethernet0/0, RPF nbr 0.0.0.0 Outgoing interface list: Tunnel0, Forward/Sparse-Dense, 00:20:55/00:00:00 ip22-75b#show ip mroute 224.1.1.1 IP Multicast Routing Table Flags: D - Dense, S - Sparse, C - Connected, L - Local, P - Pruned R - RP-bit set, F - Register flag, T - SPT-bit set, J - Join SPT M - MSDP created entry, X - Proxy Join Timer Running A - Advertised via MSDP Timers: Uptime/Expires Interface state: Interface, Next-Hop or VCD, State/Mode (*, 224.1.1.1), 02:42:20/00:02:59, RP 0.0.0.0, flags: DJC Incoming interface: Null, RPF nbr 0.0.0.0 Outgoing interface list: Tunnel0, Forward/Sparse-Dense, 00:22:53/00:00:00 Ethernet1/4, Forward/Sparse-Dense, 02:42:20/00:00:00 (1.1.1.1, 224.1.1.1), 00:22:53/00:02:59, flags: CT Incoming interface: Tunnel0, RPF nbr 6.1.1.1, Mroute Outgoing interface list: Ethernet1/4, Forward/Sparse-Dense, 00:22:53/00:00:00
为了检查组播数据是否在三条链路上均等地平衡负载,请查看路由器 75a 的接口数据。
传入接口为 9000 位/秒:
ip22-75a#show interface e0/0 . . 5 minute input rate 9000 bits/sec, 20 packets/sec
三个传出接口每个均显示 3000 位/秒:
ip22-75a#show interface e0/1 . . 5 minute output rate 3000 bits/sec, 7 packets/sec ip22-75a#show interface e0/2 . . 5 minute output rate 3000 bits/sec, 7 packets/sec ip22-75a#show interface e0/3 . . 5 minute output rate 3000 bits/sec, 7 packets/sec
此部分为常见的 IP 多播“INVALID_RP_JOIN”错误消息提供了一个解决方案。
在交汇点 (RP) 上收到此错误消息:
00:55:15: %PIM-6-INVALID_RP_JOIN: Received (*, 224.1.1.1) Join from 1.1.6.2 for invalid RP 1.1.5.4 00:56:15: %PIM-6-INVALID_RP_JOIN: Received (*, 224.1.1.1) Join from 1.1.6.2 for invalid RP 1.1.5.4
Cisco IOS Software System Error Messages(Cisco IOS 软件系统错误消息)解释了此错误的原因:一个下游 PIM 路由器发出加入共享树的消息,但此路由器并不希望接受。这一行为表明此路由器只允许下游路由器加入特定 RP。
这里可能存在某种过滤。您需要查看一下路由器的配置:
interface Ethernet0/0 ip address 1.1.5.4 255.255.255.0 ip pim sparse-dense-mode ! ip pim accept-rp 10.2.2.2 8 ip pim send-rp-announce Ethernet0/0 scope 15 ip pim send-rp-discovery scope 15 ! access-list 8 permit 224.0.0.0 0.255.255.255
那么配置中的 accept-rp 语句的用途是什么呢?在 IP Multicast Routing Commands(IP 多播路由命令)中,该文档说明“要配置路由器以接受指定 RP 和特定组列表的‘加入’或‘修剪’设置,可以使用 ip pim accept-rp 全局配置命令。要删除这项检查,可使用此命令的 no 格式。”
如果删除 ip pim accept-rp 命令,就会出现错误消息。已找到了导致问题的命令,但是如果要在配置中保留该命令,该怎么办?您可能允许了错误的 RP 地址。输入 show ip pim rp mapping 命令以查看正确的 RP 地址:
ip22-75a#show ip pim rp mapping PIM Group-to-RP Mappings This system is an RP (Auto-RP) This system is an RP-mapping agent Group(s) 224.0.0.0/4 RP 1.1.5.4 (?), v2v1 Info source: 1.1.5.4 (?), via Auto-RP Uptime: 01:00:48, expires: 00:02:07
根据输出内容,1.1.5.4 是通过 Auto-RP 或其他方式获知的唯一 RP。但是,此路由器仅是组224.0.0.0/4的RP。因此,配置中的pim accept-rp语句错误。
解决方案是纠正 ip pim accept-rp 语句中的 IP 地址,如下所示:
将此语句:
ip pim accept-rp 10.2.2.2 8
执行此更改:
ip pim accept-rp 1.1.5.4 8
您还可以更改语句以接受 auto-rp 缓存中的内容,并确保访问列表(在本示例中为 8)允许必要的组播组范围。示例如下:
ip pim accept-rp auto-rp access-list 8 permit 224.0.0.0 0.255.255.255
此错误消息出现在 router2 上。
router2# *Aug 12 15:18:17.891: %PIM-6-INVALID_RP_JOIN: Received (*, 224.0.1.40) Join from 0.0.0.0 for invalid RP 2.1.1.1
检查以确认 router2 是否是组 224.1.1.1 的 RP:
router2#show ip pim rp map PIM Group-to-RP Mappings Group(s) 224.0.0.0/4 RP 1.1.1.1 (?), v2v1 Info source: 1.1.1.1 (?), elected via Auto-RP Uptime: 00:21:26, expires: 00:02:24 router2#
224.1.1.1 的 RP 是 1.1.1.1。
检查它是否是 router2 的其中一个接口:
router2#show ip interface brief Interface IP-Address OK? Method Status Protocol Ethernet0/0 1.1.1.2 YES NVRAM up up Ethernet1/0 2.1.1.1 YES NVRAM up up Ethernet2/0 unassigned YES NVRAM administratively down down router2#
由于 router2 不是 RP,因此不应收到此 RP-Join 数据包。检查下游路由器为什么将“加入”发送给 router2,本来不应如此:
router3#show ip pim rp map PIM Group-to-RP Mappings Group(s) 224.0.0.0/4 RP 1.1.1.1 (?), v2v1 Info source: 1.1.1.1 (?), elected via Auto-RP Uptime: 00:24:30, expires: 00:02:16 Group(s): 224.0.0.0/4, Static-Override RP: 2.1.1.1 (?) router3#
可以看见,路由器 3 已静态配置了 RP 信息并指向路由器 2,这是不正确的。这解释了路由器 3 将 RP-Join 发送到路由器 2 的原因。
将 router2 作为组 224.1.1.1 的 RP,或者更改 router3 的设置使其引用正确的 RP 地址。
router3#show run | i rp ip pim rp-address 2.1.1.1 override router3#configure terminal Enter configuration commands, one per line. End with CNTL/Z. router3(config)#no ip pim rp-address 2.1.1.1 override router3(config)#exit router3#
更正 router3 的配置后,router3 将引用正确的 RP 地址,这时便会停止显示错误消息。
router3#show ip pim rp map PIM Group-to-RP Mappings Group(s) 224.0.0.0/4 RP 1.1.1.1 (?), v2v1 Info source: 1.1.1.1 (?), elected via Auto-RP Uptime: 00:30:45, expires: 00:02:02 router3#
本节介绍当未在特定子网上的所有路由器上启用思科组管理协议 (CGMP) 时出现的意外组播数据包泛洪,以及如何避免此问题。我们以下面的网络图为例。
在此图中,Catalyst 5000 交换机 A 中的静态 CAM 表未显示任何已填充的正确端口。配置了 CGMP 的路由器未发送 CGMP 数据包。
Switch A 上的 set cgmp enable 命令和路由器 75a 的 E0/2 接口上的 ip cgmp 命令已经正确配置了 CGMP。然而,当发出 show multicast group 命令时,在 Switch A 上看不到多播组。
Console> (enable) show multicast group CGMP enabled IGMP disabled IGMP fastleave disabled GMRP disabled VLAN Dest MAC/Route Des [CoS] Destination Ports or VCs / [Protocol Type] ---- ------------------ ----- ------------------------------------------- Total Number of Entries = 0
此命令的输出应当显示其中具有配置了 CGMP 的路由器的每个端口(端口 2/3)以及其中具有意向接收方的每个端口(端口 2/6)。 由于列出了 0,因此不管希望与否,多播流量都可能会不必要地泛洪到所有端口。
检查路由器 75a 上是否有任何独立多播协议 (PIM) 邻居:
ip22-75a#show ip pim neighbor PIM Neighbor Table Neighbor Address Interface Uptime Expires Ver Mode 2.1.1.1 Ethernet0/2 00:07:41 00:01:34 v2
此输出内容显示,路由器 75a 能够将路由器 75b 视为通过交换机 A 的有效 PIM 邻居。
现在检查是否在路由器上收到正确的组播路由 (mroute) 信息:
ip22-75a#show ip mroute 224.1.1.1 IP Multicast Routing Table Flags: D - Dense, S - Sparse, C - Connected, L - Local, P - Pruned R - RP-bit set, F - Register flag, T - SPT-bit set, J - Join SPT M - MSDP created entry, X - Proxy Join Timer Running A - Advertised via MSDP Timers: Uptime/Expires Interface state: Interface, Next-Hop or VCD, State/Mode (*, 224.1.1.1), 00:14:55/00:02:59, RP 0.0.0.0, flags: DJC Incoming interface: Null, RPF nbr 0.0.0.0 Outgoing interface list: Ethernet0/2, Forward/Sparse-Dense, 00:14:55/00:00:00 (1.1.1.1, 224.1.1.1), 00:14:56/00:02:59, flags: CTA Incoming interface: Ethernet0/1, RPF nbr 0.0.0.0 Outgoing interface list: Ethernet0/2, Forward/Sparse-Dense, 00:14:56/00:00:00
输出显示,路由器 75a 将组播数据包从 E0/2 转发到交换机 A。此输出显示,路由器 75b 正确获取并转发组播数据包:
ip22-75b#show ip mroute 224.1.1.1 IP Multicast Routing Table Flags: D - Dense, S - Sparse, C - Connected, L - Local, P - Pruned R - RP-bit set, F - Register flag, T - SPT-bit set, J - Join SPT M - MSDP created entry, X - Proxy Join Timer Running A - Advertised via MSDP Timers: Uptime/Expires Interface state: Interface, Next-Hop or VCD, State/Mode (*, 224.1.1.1), 00:17:57/00:02:59, RP 0.0.0.0, flags: DJC Incoming interface: Null, RPF nbr 0.0.0.0 Outgoing interface list: Ethernet1/3, Forward/Sparse-Dense, 00:17:57/00:00:00 Ethernet1/4, Forward/Sparse-Dense, 00:17:57/00:00:00 (1.1.1.1, 224.1.1.1), 00:00:35/00:02:59, flags: CTA Incoming interface: Ethernet1/3, RPF nbr 2.1.1.2 Outgoing interface list: Ethernet1/4, Forward/Sparse-Dense, 00:00:35/00:00:00
从交换机 A 的角度,您会看到它认为路由器 75a 已离开端口 2/3。
Console> (enable) show multicast router CGMP enabled IGMP disabled IGMP fastleave disabled Port Vlan --------- ---------------- 2/3 6 Total Number of Entries = 1
到目前为止一切正常。在路由器 75a 上输入一些调试命令,看看能有什么发现:
ip22-75a#debug ip cgmp CGMP debugging is on *Feb 8 12:45:22.206: CGMP: Sending self Join on Ethernet0/2 *Feb 8 12:45:22.206: GDA 0000.0000.0000, USA 00d0.ff2f.a002 *Feb 8 12:46:22.234: CGMP: Sending self Join on Ethernet0/2 *Feb 8 12:46:22.234: GDA 0000.0000.0000, USA 00d0.ff2f.a002 *Feb 8 12:47:22.262: CGMP: Sending self Join on Ethernet0/2 *Feb 8 12:47:22.262: GDA 0000.0000.0000, USA 00d0.ff2f.a002
在输出中,0000.0000.0000 是全组地址,在路由器发送 CGMP 加入/离开消息时使用,以便交换机可以填充路由器端口。GDA 代表介质访问控制 (MAC) 级别格式的组目的地址。USA 代表单播源地址。这是与所生成的此 CGMP 消息对应的,生成 IGMP 报告的主机的地址。在本例中,它是路由器75a接口E0/2的MAC地址。使用show interface命令可以看到路由器75a E0/2的MAC地址,如下所示:
ip22-75a#show interface e0/2 Ethernet0/2 is up, line protocol is up Hardware is cxBus Ethernet, address is 00d0.ff2f.a002 (bia 00d0.ff2f.a002)
此外,在打开 debug ip igmp 命令后,您可能会定期看到此消息:
*Feb 8 12:51:41.854: IGMP: Received v2 Report from 2.1.1.3 (Ethernet0/2) for 224.1.1.1
然而,随后不会看到来自路由器 75a 的对应 CGMP 数据包。这意味着路由器 75a 会接收 IGMP 报告,但不会生成必要的 CGMP 数据包(用以帮助交换机 A 获知要阻止的端口)。如果路由器 75a 是 IGMP 查询方,则这是所期望的。路由器 75a 的此输出告诉我们为什么没有发生预期行为:
ip22-75a#show ip igmp interface e0/2 Ethernet0/2 is up, line protocol is up Internet address is 2.1.1.2/24 IGMP is enabled on interface Current IGMP version is 2 CGMP is enabled IGMP query interval is 60 seconds IGMP querier timeout is 120 seconds IGMP max query response time is 10 seconds Last member query response interval is 1000 ms Inbound IGMP access group is not set IGMP activity: 3 joins, 1 leaves Multicast routing is enabled on interface Multicast TTL threshold is 0 Multicast designated router (DR) is 2.1.1.2 (this system) IGMP querying router is 2.1.1.1 No multicast groups joined
如果同一子网中有两个路由器,并且您将它们都配置为 CGMP,则只有一个路由器会发送 CGMP 数据包。发送 CGMP 数据包的路由器是 IGMP 查询路由器。这意味着该路由器是启用了 IGMP 的路由器中具有最低单播 IP 地址的路由器。
在本例中,路由器 75a 和路由器 75b 都启用了 IGMP(路由器 75b 成为 IGMP 查询路由器),但是只有路由器 75a 启用了 CGMP。由于路由器 75a 不是 IGMP 查询路由器,因此不会发送 CGMP 数据包。
为了解决此问题,您需要在 IGMP 查询路由器上配置 CGMP。本例中是路由器 75b。首先,对路由器 75b 执行 debug 命令:
ip22-75b#conf t Enter configuration commands, one per line. End with CNTL/Z. ip22-75b(config)#int e 1/3 ip22-75b(config-if)#ip cgmp ip22-75b(config-if)#end ip22-75b#debug ip cgmp ip22-75b#debug ip igmp *Feb 8 12:58:42.422: IGMP: Received v2 Report from 2.1.1.3 (Ethernet1/3) for 224.1.1.1 *Feb 8 12:58:42.422: CGMP: Received IGMP Report on Ethernet1/3 *Feb 8 12:58:42.422: from 2.1.1.3 for 224.1.1.1 *Feb 8 12:58:42.422: CGMP: Sending Join on Ethernet1/3 *Feb 8 12:58:42.422: GDA 0100.5e01.0101, USA 0030.b655.a859
路由器75b从2.1.1.3接收组224.1.1.1的IGMP报告。随后,它向交换机A发送CGMP加入,该CGMP加入的MAC等效值为224.1.1.1,且MAC地址(USA)为2.1.1.3感兴趣主机。交换机 A 知道主机位于哪个端口,因此会将其标记为打开并禁用其他端口。
现在,交换机 A 上应当一切正常了:
Console> (enable) show multicast group CGMP enabled IGMP disabled IGMP fastleave disabled GMRP disabled VLAN Dest MAC/Route Des [CoS] Destination Ports or VCs / [Protocol Type] ---- ------------------ ----- ------------------------------------------- 6 01-00-5e-00-01-28 2/3-4 6 01-00-5e-01-01-01 2/3-4,2/6 Total Number of Entries = 2
现在情况好多了。按预期,224.1.1.1 (01-00-5e-01-01-01) 数据包仅从交换机 A 上的端口 2/3、2/4 和 2/6 发出。向所有其他端口的泛洪已经停止。条目总数现在正确列为2。MAC地址01-00-5e-00-01-28从组播地址224.0.1.40映射,该地址用于CGMP自身加入。
本节提供一个解决方案,解决有关 Catalyst 交换机将流量泛洪到每个端口而不是仅发送到正确主机这一常见问题。我们以下面的网络图为例。
在此图中,已正确为路由器 75a 和 75b 以及 Catalyst 5000(交换机 A)配置组播和思科组管理协议 (CGMP)。 主机将获取组播流量。但是,交换机 A 上的其他每台主机也是如此。交换机 A 会将流量泛洪到每个端口,这意味着 CGMP 不起作用。
交换机 A 的 show multicast group 命令的输出为:
Console> (enable) show multicast group CGMP enabled IGMP disabled IGMP fastleave disabled GMRP disabled VLAN Dest MAC/Route Des [CoS] Destination Ports or VCs / [Protocol Type] ---- ------------------ ----- ------------------------------------------- 6 01-00-5e-00-01-28 2/3-4 Total Number of Entries = 1
从输出中可以看到,唯一的组是 224.0.1.40,路由器发送 auto-RP 组的 CGMP 自动加入时使用此组。为什么没有其他组?
要理解此解决方案,您需要了解 CGMP 在特定条件下的行为。已启用 CGMP 的路由器向交换机发送 CGMP 加入,以向交换机通知与特定组播组相关的主机。交换机在其 CAM 表中查找这些主机的 MAC 地址,然后将多播数据包从意向主机的端口转发出去并禁止所有其他端口转发多播数据包。
如果路由器所接收的多播数据包的源位于启用了 CGMP 的相同接口上,则它会从启用了 CGMP 的接口发出 CGMP“自我加入”。
例如,如果源位于与路由器 75a 和 75b 相同的子网 (VLAN) 2.1.1.0/24 上,则 CGMP 将正常工作。路由器在看到来自源的数据包时,将向交换机发送一个 CGMP“自我加入”,然后交换机将动态确定路由器所在的端口并禁止所有其他端口转发多播数据包。
如果路由器所接收的 IGMP 报告的源主机位于启用了 CGMP 的相同接口上,则它会从启用了 CGMP 的接口发出 CGMP“加入”。
另一个示例是如果在此 VLAN 中您有需要的主机的情况。在这种情况下,当启用 CGMP 的路由器从与特定组播组相关的主机收到互联网组管理协议 (IGMP) 报告时,路由器将发送 CGMP 加入。加入将指示需加入的主机的介质访问控制 (MAC) 地址,及这些主机要加入的组。然后,Catalyst 5000 将在其 CAM 表中检查该主机的 MAC 地址,将关联端口放到多播组列表中,并禁止所有其他无意向的端口。
当源主机和感兴趣的主机位于启用CGMP的子网(VLAN)以外的子网时,情况并非如此。 来自源的组播数据包不会触发路由器向交换机发送 CGMP 自动加入。因此,数据包到达交换机后将在 VLAN 中泛洪到各处。此场景将持续到 VLAN 中的某个主机(从交换机上的某个端口传出)发送 IGMP 加入。只有在收到 IGMP 报告后,路由器才会发送 CGMP 数据包,进而导致交换机添加适当主机端口作为转发端口,并禁用(除了路由器端口以外的)所有其他端口。
因此,要使 CGMP 在此中转类型拓扑中正常工作,可以向路由器 75a 和 75b 所在的相同 VLAN 中添加一个主机,如下面的网络图所示。
也可以将源移到路由器 75a 和 75b 所在的相同子网上,如下面的示例所示。
将源移到相同的子网中,然后检查交换机 A 的输出:
Console> (enable) show multicast router CGMP enabled IGMP disabled IGMP fastleave disabled Port Vlan --------- ---------------- 2/3 6 2/4 6 Total Number of Entries = 2 '*' - Configured Console> (enable) Console> (enable) show multicast group CGMP enabled IGMP disabled IGMP fastleave disabled GMRP disabled VLAN Dest MAC/Route Des [CoS] Destination Ports or VCs / [Protocol Type] ---- ------------------ ----- ------------------------------------------- 6 01-00-5e-00-01-28 2/3-4 6 01-00-5e-01-01-01 2/3-4 Total Number of Entries = 2
现在 224.1.1.1 (01-00-5e-01-01-01) 只会泛洪到路由器端口 2/3 和 2/4,而不是交换机 A 的所有传出端口。
本节介绍为何某些组播 IP 地址会导致思科组管理协议 (CGMP) 将组播流量泛洪到局域网 (LAN) 上的所有端口。 当使用组播组地址 225.0.0.1 时,CGMP 不起作用。它会将多播流从所有交换机端口泛出并浪费带宽。然而,如果将地址更改为 225.1.1.1,CGMP 将会正常发挥作用。225.0.0.1 并不是路由协议的注册地址,那么使用它有什么错误呢?
首先,我们必须清楚第 3 层多播地址是如何映射到第 2 层多播地址的。所有 IP 组播帧都使用以 24 位前缀“0x0100.5e”开头的 IEEE MAC 层地址。当将第 3 层地址映射到第 2 层地址时,第 3 层组播地址的低位 23 位将映射到 IEEE MAC 地址的低位 23 位。
另外需要了解的是,IP 组播地址具有 28 位的唯一地址空间(32 位减去内含 1110 D 类前缀的前 4 位)。 由于只有 23 位插入到 IEEE MAC 地址中,因此会保留 5 位重叠部分。这意味着多个第 3 层多播地址会映射到相同的第 2 层多播地址。
例如:
224.0.0.1 = 1110 0000.0000 0000.0000 0000.0000 0001 in binary low order 23 bits = 000 0000.0000 0000.0000 0001 hex equivalent = 0 0 0 0 0 1 result of mapping = 0x0100.5e00.0001 224.128.0.1 = 1110 0000.1000 0000.0000 0000.0000 0001 in binary low order 23 bits = 000 0000.0000 0000.0000 0001 hex equivalent = 0 0 0 0 0 1 result of mapping = 0x0100.5e00.0001
请注意,在此示例中,224.0.0.1 和 224.128.0.1 均映射到相同的第 2 层组播地址。
现在您已了解如何将第 3 层组播地址映射到第 2 层组播地址,下面继续说明用于解决此问题的特定解决方案。
交换机 A 将组播数据包泛洪到 224.0.0.x,因为这些地址是链路本地地址,并且您希望确保链路本地地址到达局域网 (LAN) 上的所有设备。 Catalyst 交换机还会将多播数据包泛洪到 MAC 级别的其他 224.0.0.x 通配多播地址(例如 224.0.0.1 和 225.0.0.1 都会映射到 0100.5e00.0001)。 交换机会将多播数据包泛洪到这些本地链路地址而不管是否启用了 CGMP。
因此,多播应用必须避免使用映射到第 2 层多播地址 0100.5e00.00xx 的 D 类地址,其中 xx 可以是十六进制的 00 到 FF。这包括下列 D 类地址:
224.0.0.x (x = 0 to 255) 225.0.0.x . 239.0.0.x 224.128.0.x (x = 0 to 255) 225.128.0.x . 239.128.0.x
当在密集模式下配置了两个路由器时就会收到重复的多播数据包。在密集模式下,设备会定期泛洪流。泛洪后,它会修剪掉不需要流的接口。两个路由器也将经历该确认过程并确定哪一个是转发者。每当计时器关闭时都会发生这种情况,直到此过程完成,两台路由器都会转发数据流。这会导致应用程序收到重复的多播流。
如果将其中一个路由器配置为多播路由,另一个路由器配置为上游 RP,则可以解决此问题。将其配置为在流进入路由器之前将流转换为稀疏模式。这可以防止重复的数据包抵达应用程序。网络并不负责确保不会有重复的数据包抵达终端主机。应用程序将负责处理重复的数据包并忽略不需要的数据。
该问题会在 Cisco Catalyst 6500 交换机中出现,这些交换机配置为出口多播复制模式,可通过移除并重新插入任何板卡 [OIR] 进行触发。在 OIR 后,交换矩阵端口出口 [FPOE] 可能会被错误编程,这可导致数据包被定向到错误的交换矩阵出口通道并被发送到错误的线卡。结果是数据包沿环路返回光纤通道,并且当其在正确的板卡上退出时将重复多次。
C6509#show mls ip multicast capability Current mode of replication is Egress Auto replication mode detection is ON Slot Multicast replication capability 1 Egress 2 Egress 3 Egress 4 Egress 5 Egress 6 Egress 7 Egress
要解决此问题,可以更改为入口复制模式。在从出口复制模式更改为入口复制模式的过程中会出现流量中断,因为要清除并重新安装快捷方式。
mls ip multicast replication-mode ingress
将Cisco IOS软件升级到不受Cisco Bug ID CSCeg28814(仅限注册客户)影响的版本,以永久解决问题。
如果禁用终端主机或服务器上的接收端扩展 (RSS) 设置,也会发生此问题。
RSS 设置有利于在多个 CPU 间快速传输数据。请在终端主机或服务器上启用 RSS 设置。有关详细信息,请参阅 Microsoft 文章可扩展网络与 RSS 。
当组播流量传输时,接口上可能会出现过量的刷新和输入数据包丢弃。您可以使用 show interface 命令检查流量。
Switch#show interface gi 1/0 !--- Output suppressed MTU 1500 bytes, BW 1000000 Kbit, DLY 10 usec, reliability 255/255, txload 1/255, rxload 1/255 Encapsulation ARPA, loopback not set Keepalive set (10 sec) Full-duplex, 1000Mb/s, media type is SX input flow-control is off, output flow-control is on Clock mode is auto ARP type: ARPA, ARP Timeout 04:00:00 Last input 00:00:00, output 00:00:00, output hang never Last clearing of "show interface" counters never Input queue: 2/75/0/13370328 (size/max/drops/flushes); Total output drops: 0 Queueing strategy: fifo Output queue: 0/40 (size/max) 30 second input rate 195000 bits/sec, 85 packets/sec 30 second output rate 1000 bits/sec, 1 packets/sec L2 Switched: ucast: 53056 pkt, 4728434 bytes - mcast: 235759386 pkt, 66914376970 bytes L3 in Switched: ucast: 8714263 pkt, 1815426423 bytes - mcast: 1081138213 pkt,
438000092206 bytes mcast L3 out Switched: ucast: 4939256 pkt, 790351689 bytes mcast: 0 pkt, 0 bytes 1326976857 packets input, 506833655045 bytes, 0 no buffer Received 1318209538 broadcasts, 0 runts, 0 giants, 1 throttles 0 input errors, 0 CRC, 0 frame, 0 overrun, 0 ignored 0 input packets with dribble condition detected 31643944 packets output, 3124494549 bytes, 0 underruns 0 output errors, 0 collisions, 1 interface resets 0 babbles, 0 late collision, 0 deferred 0 lost carrier, 0 no carrier 0 output buffer failures, 0 output buffers swapped out
对于发现过大流量的接口,可以将 SPT 值设置为无限。
进行如下配置:
Switch(config-if)#ip pim spt-threshold infinity
当您在任何接口上使用 ip igmp join-group <group-name> 命令时,它会处理交换。如果组播数据包在任何接口上进行进程交换,则它会消耗更多CPU,因为它要求将所有数据包的进程交换到该组。您可以运行 show buffers input-interface 命令并检查异常大小。
Switch#show buffers input-interface gi 1/0 Header DataArea Pool Rcnt Size Link Enc Flags Input Output 437C6EAC 8096AE4 Middl 1 434 7 1 280 Gi1/1 None 437C74B4 8097864 Middl 1 298 7 1 280 Gi1/1 None 437C98E4 809C964 Middl 1 434 7 1 280 Gi1/1 None 437CAAFC 809F1E4 Middl 1 349 7 1 280 Gi1/1 None 437CAE00 809F8A4 Middl 1 519 7 1 280 Gi1/1 None !--- Output suppressed
您可以使用 ip igmp static-group <group-name> 命令而不是 ip igmp join-group <group-name> 命令。
注意:由于前面提到的问题,很可能会看到 CPU 的使用率高达 90% 左右。通过可能的修复方法解决这些问题后,CPU 使用率将下降到正常水平。
版本 | 发布日期 | 备注 |
---|---|---|
1.0 |
02-Dec-2013 |
初始版本 |