實驗一 連結上網---尋找基地台

[實驗目的]

    學習連結上網過程中的第一個步驟---尋找基地台的過程。在這個過程中若是行動主機採用被動找尋基地台的方式,則是採用聽取基地台所發出的訊標(Beacon),分析訊標內容已瞭解行動主機附近的基地台資訊;若是行動主機採用主動尋找基地台的方式,則是行動主機會送出Probe Request訊框,附近的基地台收到後,會回應Probe Response,透過Probe Response,行動主就就能瞭解附近的基地台資訊。

 

[測試環境]

    Mininet-WIFI是一個無線網路仿真器(Emulator),允許使用者採用軟體的方式建置所需要的無線網路,可以建構成具有基礎架構的無線網路(Infrastructure Mode,包含基地台和行動主機)或者是無線隨意網路(AdHoc Mode,只有行動主機)。非常的方便,只需要全軟體的操作,不需要額外再購買其他的硬體。本實驗內容當中的指定操作部份,也同樣適用於實機操作。

    Mininet-WIFI Github網站https://github.com/intrig-unicamp/mininet-wifi,使用者只需先安裝一台Linux機器,然後使用下列指令安裝,便可使用。

step 1: $ sudo apt-get install git
step 2: $ git clone 
https://github.com/intrig-unicamp/mininet-wifi
step 3: $ cd mininet-wifi
step 4: $ sudo util/install.sh -Wnfv

 

[背景知識]

    行動主機與基地台連結的程序包含(1)找尋基地台(2)身份認證(3)系統連結這三個主要步驟。其中第一個步驟又分成主動找尋基地台方式被動找尋基地台方式,主動找尋基地台主要是透過行動主機送出Probe Request,而基地台回應Probe Response來通知行動主機基地台的一些資訊。Probe Request的訊框格式如下圖所示。在frame control中的type會為00subtype=0100表示試探要求(Probe Request)。而在Frame Body中,SSID通常會被設為 0以表示這是一個廣播,但不是每個Probe Request都一定會把SSID設為0,如果工作站事先知道,就會直接填入SSID的名稱;而Supported Rates則分為一定要支援的速率與可選擇的速率,若工作站無法支援所有基地台所要求強制支援速率,就沒辦法加入該基地台。

 

IEEE 802.11 MAC訊框格式:

http://csie.nqu.edu.tw/smallko/wireless/lab1.files/image002.gif 

 

Probe Response的訊框格式如下圖所示。

當基地台收到Probe Request的時候,會使用Unicast的方式回應發出Probe Request的行動主機。

fig3

 

被動尋找基地台的方式就是行動主機被動的等待訊標(Beacon)訊框,然後再加入,其訊框格式如下圖所示。在Frame BodyTimestamp是用來讓相同Basic Service Set的行動主機作同步用,其單位為micro-secondBeacon Interval是表示多久時間基地台會送出一次訊標,其一個單位時間是1024 micro-second,目前大部份基地台的內定設定值為100,也就是相當於1024 micro-second * 100 =0.1024秒。

fig4

 

Capability Info中的ESS/IBSS則是用來顯示目前無線網路的環境模式設定,如果現在是infrastructure modeESS會設為1IBSS會設為0;如果現在是Ad Hoc mode ESS會設為0IBSS會設為1。其他在Capability Info的欄位先暫時不討論。

fig5

 

回到Frame Body中的SSID,此欄位又分三個子欄位,第一個子欄位Element ID0,用以表示為服務組編號(SSID),第二個子欄位為文字字串長度,第三個子欄位為SSID字串內容,舉例來說,如果我們設定基地台的SSIDSMC,則此SSID欄位就會用00 03 53 4D 43表示,其中00表式服務組編號,03表示後面有三個字母,53ASCII中表示S4D表示M43表是C,所以 行動主機藉由分析此欄位就可以得知有一台名叫SMC的基地台在附近。

fig6

 

另外一些常見的Element ID的值和其意思可以參照下面的圖。

fig7

 

