高建行
桂林理工大學信息科學與工程學院 廣西 541004
隨著網絡應用范圍的不斷擴展,對網絡帶寬資源的要求也隨著網絡應用范圍的擴大而提高,網絡帶寬資源相對應用的需求總是有限的;另外不同的網絡應用業(yè)務對網絡的帶寬、可靠性和時延的要求也不一樣。因此如何合理的根據不同業(yè)務的具體需求分配帶寬并進行精確的流量控制已經成為目前網絡管理中一個迫切需要解決的問題。在目前的網絡通信中,大多數流量是以 TCP/IP協(xié)議為基礎的,即所有的通信是交互的,當接收端收到數據包后,總要發(fā)送一個確認消息以便發(fā)送方采取下一步動作。目前由于P2P業(yè)務的大量應用造成大量的帶寬被占用,更需要對網絡進行更精確的流量控制與帶寬分配。目前Linux平臺下以Netfilter和Iptables構建的Traffic Control下提供了多種流量控制策略,但由于其粒度過大無法提供精確的流量控制。
Linux內核中的防火墻 Netfilter是用于擴展各類網絡服務的結構化的底層架構,主要包含:數據報過濾模塊、連接跟蹤模塊、網絡地址轉換模塊、數據報修改模塊和其它高級功能模塊。Netfilter的這種架構設計使得其生成的任何一個結構模塊比較容易擴展,因此一些新的特性的加入只需通過構建相應的內核模塊,并不需要對內核進行重啟,有利于擴展底層網絡的特性。Netfilter主要通過HOOK機制、Iptables基礎模塊來實現(xiàn)。其處理流程如下:數據報進入系統(tǒng)后,經IP校驗以后,先由第一個HOOK函數NF_IP_PRE_ROUTING進行處理;然后路由選擇模塊決定該數據報的去向,是否需要轉發(fā)或是留在本機;發(fā)給本機的數據報,則由HOOK函數NF_IP_LOCAL_IN處理后發(fā)送給上層協(xié)議;轉發(fā)的數據報,則交由 NF_IP_FORWARD的 HOOK函數處理;最后一個HOOK函數NF_IP_POST_ROUTING處理轉發(fā)的數據報后,再將其傳輸到網絡上。HOOK函數NF_IP_LOCAL_OUT將本地所產生的數據報處理之后,經路由選擇,由HOOK函數NF_IP_POST_ROUTING處理并轉發(fā)。
Linux內核模塊中的Netfilter擴展可以在5個HOOK函數中進行,如圖1所示。控制和監(jiān)聽相應的數據包。在每個HOOK函數處,可以任意對數據報進行處理,且使每個HOOK函數的處理結果都反饋給Nefilter,以便Netfilter對數據報的類型標記、轉發(fā)路徑等進行相應處理。
圖1 Linux內核數據包處理流程
Netfilter的Iptables提供了limit和hashlimit的模塊,用于匹配單位時間內通過的數據包的數量。其中hashlimit相比limit模塊多了hash功能,是有l(wèi)imit模塊擴展而來,可以根據IP地址進行數據包發(fā)送數量的限制。netfilter提供的limit和limit-burst兩個選項可以對發(fā)送數據包的數量進行限制,但是其存在如下問題。
由于 netfilter架構下的 limit模塊只是實現(xiàn)了一個match,用于計算單位時間內通過的數據包的數目。這是一種基于數據包數量的統(tǒng)計方法,而不是基于單位時間內的流量進行統(tǒng)計的,因此很難準確的統(tǒng)計流量。例如,限制某個IP地址單位時間內發(fā)50個數據包,然而這50個數據包有可能是50個mtu大小的數據包,也有可能是50個單字節(jié)大小載荷的數據包或者是TCP的ACK包,因此很難實現(xiàn)真正的流控。另外這個模塊僅僅實現(xiàn)了一個netfilter的match函數,其使用方法為:
沒有任何策略隊列對超發(fā)的流量進行緩存,只能簡單的丟棄。這種簡單的直接丟棄方式會影響突發(fā)流量較多的業(yè)務開展的質量。另外,這種方式需要把所有的要需要基于IP限速的IP地址全要作為filter的匹配規(guī)則顯示標示出來,會導致策略表的快速膨脹消耗大量的內存。
Netfilter的limit模塊限定的速度最快為每秒發(fā)送10000個數據包,即發(fā)送一個數據包耗費0.1毫秒。然而由于此算法是基于平臺宏HZ的,即系統(tǒng)的jiffy計數器。由于不同平臺的HZ是不一樣的,Linux 2.4內核中規(guī)定為100,ARM平臺也規(guī)定為100。例如在linux 2.6版本內核上規(guī)定其為1000,也就是說jiffy計數器在此平臺上沒1ms加1。由以上可得出,jiffy計數器的頻率在一定程度上影響著發(fā)包的數量。
根據如圖1所示的數據包在Linux防火墻Netfilter的處理流程中,數據包進來時首先經過PREROUTING而流出的數據包經過 POSTROUTING。因此對于流入的數據包的控制,在NF_IP_PRE_ROUTING處的HOOK函數處進行控制,對于流出的數據包,在NF_IP_POST_ROUTING處的HOOK函數處進行控制,這樣能降低系統(tǒng)控制的成本。Netfilter的limit模塊目前支持對單位時間內發(fā)送和接收數據包的數量進行限制,我們可以通過修改limit模塊的實現(xiàn)來限制單位時間內所發(fā)送的數據量的大小,并通過重新設計令牌桶算法結合limit模塊來控制指定Ip地址的流量。
根據 Netfilter的框架結構,將擴展分為兩大部分,在Netfilter部分實現(xiàn)了一個match,能控制其網絡內部的每臺計算機單位時間內通過的流量,以此為基礎可以控制單個IP地址下的單位時間內流量的大小,并重新構造了一個令牌桶實現(xiàn)了對流量的整形控制;在 Iptables中實現(xiàn)一個用戶態(tài)的Iptables擴展庫,實現(xiàn)了一個match的配置接口。Match函數的設計為,在源IP鏈表中尋找數據包所攜帶源IP地址,若在源IP鏈表中找到相匹配的IP地址,則取出相應的統(tǒng)計信息,看令牌桶中是否有足夠的令牌,若有則匹配,若源 IP地址鏈表中沒有找到,則創(chuàng)建一個鏈表項,并記錄下當前時間和當前數據包的大小并返回無匹配項信息;若找到,將找到的匹配項的源鏈表項取出,插入到HEAD位置,若沒有找到則將剛剛創(chuàng)建的鏈表項插入到鏈表的HEAD位置。
Linux內核中對流量進行控制和整形的令牌桶算法是著名的網絡流限速算法,它通過令牌來控制網絡數據包發(fā)送或接收的速度,令牌既然可以代表數據包的數量,也就可以代表數據量的多少。之所以可以用此方法限速,是因為系統(tǒng)可以按照用戶事先約定的速度,向令牌桶中放置令牌并且令牌桶容量有限,桶滿后不能再放入令牌。當數據包到達后,首先計算當前數據包所需要的令牌數并查看令牌桶中令牌數量,若當前令牌桶中的令牌數量滿足數據包發(fā)送的要求,則放行數據包,且從令牌桶中減去與當前發(fā)送的數據包相同當量的令牌?;谏鲜龅乃悸罚瑯嬙炝艘粋€令牌桶原理的新算法,對單位時間內發(fā)送的字節(jié)數進行限制,并且需要顯示指定限制的單位時間內的流量、允許的突發(fā)緩沖區(qū)大小,緩沖區(qū)用于流量整形。通過下面的算法來計算令牌數量,每一個令牌所代表的可發(fā)送的字節(jié)數和每個 jiffy所產生的令牌數(一個 jiffy是計算機內部硬件計時器的一個嘀嗒聲,例如內部處理器的頻率為100hz那么就是10ms產生一個jiffy)。根據當前到達數據包的長度與當前數據包所需要的令牌數進行計算與比較,若當前到達的數據包所需要的令牌數大于當前令牌桶中所擁有的令牌數,則不允許此數據包發(fā)送,可以將此數據包放到緩沖區(qū)暫存,等有足夠令牌后發(fā)送。反之,允許此數據包的發(fā)送。
下面是令牌桶算法的計算方法,當指定好限定的流量后,令牌桶中的令牌數量按照如下數量關系來計算:
根據 Netfilter提供的框架,可以擴展 Table、Match和Target等。在這里我們將用Match構件擴展來限制發(fā)包的速度,使其成為Iptables的match擴展模塊。程序包含用戶態(tài)和內核態(tài)兩部分,用戶態(tài)主要在 Iptables模塊,用來供用戶輸入流量控制參數并向內核態(tài)傳遞用戶輸入的流量控制參數,內核態(tài)部分根據用戶輸入的控制參數執(zhí)行實際流量控制。
內核實現(xiàn)如下:
(1) 定義一個 struct st_rateinfo, 用來存放限速信息;
(2) 維護一個IP地址鏈表,用于保存到達本地本機的IP數據包的IP地址;
(3) 實現(xiàn)一個 match函數,并在此函數中實現(xiàn)令牌桶控制和流量的整形處理。
例如要對來自192.168.0.1 這個地址進行限流至200k,則添加如下兩條規(guī)則即可:
本文研究了根據IP地址進行流量限速的方法。該方法改進了 linux內核本身令牌桶算法存在的在不同平臺上的流量不一致問題和流量統(tǒng)計不精確問題。在linux的netfilter框架中存在的精確控制流量的問題和不同平臺統(tǒng)計不一致問題都可以用改進的令牌桶算法解決。實現(xiàn)了單個IP地址的出入數據流的控制。
[1]楊虎,張大方,謝鯤等.Netfilter/Iptables框架下基于TCP滑動窗口的串行流量控制算法[J].計算機工程與科學.2009.
[2]李君.P2P 業(yè)務流量識別、分析和控制研究[J].計算機工程.2006.
[3]程克勤,顧棟梁,周健.Per_IP流量控制方法[J].計算機工程與設計.2010.
[4]Nicolas Bouliane.Limit TBF analysis[EB/OL].http://people.netfilter.org/acidfu/papers/limit-tbf-analysis.pdf.2007.