目录

简介

先决条件

要求

使用的组件

背景信息

配置

网络图

带调试的数据包流

步骤1:在WLC上全局启用mDNS时

第二步：WLC缓存Bonjour服务（Apple TV广告）

第三步：WLC侦听客户端的服务查询

第四步：WLC发送单播响应到客户端对Bonjour服务的查询

验证和故障排除

简介

本文档介绍如何在无线控制器上实施Bonjour协议，并提供帮助排除问题的指南。

先决条件

要求

Cisco 建议您了解以下主题：

- Bonjour协议的基础知识

- 有关如何在WLC上配置mDNS的基本知识

- 组播路由的基本知识

使用的组件

本文档中的信息基于以下软件和硬件版本：

- AIR-CT2504-K9 WLC，8.2.141.0

- WS-C3560CX-8PC-S

- AIR-CAP3702I-E-K9

- 苹果电视

- Iphone5s，10.2

本文档中的信息都是基于特定实验室环境中的设备编写的。本文档中使用的所有设备最初均采用原始（默认）配置。如果您的网络处于活动状态，请确保您了解所有命令的潜在影响。

背景信息

Bonjour协议是一种Apple服务发现协议，它使用组播域名系统(mDNS)服务记录定位本地网络上的设备和服务。Bonjour协议适用于服务通告和服务查询。每个查询或通告都发送到Bonjour组播地址ipv4 224.0.0.251(ipv6 FF02::FB)。该协议在UDP端口5353上使用mDNS。

Bonjour协议使用的地址是本地链路组播地址，因此只转发到本地L2网络。由于生存时间(TTL)设置为1，路由器无法使用组播路由重定向流量。这意味着所有服务提供商/源（通告该服务）和Bonjour客户端（请求服务）必须位于同一子网中。这会导致可扩展性问题。

为了解决此问题，思科无线局域网控制器(WLC)充当Bonjour网关。WLC侦听Bonjour服务，从源/主机缓存这些Bonjour广告（AirPlay、AirPrint等）。例如，Apple TV和Bonjour客户端在请求/请求服务时作出回复。这样，您可以在不同的子网中拥有源和客户端。

配置

网络图

带调试的数据包流

在Cisco WLC上运行mDNS时，需要执行四个基本步骤。这些步骤说明如下：

步骤1:在WLC上全局启用mDNS时

如果您没有创建自定义的mDNS配置文件（如图所示），WLC将侦听这些默认服务。

每个服务都有一个与其关联的服务字符串。服务字符串用于将服务实例与服务查询相匹配。服务类型始终包含服务名称和协议。此外，它可以包含一个或多个子类型标识符。 AppleTV服务使用:_airplay._tcp.local。

当全局启用mDNS时，控制器会针对有线（管理和动态接口）和无线网络上的所有服务向224.0.0.251发送mDNS查询。

在此捕获的WLC交换机端口上，数据包80、81和82显示WLC通过有线网络将查询发送到224.0.0.251，其中具有管理源IP(10.48.39.142)和动态接口（192.168.232.11和192.168.239.8），如图所示。

数据包83显示WLC通过无线发送查询。内部数据包显示从管理接口到224.0.0.251的WLC查询。由于此查询通过无线进行，因此capwap报头会添加到数据包中，而外部源IP仍然是管理源IP，但目的地是组播IP 239.100.100.100，如图所示。

现在，此组播IP 239.100.100.100来自哪里？在WLC上，接入点(AP)组播模式(controller > general)设置为组播，组播组地址为239.100.100.100（这只是一个示例，即239范围内的任何ip）。AP加入此组播组并在组上进行监听。WLC将查询转发到此组，AP接收查询并通过无线发送查询。地址239.100.100.100（这不是静态地址，这是您在下一个示例中配置的地址）仅出现在WLC和AP之间的capwap报头中，无线客户端看不到其中的任何内容（但可以看到内部原始mdns数据包），如图所示。

请记住，在此设置中，WLC是VLAN 1中的2504，而AP是VLAN 231。由于设备位于不同的vlan中，您需要有线上为vlan 1和239启用组播路由，这样才能正常工作。

注：如果在有线上未为wlc和AP管理vlan启用组播路由，则必须将AP组播模式设置为单播。在此模式下，控制器将每个组播数据包单播到与控制器关联的每个AP。此模式效率非常低，不建议使用。

