王新峰 曾明星
(吉首大學軟件學院 湖南 張家界 427000)
在今天,用戶走在任何地方都可以將手機、PAD等設備接入網絡,而這背后都是無線局域網(WLAN)的功勞。WLAN是一種無線通信方式,一般由接入控制器AC(Access Controller)和無線接入點AP(Access Point)組成。早期WLAN只有AP部分,所有的802.11功能,即802.11物理層和媒體接入控制(MAC)功能,都實現在AP中。在這種WLAN結構中,必須對接入點進行單個管理,而且不易實施負載平衡控制,也不可能根據話音之類的實時應用需求執行快速切換等,上述因素決定了這種網絡不適宜于大規模的部署。后來采用的AC+AP結構是WLAN 的最佳結構,在這種結構中,存在一個集中式的設備——接入控制器(AC)或者WLAN Switch。它利用一個或多個集中式設備來對接入點進行管理、控制和配置,將802.11 的功能實現在接入點和集中式設備之間,使其具有很好的管理性和擴展性,是當前WLAN的主流結構,如圖1所示,無線客戶端STA(Station)如:手機、PAD等通過AP接入網絡。

圖1 典型WLAN結構
WLAN的初衷是針對家庭、小辦公室應用,因為無線AP的覆蓋范圍是有限的,AP的覆蓋范圍和其提供的接入速率是緊密相關的,STA距離AP越遠,AP提供的接入速率越低,如圖2所示。

圖2 距離與接入速度關系圖
要大范圍覆蓋無線網絡,只能通過安裝多個AP實現,如圖3所示,STA從AP3范圍移動到AP1范圍再關聯到AP1時會斷線,這在WLAN網絡早期人們是可以接受的。

圖3 大范圍內AP覆蓋場景
隨著無線網絡應用的逐步擴大,用戶對訪問網絡的移動性要求越來越高。即用戶希望能夠邊移動邊正常使用網絡,這對現有的技術提出了極大的挑戰。如何有效地滿足用戶在使用無線WLAN網絡時的快速無縫漫游問題,成為亟待解決的問題。
漫游是指 STA在移動到兩個BSS基礎服務集(Basic Service Set,俗稱WIFI名)覆蓋范圍的臨界處時,STA與新AP重新關聯并與原AP斷開關聯的過程,整個漫游過程中STA的IP地址和訪問域保持不變。對于用戶來說,漫游的行為通常是透明的無縫漫游,即用戶及其使用的應用程序,不會感知到漫游的發生。
根據STA漫游前后所涉及的AC,可以將漫游分為AC內漫游和AC間漫游。
AC內漫游:針對小范圍WLAN覆蓋場景,AP數量少且全部由一臺AC控制,STA漫游前后所關聯的AP都在同一AC控制下,如圖4所示,STA從原來所在的AP1范圍移動進入AP2的范圍。

圖4 AC內漫游
AC間漫游:是針對大范圍WLAN覆蓋場景,整個網絡中有多個AC,每個AC下連多個AP,STA漫游前后所關聯的AP歸屬于不同的AC控制,如圖5所示,圖中虛線代表STA漫游方向從AP1漫游到AP2。

圖5 AC間漫游
漫游是STA與新AP重新關聯并與原AP斷開關聯的過程,要實現漫游需要先了解STA正常的關聯以及各模塊的功能。
AC:負責AP和STA的管理,當有STA從AP接入時存儲STA相關的信息(有MAC、IP、接入AP、QoS、Security等),以及負責數據的控制和轉發。
AP:發送BSS讓STA接入,有STA接入后負責在AC與STA之間傳遞數據。AP形象點描述就像一座橋連接AC與STA,只傳遞數據不處理數據。
STA:發出關聯請求和重關聯請求,關聯上AC后即可為用戶獲取網絡數據。關聯請求是STA正常關聯AP的請求,而重關聯請求是當STA已關聯上AP后,發現有相同名稱且信號更好的BSS服務時發出的請求。正是由于重關聯請求的存在,才有了漫游實現的可能。
STA正常上線過程會涉及到很多模塊如快速轉發、安全模塊和AP模塊(為了只關注漫游,這些模塊只簡單列出幾個描述)等,最終建立了STA信息,如圖6所示。整個STA上線建立所有相關模塊信息的時間大致是幾百毫秒,由于是第一次上線,這個時間用戶是可接受的。當用戶從當前AP覆蓋范圍進入到另一個AP的范圍時,會發送重關聯請求,在沒有漫游機制的情況下,這時AC的處理跟正常處理一致,會重新建立一個新的STA信息同時把相關模塊的數據更新,而這個過程耗時跟之前一樣也是幾百毫秒,在這個時間內用戶的網絡會斷開,嚴重影響用戶體驗,這正是問題之所在。