支援速率(Supported Rate)Element ID的值是1Length表示後面共有幾個位元組是有被支援的速率(每個位元組代表一個支援的速率),每個位元組會再細分成1+7bits,最左邊的那1bit 表示速率是否一定要支援,如果是強制要支援則會設為1,不一定要強制就設為0,另外的bits就是速率的值,每個單位就是500kbps,所以若值是2就表是1Mbps (500*2=1000kbps=1Mbps) ,如果是4就是2Mpbs,如果是11就是5.5Mbps,如果是22就是11Mbps(這樣的解釋雖然跟下圖圖示有所出入,但這樣的分析方法比較簡單易懂)

temp11

 

(其他Element ID有遇到時再進一步解式)

 

[實驗環境]

   我們使用script去建立一個簡單的無線網路環境,包含了一個AP和兩個stations.底下的程式碼中,使用net.addStation去增加一台station,並設定其IP位址;使用net.addBaseStation去增加一台AP,並設定其ssid名稱,使用的模式和傳輸通道;由於mininet-wifi可以撰寫不同的控制程式碼來控制基地台,但目前的實驗並無特殊需求,所以就使用預設的控制器,AP就只是單純的AP,沒有別的特殊功能;另外使用addLinkstationap連結起來。

#!/usr/bin/python

 

"""

This example shows how to work with different APs

"""

from mininet.net import Mininet

from mininet.node import  Controller, OVSKernelSwitch

from mininet.cli import CLI

from mininet.log import setLogLevel

from mininet.link import TCLink

 

def topology():

    "Create a network."

    net = Mininet( controller=Controller, link=TCLink, switch=OVSKernelSwitch )

 

    print "*** Creating nodes"

    sta1 = net.addStation( 'sta1', ip="192.168.0.1" )

    sta2 = net.addStation( 'sta2', ip="192.168.0.2" )

    ap1 = net.addBaseStation( 'ap1', ssid="ssid_1", mode="g", channel="1" )

    c0 = net.addController('c0', controller=Controller, ip='127.0.0.1', port=6633 )

 

    print "*** Adding Link"

    net.addLink(sta1, ap1)

    net.addLink(sta2, ap1)

 

    print "*** Starting network"

    net.build()

    c0.start()

    ap1.start( [c0] )

 

    print "*** Running CLI"

    CLI( net )

 

    print "*** Stopping network"

    net.stop()

 

if __name__ == '__main__':

    setLogLevel( 'info' )

    topology()

 

[實驗步驟]

(被動式等待Beacon,已瞭解基地台資訊)

1.開一新視窗,執行script

 

2.使用xterm開啟ap1的視窗。

 

3.ap1的視窗中,啟動hwsim0這個介面

 

4.ap1的視窗中,執行wireshark,並選擇hwsim0作為監聽的介面

 

5.按下start開始抓取無線網路封包。

 

6.接著我們就開始針對所抓取到的Beacon Frame來作分析。

首先,我們先觀察抓取封包的MAC header前兩個bytes資料(80 00),這兩個bytes在解讀的時候,要做順序的顛倒,也就是要解讀成0x0080,且轉換成二進制資料時,值為00000000 10000000,同時MSB在最左邊,LSB在最右邊,這邊是要特別留意的。根據IEEE 802.11 MAC格式,最右邊2bit為版本(值為00),下一個欄位為型態,長度為兩個bits(值為00),型態00表示管理類型的訊框(management frame),型態01表示控制類型的訊框(control frame),型態10表示資料類型的訊框(data frame),下一個欄位為子型態,長度共4bit,表是為子型態(值為1000),根據管理類型的訊框,若棋子型態的值為0000,表示為連結要求(association request),0001表示為連結回應(association response),0010為重新連結要求(reassociation request),0011表示重新連結回應(reassociation response),0100為試探要求(probe request),0101為試探回應(probe response),1000為訊標(Beacon),所以根據其訊框的內容,此訊框為訊標(因為型態為00,子型態為1000)

 

 

另外關於flags的值都是為0,其解釋就如下圖所示。如此訊框不是來自DS,也不是要去DS,沒有其他的片段資料,沒有重傳過,沒有做電源管理,沒有加密等等。

 

 