此捕获是详细的查询数据包，如图所示。

这些调试反映了捕获中所看到的内容。在此代码片断仅显示来自管理接口的查询。

(Cisco Controller) >debug mdns all enable

Cisco Controller) >*emWeb: Feb 22 16:24:18.203: bgSetBonjourAccessPolicy :1192 Bonjour AccessPolicy status is already in requested state Disabled

*emWeb: Feb 22 16:24:18.203: bgSetBonjourQueryInterval :1359 Bonjour query interval is already configured for requested value = 15

*Bonjour_Process_Task: Feb 22 16:24:18.215: bonjourProcessTask : 220 Processing message type = BONJOUR_AGGREGATED_QUERY

*Bonjour_Process_Task: Feb 22 16:24:18.215: sendBonjourPkt : 3881 sendBonjourPkt msg-type = BONJOUR_AGGREGATED_QUERY toSend = all

*Bonjour_Process_Task: Feb 22 16:24:18.216: Send to Wired, All vlan is TRUE

*Bonjour_Process_Task: Feb 22 16:24:18.216: sendBonjourPacketToWired : 3652 sending aggregated query on interface = management

*Bonjour_Process_Task: Feb 22 16:24:18.216: buildBonjourPacket : 2916 Preparing for l2 Multicast send

*Bonjour_Process_Task: Feb 22 16:24:18.216: buildBonjourPacket : 2936 allVlan = 0 , vlanId = 0

*Bonjour_Process_Task: Feb 22 16:24:18.216: buildBonjourPacket : 2948 simInterfaceMacAddrGet( management ) =  00:A2:89:B9:62:60

*Bonjour_Process_Task: Feb 22 16:24:18.216: Inside buildBonjourAggregatedQuery, available len = 1458

*Bonjour_Process_Task: Feb 22 16:24:18.216: fillBonjourAggregatedQuery : 7339 Sending mDNS AGGREGATED query for services configured in MSAL-DB

*Bonjour_Process_Task: Feb 22 16:24:18.216: fillBonjourAggregatedQuery : [ 1 ] Including SRV = AirPrint in aggregated query packet

*Bonjour_Process_Task: Feb 22 16:24:18.216: fillBonjourAggregatedQuery : [ 2 ] Including SRV = AirTunes in aggregated query packet

*Bonjour_Process_Task: Feb 22 16:24:18.216: fillBonjourAggregatedQuery : [ 3 ] Including SRV = AppleTV in aggregated query packet

*Bonjour_Process_Task: Feb 22 16:24:18.216: fillBonjourAggregatedQuery : [ 4 ] Including SRV = HP_Photosmart_Printer_1 in aggregated query packet

*Bonjour_Process_Task: Feb 22 16:24:18.216: fillBonjourAggregatedQuery : [ 5 ] Including SRV = HP_Photosmart_Printer_2 in aggregated query packet

*Bonjour_Process_Task: Feb 22 16:24:18.216: fillBonjourAggregatedQuery : [ 6 ] Including SRV = Printer in aggregated query packet

*Bonjour_Process_Task: Feb 22 16:24:18.216: -----------------------------------------

*Bonjour_Process_Task: Feb 22 16:24:18.216: fillBonjourAggregatedQuery : PACKET-1 mDNS-QUERY sent for [ 6 ] services

*Bonjour_Process_Task: Feb 22 16:24:18.216: fillBonjourAggregatedQuery : mDNS-QUERY sent for all services in [ 1 ] packets

*Bonjour_Process_Task: Feb 22 16:24:18.216: -----------------------------------------

*Bonjour_Process_Task: Feb 22 16:24:18.216: buildBonjourPacket : 3054 BONJOUR_AGGREGATED_QUERY: buildBonjourAggregatedQuery()STATUS = 0

*Bonjour_Process_Task: Feb 22 16:24:18.216: buildBonjourPacket MCAST-DST-IP ADDR = 224.0.0.251

第二步：WLC缓存Bonjour服务（Apple TV广告）

在此数据包中，Apple TV(192.168.239.37)向224.0.0.251发送通告。由于在本例中，Apple TV是无线的，因此您可以看到通过capwap发送的广告。WLC只记录一次mDNS服务响应，但是，缓存条目具有TTL，并且必须保持连接才能维护它，如图所示。

Apple TV的详细响应如图所示。

