物联网之Wifi协议
今天来重点介绍一下WIfi协议,咱们用的其实已经很多了。
主要内容:
⼀、基本概述
⼆、实践基础
三、⼀些原理
⼀、基本概述
============================
1、有线和⽆线⽹络
⽬前有线⽹络中最著名的是以太⽹(Ethenet),但是⽆线⽹络WLAN是⼀个很有前景的发展领域,虽然可能不会完全取代以太⽹,但是它正拥有越来越多的⽤户,⽆线⽹络中最有前景的是Wifi。本⽂介绍⽆线⽹络相关内容。
⽆线⽹络相⽐有线⽹络,还是有许多的缺点的:
(*)通信双⽅因为是通过⽆线进⾏通信,所以通信之前需要建⽴连接;⽽有线⽹络就直接⽤线缆连接,不⽤这个过程了。
(*)通信双⽅通信⽅式是半双⼯的通信⽅式;⽽有线⽹络可以是全双⼯。
(*)通信时在⽹络层以下出错的概率⾮常⾼,所以帧的重传概率很⼤,需要在⽹络层之下的协议添加重传的机制(不能只依赖上⾯TCP/IP的延时等待重传等开销来保证);⽽有线⽹络出错概率⾮常⼩,⽆需在⽹络层有如此复杂的机制。
(*)数据是在⽆线环境下进⾏的,所以抓包⾮常容易,存在安全隐患。
(*)因为收发⽆线信号,所以功耗较⼤,对电池来说是⼀个考验。
(*)相对有线⽹络吞吐量低,这⼀点正在逐步改善,802.11n协议可以达到600Mbps的吞吐量。
2、协议
Ethenet和Wifi采⽤的协议都属于IEEE 802协议集。其中,Ethenet以802.3协议做为其⽹络层以下的协议;⽽Wifi以802.11做为其⽹络层以下的协议。⽆论是有线⽹络,还是⽆线⽹络,其⽹络层以上的部分,基本⼀样。
这⾥主要关注的是Wifi⽹络中相关的内容。Wifi的802.11协议包含许多⼦部分。其中按照时间顺序发展,主要有:
(1)802.11a,1999年9⽉制定,⼯作在5gHZ的频率范围(频段宽度325MHZ),最⼤传输速率54mbps,但当时不是很流⾏,所以使⽤的不多。
(2)802.11b,1999年9⽉制定,时间⽐802.11a稍晚,⼯作在2.4g的频率范围(频段宽度83.5MHZ),最⼤传输速率
11mbps。
11mbps。
(3)802.11g,2003年6⽉制定,⼯作在2.4gHZ频率范围(频段宽度83.5MHZ),最⼤传输速率54mbps。
(4)802.11n,2009年才被IEEE批准,在2.4gHZ和5gHZ均可⼯作,最⼤的传输速率为600mbps。
这些协议均为⽆线⽹络的通信所需的基本协议,最新发展的,⼀般要⽐最初的有所改善。
另外值得注意的是,802.11n在MAC层上进⾏了⼀些重要的改进,所以导致⽹络性能有了很⼤的提升例如:
(*)因为传输速率在很⼤的程度上取决于Channel(信道)的ChannelWidth有多宽,⽽802.11n中采⽤了⼀种技术,可以在传输数据的时候将两个信道合并为⼀个,再进⾏传输,极⼤地提⾼了传输速率(这⼜称HT-40,high through)。
(*)802.11n的MIMO(多输⼊输出)特性,使得两对天线可以在同时同Channel上传输数据,⽽两者却能够不相互⼲扰(采⽤了OFDM特殊的调制技术)
3、术语
讲述之前,我们需要对⽆线⽹络中⼀些常⽤的术语有所了解。这⾥先列出⼀些,后⾯描述中出现的新的术语,将会在描述中解释。
(*)LAN:即局域⽹,是路由和主机组成的内部局域⽹,⼀般为有线⽹络。
(*)WAN:即⼴域⽹,是外部⼀个更⼤的局域⽹。
(*)WLAN(Wireless LAN,即⽆线局域⽹):前⾯我们说过LAN是局域⽹,其实⼤多数指的是有线⽹络中的局域⽹,⽆线⽹络中的局域⽹,⼀般⽤WLAN。
(*)AP(Access point的简称,即访问点,接⼊点):是⼀个⽆线⽹络中的特殊节点,通过这个节点,⽆线⽹络中的其它类型节点可以和⽆线⽹络外部以及内部进⾏通信。这⾥,AP和⽆线路由都在⼀台设备上(即Cisco E3000)。
(*)Station(⼯作站):表⽰连接到⽆线⽹络中的设备,这些设备通过AP,可以和内部其它设备或者⽆线⽹络外部通信。
(*)Assosiate:连接。如果⼀个Station想要加⼊到⽆线⽹络中,需要和这个⽆线⽹络中的AP关联(即Assosiate)。
(*)SSID:⽤来标识⼀个⽆线⽹络,后⾯会详细介绍,我们这⾥只需了解,每个⽆线⽹络都有它⾃⼰的SSID。
(*)BSSID:⽤来标识⼀个BSS,其格式和MAC地址⼀样,是48位的地址格式。⼀般来说,它就是所处的⽆线接⼊点的MAC地址。某种程度来说,它的作⽤和SSID类似,但是SSID是⽹络的名字,是给⼈看的,BSSID是给机器看的,BSSID类似MAC地址。
(*)BSS(Basic Service Set):由⼀组相互通信的⼯作站组成,是802.11⽆线⽹络的基本组件。主要有两种类型的IBSS和基础结构型⽹络。IBSS⼜叫ADHOC,组⽹是临时的,通信⽅式为Station<->Station,这⾥不关注这种组⽹⽅式;我们关注的基础结构形⽹络,其通信⽅式是Station<->AP<->Station,也就是所有⽆线⽹络中的设备要想通信,都得经过AP。在⽆线⽹络的基础形⽹络中,最重要的两类设备:AP和Station。
(*)DS(Distributed System):即分布式系统。分布式系统属于802.11逻辑组件,负责将帧转发⾄⽬的地址,802.11并未规定其技术细节,⼤多数商业产品以桥接引擎合分步式系统媒介共同构成分布式系统。分步式系统是接⼊点之间转发帧的⾻⼲⽹络,⼀般是以太⽹。其实,⾻⼲⽹络并不是分步系统的全部,⽽是其媒介。主要有三点:⾻⼲⽹(例如以太⽹)、桥接器(具有有线⽆线两个⽹络接⼝的接⼊点包含它)、属于⾻⼲⽹上的接⼊点所管辖的基础性⽹络的station通信(和外界或者BSS内部的station)必须经过DS、⽽外部路由只知道station的mac地址,所以也需要通过分布式系统才能知道station的具体位置并且正确送到。分步式系统中的接⼊点之间必须相互传递与之关联的⼯作站的信息,这样整个分步式系统才能知道哪个station和哪个ap关联,保证分步式系统正常⼯作(即转达给正确的station)。分步式系统也可以是使⽤⽆线媒介(WDS),不⼀定⼀定是以太⽹。总之,分步式系统⾻⼲⽹络(例如以太⽹)做为媒介,连接各个接⼊点,每个接⼊点与其内的station可构成BSS,各个接⼊点中的桥接控制器有到达⾻⼲⽹络和其内部BSS⽆线⽹的接⼝(类似两个MAC地
址),station通信需要通过分布式系统。
⼆、实践基础
============================
1、⼀些参数
(*)MAC
MAC(即Medium/MediaAccess Control, 介质访问控制),是数据链路层的⼀部分。MAC地址是烧录在
NetworkInterfaceCard(即⽹卡,简称NIC)⾥的,它也叫硬件地址,是由48位(即bit,⼀字节为8位,即1byte=8bits)16进制的数字组成。其中0-23位叫做组织唯⼀标志符(organizationally unique,简称OUI),是识别LAN(局域⽹)节点的标识(在有些抓包⼯具抓包的时候会将前三个字节映射成某种组织名称的字符,也可以选择不显⽰这种映射)。24-47位是由⼚家⾃⼰分配。
(*)SSID
表⽰⼀个⼦⽹的名字,⽆线路由通过这个名字可以为其它设备标识这个⽆线路由的⼦⽹。设备进⾏扫描的时候,就会将相应SSID扫描到,然后就能够选择相应的SSID连接到相应的⽆线⽹络(当然不扫描,理论上也可以直接指定⾃⼰事先已经知道的ssid进⾏连接)。SSID 可以和其它的重复,这样扫描的时候会看到两个同样SSID的⽆线⽹络,其实这⼀般⽤于将⼀个⽆线⽹络扩⼤的情况(毕竟⽆线路由器⽆线信号的覆盖范围是有线的):当想要扩⼤⼀个⽆线⽹络(即SSID固定)的范围的时候,可以给多个路由设置相同的SSID来达到这个⽬的。(这也是漫游的原理,漫游的时候,我们可以在远⽅或者本地都能够打电话,也就是访问移动通信⽹络)。
SSID和BSSID不⼀定⼀⼀对应,⼀个BSSID在不同的Channel上⾯可能会对应到多个SSID,但是它们在⼀个Channel是⼀⼀对应的;另外,漫游的时候,虽然SSID不变,但是BSSID⼀定是会变化的。我们经常可以看到实际数据包中的AP的MAC地址和BSSID只差⼏位,其实实际设备的MAC地址可能只有⼀个,和BSSID没什么对应关系。在⼀个包含了路由功能和AP功能的⽆线路由器(Fat AP)上⾯,很可能是:路由器有两个MAC地址,⼀个⽤于外⽹(WAN),⼀个⽤于内⽹(WLAN和LAN),⼀般路由器上⾯或者配置路由器的⽹页上⾯只标注外⽹的MAC地址;内⽹的MAC地址和外⽹MAC地址⼀般只有⼏位不同(甚⾄连续,也有些相差很多的例外)。
(*)Band(频率范围)
⼀般ap可以⽀持5g或2.4g两个频率范围段的⽆线信号。如果两者同时可以设置,⽽不是互斥那么,这个路由器还能够同时⽀持两种频段(频段即Band),这相当于这个ap可建⽴两个⽆线⽹络,它们采⽤不同的频段(这类似收⾳机在长波范围内收⾳和短波范围内收⾳)。
(*)Channel(信道)
Channel是对频段的进⼀步划分(将5G或者2.4G的频段范围再划分为⼏个⼩的频段,每个频段称作⼀个Channel),
有”5.18GHZ“,“Auto(DFS)”等等,处于不同传输信道上⾯的数据,如果信道覆盖范围没有重叠,那么不会相互⼲扰。对于信道的使⽤,在国际上有所规定。其中有些信道是⽆需授权即可直接使⽤的(究竟是那个频段的那个信道,依照各个国家⽽不同),⽆需授权使⽤的意思是,传输数据的时候(⽆论以哪种⽆线⽅式),可以让设备收发的功率导致传输时的数据进⼊该信道的频率并在该信道所在频段宽度内进⾏传输;授权的使⽤的意思是,不允许传输时使⽤授权信道进⾏,否则会违反规定,并且⼲扰该信道上其他数据的传输。另外,除了wifi,微波、红外线、蓝⽛(使⽤802.15协议)的⼯作频段也都有在2.4gHZ范围内的,所以,它们传输的时候会对wifi传输造成⼲扰,因为两者在不同的协议下进⾏通信,所以互相将对⽅传输的信号识别为噪声。有时候配置AP的时候,Channel中有⼀个类似“Auto”的选项值,这表⽰打开AP的时候,AP⾃⼰Scan周围的环境,选择⼀个⼲扰最⼩的Channel来进⾏通信,当选择好了⼀个Channel的时候,⼀般就不会改变了。
(*)Channel Width(信道宽度)
(*)Channel Width(信道宽度)
这⾥的Channel Width是信道的带宽,有”20M HZ“、”40M HZ“等,它表⽰⼀个Channel⽚段的宽度(假设5g的频段宽度总共为100M,平均划分为互不⼲扰的10个Channel,那么每个Channel的Channel Width就为100M/10=10M,实际Channel并不⼀定是完全不重叠的)。这个参数可能依赖于⼀些其它的选项,例如不是802.11N的协议,就可能不会有40M HZ的Channel Width(N模式有⼀个特点就是可以把两个Channel合并,通过提⾼ChannelWidth来提⾼吞吐量)。例如选择了"20M HZ"这个Channel Width之后,后⾯再选择⼀个“5.18GHZ”的Channel,则表⽰以5.18GHZ为中⼼的前"10M HZ"以及其后⾯的"10M HZ"频带范围被占⽤。
⾄此可知,配置⽆线AP的时候,如果屋⼦⾥⾯有很多的AP(也就是⽆线路由接⼊点)的话,仔细设置它们的Channel Width和Channel可以保证它们相互之间的⼲扰(类似收⾳机⾥⾯的串台)尽可能⼩。当然,如果相互⼲扰了,那么Net Mode所指定的协议也会有相应的处理⽅式让他们之间进⾏协调(例如让谁先通信谁等⼀会再通信之类的),但是这样⽹络的性能就不如没有⼲扰的时候好了。
(*)Wireless Security(⽆线⽹络的安全性)
这⾥主要涉及WEP、WPA、WPA2和RC4、TKIP、AES。
IEEE 802.11 所制定的是技术性标准 ,Wi-Fi 联盟所制定的是商业化标准 , ⽽ Wi-Fi 所制定的商业化标准基本上也都符合 IEEE 所制定的技术性标准。WEP 是1999年9⽉通过的 IEEE 802.11 标准的⼀部分;WPA(Wi-Fi Protected Access) 事实上就是由 Wi-Fi 联盟所制定的安全性标准 , 这个商业化标准存在的⽬的就是为了要⽀持 IEEE 802.11i 这个以技术为导向的安全性标准;⽽ WPA2 其实就是 WPA 的第⼆个版本。直观点说,WEP是较⽼的认证⽅法它有好⼏个弱点,因此在2003年被WPA淘汰,WPA⼜在2004年由完整的 IEEE
802.11i 标准(⼜称为 WPA2)所取代。
WEP(Wired Equivalent Privacy),采⽤名为RC4的RSA加密技术;WPA(Wi-Fi Protected Access) ,采⽤新的TKIP算
法,TKIP算法保留了RC4所以也有其弱点,但是这个时候更好的CCMP还没完成,所以先在WPA上⽤TKIP技术;WPA2是WPA的第2个版本,采⽤CCMP加密协定(在有些路由器等设备上设定加密协定或者加密算法的时候,可能会⽤类似AES之类的字眼替代CCMP)。所以WPA2+AES是安全性最强的。
另外,在有些⽆线⽹路设备的参数中会看到像 WPA-Enterprise / WPA2-Enterprise 以及 WPA-Personal / WPA2-Personal 的字眼 , 其实 WPA-Enterprise / WPA2-Enterprise 就是 WPA / WPA2 ;WPA-Personal / WPA2-Personal 其实就是 WPA-PSK / WPA2-PSK, 也就是以 ”pre-share key” 或 ” passphrase” 的验证 (authentication) 模式来代替 IEEE 802.1X/EAP 的验证模式
,PSK 模式下不须使⽤验证服务器 ( 例如 RADIUS Server), 所以特别适合家⽤或 SOHO 的使⽤者。
还有,wep是旧的加密⽅式,⼯作于802.11B/G模式下⽽802.11N草案并不⽀持此加密⽅式,所以如果802.11N的设备采⽤wep加密⽅式后,它也只会⼯作在802.11b/g模式下,N的性能发挥不出来。
实际中,在有些路由器上⾯,设置的时候,可能不是严格按照这个规定来设置的(例如设定了采⽤WPA⽅式,还可以选择AES),但是⼤体⼀样。
(*)Region(区域)
⼀般在⽆线⽹络中的AP上都有⼀个参数,表明它是处于哪个Region(地区)。Station根据AP中设置的Region调整其相应的发射功率以遵守该地区的规定。AP的调整过程⼀般都是⼿动设定,设置好AP所处的Region之后,这些信息就会在AP发送的Beacon帧(后⾯会说到)中包含了;通过这个AP连接到⽆线⽹络上的Station,从Beacon帧中了解到这些Region信息,并且根据这些信息中的规定和AP进⾏通信。如果AP开始设置错了,那么Station和AP通信的时候,采⽤的将会是不符合Region规定的频段,可能会对该Region中的其它传输⽹络造成⼲扰,这应当是“⾮法”的。
(*)Transmission Rate
设置传输速率。这⾥采⽤不同的⽆线⽹络传输协议(802.11a,802.11b,802.11g等),那么可以设置的速率范围有所不同,这⾥的速度是指理论的速度,实际中,由于各种⼲扰因素,传输的速率可能会⽐设置的⼩。
⾥的速度是指理论的速度,实际中,由于各种⼲扰因素,传输的速率可能会⽐设置的⼩。
⼀般⽽⾔,在⽆线⽹络中,对于某种协议的性能进⾏描述时,我们需要注意的是,描述时提到的传输速率(Datarate)和吞吐量(Throughput)是不同的。Datarate是理论上⾯最⼤数据传输速率,⽽Throughput是数据的实际最⼤吞吐量。因为⼚家以及传输时所使⽤的协议等各种因素造成的开销,会导致实际吞吐量⽐理论吞吐量要⼩,⼀般实际最⼤吞吐为理论最⼤的50%左右(⼀个不太准确但是相对直观的估计:在⽹络中,⾼清视频所需的Throughput也就30mbps左右,⽹络上⼀般的视频也就4mbps左右)。
(*)Qos(质量保证)
⽆线⽹络中的QOS是质量保证,⼤致的意思是,传输数据的时候,考虑各种因素(例如收费策略,所处地区等),以⼀定的优先级来保证传输的特定要求(⼀般就是速度),如果带宽⾜够的话,QOS反⽽不需要了。
(*)RTS Threshold / CTS Protection Mode:
这⾥的RTS是Request-To-Send的简写,CTS是Clear-To-Send的简写。设置好RTS的阈值之后,如果超过这个阈值就会在发送信息之前先发送RTS,以减少⼲扰,相应的CTS会回应之前的RTS。⼀般都是AP发送CTS数据,⽽Station发送RTS数据。
这⾥对RTS和CTS做⼀个简单解释:假设在同⼀个AP所覆盖的⽆线⽹络范围内的两个Station A和B,它们之间可能会因为距离的原因互相不可见(例如它们在AP⽹络范围的两端,⽽这两端的距离⼤于两者的信号覆盖范围),但是AP却知道它们是在⾃⼰的范围内。当⼀个A想要在AP的⽹络中进⾏通信的时候,必定要经过AP转发它的信息,由于A不知道B的存在,所以如果同时B也通过AP进⾏⽹络通信,那么会出现AP同时收到A、B两个Station的通信请求,⽽这在⽆线⽹络中是不允许的(⽆线⽹络中,同⼀时刻不能有多个⼈传输数据)。在这种情况下,B和A互相⼲扰了对⽅的通信,但是却互相不可见(不可见的节点互相被称作隐藏节点)。如果在⼀个⽹络中,这样的隐藏节点很多,那么势必会影响⽹络的性能(因为数据⼀旦发送失败,就要重传,隐藏节点会导致重传的机率增⼤)。这个时候,可采⽤RTS和CTS机制。即:在A想要通信的时候,先⼴播发送RTS给AP,告诉AP“它想要通信”,同时接受到RTS的别的Station(它们对发送RTS 的Station⽽⾔可见)会知道A将要发送数据,于是它们不会发送数据以免⼲扰A;AP收到RTS之后,会⼴播发送CTS,告诉所有在AP范围内的Station(包括对A⽽⾔的隐藏节点B)”A将要通信(同时也相当于告诉A,A可以⽆⼲扰的发送信息了)”,这样对A⽽⾔的隐藏节点B也知道有⼀个A的存在并且要发送信息了,于是B就不会⼲扰A了。这⾥,A和B两者可以在不同的⽹络上,也就是说,不同⽹络的⼯作站之间也可以通过RTS/CTS来清除相互的⼲扰。
(*)Beacon Interval:
表⽰⽆线路由定期⼴播其SSID的时间间隔。这个⼀般不会特别设置,就采⽤默认值即可。如果不⼴播了,那么Station端扫描的时候可能会发现不定期⼴播的AP对应的SSID的⽹络不见了,所以可能会断开连接。这⾥定期⼴播,表⽰AP会定时向其范围内⼴播SSID的信息,以表⽰AP的存在,这样Station进⼊⼀个区域之后,就能够通过扫描知道这个区域是否有AP的存在。当然,除了AP⼴播SSID以告知其⽆线⽹络存在之外,Station也可主动⼴播探寻包,在其能够覆盖的范围内询问是否有AP存在(即我们通常所说的扫描寻找接⼊点)。
(*)DTIM Interval:
DTIM/TIM表⽰告诉Station,AP在为Station做package buffer(例如Station睡眠的时候)的缓存时间。为了节省电池使⽤时间,处于⽆线⽹络中的Station可能会在⼀定时间之后⾃动进⼊休眠状态。这个时候,AP会为这个Station缓存发送给它的数据,⽽处于休眠状态的Station只会在⼀定时间间隔内给AP发送⼀个数据帧,以确认是否有发送给⾃⼰的数据存在。例如,当我们在主机上ping另外⼀台睡眠的机器的时候,收到另外⼀台机器响应的时间,要⽐它不睡眠的时候响应的时间长很多。
(*)Fragmentation Threshold:
表⽰⼀个package的分⽚阈值。我们可以设置分⽚⼤⼩,当发送的数据包超过这个阈值之后,802.11协议会⾃动对这个数据包进⾏分
割。如果设置的这个分⽚值越⼩,那么整个数据包越容易传输成功(因为如果出错,那么只需要传送⼀个⽚段⽽不是整个包,⽆线wifi⽹络中数据传输时出错的概率⽐有线的以太⽹要⼤的多的多),当然开销也越⼤(因为需要额外的信息标记每个分⽚,以及各个分⽚传输成功之后涉及到的重组问题)。
2、抓包
⼀般来说,我们的机器上⾯的软件抓取⽆线⽹卡上⾯的包的时候,其实这些包的⽬标地址都是这个机器的⽆线⽹卡,因为不是发给这个机器⽆线⽹卡的包都被⽹卡过滤了。所以如果我们想要抓取所处⽆线⽹络环境下所有的包的时候,需要给机器配备⼀种特殊的设备(sniffer就是嗅探器),然后再通过抓包⼯具抓取并分析。有⼀个硬件设备叫做AirPcap,就是做这个⽤的,⼤有⼏百到上千美⾦,它可以同时做为嗅探器或者⽆线⽹卡使⽤,不过做为嗅探器的时候,会抓取所有经过它的包。这个⼯具⽬前只有Windows上⾯的驱动,所以使⽤这个⼯具,只能在Windows上⾯,配合Wireshark抓包软件进⾏抓包。
这⾥假设采⽤AirPcap嗅探,Wireshark软件抓包(其它抓包软件,例如linux下⾯的tcpdump等分析类似)。不⽤图形⽅式详细展⽰具体的抓包过程以及分析⽅法了,主要说⼀下抓包(这⾥的包实际主要指的是⽹络层以下的包,更常见的称呼应该是数据帧)时候需要注意的问题。
(*)Wireshark展⽰包的时候,⼤致都是按照协议规定的字段展⽰,也些地⽅按照它⾃⼰特定的⽅式展⽰。因为这⾥着重讲述⼀些抓包时注意的基本原理上⾯的东西,所以不会对此进⾏过多阐述。⼤致就是:Wireshark软件中,对包展⽰的时候,按照协议规定的字段分别⽤Header和Body两个部分展⽰;另外,在Header之前还有两个部分是Wireshark为⽅便⽤户⽽展⽰的包的⼤⼩、时间等全局信息(例如见过表⽰这个包在B和G mode中的Channel 1时,⽤"BG1"表⽰)。所以,其实我们分析的时候,实际应该按照后⾯的Header和Body两个部分进⾏。后⾯将基于以上所述,进⾏进⼀步的讲解。
(*)抓包的时候,需要⾸先确认这个包是否是完整、正确的包。只要是校验位(checksum)不对的,就是错误的包,也⽆法确定接收的时候那⾥出了差错,所以这个包是应该忽略的,⼏乎没有分析的价值。另外,抓包的时候,由于⼲扰等原因,抓取的内容可能不是在实际传输所处的Channel上的包(例如在Channel 1上⾯嗅探,却嗅探到了Channel 2上的包)。
(*)抓取授权阶段的包,需要注意实际的授权是在后⾯进⾏的。Authentication的时候,开始阶段实际是Open的(即⽆授权),也就是说,开始实际已经建⽴好了连接,所以我们在抓包的时候,开始看到的⼀般都是通过验证,但是在后⾯紧接着采⽤了类似802.11x等安全加强的协议,来进⾏再次鉴权认证,如果这⾥⽆法通过则⽴即将已经建⽴的Association断开。这样的机制,是因为原来的802.11没有充分考虑安全才会这样的,这样也兼容了以前的802.11。
(*)抓取的包的数据,要注意这个包是否是被加过密的。根据协议标准的描述,包中如果有dataprotected字段,则表⽰这个数据本⾝是被加了密的,不知道这个数据具体是什么,当然,如果有密码,wireshark也有⼀个可以按照这个密码解密的⼯具,有时候不好⽤。这⾥所说的数据加密和⽹络的加密不⼀样,可能访问⽹络本⾝是需要密码(⽹络是security的),⽽数据本⾝没有crpted(加密)。对于⼀个加了密的数据包,我们⼀般看不出来这个包到底是做什么⽤的或者什么类型的等等。
(*)抓包的时候,要注意包中指⽰的源和⽬的地址以及包的序号。在⽆线⽹络中通信的时候,我们抓包的时候可能会看到被抓取的包对应AP的MAC地址是不存在的,其实抓包时AP的MAC是BSSID,它和实际标注的MAC地址不⼀定⼀样(但是⼀般都差不多,也就是之后最后⾯的⼏位不⼀样)。有时候,我们看到抓取的包中的MAC地址有许多只相差⼏位,那么可能它们都属于⼀个设备(因为虽然设备可能只标注了⼀个⽹卡的MAC地址,但是它却“虚拟”出或者实际有多个MAC地址),所以当我们看到包中对应两个AP的MAC地址⼏乎⼀样的时候,⼀般来说,这两个MAC地址很可能就是⼀个设备的。还有在抓包的时候,⼀个地址上⾯的包的sequence(序号)是连续的,除⾮丢包了导致重复或者缺失。如果⼀个设备虚拟出来两个地址,那么也可能由于没有经过什么处理,导致这两个地址上⾯的包共同起来是连续的(如前所述,这两个地址和MAC很接近,应该是BSSID)。
(*)抓取的数据帧如果是⼴播帧则不需要确认(ACK),如果是单播帧,则⼀般需要确认(ACK)。例如,Probe帧是⼴播帧,所以它⽆对应的ACK确认帧,对Probe的回复则叫做Probe Response;注意ACK帧本⾝⽤于确认,是单播的,但是它本⾝却不需要再被确认了。从包中的⽬的MAC地址中,可以看出这个包是⼴播/多播帧还是单播帧。MAC第⼀个字节的第⼀个位是1,表⽰组播,前两位是1表⽰⼴播,第⼀个字节第⼀个位是0表⽰单播。这⾥注意,MAC不是值,⽽是⼀个Pattern,所以没有Endian之说,也没有那个位⾼,那个MAC⼤之说。例如:“a8:27:26:....:b7”,这⾥第⼀个字节就是a8(10101000),其第⼀个字节的第⼀位就是8的最“右”位,
即“0”,所以它的第⼀个字节的第⼀个位是0,是⼀个单播地址。其实,这⾥涉及到⼤端⼩端问题,后⾯也会讲到,总之,以太⽹线路上按“Big Endian”字节序传送报⽂(也就是最⾼字节先传送),⽽⽐特序是”Little Endian”(也就是字节内最低位先传送)所以,⼀个⼗六进制表⽰法表⽰的MAC地址01-80-C2-00-00-00,传送时的bit顺序就是:1000 0000 0000 0001 0100 0011 0000 0000 0000 0000 0000 0000。
(*)使⽤Wire Shark在抓包或者显⽰包的时候,都可以设置过滤器(filter)。抓包时候设置的过滤器叫做capture filter,它是⽤BPF(berkerley package filter)这个⽐较通⽤的语⾔来描述(注意这不是Wireshark专⽤的filter语⾔,⽽是⼀个通⽤的语⾔)。但是抓包期间的过滤,有时候不准,所以我们⼀般先将所有的包抓取下来,然后⽤WireShark中显⽰的过滤器(即view filter)来显⽰我们关注的包,这⾥我们可以⽤macro来定义⽐较复杂的显⽰过滤条件。保存的时候,可以⽤按照显⽰过滤还是抓取过滤的⽅式保存内容。
(*)尽量不要抓取Channel Width为40MHZ的Channel上的帧。我们还需要注意的是,使⽤Sniffer抓取⽆线⽹络包的时
候,AirPcap⽆法正常抓取40MHZ Channel Width的包,或者说对抓取这个Channel Width上⾯的包⽀持不好。如果⾮要抓取40MHZ Channel Width的包,那么就在40或者36号Channel上⾯进⾏抓取,并在Wireshark上⾯设置“channel=36,offset+1”(平时offset 都是0),这样能够抓取 Channel Width为40MHZ的包(但是,其他Channel上⾯的40mHZ的包还是⽆法抓取),这是由AirPcap内部的芯⽚固件的问题决定的(估计broad com芯⽚公司也不愿花过多的精⼒来⽀持这个很少有⼈⽤的抓包⼯具的这个功能)。
另外,假设⼀个⽆线⼯作站是基于Android系统的(例如智能⼿机或者平板电⼦书)那么我们可以利⽤“wpa_cli status”命令来可以查看当前设备的连接的SSID,BSSID,MAC,IP等信息,(这⾥“cli”=“command line interface”)。还有更“复杂”的命
令“wc”和“wl”,其中wc是⽐较上层的命令,wl是下层的命令(是基于芯⽚是否⽀持的,例如wl在broadcom芯⽚上⽀持,但是在ti上⾯就没有了)。
三、⼀些原理
============================
1、常见的帧
在802.11中的帧有三种类型:管理帧(Management Frame,例如Beacon帧、Association帧)、控制帧(Control Frame,例如RTS帧、CTS帧、ACK帧)、数据帧(Data Frame,承载数据的载体,其中的DS字段⽤来标识⽅向很重要)。帧头部中的类型字段中会标识出该帧属于哪个字段。
(*)ACK帧
单播(unicast)帧都需要⽤ACK来确认,ACK本⾝不是⼴播帧,ACK在MAC上是unicast的,帧中有receive地址字段(⽤来标识是对谁的确认),但是它却不需要再确认了。ACK只有接收地址(receive)⽽⽆源地址(src)和序号(sequence),因为发送和接受是⼀个整体,发送之后,其他⼈(除了这个发送的接受者)都不会再发送数据了(⽆线协议中的冲突避免机制),所以接受者会发送⼀个没有src 的ack帧给receiver,⽽接收ACK的⼀端会根据这个知道它收到了⼀个ACK帧(其实根据协议,应当把发送单播帧和收到它相应的ACK看作⼀个原⼦的不可分割的整体,表⽰⼀次成功的通信)。
(*)Beacon帧
Beacon帧定时⼴播发送,主要⽤来通知⽹络AP的存在性。Station和AP建⽴Association的时候,也需要⽤到Beacon。Station可以通过Scan来扫描到Beacon,从⽽得知AP的存在,也可以在扫描的时候通过主动发送Probe来探寻AP是否存在。也就是说,建⽴Association的时候有主动的扫描或者被动的扫描两种⽅式。另外,Beacon还包含了关于Power Save、以及地区等信息。
(*)Association帧
通常Association帧都有Probe Request和相应的Probe Response。Association的Request中有其所需要的Channel以及Data Rate等状态,以便让AP决定是否让它与⾃⼰建⽴Association。⽽关联是否成功,主要是看Response中的Status code是否为Success。
(*)Data帧
Data Frame具有⽅向,这个⽅向⽤DS(分布式系统)字段来标识,以区分不同类型帧中关于地址的解析⽅式;其它的类型Frame例如Control Frame或者管理帧中,这个字段是全零。这个字段⽤两位表⽰,这两个位的含义分别表⽰“To Ds”和“From Ds”,⼤致含义如下:
(a)To DS:表⽰Station->AP,⼀般也叫Upload。
(b)From DS表⽰AP->Station,⼀般也叫Download。
这⾥,我们可以⼤致将DS看做AP,To/From是从AP的⾓度来考虑的。To DS就是让AP⼲活。另外Data Frame中还有⼀个⽐较重要的字段就是Sequence,表⽰帧的序号。重传帧序号⼀样,但是多了⼀个Retry的字段表⽰该帧是重传的。
为了便于理解,这⾥再次详细解释⼀下DS字段的含义:
To DS=0,From DS=0:表⽰Station之间的AD Hoc类似的通信,或者控制侦、管理侦。
To DS=0,From DS=1:Station接收的侦。
To DS=1,From DS = 0:Station发送的侦。
To DS=1,From DS = 1:⽆线桥接器上的数据侦。
这⾥,我们主要关注To DS和From DS分别是01和10的情况,DS虽然⼤致等于AP但是它不是AP,它其实是⼀个系统,从Station 的⾓度来看,⽐较容易理解。并且To DS和From DS⼀定是⽆线⽹络上⾯数据侦才有的字段。
2、帧和⼤端⼩端
Ethernet和802.11都是按照Little Endian的⽅式来传输数据,也就是说,⽽MAC层传输的时候,是采⽤Little Endian的⽅式,⼀个字节⼀个字节的传输的,前⾯的低位字节先传输,后⾯的⾼位字节后传输(传输单位不是按位⽽是字节);在协议标准上描述⼀个帧的时候,⼀般是先按照Little Endian的⽅式对其进⾏总体描述,然后具体细节说每个字段的值,这时候这个字段值是Big Endian⽅式表⽰的,这⼀点应当注意。
例如,协议标准中可能能对某个帧格式做如下的描述:
|b0|b1|b2|b3|b4|b5|b6|b7|b8|b9|...|...|
这⾥,最低位b0在最前⾯,所以这⾥采⽤的就是⼩端的⽅式来描述帧的总体格式信息。传输的时候,就按照这⾥的⽅式,以字节为单位向物理层进⾏传输(先传b0~b7然后b8~b16等等)。 但是,在解释这个帧的各个域的时候却采⽤⼤端的⽅式进⾏描述。假设
b3=0,b2=1,b1=0,b0=0四者共同组成⼀个名字为“FLAG”的域,那么会有类似如下的描述:
FLAG=4(即FLAG为0100):表⽰XXX。
所以,协议标准中具体描述某个域的时候,⼀般直接⽤⼤端⽅式表⽰的数值(b3b2b1b0=0100)来描述;⽽传输数据帧或者在协议标准中描述整体帧的时候,中给出的却是⼩端的⽅式(b0b1b2b3=0010)。这⾥的每个字段都是帧的⼀个部分,在管理帧(后⾯会说)中长度不固定的部分⼜叫IE(information Element) 。
另外注意,内存地址是⽤来标记每个字节的⽽不是位,所以内存⾥⾯⼤端⼩端也是以字节⽽不是位为单位的(前⾯描述“⼤端“、”⼩端”的时候却以位序⽽⾮字节序,这⼀点需要明辨,不要混淆)。假设奔腾的机器,CPU为32位,采⽤Little Endian⽅式,那么表⽰1这个int类型整数的时候,假设它在数值上是⼗六进制的"00000001",那么存放在内存中却是由低位到⾼位依次存放的,由低到⾼地址依次为:"01"、"00"、"00"、"00"(也就是说⼩端⽅式存放在内存中的时候,是按照含有最低位的字节存放在低地址,注意是字节,在内存中“位”没有地址,所以没有⼤端⼩端⼀说)。在传递帧的时候,也是按照⼀个字节⼀个字节的传输,⽽⼀个字节内部在实际上其实没有什么端的分别,但是wireshark⼀律使⽤“b7b6b5b4b3b2b1b0”这样的⽅式来⽤⼤端的⽅式显⽰。
总之,需要注意⽹络层下⾯的帧的⼤端⼩端问题(不是⽹络中的字节序,TCP/IP中规定的⽹络字节序是Big Endian),⼤致就是:协议规定,传输的时候使⽤Little Endian;标准描述的时候⽤Big Endian和Little Endian都⽤;另外,Wire shark软件抓的包中,好象全都⽤Big Endian来进⾏标⽰(⽆论是信息窗⼝还是内存窗⼝都这样展⽰)。
3、CSMA/CA的机制
与以太⽹的CSMA/CD机制(冲突检测)相对,802.11采⽤的CSMA/CA机制(冲突避免)。采⽤这个机制,可以保证每次通信的原⼦性(即每次通信所需要传输的多种不同类型的帧之间没有夹杂其它通信的帧的⼲扰),⼤体过程是:
(a)链路空闲下来之后,所有Station在发送帧之前都⾸先等待⼀段时间(即DIFS,⼜称帧间隔时间);
(b)到达DIFS之后,所有的Station进⼊竞争时间窗⼝(就是竞争期间),将这个竞争时间窗⼝分割成多个Slot(退避时间间隔),然后每个Station随机选择⼀个Slot;
(c)当某个Station到达它的Slot对应的时间之后,就开始发送数据。这⾥,选择的Slot越靠前,则表⽰Station在DIFS之后再等待的时间(退避时间)越短,也就会越早发送实际数据;
(d)退避窗⼝的Slot有多个,选择的时候,可能某个Slot被多个站点同时选取,这个时候发送会产⽣真正的数据冲突(如果多个⼈同时发送,那么它们都要经过AP来转发,AP⽆法同时听见多个⼈的“说话声⾳”)那么Station就会再重新选择并发送;
(e)当⼀个Station发送数据之后,所有Station会检测到链路忙,于是放弃尝试发送,等那个Station发送完数据之后,链路开始空闲,于是⼜进⼊到(a)重新开始这个过程。对于以上的机制,如果我们让某个Station经过DIFS之后,选择的Slot越⼩,就意味着它发送帧的机会越⼤,也就是说这个Station的优先权越⾼。这就是Qos(质量保证)的基本,前⾯也说过,Qos就是“以⼀定的优先级来保证传输的特定要求”,要获得这种优先级,就要有相应的条件(例如“花钱”)(有⼀种不常⽤的⽆竞争发送,其实就是DIFS之后,不退避⽽直接发送)。
另外,其实对物理层上来说,所有的发送都是⼴播,单播与否只是在链路层以上分辨的。上⾯提到的检测链路是否忙,可以从链路上⽤软件⽅式进⾏(例如增加帧的特殊字段),也可以直接在物理层上进⾏,实际因为在物理层上成本较⾼,经常⽤的是前者,具体参见协议。软件检测⼤致的思路就是,进⾏⼀个通信的时候,这个通信包含多个帧,每个帧有不同的作⽤,发送的第⼀帧的时候,会通过其中的某个特殊字段(Duration字段,也叫NAV,即⽹络分配向量,是⼀个延迟时间值)告诉所有其它Station,在未来的⼀段时间内,链路被占⽤,以完成整个通信过程。这样,其它Station在此期间就不会发送数据⼲扰这次通信了,以后这个通信的每⼀帧以及其ACK确认帧之间都会有⼀个很⼩的时间间隔(⼩于DIFS,即SIFS),并且每帧会视情况延长那个Duration字段,保证整个通信期间确实不会有其它⼈⼲扰,这样整个通信就是原⼦性的了。
4、帧的来源和⽬的地址
因为⽆线⽹络中没有采⽤有线电缆⽽是采⽤⽆线电波做为传输介质,所以需要将其⽹络层以下的帧格式封装的更复杂,才能像在有线⽹络那样传输数据。其中,仅从标识帧的来源和去向⽅⾯,⽆线⽹络中的帧就需要有四个地址,⽽不像以太⽹那样简单只有有两个地址(源和⽬的)。这四个地址分别是:
SRC:源地址(SA),和以太⽹中的⼀样,就是发帧的最初地址,在以太⽹和wifi中帧格式转换的时候,互相可以直接复制。
DST:⽬的地址(DA),和以太⽹中的⼀样,就是最终接受数据帧的地址,在以太⽹和wifi中帧格式转换的时候,互相可以直接复制。
TX:也就是Transmiter(TA),表⽰⽆线⽹络中⽬前实际发送帧者的地址(可能是最初发帧的⼈,也可能是转发时候的路由)。
RX:也就是Receiver(RA),表⽰⽆线⽹络中,⽬前实际接收帧者的地址(可能是最终的接收者,也可能是接收帧以便转发给接收者的ap)。
注意,其实,还有⼀个BSSID,⽤来区分不同⽹络的标识。在802.11帧中,有四个地址字段,⼀般只⽤到其中的三个,并且,这四个字段对应哪种地址或者使⽤哪些地址,根据帧中的另外⼀个DS字段以及帧的类型⽽有不同的解释。
举例:
(1)⽆线⽹络中的Station和以太⽹中的Host进⾏通信:
Station<- - - - ->AP<---------->Host
a)当Station->Host的时候:
⾸先Station->AP,这时候Src=Station,Dst=Host,Tx=Station,Rx=AP,然后AP->Host,这时候Src=Station,Dst=Host,因为AP转发的时候,是在以太⽹中,所以没有Tx和Rx。
b)当Host->Station的时候:
⾸先Host->AP,这时候Src=Host,Dst=Station,然后AP->Station,这时候,Src=Host,Dst=Station,Tx=AP,Rx=Station。
(2)⽆线⽹络中的Station之间进⾏通信:
Station1<- - - - ->AP<- - - - ->Station2
a)当Station1->Station2时
⾸先Station1->AP,Src=Station1,Dst=Station2,Tx=Station1,Rx=AP,然后AP->Station2,Src=Station1, Dst=Station2,
Tx=AP, Rx=Station2。
可见,在⽆线⽹络中,始终存在Tx和Rx,但是,这四个地址中还是只有三个地址⾜矣。
(3)当两个⽆线⽹络中的Station进⾏通信的时候:
Station1<- - - - ->AP1<- - - - ->AP2<- - - - - ->Station2
当Station1->Station2时:
⾸先Station1->AP1,Src=Station,Dst=Station2,Tx=Station1,Rx=AP1,然后AP1->AP2,Src=Station, Dst=Station2,
Tx=AP1, Rx=AP2,然后AP2->Station2,Src=Station1,Dst=Station2,Tx=AP2,Rx=Station2。
注意,这个时候,AP起到桥接的作⽤,所以四个地址各不相同,同时,AP之间或者Station和AP之间的那部分连接,也可以是以太⽹。
综上可知,⽆线⽹络中的Station想要通信,必须经过AP来进⾏“转发”,其实,Tx和Rx是⽆线⽹络中的发和收,也就是Radio;⽽Src和Dst是真正的发送源和接收者。
5、Sleep和Power save(节电)
其实,⽆线⽹络中的Power save是指Station的Sleep(睡眠),并且这个Sleep并不是整个系统的Sleep,确切来说,应该是其wifi 中Receiver(接收天线)的Sleep。Station在睡眠的期间还是可以Transmit(发送)的,只是当AP知道Station的Receiver处于Sleep状
态时,就不会给Station发送帧了。Station在Sleep之前,会给AP发送⼀个特殊的帧,告诉AP说它(Station)要睡眠了,AP通过这个帧来记住是这个Station睡眠了,然后AP就不会给这个Station单独发送数据了。
当有和这个Station通信的包想通过AP转达的给这个Station时候,AP会帮这个Station将它们缓存起来,然后在Beacon⼴播帧中添加⼀个特殊的位(实际这个位是⼀个bitmap中的位,这个bitmap表⽰所有和该AP建⽴了关联的Station,⽽这个睡眠的Station的相应位为被置1则表⽰有消息要传达给这个Station),来表⽰这个Station有数据到达了(Beacon是定时⼴播的帧,前⾯说过它是⽤来通知⽆线⽹络,这个AP的状态),⽽不是直接发送给Station。⽽这个睡眠的Station,会在睡眠期间不时地醒来,以检查Beacon帧中的状态,当发现有给它的数据的时候,就会通过发送⼀个Power Poll的帧来收取数据,收取之后继续睡眠(所以ping⼀个睡眠状态的Station,响应的时间要慢好多)。
对于发送给这个Station的⼴播帧,其处理⽅式和普通帧有⼀点不同:当有⼴播帧要传达给这个Station的时候,AP会为这个Station 缓存发送给它的⼴播帧,但是缓存的时间是DTIM(⼀般为300ms)。注意:单播帧缓存的时间不⼀定是多少,⼴播帧却缓存DTIM的时间。AP每发送⼀个Beacon的时候,都会将Dtim减少1,⽽Station睡眠的时候,会不时地醒来,查看⼀下Beacon帧中的dtim值。当Station发现其DTIM值变成0的时候,就醒来长⼀些的时间,看看有没有⼴播给它的数据,如果有的话就⽤类似Power Save Poll的帧接受,没有则继续睡眠。
这⾥,接收数据是根据是否有more data类似的字段来确认是否有更多的数据的;重发的帧是⽤类似retry的字段来标记。另外注意,当Station进⾏Sleep的时候,还是可以主动Tranmit消息的,当Station主动Transmit消息的时候,它会等待Reply,所以这个时
候,Receiver是on的状态。
可见不同状态,电源消耗状态不同(传送⽐接收更耗电),另外,如果电源供电不⾜,在某个状态中就会出现通信失败的情况。(好像ap上⾯broadcom芯⽚中的睡眠之后,醒来⽴即重新发送的时候经常开始会失败,可能就是这个原因)。
6、建⽴Association
下⾯是Station和Ap建⽴开放Association的过程:
(0)Ap周期性地⼴播Beacon帧
(1)Station⼴播Probe Request到达Ap
(2)Ap向Station发送Probe Reponse
(3)Station向Ap发送ACK
(4)Station向Ap发送Authentication Request
(5)Ap向Station发送ACK
(6)Ap向Station发送Authentication Reponse
(7)Station向Ap发送ACK
(8)Station向Ap发送Association Request
(9)Ap向Station发送ACK
(10)Ap向Station发送Association Reponse
(11)Station向Ap发送ACK
(12)Station和Ap开始相互通信。
可见,⼴播帧不⽤回复,单播帧需要⽤ACK确认,ACK本⾝不⽤被确认。
鸣谢:
https://mp.weixin.qq.com/s?__biz=Mzg4NjAxNzE4Ng==&mid=2247484822&idx=1&sn=6ccf957eebf192e80e19c7bc805e4d36&chksm=cfa1585bf8d6d14d5358580a238d79a3f40db1fd7c3b3627d9e6b2566720d037c88f2986f5fd&scene=132#wechat_redirect
物联网之Wifi协议的更多相关文章
- 7-STM32物联网开发WIFI(ESP8266)+GPRS(Air202)系统方案升级篇(TCP实现HTTP访问下载文件,明白底层如何实现的,地基稳才踏实)
看了好多文章.....唉,还是自己亲自动手用网络监控软件测试吧 先看这个节安装WEB服务器.....安装好以后就可以用HTTP访问电脑文件了 6-STM32物联网开发WIFI(ESP8266)+GPR ...
- 无线物联网中CoAP协议的研究与实现【转】
无线物联网中CoAP协议的研究与实现 时间:2013-04-09 来源:电子科技 作者:汤春明,张 荧,吴宇平 关键字:CoAP 无线 物联网 协议 摘要:由于物联网中的很多设备都是资源受 ...
- 高度集成智能家居物联网网关WiFi通信应用的无线路由模块:模小块成长记
大家好,我叫模小块,代号L107模块,出生在BOJINGnet大家庭里,我在物联网网关里不可或缺,或许业内专业人士和物联网工程师知道我的存在.别看我体积小(40mm25mm3mm),贴片式邮票孔接口( ...
- 4-STM32物联网开发WIFI(ESP8266)+GPRS(Air202)系统方案安全篇(为域名申请SSl证书)
3-STM32物联网开发WIFI(ESP8266)+GPRS(Air202)系统方案安全篇(购买域名,域名绑定IP) 然后就是等着..... 假设可以了 咱呢是配置MQTT实现SSL安全加密通信,所以 ...
- 3-STM32物联网开发WIFI(ESP8266)+GPRS(Air202)系统方案安全篇(购买域名,域名绑定IP)
2-STM32物联网开发WIFI(ESP8266)+GPRS(Air202)系统方案安全篇(监听Wi-Fi和APP的数据) 因为安全连接是和域名绑在一块的,所以需要申请域名 有没有不知道域名是什么的, ...
- 2-STM32物联网开发WIFI(ESP8266)+GPRS(Air202)系统方案安全篇(监听Wi-Fi和APP的数据)
1-STM32物联网开发WIFI(ESP8266)+GPRS(Air202)系统方案安全篇(来看一下怎么样监听网络数据,监听电脑上位机软件的数据) 因为那个软件只能监听咱自己电脑上的数据,所以咱就用电 ...
- 1-STM32物联网开发WIFI(ESP8266)+GPRS(Air202)系统方案安全篇(来看一下怎么样监听网络数据,监听电脑上位机软件的数据)
首先安装网络监听软件 运行这个软件 这个软件安装到电脑上,默认是监听咱电脑上的网络通信 咱们先监听电脑的软件的网络通信数据,然后再说怎么监听Wi-Fi和APP的软件的网络通信数据 咱就监听咱基础篇的 ...
- 4-STM32物联网开发WIFI(ESP8266)+GPRS(Air202)系统方案数据篇(云端电脑(Windows)安装配置数据库,使用本地Navicat for MySQL和手机APP 远程连接测试)
3-STM32物联网开发WIFI(ESP8266)+GPRS(Air202)系统方案数据篇(安装配置数据库,使用Navicat for MySQL和手机APP 连接测试) 根据前面的教程把软件复制到云 ...
- 3-STM32物联网开发WIFI(ESP8266)+GPRS(Air202)系统方案数据篇(安装配置数据库,使用Navicat for MySQL和手机APP 连接测试)
2-STM32物联网开发WIFI(ESP8266)+GPRS(Air202)系统方案数据篇(数据库简单说明) https://www.mysql.com/ 咱用安装版的 我把自己下载的放在了这里 现在 ...
- 2-STM32物联网开发WIFI(ESP8266)+GPRS(Air202)系统方案数据篇(数据库简单说明)
1-STM32物联网开发WIFI(ESP8266)+GPRS(Air202)系统方案数据篇(视频总揽) 这里有个教程 http://www.cnblogs.com/best/p/6517755.h ...
随机推荐
- 思科数据中心CCIE v3.0考试内容
考试内容: CCIE DC LAB V3.0 考试内容 1 Design 30 + 选择,拖图及勾选题 2 Deploy&Operate&Optimize 1 套 含3部分 备考安排: ...
- springcloud day01
单体架构:业务所有功能都在一个项目中开发,打成一个包部署 优点是架构简单 部署成本低 缺点是 耦合度高 分布式架构:根据业务功能对系统做拆分,每个业务功能模块作为一个独立的项目开发,也称为一个服务 优 ...
- mybatis中多条件模糊查询不显示数据的问题
在写查询语句时:
- TP3.2.x判断手机端访问,同一个域名在PC和手机端展示不同模板(半独立式网站)
首先介绍APP_STATUS内置常量,TP入口文件增加APP_STATUS 参数, 自动加载不同的项目配置文件,通过配置文件指向不同的模块 手机端访问时调用Wap手机模块,实现在手机端访问时展示出手 ...
- Android GNSS模块详解
1. 参考https://blog.csdn.net/yang_mao_shan/category_12133410.html GNSS 架构是从 应用层 ---> 通过原生 jar 包 --- ...
- 51电子-STC89C51开发板:程序烧录(刷写) 到 IC 设置
全部内容,请点击: 51电子-STC89C51开发板:<目录> --------------------------- 正文开始 --------------------------- ...
- Docker CLI docker attach 常用命令
Docker 是一个开源的应用容器引擎,让开发者可以打包他们的应用以及依赖包到一个可移植的镜像中,然后发布到任何流行的 Linux或Windows操作系统的机器上,也可以实现虚拟化.Docker是内核 ...
- MyBatis_06(自定义映射resultMap)
主题:自定义映射resultMap "自定义映射resultMap",可以解决什么问题: 1-"属性" 和 "字段名" 不一致的情况 2-& ...
- MySQL连接提示 public key retrieval is not allowed
使用DBeaver连接mysql数据提示public key retrieval is not allowed 修改DBeaver的驱动属性中的allowPublicKeyRetrieval
- cloudreve webdav 无法连接问题
从Windows Vista起,微软就禁用了http形式的基本WebDAV验证形式(KB841215),必须使用https连接,所以在Windows Vista/7/8/10中,要方便地映射网盘文件为 ...