圖6 STA正常關聯過程圖
漫游的目標是讓用戶對漫游過程無感知,用戶無感知即對用戶使用的網絡通信無影響,對于像VoWLAN這樣的對實時性要求很高的應用來說,切換時,用戶數據通信中斷的時間必須少于50 ms(人耳能感覺到的時間間隔),因此漫游過程耗時必須小于50 ms。而正常關聯過程涉及眾多模塊耗時幾百毫秒,遠大于50 ms,這就是需要解決的問題。
當STA發生漫游時,更新各模塊相關的數據耗時幾百毫秒,如果不更新數據就無耗時,這里引入一種機制“欺騙”各個相關模塊,讓它們以為STA漫游前后并沒有什么變化,并將實現該機制的功能叫漫游模塊。
用戶對漫游無感知的本質是漫游前后用戶與網絡通信數據正常,因此必須分析漫游前后STA通信數據的上下行通道,數據上行是指STA通過AC把數據發送到網絡,下行是指AC從網絡接受數據發送到STA,通俗講上下行就是STA上網數據傳輸過程。圖7描述了一個最簡單的漫游過程對比,STA從圖中AP1漫游到AP2,圖中雙向箭頭線代表數據上下行的傳輸通路,其中虛線是漫游前的,實線是漫游后的。下面是漫游前后相同與不同點對比:
1) 相同點:STA上下行數據傳輸還是由AC來轉發,對于網絡來說STA是通過AP1還是通過AP2傳輸數據是不用關心的。
2) 不同點:漫游前下行的數據需要AC通過各模塊檢測后從AP1傳到STA,漫游后需要把下行數據通過AP2傳到STA。漫游前上行數據是STA通過AP1上傳到AC經各模塊檢測后上傳到網絡,漫游后是通過AP2上傳到AC的。

圖7 漫游前后STA上下行數據傳輸通道圖
漫游模塊的工作原理是建立一個模塊用來“欺騙”AC上各模塊,如圖8所示,其中雙向箭頭代表數據數。

圖8 漫游模塊功能圖
增加漫游模塊后,當STA從AP1漫游到AP2,漫游模塊處理如下:
1) STA上行數據通過AP2到達AC時,漫游模塊最先接收數據將數據來源從AP2改成AP1,這樣其他上層模塊會以為數據還是從AP1傳上來的。
2) 網絡下行數據通過AC各模塊后準備發往AP1到STA時(因為其他模塊還認為STA是關聯在AP1上),漫游模塊最后處理數據將AP1改成AP2發到STA。
這樣就達到了“欺騙”各模塊的效果,除了漫游模塊感知了STA漫游,其他所有模塊都不變。
漫游模塊由三部分組成:漫游組、MTI隧道(AC間通信專用隧道)以及漫游表。漫游表是AC內與AC間漫游都需要的關鍵部分,漫游組與MTI隧道兩個部分只是為AC間漫游服務。如果網絡環境較小只需要實現AC內漫游,則只需增加漫游表這部分功能。
對于AC內漫游,STA漫游前后所有信息都在同一個AC,此時漫游模塊對其他模塊進行“欺騙”是很容易的,只需要建立一個漫游表,表里存儲每個漫游STA的狀態信息,包括:STA的MAC地址、STA的用戶狀態、STA關聯的WLAN ID、正常關聯時關聯的CTI(AC與AP通信的通道)端口索引和漫游后關聯的CTI端口索引、STA在AC上的狀態,如表1所示。

表1 漫游表
當STA發送重關聯請求時,漫游模塊可以查詢到之前STA關聯的信息,再通過重關聯幀獲取到漫游后的AP信息,最后建立漫游表。
下面通過一個簡單的示例來講解下漫游表的作用,圖9所示為一個AC內漫游,圖內右邊是漫游表,當漫游發生后數據的上下行傳輸如下。
1) 下行:網絡有數據要下行到STA,漫游模塊接手數據查詢漫游表,發現是一個漫游用戶,將傳輸接口從CTI 1改成CTI 2,這樣數據就到達AP2然后傳給了STA,下行數據通暢。
2) 上行:STA發送數據上行到網絡,漫游模塊接到從AP2傳上來的STA數據,查看發現是漫游STA,將CTI 2改成CTI 1,其他模塊依然認為數據從CTI1上來,通過各模塊檢查安全傳輸到網絡,上行數據通暢。
當STA漫游后數據依然能上下行通暢,證明聯網正常,同時其他模塊又對漫游前后無感知,證明此方案可行。