这些调试显示Apple TV响应WLC的查询。在这种情况下，Apple TV回应了21项服务，其中只有Airplay服务感兴趣。

*Bonjour_Msg_Task: Feb 23 16:22:02.372: 18:ee:69:11:dc:60 Parsing 21 Bonjour Answers.

*Bonjour_Msg_Task: Feb 23 16:22:02.374: bgProcessServiceAdvRsp : 1562 aStringNameStr = Wireless Team (4)._airplay._tcp.local.

*Bonjour_Msg_Task: Feb 23 16:22:02.374: bgProcessServiceAdvRsp : 1579 RR: Wireless Team (4)._airplay._tcp.local., aType: 16, aClass: 32769, aTTL: 4500, aDataLen: 207, ptr: 0x327a9ca8, end: 0x327aa100

*Bonjour_Msg_Task: Feb 23 16:22:02.374: bgProcessServiceAdvRsp : 1581 aStringNameStr : Wireless Team (4)._airplay._tcp.local.

*Bonjour_Msg_Task: Feb 23 16:22:02.374: Found Service Name:_airplay._tcp.local., Service Provider Name:Wireless Team (4)._airplay._tcp.local.

*Bonjour_Msg_Task: Feb 23 16:22:02.374: bgServiceAllowedInMsalDb : 181 srv_str = _airplay._tcp.local. type = Wireless

*Bonjour_Msg_Task: Feb 23 16:22:02.374: bgServiceAllowedInMsalDb : 195 Incoming Service Advertisement string = _airplay._tcp.local.

*Bonjour_Msg_Task: Feb 23 16:22:02.374: Service-Name = AppleTV Service-String = _airplay._tcp.local. Type = all Origin = Wireless FOUND and is ALLOWED FOR LEARNING

<<< Airplay service registered in WLC DB >>

*Bonjour_Msg_Task: Feb 23 16:22:02.374: Service Name:_airplay._tcp.local. is supported in Master-service-db

*Bonjour_Msg_Task: Feb 23 16:22:02.374: aDataLen: 2, aSrPtrRecord.aSrvProName.size: 39

*Bonjour_Msg_Task: Feb 23 16:22:02.374: Updating updateBonjourSrPtrDb:

*Bonjour_Msg_Task: Feb 23 16:22:02.374: aType: 12, aClass: 1, aTTL: 4500, aDataLen: 2, ptr: 0x327a9d93, end: 0x327aa100

*Bonjour_Msg_Task: Feb 23 16:22:02.374:           bgProcessServiceAdvRsp : .. < SP-SR_PTR PKT >...

*Bonjour_Msg_Task: Feb 23 16:22:02.374:           bgProcessServiceAdvRsp : SERVICE NAME ......... = AppleTV

*Bonjour_Msg_Task: Feb 23 16:22:02.374:           bgProcessServiceAdvRsp : SERVICE STRING ....... = _airplay._tcp.local.

*Bonjour_Msg_Task: Feb 23 16:22:02.374:           bgProcessServiceAdvRsp : SERVICE PROVIDER ..... = Wireless Team (4)._airplay._tcp.local.

*Bonjour_Msg_Task: Feb 23 16:22:02.374:           bgProcessServiceAdvRsp : aTTL ................. = 4500n

*Bonjour_Msg_Task: Feb 23 16:22:02.374: bgProcessServiceAdvRsp : 1546 msg : 0x327a9bda, ptr : 0x327a9d93, end : 0x327aa100, pld_len : 877

第三步：WLC侦听客户端的服务查询

之后，在任意时间点，无线客户端(192.168.232.98)发送请求空中播放服务的查询（通常当客户端打开支持空中播放的应用程序时），如图所示。

*Bonjour_Msg_Task: Feb 27 17:03:15.603: 00:6d:52:5d:5a:7d Parsing 2 bonjour questions

*Bonjour_Msg_Task: Feb 27 17:03:15.603: 00:6d:52:5d:5a:7d Query Service Name: _airplay._tcp.local., RR-Type:  TYPE_DOMAIN_NAME_PTR , Class: 1

*Bonjour_Msg_Task: Feb 27 17:03:15.603: processBonjourPacket : 1017 qNameStr : _airplay._tcp.local., bonjServiceNameStr : _airplay._tcp.local., bonjSpNameStr : _airplay._tcp.local.

*Bonjour_Msg_Task: Feb 27 17:03:15.603: Service Name : AppleTV  Service String : _airplay._tcp.local. is supported in MSAL-DB

