WIFI基本知識整理 linux
這裏對wifi的802.11協議中比較常見的知識作一個基本的總結和整理,便於後續的學習。由於無線網絡中涉及術語不少,而且許多協議都是用英文描述,因此有些地方翻譯出來會有歧義,這種狀況就直接英文來描述了。算法
主要內容:緩存
1、基本概述安全
2、實踐基礎服務器
3、一些原理網絡
4、補充併發
5、其它less
1、基本概述tcp
============================分佈式
一、有線和無線網絡
目前有線網絡中最著名的是以太網(Ethenet),可是無線網絡WLAN是一個頗有前景的發展領域,雖然可能不會徹底取代以太網,可是它正擁有愈來愈多的用戶,無線網絡中最有前景的是Wifi。本文介紹無線網絡相關內容。
無線網絡相比有線網絡,仍是有許多的缺點的:
(*)通訊雙方由於是經過無線進行通訊,因此通訊以前須要創建鏈接;而有線網絡就直接用線纜鏈接,不用這個過程了。
(*)通訊雙方通訊方式是半雙工的通訊方式;而有線網絡能夠是全雙工。
(*)通訊時在網絡層如下出錯的機率很是高,因此幀的重傳機率很大,須要在網絡層之下的協議添加劇傳的機制(不能只依賴上面TCP/IP的延時等待重傳等開銷來保證);而有線網絡出錯機率很是小,無需在網絡層有如此複雜的機制。
(*)數據是在無線環境下進行的,因此抓包很是容易,存在安全隱患。
(*)由於收發無線信號,因此功耗較大,對電池來講是一個考驗。
(*)相對有線網絡吞吐量低,這一點正在逐步改善,802.11n協議能夠達到600Mbps的吞吐量。
二、協議
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。
(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特殊的調製技術)
三、術語
講述以前,咱們須要對無線網絡中一些經常使用的術語有所瞭解。這裏先列出一些,後面描述中出現的新的術語,將會在描述中解釋。
(*)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通訊須要經過分佈式系統。
2、實踐基礎
============================
一、一些參數
(*)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是信道的帶寬,有」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和RC四、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網絡中數據傳輸時出錯的機率比有線的以太網要大的多的多),固然開銷也越大(由於須要額外的信息標記每一個分片,以及各個分片傳輸成功以後涉及到的重組問題)。
二、抓包
通常來講,咱們的機器上面的軟件抓取無線網卡上面的包的時候,其實這些包的目標地址都是這個機器的無線網卡,由於不是發給這個機器無線網卡的包都被網卡過濾了。因此若是咱們想要抓取所處無線網絡環境下全部的包的時候,須要給機器配備一種特殊的設備(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上面就沒有了)。
3、一些原理
============================
一、常見的幀
在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必定是無線網絡上面數據偵纔有的字段。
二、幀和大端小端
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來進行標示(不管是信息窗口仍是內存窗口都這樣展現)。
三、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字段,保證整個通訊期間確實不會有其它人干擾,這樣整個通訊就是原子性的了。
四、幀的來源和目的地址
由於無線網絡中沒有采用有線電纜而是採用無線電波作爲傳輸介質,因此須要將其網絡層如下的幀格式封裝的更復雜,才能像在有線網絡那樣傳輸數據。其中,僅從標識幀的來源和去向方面,無線網絡中的幀就須要有四個地址,而不像以太網那樣簡單隻有有兩個地址(源和目的)。這四個地址分別是:
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是真正的發送源和接收者。
五、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的狀態。用一個圖示來標識Sleep,Receive,Transmit時的電源消耗情況,大體以下:
power
^
trans | ------------------------
| | |
receive | -----------| |
| | |
sleep |--------| |--------------------
|----------------------------------------------------------------------> time
可見不一樣狀態,電源消耗狀態不一樣(傳送比接收更耗電),另外,若是電源供電不足,在某個狀態中就會出現通訊失敗的狀況。(好像ap上面broadcom芯片中的睡眠以後,醒來當即從新發送的時候常常開始會失敗,可能就是這個緣由)。
六、創建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自己不用被確認。
4、補充
============================
有待添加。
5、其它
============================
本文內容主要來自學習的總結以及網絡,主要集中於無線網絡中物理層以上相對比較常見的部分,若是想要理解更詳細和全面的內容則需參考相關書籍以及網絡協議。因爲對此方面的知識也是在初步學習之中,若文章中有錯誤和不完整之處,謝謝讀者指正。^_^