圖9 漫游表工作圖
由于AC關聯的漫游STA數量可能較大,同時每個STA的每個數據包都需要經過漫游模塊進行檢查修改,這時快速定位到漫游表中的STA是必須考慮的現實問題。在眾多數據結構中HASH表是能直接定位的存儲結構,所以使用HASH表來維護STA狀態數據庫,使用介質接入控制MAC(每個STA的MAC是唯一的)來生成hash索引,對于極少的hash沖突的STA狀態信息通過鏈表進行維護,具體參見圖10。

圖10 漫游表中STA狀態信息存儲圖
漫游模塊處理AC內漫游很容易,而AC間漫游處理起來就比較復雜了,因為漫游前后STA關聯的AC是不同的,STA漫游關聯到的AC2如何知道漫游前AC1的信息呢?解決辦法是信息共享。用戶的漫游范圍不能無限擴大,為了對用戶漫游范圍進行控制,同時達到共享目的,將一組可進行STA信息數據同步的控制器,稱為一個漫游組。通過創建一個漫游組,使得同一個組內的各個控制器能互相分享用戶的相關信息,達到快速漫游的目的。圖11[2]顯示了一個漫游組的拓撲情況。圖中三個AC分別為ControllerA、ControllerB、ControllerC,每個AC上建立了一個漫游組,記錄組內的其他成員AC。

圖11 漫游組圖
漫游組的工作機制是當一個STA先關聯在ControllerA,之后漫游到ControllerB,此時ControllerB可以在漫游組內詢問:這個STA是否之前關聯漫游組內的AC上,ControllerA接受到詢問后,告訴ControllerB此STA信息,這樣漫游前后STA的信息雙方都知道了。有了信息漫游模塊就可以對其他模塊進行“欺騙”,因此在沒有漫游組的不同AC之間無法進行漫游。
漫游組必須在AC上手動創建,通過漫游組的名字來區分不同的漫游組。實際應用中不可能無限擴大漫游范圍,因此設置每個AC可配置最多8個漫游組,每個組內最多24個成員,用于不同需要。每個漫游組至少需要包括以下信息:漫游組的名字、漫游組ID、漫游組是否有效、數據通道保活報文發送間隔、數據通道保活報文接收閥值、漫游組內的成員數等。每個漫游成員至少需要保存如下信息:漫游成員的IP地址、成員是否有效、對應MTI端口的相關信息、MTI數據/控制通道狀態、數據通道保活報文接收失敗次數等。
漫游組和漫游組成員信息在AC內的存儲方式為數組方式,因為漫游組和漫游組成員少,并且在實際環境中,漫游可能會較為頻繁地發生,也可能會經常需要訪問漫游組內漫游成員的信息,如果用鏈表來維護,就需要對鏈表本身進行額外的保護,這樣操作就會變得較為復雜。這里采用數組的方式進行操作較為簡便,如圖12所示。

圖12 漫游組數據結構存儲圖
漫游組內不同AC之間需要共享信息,還要傳遞STA通信數據,因此需要建立一個專門的通信隧道MTI。MTI類似于CTI通道,使得漫游模塊在建立相同的漫游表時可處理兩種漫游。圖13為AC間漫游,STA從AC1漫游到AC2的AP2,數據的上下行傳輸過程。
1) 下行:網絡有數據要下行到STA,漫游模塊接手數據時查看漫游表,發現是一個漫游用戶,于是將傳輸接口從CTI 1改成MTI 1,這樣數據就到達AC2,之后AC2上的漫游模塊將MTI 2改成CTI 2,數據由AP2下發給STA,下行數據通暢。
2) 上行:STA發送數據上行到網絡,AC2上漫游模塊接到從AP2傳上來的STA數據,查看發現是漫游STA,將CTI 2改成MTI 2,數據由MTI隧道傳到AC1,AC1上漫游模塊接收到數據后將MTI 1改為CTI 1,上傳到網絡。其他模塊依然認為數據從CTI 1上來,通過檢查傳輸到網絡,上行數據通暢。