*Bonjour_Msg_Task: Feb 27 17:03:15.603: 00:6d:52:5d:5a:7d SRV : _airplay._tcp.local. is supported by client profile : default-mdns-profile

第四步：WLC发送单播响应到客户端对Bonjour服务的查询

WLC使用缓存的服务Wireless Team(4)。_airplay._tcp.local进行响应。内部数据包的源IP是客户端VLAN的动态接口，在本例中为192.168.232.11，如图所示。

调试片段

BONJOUR_AGGREGATED_QUERY_RESPONSE

*Bonjour_Process_Task: Feb 27 17:03:45.229: buildBonjourQueryResponsePld : SRV-NAME ..... : AppleTV

*Bonjour_Process_Task: Feb 27 17:03:45.229: buildBonjourQueryResponsePld : SP-NAME....... :

*Bonjour_Process_Task: Feb 27 17:03:45.229: buildBonjourQueryResponsePld : SEND TO ...... : BONJOUR_PKT_TO_WIRELESS

*Bonjour_Process_Task: Feb 27 17:03:45.229: buildBonjourQueryResponsePld : VLAN ......... : 232

*Bonjour_Process_Task: Feb 27 17:03:45.229: buildBonjourQueryResponsePld : IS MCAST ..... : NO

*Bonjour_Process_Task: Feb 27 17:03:45.230: buildBonjourQueryResponsePld : DST-MAC ...... :  00:6D:52:5D:5A:7D

*Bonjour_Process_Task: Feb 27 17:03:45.230: buildBonjourQueryResponsePld : DST-IP ....... : 192.168.232.98

*Bonjour_Process_Task: Feb 27 17:03:45.230: buildBonjourQueryResponsePld : ALL mDNS-AP .. : 0

*Bonjour_Process_Task: Feb 27 17:03:45.230: buildBonjourQueryResponsePld : TTL COUNTER .. : TIMEOUT_RESET

*Bonjour_Process_Task: Feb 27 17:03:45.230: buildBonjourQueryResponsePld : RESTART TIME . : 0

*Bonjour_Process_Task: Feb 27 17:03:45.230: buildBonjourQueryResponsePld : SNOOP STATUS . : 0

*Bonjour_Process_Task: Feb 27 17:03:45.230: buildBonjourQueryResponsePld : LSS STATUS ... : DISABLED

*Bonjour_Process_Task: Feb 27 17:03:45.230: buildBonjourQueryResponsePld : RSP SRV NAME . : AppleTV

*Bonjour_Process_Task: Feb 27 17:03:45.230: buildBonjourQueryResponsePld : MSG-ID ....... : 0

*Bonjour_Process_Task: Feb 27 17:03:45.230: buildBonjourQueryResponsePld : POLICY STATUS  : DISABLED

*Bonjour_Process_Task: Feb 27 17:03:45.230: buildBonjourQueryResponsePld INCLUDING SpData : Wireless Team (4)._airplay._tcp.local. in AGGREGATED QUERY RESPONSE

*Bonjour_Process_Task: Feb 27 17:03:45.233: VALID SR-PTR RR FOUND, attaching.....

*Bonjour_Process_Task: Feb 27 17:03:45.233: VALID SD-PTR RR FOUND, attaching.....

*Bonjour_Process_Task: Feb 27 17:03:45.233: VALID SRV RR FOUND, attaching.....

*Bonjour_Process_Task: Feb 27 17:03:45.233: VALID TXT RR FOUND, attaching.....

*Bonjour_Process_Task: Feb 27 17:03:45.233: VALID NSEC RR FOUND, attaching.....

*Bonjour_Process_Task: Feb 27 17:03:45.233: VALID DOMAIN RR FOUND, attaching.....

*Bonjour_Process_Task: Feb 27 17:03:45.233: fillBonjourDomain : 6055 : attaching SP-DOMAIN RR

*Bonjour_Process_Task: Feb 27 17:03:45.233: VALID DOMAIN-NSEC RR FOUND, attaching.....

*Bonjour_Process_Task: Feb 27 17:03:45.233: buildBonjourPacket DST-IP ADDR = 192.168.232.98

*Bonjour_Process_Task: Feb 27 17:03:45.233: Transmitting bonjour Pkt to STA: 00:6D:52:5D:5A:7D

