宮興琦,姜會增,周用貴
(中國鐵道科學研究院 標準計量研究所,北京 100081)
為旅客提供互聯(lián)網(wǎng)接入服務是旅客列車無線局域網(wǎng)系統(tǒng)的主要功能之一,該系統(tǒng)采用移動、聯(lián)通和電信3家運營商的4G網(wǎng)絡,構(gòu)建9路車地通信鏈路,提升互聯(lián)網(wǎng)出口帶寬。高鐵及動車車廂內(nèi)用戶密度高,車地通信出口帶寬較小,旅客列車無線局域網(wǎng)寬帶分配系統(tǒng)作為旅客列車無線局域網(wǎng)接入系統(tǒng)的關(guān)鍵部分,切實影響旅客接入互聯(lián)網(wǎng)的實際體驗。利用有限的帶寬為旅客提供更好的互聯(lián)網(wǎng)接入服務是帶寬分配系統(tǒng)的一個重要功能。
旅客列車無線局域網(wǎng)由中心服務器、單車服務器、無線訪問接入點(AP)和無線網(wǎng)橋組成,中心服務器主要提供旅客互聯(lián)網(wǎng)接入服務,單車服務器提供車廂內(nèi)局域網(wǎng)服務,AP提供無線終端接入服務,無線網(wǎng)橋連接車廂間的單車服務器,局域網(wǎng)組成如圖1所示[1]。
旅客列車無線局域網(wǎng)帶寬分配系統(tǒng)部署于中心服務器,由用戶發(fā)現(xiàn)模塊和鏈路發(fā)現(xiàn)模塊組成,主要用于提升互聯(lián)網(wǎng)接入利用率。
帶寬分配系統(tǒng)的用戶發(fā)現(xiàn)模塊主要用于實時更新車上用戶的狀態(tài),適應高鐵停靠站旅客上下線較頻繁的情況,為鏈路發(fā)現(xiàn)模塊提供信息支持;鏈路發(fā)現(xiàn)模塊主要根據(jù)在線用戶狀態(tài)和9路車地鏈路狀態(tài)為用戶選擇合適的通信信道。
圖1 旅客列車無線局域網(wǎng)組成圖
jhash_3words算法為Linux 網(wǎng)絡協(xié)議中常用的一個哈希算法,適用于網(wǎng)絡數(shù)據(jù)哈希運算。通過用戶數(shù)據(jù)包解析出用戶的mac地址,并通過jhash_3words算法將解析出的mac地址進行hash散列運算,用戶發(fā)現(xiàn)模塊通過對jhash_3words算法進行二次封裝,得到mac地址散列運算函數(shù)get_tuple_hash。
運算結(jié)果更新,存入用戶信息鏈表,信息鏈表的單個節(jié)點記錄了用戶的狀態(tài)、最新數(shù)據(jù)更新狀態(tài)和權(quán)限級別。當用戶接入中心服務器后,get_tuple_hash函數(shù)通過用戶源IP和mac地址進行hash運算,根據(jù)運算結(jié)果將用戶登入時間和權(quán)限等信息更新到指定的鏈表結(jié)點上,如果指定結(jié)點不存在則表示為新用戶,為其創(chuàng)建新的結(jié)點[2]。如果結(jié)點已經(jīng)存在則表示該用戶為老用戶,更新其最后一次訪問時間。
當內(nèi)核態(tài)通過hash mac散列算法將用戶列表更新后,內(nèi)核通過netlink socket動態(tài)消息通道向用戶態(tài)應用發(fā)送新的用戶列表。
鏈路發(fā)現(xiàn)模塊負責數(shù)據(jù)包在各條可用鏈路上的并發(fā)傳輸,帶寬分配方式的選擇原則是并行帶寬增大和數(shù)據(jù)傳輸可靠。
采用 RoundRobinScheme算法[4],也稱為輪詢調(diào)度算法,該算法把來自用戶的請求輪流分配給內(nèi)部鏈路,從1開始,直到N(網(wǎng)卡個數(shù)),然后重新開始循環(huán)。
RoundRobin算法的優(yōu)點是簡潔,無需記錄當前所有連接的狀態(tài),是一種無狀態(tài)分配。系統(tǒng)使用了RoundRobin的權(quán)重分配算法,即為每條鏈路分配不同的比例系數(shù),例如,3塊網(wǎng)卡設置為3:1:1時,將控制數(shù)據(jù)包在各條鏈路上的分發(fā)比例為3:1:1。
帶寬分配系統(tǒng)采用 C語言開發(fā),開發(fā)平臺為Centos6.6,內(nèi)核版本為2.6.38,采用的編譯器為gcc。系統(tǒng)的用戶發(fā)現(xiàn)模塊采用內(nèi)核編程方式,鏈路發(fā)現(xiàn)模塊采用應用層編程方式,二者通過netlink套接字方式通信。
當用戶通過列車AP接入中心服務器后,用戶發(fā)現(xiàn)模塊通過內(nèi)核HOOK獲取用戶數(shù)據(jù)包[3],根據(jù)數(shù)據(jù)包信息通過jhash_3words算法更新用戶列表,之后通過netlink套接字將消息發(fā)送至應用層接收程序,應用層接收程序?qū)崟r更新用戶列表。部分實現(xiàn)代碼如下:
jhash_3words算法進行二次封裝,得到高性能mac地址散列運算函數(shù)get_tuple_hash,實現(xiàn)代碼如下:
此時,get_tuple_hash函數(shù)通過用戶源IP和mac地址進行hash運算,根據(jù)運算結(jié)果將用戶登入時間和權(quán)限等信息更新到指定的鏈表結(jié)點上,如果指定結(jié)點不存在,則表示為新用戶,為其創(chuàng)建新的結(jié)點。如果結(jié)點已經(jīng)存在,則表示該用戶為老用戶,更新其最后一次訪問時間,其部分實現(xiàn)代碼如下:
當內(nèi)核態(tài)通過hash mac散列算法將用戶列表更新后,內(nèi)核通過netlink socket動態(tài)消息通道向用戶態(tài)應用發(fā)送新的用戶列表,netlink需要定義新的協(xié)議號用來標示消息,如下所示:
中心服務器使用移動、聯(lián)通、電信的3G/4G網(wǎng)絡作為車地通信的網(wǎng)絡出口,支持最多9條無線鏈路并發(fā)傳輸用戶數(shù)據(jù),但是相對于乘客的需求而言,此時帶寬仍屬于窄帶通信,因而如何將9路鏈路充分利用,提高帶寬分配效率是提升乘客使用體驗的一個重要環(huán)節(jié)。
鏈路發(fā)現(xiàn)模塊的作用在于即時維護各條鏈路的真實狀態(tài),包括鏈路的可用性、鏈路IP變換,并且在鏈路狀態(tài)發(fā)生變化時能夠?qū)⒂脩粽{(diào)度到可用鏈路上,對上層應用是透明的,能夠保證用戶通信的連續(xù)性。
鏈路發(fā)現(xiàn)模塊需要維護可用鏈路鏈表,在IP發(fā)生變化時通過可用鏈表來選擇數(shù)據(jù)轉(zhuǎn)移的去處,同時更新可用鏈表中的內(nèi)容,IP切換的過程可以分解為兩個部分:
(1)現(xiàn)有的IP地址消失,即舊的鏈路失效,此時,應該將數(shù)據(jù)轉(zhuǎn)移到其他鏈路上去。
(2)新的IP地址出現(xiàn),即新的可用鏈路出現(xiàn),此時,應該將一部分數(shù)據(jù)分配到新的可用鏈路上。
在新的IP出現(xiàn)時需要新建套接字描述符,并將其代表的鏈路名稱等信息生成一條新的可用鏈路結(jié)構(gòu)加入到鏈表中,同時,將代表該鏈路上的舊IP記錄刪除,注銷套接字描述符。
創(chuàng)建套接字的過程并不復雜,關(guān)鍵在于要保證在IP切換的過程中數(shù)據(jù)能夠及時、連續(xù)地進行交互[5]。當可用鏈路的數(shù)量發(fā)生變化時,自動地將數(shù)據(jù)進行轉(zhuǎn)移分發(fā),既不能向失效鏈路分配數(shù)據(jù),也不能使新的可用鏈路閑置。
以4塊網(wǎng)卡為例,當4條鏈路變?yōu)?條,或者3條鏈路變?yōu)?條之后,需要對網(wǎng)卡進行重新排序,調(diào)整各條可用鏈路的狀態(tài),處理流程如圖2所示。
圖2 可用鏈路更新流程圖
可用鏈路模塊在數(shù)據(jù)轉(zhuǎn)移模塊中的作用比較重要,可用鏈路模塊維護了現(xiàn)在可用鏈路的全部信息,為數(shù)據(jù)包的鏈路分發(fā)提供了重要參考。
鏈路發(fā)現(xiàn)模塊負責數(shù)據(jù)包在各條可用鏈路上的并發(fā)傳輸,實現(xiàn)并行帶寬增加和數(shù)據(jù)傳輸可靠。在調(diào)度方式的選擇上,采用RoundRobin算法[6]。
本文允許其他模塊通過調(diào)用RoundRobin模塊對各條鏈路的權(quán)重系數(shù)進行調(diào)節(jié),其中,sendpercent[7]為權(quán)重系數(shù),鏈路發(fā)現(xiàn)模塊將根據(jù)sendprecent設置的系數(shù),并進一步通過匹配ifname和device_id來確定對應的鏈路,從而正確設置系數(shù)。
RoundRobin算法在高速移動環(huán)境下簡單易實現(xiàn),是從鏈路負載的角度進行考慮。然而從用戶使用的角度上講有著很大的局限性,通過簡單的輪詢,同一個應用的數(shù)據(jù)流被分到不同的鏈路上很可能非但沒有增加并行傳輸?shù)膸?,反而造成了鏈路帶寬的下降。假設有兩條鏈路A和B,A鏈路的往返時間(RTT)為40 ms,B鏈路的RTT為80 ms,如圖3所示。
圖3 RoundRobin輪詢算法示例
由圖3可知,B鏈路的時延較大,在Packet1到達Recver后,需要等到Packet2也到達Recver才能向上層應用進行遞交,也就是說,即便A鏈路此時的RTT較小,也需要等待B鏈路的數(shù)據(jù)包,此時對于用戶來講,B鏈路的情況較差。在A鏈路不發(fā)生擁塞的情況下,B鏈路的加入反而拉低了A鏈路的表現(xiàn)。
當某條鏈路的IP失效時,鏈路發(fā)現(xiàn)模塊會將發(fā)生IP變化的鏈路消息通知數(shù)據(jù)轉(zhuǎn)移模塊,此時需要將此鏈路設為不可用鏈路,停止繼續(xù)分配數(shù)據(jù)包至此鏈路,代碼如下:
IP變化消息中的新IP為0.0.0.0,說明該網(wǎng)卡的IP已經(jīng)失效,需要將此鏈路中的輪詢比例(dis)屬性設為0,數(shù)據(jù)調(diào)度模塊會檢測dis的數(shù)值,當為0時會停止向此鏈路分發(fā)數(shù)據(jù),此時可用鏈路的數(shù)目發(fā)生了變化,需要更新鏈路ID,確??捎面溌锋湵淼臓顟B(tài)是最新的,通過檢查dis屬性設置可用鏈路的ID和可用鏈路的數(shù)量[5]。
當接收到的IP變化的消息中新IP不為零時說明有新的可用鏈路加入,此時應該將其加入到可用鏈路鏈表,為其分配數(shù)據(jù)[8],代碼如下:
帶寬分配系統(tǒng)在試驗室環(huán)境下已經(jīng)通過功能驗證,經(jīng)測試,該系統(tǒng)能夠在常數(shù)時間內(nèi)判別大量用戶實時狀態(tài),提升9路鏈路的應用效率,采用運營商的網(wǎng)絡進行互聯(lián)網(wǎng)接入,具備同時接入中國移動、中國聯(lián)通和中國電信3G/4G網(wǎng)絡的能力。每列車中心服務器上統(tǒng)一配置一套互聯(lián)網(wǎng)接入設備,具備多信道帶寬匯聚并在車載局域網(wǎng)內(nèi)進行自適應分配的功能。
旅客列車無線局域網(wǎng)帶寬分配系統(tǒng)在試驗室環(huán)境下已經(jīng)通過功能驗證,但是在實際情況下,每條線路的運營商3G/4G信號覆蓋強度不同,導致不同的線路出口帶寬差別較大。下一步需做的工作是在實際運行環(huán)境下進行測試,通過積累大量用戶的行為特征與數(shù)據(jù)特性,更好地優(yōu)化互聯(lián)網(wǎng)接入功能,更進一步提升互聯(lián)網(wǎng)帶寬分配效率,提升用戶使用體驗。
[1]中國鐵路總公司. 旅客列車無線局域網(wǎng)系統(tǒng)和安裝布線總體技術(shù)要求(暫行)[Z]. 北京:中國鐵路總公司,2015.
[2]李晨光. Linux系統(tǒng)網(wǎng)絡管理模塊的實現(xiàn)[J].鐵路計算機應用,2008 ,17(6):35-38.
[3]張 昊. 高鐵車地通信系統(tǒng)級仿真平臺設計與多基站協(xié)作技術(shù)的研究[D].成都:西南交通大學,2013.
[4]丁良輝. 無線自組織網(wǎng)絡中的TCP協(xié)議研究[D]. 上海:上海交通大學,2008.
[5]周開波. 利用mSCTP實現(xiàn)3G和WLAN無縫切換及其性能分析[D]. 北京:北京郵電大學,2012.
[6]何 川. 移動自組織網(wǎng)絡中的可靠傳送協(xié)議[D].成都:電子科技大學,2013.
[7]宮興琦.高速移動環(huán)境下連接及擁塞控制的研究與實現(xiàn)[D].北京:北京交通大學,2014.
[8]方 棋,吉 強,韓 臻.Linux環(huán)境下基于策略路由實現(xiàn)多線路負載均衡[J]. 鐵路計算機應用,2006,15(9):35-38.
[9]Andrea De Vendictis, Andrea Baiocchi, Michela Bonacci.Analysis and enhancement of TCP Vegas congestion control in a mixed TCP Vegas and TCP Reno network scenario[J].Performance Evaluation, 2003(533).
[10]Tine Stegel, Janez Sterle, Urban Sedlar, et al. SCTP multihoming provisioning in converged IP-based multimedia environment[J]. Computer Communications, 2010(3314).