圖13 MTI隧道展示圖
(1) MTI隧道的建立 當為漫游組配置了漫游成員AC之后,創建對應的MTI端口,并且當數據通道打通后將MTI端口狀態UP。當數據通道不通的時候將MTI端口的狀態置為DOWN,當漫游組中的漫游成員被刪除的時候,將其對應的MTI端口刪除。
雖然漫游組中的各成員AC之間是對等的,但是在控制通道中需要將MTI連接的AC分為Server和Client。為了使不同AC都能得到同樣的結果,所以通過比較AC的管理IP地址來確定AC間的C/S關系:MTI 2端AC中IP地址的二進制值較小的作為Server,較大的作為Client。
(2) MTI隧道的保活 MTI隧道會因為各種異常斷開,為了及時檢測隧道是否正常,需要對隧道進行從中保活,做法是通過keepalive報文來實現。Keepalive報文需要分為request報文和response報文。其中keepalive request報文由Client端主動發出,根據配置的保活時間,每個一定時間發出。而keepalive response是Server端收到request后才進行回復。當Server端在連續若干個保活周期(周期個數通過CLI來修改)內都沒有收到Client端的keepalive request報文,那Server端就認為數據通道已經不通,將數據通道狀態改為down。而Client端如果在連續若干個保活周期(周期個數通過CLI來修改)內都沒有收到keepalive response報文,那么Client端就認為數據通道已經不通,將MTI隧道狀態改為down。
漫游模塊由三部分組成,工作原理并不復雜。可實際環境中漫游過程是非常復雜的,會出現先AC內漫游再轉到AC間漫游、AC間漫游轉AC間漫游等復雜的情況。為了證明漫游模塊能滿足復雜多變的實際應用,需要對STA的各種漫游場景進行分析。
STA在發生漫游時,對不同AC來說意義不一樣,為了方便討論,先列出4種AC上STA狀態:
NC(普通用戶):正常關聯到AC上,無漫游。
LRC(本地漫游或稱AC內漫游用戶):STA在AC內漫游。
RIC(漫入用戶):STA發生AC間漫游,從別的AC漫游到本AC。
ROC(漫出用戶):STA從本AC漫游出到別的AC。
由于需要保持STA在整個多次的漫游過程中IP地址和訪問域不變,必須關注STA最開始關聯的AC/AP,只有這樣才能確定STA的訪問域;同時需要關注STA漫游后當前關聯的AC/AP,只有知道了當前的位置,才能使做相應操作時STA在當前位置上保持原有的訪問域不變;最后,還需要關注STA在本次漫游之前關聯的AC/AP,因為該位置上可能保存有前一次漫游時候的相關信息,而這些信息需要更新或刪除。
因此確定STA的漫游情況,需要且只需要知道3個位置:STA正常加入的AC/AP、本次漫游行為之前關聯的AC/AP、當前也就是本次漫游后關聯的AC/AP。因為只要3個AC/AP位置就能表述STA的漫游所有場景,所以可以通過一個總共有3臺AC,每臺AC下聯3臺AP的模型來對所有可能的情況進行表述。
下面對可能的各種情況進行討論。為了便于討論,假設當前的場景中有3臺AC:AC0、AC1、AC2,每臺AC各下聯有3臺AP:AP0、AP1、AP2,如圖14所示。當STA關聯到ACx下的APy時,用(x,y)來表示STA當前關聯的位置,表格中描述的STA在AC上的用戶狀態。
鑒于篇幅的限度及漫游場景的相似性,下面只對最常見的6種漫游場景進行詳細分析。
? 場景1:AC內一次漫游(見圖14)

圖14 AC內一次漫游示意圖
漫游前STA是與AP0正常關聯的。STA向AP1發出重關聯,AC0收到STA的重關聯請求后,改變STA與AP的關聯,將STA關聯到AP1,并且通告漫游模塊。漫游模塊收到通告后,根據STA信息判斷是AC內漫游,修改STA中漫游相關的狀態,如表2所示。

表2 AC內一次漫游時STA在AC上狀態的變化
? 場景2:AC間一次漫游(見圖15)