*Bonjour_Process_Task: Feb 27 17:03:45.233: Unicast Packet sent to client  00:6D:52:5D:5A:7D  success.

验证和故障排除

本部分提供可用于确认和排除配置故障的信息。

为了在mdns中识别和隔离问题，需要配置正确，因此几乎不需要基本检查。

步骤1.必须全局启用mDNS。

在GUI中导航控制器> mDNS 如图所示.

从CLI:

show network summary (snippet)

mDNS snooping............................... Enabled

mDNS Query Interval......................... 15 minutes

第二步：如果使用自定义mDNS配置文件，请确保所有必需的服务都添加到该配置文件。

第三步：确保在SSID下启用了mDNS，并且正确的mdns配置文件已映射到SSID。

从GUI导航至WLAN > WLAN ID > Advanced，如图所示。

从CLI:

show wlan

(snippet)

mDNS Status...................................... Enabled

mDNS Profile Name................................ default-mdns-profile

第四步： 验证mDNS域服务中是否列出了mDNS服务提供程序。这列出了WLC缓存的服务的域名(Apple TV、airprinters)。

从GUI中，导航到Controller > mDNS > mDNS Domain Name IP> Summary，如图所示。

从CLI:

show mdns domain-name-ip summary

Number of Domain Name-IP Entries................. 1

DomainName             MAC Address       IP Address       Vlan Id Type     TTL Time left (sec) (sec)

--------------------   ----------------  ---------------- ------- ------   ------ ------

Wireless-Team-3.local. 18:ee:69:11:dc:60 192.168.239.37   239     Wireless 4725   4163

第五步： 验证服务提供商是否也在特定服务本身下列出。

在GUI中，导航到Controller > mDNS > General > Service Name，如图所示。

从CLI:

show mdns service detailed AppleTV

Service Name..................................... AppleTV

Service String................................... _airplay._tcp.local.

Service Id....................................... 3

Service query status............................. Enabled

Service LSS status............................... Disabled

Service learn origin............................. Wireless and Wired

Number of Profiles............................... 1

Profile.......................................... default-mdns-profile

Number of Service Providers ..................... 1

Number of priority MAC addresses ................ 0

ServiceProvider MAC Address AP Radio MAC Vlan Id Type TTL Time left(sec) (sec)

-------------------- ---------------- ---------------- ------- ------ ----- ---------

Wireless Team (4)._airplay._tcp.local. 18:EE:69:11:DC:60 A4:6C:2A:7C:8F:80 239 Wireless 4500 3841

第六步：如果WLC未发现该服务，则检查是否要在bonjour浏览器（Controller>>mDNS>>mDNS浏览器）下获取该服务。 Bonjour浏览器是在WLC上看到的所有服务通告的缓存，由于配置不允许学习，因此未发现该缓存。您可以从Bonjour浏览器中选择和添加服务，这在您测试和实施新服务时非常方便。

步骤 7.以下是调试Bonjour的命令：

debug mdns error enable

debug mdns message enable

debug mdns detail enable

debug mdns all enable

Bonjour浏览器和show mdns service not-learned也可以用作调试工具。

步骤 8如前所述，如果WLC和AP位于不同的子网中，并且AP组播模式设置为组播，则请确保在两个vlan之间的有线网络上启用组播路由。在此设置中，vlan为vlan 1(WLC)和vlan 231(AP)。

Conf t

!

interface Vlan1

ip pim sparse-dense-mode

!

interface Vlan231

ip pim sparse-dense-mode

!

正在运行的组播路由：

Gateway#sh ip mroute 239.100.100.100

IP Multicast Routing Table

-------snippet--------------------

(*, 239.100.100.100), 2w4d/stopped, RP 10.48.39.5, flags: SJC

Incoming interface: Null, RPF nbr 0.0.0.0

Outgoing interface list:

Vlan231, Forward/Sparse-Dense, 2w0d/00:02:10

Vlan232, Forward/Sparse-Dense, 2w4d/00:02:11

(10.48.39.142, 239.100.100.100), 2w4d/00:02:50, flags: T

Incoming interface: Vlan1, RPF nbr 0.0.0.0, RPF-MFD

Outgoing interface list:

Vlan231, Forward/Sparse-Dense, 2w0d/00:02:10, H

除了这些核对表，关键是要了解mDNS在WLC上运行时的数据包流。数据包流和调试有助于深入了解先前的

验证命令不足。