下一個欄位是持續時間(duration),這個欄位主要是要做network allocation vector(NAV),beacon不需要,所以其值為00 00,長度為兩個bytes

 

 

infrastructure mode,會用到三個位址,Addr1為接收端位址或目的地位址(Receiver Address or Destination Address),Addr2為傳送端位址或來源端位址(Transmitter Address or Source Address),Addr3BSSID。從下面可以得知訊標的Receiver Addressff:ff:ff:ff:ff:ff(廣播位址)

 

 

Transmitter address02:00:00:00:02:00,這也是基地台的MAC address

 

 

基地台的網卡位址可以從下圖看出來是02:00:00:00:02:00,其介面為ap1-wlan0

 

 

最後的addr3BSSID,通常也是基地台的MAC address,所以也是02:00:00:00:02:00

 

 

最後Sequence Control欄位包含了Fragment numberSequence number。在Beacon中這個欄位的值為0

 

 

接著,根據Beacon的格式,我們將要進入分析訊框主體的部分(Frame Body)。這個主體包含了fixed parameters。部分和tagged parameters部分。

Fixed parameters包含了timestamp,其長度為8bytes,以底下的例子,其值為04 14 ed f9 33 25 05 00timestamp主要是要讓相同的BSS工作站做同步用(synchronization)

下一個欄位為訊標區間(beacon interval),也就是基地台多久會送出beacon,其值為64 00,但要解讀為0x0064,也就是十進位的100,一個單位為1024 micro-second,100個單位就表示約0.1秒會送出去一個beacon。第三個欄位為性能資訊(capabilities information)

 

 

最後分析Tagged parameters部分,這部分主要都是採用TLV編碼方式,T就是類型(Type),L是長度(Length),V是值(Value)。以底下的例子,00 06 73 73 69 64 5f 31這樣的編碼,其解讀是00表示這是SSID的名稱,06表示其SSID的名稱為6bytes,73ascii編碼的s,69i,64d,5f_,31是數字的1,所以SSID的名稱就是"ssid_1",這也是我們在mininet-wifiap設定的SSID名稱。

 

 

接著,是關於此基地台支援的傳輸速度,01表示supported rates,08表示有八種支援的速度,第一個82(二進制為10000010,最左邊的bit表示一定要支援,後面的七個bits表示支援的速度,每一個單位為500bps),所以2就表示500x2 = 1Mbps,第二個是84(表示500x4=2Mbps),第三個是8b(表示500x11=5.5Mbps),第四個是96(表示500x22=11Mbps),第五個是0C(00001100,第一個bit0,表示不一定支援,500x12=6Mbps),第六個是12(表示500x18=9Mbps),第七個是18(表示500x24=12Mbps),第八個是24(表示500x36=18Mbps)

 

 

接著03表示AP要使用的通道,此例子中值為01,表示AP是使用channel 1

 

其他的部分先不解析,等有需要的時候再看。

 

(主動式發送Probe Request,等待附近基地台Probe Response,瞭解基地台資訊)

1.請重複之前的步驟1~5

2.開一新視窗,執行底下的指令,讓行動主機送出Probe Request

 

3.wireshark視窗中, Display Filter輸入(wlan.fc.type_subtype == 0x04)  or (wlan.fc.type_subtype == 0x05) 以篩選出Probe RequestProbe Response的封包,其中subtype=0x04Probe Requestsubypte=0x05Probe Response)

 

4.Probe Request的分析大致上都跟Beacon類似,差別是在subtype, Probe Request值為0x04

 

5. Probe Request的分析大致上都跟Beacon類似,差別是在subtype, Probe Response值為0x05

 

[參考資料]

1.    簡榮宏,廖冠雄,”無線區域網路”,全華科技圖書股份有限公司

2.    http://www.amilabs.com/HTM/HTM80211.pdf

3.  https://supportforums.cisco.com/document/101431/80211-sniffer-capture-analysis-management-frames-and-open-auth

 

 

Dr. Chih-Heng Ke (smallko@gmail.com)

Department of Computer Science and Information Engineering,

National Quemoy University, Kinmen, Taiwan.