WLC上mDNS网关的理解及排查

第一部分:介绍

这篇文档描述了Bonjour协议在WLC上的操作,该文档旨在协助工程师理解该工作流量的原理以及提供故障排查的指导。

第二部分:需求和前提

知识需求:

Cisco建议你对Bonjour协议、在WLC配置mDNS、以及多播路由有一定的基础知识,以便你能更好的理解。

设备组件:

该文档是基于如下设备和相关软件版本完成的:

  • AIR-CT2504-K9 WLC, 8.2.141.0
  • WS-C3560CX-8PC-S
  • AIR-CAP3702I-E-K9
  • Apple TV
  • Iphone5s, 10.2

该文档是在指定的LAB环境中完成的,所有的设备开始都是默认的配置。如果你的网络是在线的,有业务,那么需要你了解你的操作对网络的潜在影响。

第三部分:背景信息

Bonjour协议是一种Apple服务发现协议,它使用多播域名系统(multicast Domain Name System,mDNS)服务记录来定位本地网络上的设备和服务。

Bonjour协议通过服务通告(service announcements)和服务查询(service queries)来运作。每个查询和通告消息都以组播地址224.0.0.251为目的地址发送出去(如果在IPv6中,地址为FF02::FB),该协议在UDP5353上使用mDNS。

Bonjour协议使用的地址是链路本地多播地址,因此仅转发到本地L2网络。路由器无法使用多播路由重定向流量,因为生存时间(TTL)设被置为1。那么,这就有一个问题,所有的服务提供者(或者称为源,通告服务的设备)和Bonjour客户端(请求服务的设备)都必须位于同一子网,这就限制扩展性。那么,为了解决这个问题,思科WLC就充当这个Bonjour的网关。由WLC来监听Bonjour服务,缓存这些来自源的Bonjour通告(例如AirPlay、AirPrint等)。例如,Apple TV会在Bonjour客户端请求服务的时候给予响应。那么这样的方式就就可以让源和客户端位于不同的子网中。

第四部分:配置拓扑

网络拓扑图

第五部分:数据流和debug操作

当mDNS在Cisco WLC上运行时,会发生如下基本的四个步骤。 这些步骤描述如下:

步骤1:当在WLC全局开启mDNS

默认情况下,WLC(version8.3.143)上mDNS监听如下的服务:

如下所示的是自定义的mDNS profile:其中的每一个服务都有一个Service String与之关联。Service Strings是为服务查询匹配服务实例的。一个服务类型就是包含了服务名称(Service Name)和协议(Protocol)。另外,它还可以包含一个或多个子类型标识符(subtype identifiers)。如下的AppleTV Service使用 _airplay._tcp.local. 这个字符串。

当mDNS全局开启的时候,控制器会发送mDNS queries消息到目的组播地址224.0.0.251,以查询有线和无线网络的服务。

如下的抓包信息,是在WLC switch port抓取,我们可以看到80、81和82 三个query报文是以management(10.48.39.142)和动态接口(192.168.232.11 & 192.168.239.8)作为源,发送到组播地址224.0.0.251的,来查询有线网络上的服务。

包83显示的是WLC发送到无线网络的查询。在内部的报文显示WLC的查询报文还是以源为management,目的地址为224.0.0.251的。无线上的query报文,会被添加上CAPWAP头部,该报文外部的IP地址还是management,但是此图中目的地址就是组播地址239.100.100.100了。

其中的组播地址239.100.100.100,是在WLC全局配置的。APs会加入这个组播组以监听这个它。WLC转发query报文到这个组播组,APs收到查询报文后,将它发送到无线空口环境。这个组播地址239.100.100.100只出现在WLC和APs的CAPWAP的头部中,无线clients不会感知到它(但是clients看得到作为数据封装在报文中的原始mDNS报文)。

这里的设置中,WLC是2504在vlan1中,并且AP在vlan231。由于这两个设备是在不同的vlan,那么需要在vlan1和vlan231的有线网络开启组播路由,才能使其正常工作。