圖15 AC間一次漫游示意圖
漫游前STA與AC0的AP0是正常關聯的。STA向AC1的AP0發出重關聯請求,通過AP傳遞,AC1收到漫游請求,根據STA的狀態判斷是AC間漫游;AC1向同漫游組內的AC0和AC2發出漫游請求;AC2收到漫游請求后發現不是與自己相關的STA所以不回復;AC0收到請求后檢索STA信息發現自己是漫出AC,修改AC0上的STA狀態信息并設置轉發面,然后向AC1發出漫游應答;AC1收到漫游應答時修改STA漫游相關信息,如表3所示。

表3 AC間一次漫游時STA在AC上的狀態變化
? 場景3:AC內二次漫游(見圖16)

圖16 AC內二次漫游示意圖
在當前漫游之前,STA已經經過若干過程從AC0的AP0漫游到AP1。STA向AC0的AP2發起重關聯,AC0收到重關聯請求后解除STA與AP1的關聯,并且將STA關聯到AP2。漫游模塊根據當前AP關聯的變化情況更新STA漫游相關信息,如表4所示。

表4 AC內二次漫游時STA在AC上的狀態變化
? 場景4:AC內往返漫游(見圖17)

圖17 AC內往返漫游示意圖
在當前漫游之前,STA已經經過若干過程從AC0的AP0漫游到AP1。STA向AP0發起重關聯請求,AC0收到重關聯請求后,將STA關聯到AP0,并且判斷AP0是STA最開始正常加入的AP,所以將STA看作與正常加入的情況相同,同步信息到STA控制塊和轉發面,如表5所示。

表5 AC內往返漫游時STA在AC上的狀態變化
? 場景5:AC內到AC間二次漫游(見圖18)

圖18 AC內到AC間二次漫游示意圖
在當前漫游之前,STA已經經過若干過程從AC0的AP0漫游到AC0的AP1。STA向AC0的AP0發起重關聯請求,AC1判斷之前沒有該STA的信息,向漫游組內的AC0和AC2發出漫游請求。AC2收到請求后判斷自己沒有STA的信息,所以不進行回應。AC0收到請求后,查找到STA相關信息,修改STA控制塊和轉發面信息為漫出狀態,同時將STA信息通過漫游模塊發送到AC1。AC1收到信息后更新本身的STA控制塊和轉發面信息,如表6所示。

表6 AC內到AC間二次漫游時STA在AC上的狀態變化
? 場景6:AC間往返漫游(回到同一AP,見圖19)

圖19 AC間往返漫游的示意圖
在當前漫游之前,STA已經經過若干過程從AC0的AP0漫游到AC1的AP0。STA向AC0的AP0發起重關聯請求,AC0收到后判斷STA當前的轉狀態是漫出,所以向漫游組內的AC1和AC2發送漫游請求,同時更新STA控制塊和轉發面信息恢復到STA正常關聯的狀態,如表7所示。AC1收到漫游請求后刪除對應的STA信息,并且由于AC1不是最近一次正常加入時候的AC,所以不發送回應;AC2收到漫游請求后,判斷本身沒有這個STA信息,也不進行回應。

表7 AC間往返漫游時STA在AC上的狀態變化
從上述場景分析可以看出,本漫游方案是能夠適用于各種可能發生的漫游場景。
為了證明漫游模塊符合設計需要即漫游處理過程時間不超過50 ms,需要測試漫游模塊在AC端的性能。需要分別測試在AC內和AC間環境下,STA與所在網絡的其他設備進行不間斷的通信過程中,在漫游前后STA的斷流時間。
測試拓撲圖選用最典型的AC內(參見圖4)和AC間(圖5)漫游結構圖,測試步驟如下:
1) STA1關聯到AP1上,STA1通過flood_ping工具不停向AP1發ping 報文。
2) PC采用WireShark通過鏡像口抓取AP1收到的ping_req報文和發送的ping_reply報文。
3) STA1從AP1漫游到AP2。
4) 采用時間戳來記錄漫游處理時間,接收重關聯幀到漫游表建立完成一共花費的時間,如表8所示。

表8 漫游處理時間
從表8可以看出,AC端和漫游模塊成功處理完漫游STA的數據,其平均時間不超過10 ms,這與漫游機制的指標吻合。
本文對大范圍部署WLAN網絡時用戶移動掉線的問題,給出了一種解決機制。本漫游機制原理不復雜,但同時能完全滿足各種應用場景,通過測試漫游的性能也證明其符合設計目標。但不同運營商對WLAN 漫游持不同的態度,因此無法做到全網任意漫游,只能在安裝有漫游模塊的特定設備上才能實現用戶漫游。