注意:如果组播路由没有在WLC和AP的管理VLAN开启,则必须将AP组播模式设置为单播。在此模式下,WLC将每个多播数据包单播发送到与WLC关联的每个AP。此模式效率非常低,不建议使用。

如下抓取的数据包是query数据包的详细部分:

如下的debug信息体现的之前抓取报文的相同部分:

(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

步骤2:WLC缓存Bonjour服务(Apple TV通告)

在此数据包中,Apple TV(192.168.239.37)向224.0.0.251发送通告。 由于在这种情况下Apple TV是无线的,因此可以看到通过capwap发送的通告报文。 WLC仅注意一次mDNS服务响应,但是,该缓存条目具有TTL,并且需要keepalive来维护它,如图所示。

如下报文是Apple TV的响应:

这些debug信息显示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 

步骤3:WLC监听客户端针对对应服务的query

之后,在任何时间点,无线客户端(192.168.232.98)发送一个请求airplay service的query报文(通常在客户端打开一个具有播放功能的应用程序时),如图所示:

*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

步骤4:WLC发送对应Bonjour服务的单播响应给客户端

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

如下是debug片段:

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必须全局开启

WLC的GUI界面,Controller>mDNS

CLI界面查看:

show network summary (snippet) 

mDNS snooping............................... Enabled
mDNS Query Interval......................... 15 minutes

步骤2:如果你使用的是自定义的mDNS profile,确定所有的所需的服务都被添加进去。

步骤3:保证mDNS在对应的SSID下面开启,并且对应了正确的mDNS profile。

通过GUI界面查看,WLAN>WLAN ID>Advanced

通过CLI查看:

show wlan <ID> (snippet)

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

步骤4:验证mDNS服务提供者是否在“Domain Names”列表中。

GUI查看:Controller>mDNS>mDNS Domain Name IP>Summary,这里就是WLC缓存的domain names(例如Apple TV,Airprinters)。

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

步骤5:验证服务提供者是否在指定的服务下面

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

步骤6:如果WLC未发现该服务,则检查是否在Bonjour browser(Controller >> mDNS >> mDNS browser)中学到了。 Bonjour browser是在WLC上看到的所有服务通告的缓存,由于配置不允许学习而未被发现。 我们可以通过从Bonjour browser中选择服务来添加该服务,这在我们测试和实施新服务时非常方便。

步骤7:如下是debug Bonjour的相关命令(注意,命令开启后,信息很多!)

debug mdns error enable
debug mdns message enable
debug mdns detail enable
debug mdns all enable

Bonjour browser和 show mdns service not-learnt  也可以作为排查根据提供帮助。

步骤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上运行时的数据包流。 数据包流和debug有助于深入研究上述验证命令不足的部分。

原文链接:https://www.cisco.com/c/en/us/support/docs/wireless/wireless-lan-controller-software/210835-Troubleshooting-mDNS.html#anc13

 

mDNS故障排查(译)的更多相关文章

  1. NO11 SSH故障排查思路和netstat命令

    本章知识相关考试:1.企业场景面试题:Linux系统如何优化?2.企业场景面试题:SSH服务连不上,如何排查?记住回答技巧: 1 ping  2 telnet 客户端ssh工具:SecureCRT,x ...

  2. 坑爹坑娘坑祖宗的87端口(记一次tomcat故障排查)

    原贴如下 坑爹坑娘坑祖宗的87端口(记一次tomcat故障排查) 虽然我用的是PHPstudy部署的dedecms,还是一样栽倒这个坑里了. 总结经验:本地测试使用8000~9000的端口比较安全.

  3. Java线上应用故障排查之二:高内存占用

    搞Java开发的,经常会碰到下面两种异常: 1.java.lang.OutOfMemoryError: PermGen space 2.java.lang.OutOfMemoryError: Java ...

  4. paip.hql的调试故障排查流程总结

    paip.hql的调试故障排查流程总结 环境.myeclipse7.0 1 Hql的调试工具myeclipxe默认工具.../Hibernate8IDE 1 故障的排除方法overview 1 Hql ...

  5. 使用strace工具故障排查的5种简单方法

    使用strace工具故障排查的5种简单方法 本文源自5 simple ways to troubleshoot using strace strace 是一个非常简单的工具,用来跟踪可执行程序的系统调 ...

  6. 一次线上OOM故障排查经过

    转贴:http://my.oschina.net/flashsword/blog/205266 本文是一次线上OOM故障排查的经过,内容比较基础但是真实,主要是记录一下,没有OOM排查经验的同学也可以 ...

  7. SQL Server 2008性能故障排查(四)——TempDB

    原文:SQL Server 2008性能故障排查(四)--TempDB 接着上一章:I/O TempDB: TempDB是一个全局数据库,存储内部和用户对象还有零食表.对象.在SQLServer操作过 ...

  8. SQL Server 2008性能故障排查(三)——I/O

    原文:SQL Server 2008性能故障排查(三)--I/O 接着上一章:CPU瓶颈 I/O瓶颈(I/O Bottlenecks): SQLServer的性能严重依赖I/O子系统.除非你的数据库完 ...

  9. SQL Server 2008性能故障排查(二)——CPU

    原文:SQL Server 2008性能故障排查(二)--CPU 承接上一篇:SQL Server 2008性能故障排查(一)--概论 说明一下,CSDN的博客编辑非常不人性化,我在word里面都排好 ...

随机推荐

  1. Light Up Your Business Promotions With LED Keychain

    Imagine you want to insert the car key into the keyhole in the dark. What would you do? You will def ...

  2. PHP中spl_autoload_register()函数用法实例详解

    本文实例分析了PHP中spl_autoload_register()函数用法.分享给大家供大家参考,具体如下: 在了解这个函数之前先来看另一个函数:__autoload. 一.__autoload 这 ...

  3. Modelsim, Debussy联合仿真Xilinx

    http://wenku.baidu.com/view/8363d40003d8ce2f006623e9.html  另外一个博客 生成Xilinx库 先调用ISE的simulation librar ...

  4. AVR单片机教程——DAC

    本文隶属于AVR单片机教程系列.   单片机的应用场景时常涉及到模拟信号.我们已经会使用ADC把模拟信号转换成数字信号,本讲中我们要学习使用DAC把数字信号转换成模拟信号.我们还将搭建一个简单的功率放 ...

  5. ($children,$refs,$parent)的使用

    如果项目很大,组件很多,怎么样才能准确的.快速的寻找到我们想要的组件了?? $refs 首先你的给子组件做标记.demo :<firstchild ref="one"> ...

  6. 吴裕雄 python 机器学习——半监督学习标准迭代式标记传播算法LabelPropagation模型

    import numpy as np import matplotlib.pyplot as plt from sklearn import metrics from sklearn import d ...

  7. HahMap相关问题

    概述 文章对HashMap的部分细节进行介绍,JDK1.7之前有可能出现环形表的问题,而1.7之后进行了改进,文章对环形表现象的出现进行了解析,然后对HashMap注意的几个问题进行了解答. Hash ...

  8. VS2017出现不存在从"CString"到"const char*"的适当转换函数

    出现不存在从CStrign到const char*的转换,可以将项目属性的字符集设置从"使用Unicode字符集“转换为”使用多字字符集“. 点击”项目“----“属性”----“配置属性” ...

  9. unittest 改装框架ascii 排序执行用例,按照自己书写先后顺序执行

    设计思路: 获取成员变量class.__dict__.keys() filter过滤符合要求成员,由于3.x成员dict属性是支持有序的 # coding=utf-8import unittestfr ...

  10. UVa 400 Unix Is命令

    简单题 #include <bits/stdc++.h> using namespace std; const int maxn=110; string s[maxn]; int main ...