HTB介紹以及使用_第1頁
HTB介紹以及使用_第2頁
HTB介紹以及使用_第3頁
HTB介紹以及使用_第4頁
HTB介紹以及使用_第5頁
已閱讀5頁,還剩18頁未讀, 繼續(xù)免費閱讀

下載本文檔

版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領

文檔簡介

1、HTB相關TC命令以及內核實現(xiàn)介紹文檔編號:00-6201-100當前版本:創(chuàng)建日期:2008-9-1 編寫作者:wanghuaijiaHTB 相關 TC 命令以及內核實現(xiàn)介紹前言 3關于此文檔 3參考資料 3第一章 HTB 介紹 41.0 HTB 命令介紹 52.0 Rate ceiling 速率限度 12第二章 HTB 程序實現(xiàn) 132.0 用戶傳遞消息的格式 142.1 HTB 命令的解析 16舉例消息解析過程 172.2 HTB 內核程序的實現(xiàn) 182.2.1 數(shù)據(jù)包進隊 192.2.2 數(shù)據(jù)包的出隊 21、八、亠前言關于此文檔本文檔是本人學習 LINUX 流量控制的過程

2、中的學習總結。 主要講述了 HTB 的原理以及內核的實現(xiàn)部分,不過重點講的是原理 部分,以及如何根據(jù)需要給數(shù)據(jù)流分類,控制不同數(shù)據(jù)流的速度。參考資料網(wǎng)絡資源。HTB 相關 TC 命令以及內核實現(xiàn)介紹 在介紹 HTB 前我們看看在 TC 下的速度換算: tc 采用如下規(guī)定來描述帶寬:mbps = 1024 kbps = 1024 * 1024 bps = byte/smbit = 1024 kbit = kilo bit/s.mb = 1024 kb = 1024 * 1024 b = bytembit = 1024 kbit = kilo bit.內定:數(shù)字以bps和b方式儲存。但當tc輸出速

3、率時,使用如下表示:1Mbit = 1024 Kbit = 1024 * 1024 bps = byte/s第一章 HTB 介紹HTB 意味著是一個更好理解更容易掌握的可以快速替換 LINUX CBQ 隊列規(guī)定的隊列 , CBQ 和 HTB 都可以幫助你限制你的鏈路上 的出口帶寬,但是 CBQ 配置很復雜而且精度又不夠,在 HTB 問世 后, HTB 就逐漸的代替 CBQ ,成為人們進行流量控制的工具。 他 允許你把一條物理鏈路模擬成幾條更慢的鏈路, 或者是把發(fā)出的不同 類型的流量模擬成不同的連接 ,在他們的實際應用中 , 你必須指定怎 么分配物理鏈路給各種不同的帶寬應用并且如何判斷每種不同的

4、應 用的數(shù)據(jù)包是怎么樣被發(fā)送的。應用 HTB 我們可以很好的規(guī)劃我們 的帶寬,根據(jù)不同的需要為網(wǎng)絡中的主機或者本機上的不同業(yè)務分配 不同的帶寬。1.0 HTB命令介紹案例:我們有兩不同的用戶 A和B,都通過網(wǎng)卡ethO連接到in ternet ,我們想分配 60 kbps的帶寬給A和40 kbps的帶寬給B。HTB可以保障提供給每個類帶寬的數(shù)量是它所需求的最小需求 或者等于分配給它的數(shù)量.當一個類需要的帶寬少于分配的帶寬時,剩 余的帶寬被分配給其他需要服務的類.注:這里這種情況被稱為”借用”剩余帶寬,我們以后將用這個術 語,但無論如何,好像很不好因為這個”借用”是沒有義務償還的.tc qdis

5、c add dev ifbrO root han die 1: htb default 12這個命令建立QDISC的根類型。默認情況下選擇的類為12.tc class add dev ifbrO pare nt 1: classid 1:1 htb rate 100kbps ceil100kbps這個命令在根的基礎上建立一個類,速度為100Kbps起到總速度限制的作用。tc class add dev ifbr0 pare nt 1:1 classid 1:10 htb rate 30kbps ceil100kbpstc class add dev ifbr0 pare nt 1:1 clas

6、sid 1:11 htb rate 10kbps ceil100kbpstc class add dev ifbr0 pare nt 1:1 classid 1:12 htb rate 60kbps ceil100kbps這兩命令是進行分流作用,在前面建立的底下建立三個類,速 度控制分別為 30kbps , 10kbps和60,并且都設置 ceil為100kbps 至于ceil我們稍后討論。接下來我們使用分類器進行設置使不同的數(shù) 據(jù)包分發(fā)到不同的類進行發(fā)送數(shù)據(jù)。tc filter add dev eth0 protocol ip parent 1:0 prio 1 u32 match ip s

7、rc 64match ip dport 80 0xffff flowid 1:10tc filter add dev eth0 protocol ip parent 1:0 prio 1 u32 match ip src 64match ip dport 90 0xffffflowid 1:11這樣來自ip 64 且目的端口號為80的數(shù)據(jù)包都會發(fā)送到類1:10 所對應的隊列中,自 ip 64 且目的端口號為 90的數(shù)據(jù)包都會發(fā)送到類 1:11 所對應的隊列中,其他不匹配的數(shù)據(jù)包都會發(fā)送到類 1 : 1 2所

8、對應的隊列中,這是默認的隊列,前面已經(jīng) 定義。當然這只是簡單的配置, 我們也可以根據(jù)自己的需要配置成更為復雜的隊列規(guī)定,接下來我們舉如下的例子:假如內網(wǎng)中的用戶通過網(wǎng)卡eth0與外界通訊,這樣我們可能需要配置 我們的通訊規(guī)則。我們可能有如下的需求:Internet64Linux Soxethletho10% telnet-6220% wvw20% ftp50% other192.158.1 129-19015% telnet30% www30%flp25% otherFigure 2+8,3我們希望制定以上的控制規(guī)則,以便保證不同用戶的不同需求。當然

9、帶寬比例是相對的,也就是說在忙的時候會趨向于以上的帶寬比 例。不忙的時候忙的服務可以借用不忙用戶的帶寬。假如我們總帶寬為2048Mbps。這樣我們分配給A, B的帶寬分別為1228Mbps,820Mbps。帶寬分配如下所示:nt&i:uFigure 2.8.4好了按照以上的模型 我們開始建立規(guī)則。首先我們需要為網(wǎng)卡建立一個根類型(QDISC )這個是必須的步驟crn-4i#tc qdisc add dev ethO root handle 1:0 htb接下來我們在根類型下建立子類,控制總速度如圖示#tc class add dev ethO parent 1:0 classid 1:1 ht

10、b rate 2048kbit按照上圖的步驟我們應該在這個類的底下建立兩個子類,來進行速度 的分發(fā)#tc class add dev ethO parent 1:1 classic! 1:2 htb rate 1228kbit cell 2048kbit#tc class add dew ethO parent 1:1 classic! 1:3 htb rate 20kbit ceil 2048kbitcm-4 3我們繼續(xù)根據(jù)上圖建立如下子類:CLASS 1:2的子類:#tc class add dev ethO parent 1:2 classid 1:21 htb rate 122kibi

11、t ceil 1228kbit# tc class add dev ethO parent 1classid 1:22 htb rate 246kbit ceil 1228kibit#tc class add dev ethO parent 1:2 classiid 1:23 htb rate 246kbit cell 1228kbtt#tc class add dev ethO parent 1:2 classid 1:24 htb I rate 614kbit ceil 1223kbttcm-45CLASS 1:3的子類:#tc class add dev ethO parent 1:3

12、classid 1:31 htb rate 122kbit ceil 820kbit#tc class add dev ethO parent 1:3 classid 1:32 htb rate 246kbit cell 820kbit#tc class add dev ethO parent 1:3 classid 1:33 htb rate 246kbit cell 820kbit#tc class add dev ethO parent 1:3 classid 1 ;34 htb rate 206kbit ceil 820kbitcm-4E接下來我們?yōu)槿~子節(jié)點掛載pfifo的隊列規(guī)定,當

13、然你也可以根據(jù)自己的需要定義自己的隊列規(guī)定。命令如下:# tc qdisc add dev ethO parent 1:21 handle 210# tc qdisc add dev ethO parent 1:22 handle 220# tc qdisc add dev ethO parent 1:23 h食nd俺 230# tc qdisc add dev ethO parent 1:24 handle 240# tc qdisc add dev ethO parent 1:31 handle 310# tc qdisc add dev ethO parent 1:32 handle 3

14、20# tc qdisc add dev ethO parent 1:33 handle 330pfifo limit 10pfifo limit 10pfifo limit 10pfifo limit 10pfifo limit 10pfifo limit 10pfifo limit 10pfifo limit 10cm-47# tc qdisc add dev ethO parent 1:34 handle 340這樣我們根據(jù)需要框架是已經(jīng)搭建完成了, 不過我們還不知道哪些包 進入哪個類進行處理。接下來我們講根據(jù)需求建立分類器。當然我們 使用的是功能強大的U32分類器,首先我們?yōu)锳網(wǎng)絡分配

15、規(guī)則:#tc filter add dev ethO parent 1:0 protocol ip prio 1 u32 match ip dst 192.168.1/26 match ip sport 23Oxfffflowid 1:21filter add dev ethO parent 1:0 protocol ip prio 1 u32 match ip dst 192.168.1Z26 match ip sport 80 Oxfff flowid 1:22filter add dev ethO parent 1:0 protocol ip prio 1 u32 match ip ds

16、t 192,168.1/26 match ip sport 20 OxfTf flowid 1:23#tc filt&r add dev ethO parent 1:0 protocol ip prio 1 u32 match ip dst 192-168.1/26 match ip sport 21 OxfTf flowid 1:23filter add dev ethO parent 1:0 protocol ip prio 1 u32 match ip dst 192.166.16 flowid 1:24接下來我們?yōu)锽網(wǎng)絡匹配規(guī)則:#tc filter add dev ethO pare

17、nt 1:0 protocol ip prio 1 u32 Vmatch ip dst 192.168.129/26 match ip sport 23 Oxfffflowid 1:31#tc filter add dev ethO parent 1:0 protocol ip prio 1 u32 match ip dst 192.168.129/26 match ip sport 80 Oxfffflowid 1:32 filter add dev ethO parent 1:0 protocol ip prio 1 u32 match ip dst 192.168.129/26 matc

18、li ip sport 20 Oxfffflowid 1:33#tc filter add dev ethO parent 1:0 protocol ip prio 1 u32 match ip dst 192J68.129/26 match ip sport 21 Oxfffflowid 1:33filter add dev ethO parent 1:0 protocol ip prio 1 u32 match ip dst 192.166.129/28 flowid 1:34cm-49這樣我們就大功告成了2.0 Rate ceili ng速率限度我們看到了上面配置過程中一直有這個參數(shù),我

19、們接下來討論下這個參數(shù)的用途。參數(shù)ceil指定了一個類可以用的最大帶寬,用來限制類可以借用多少 帶寬缺省的ceil是和速率一樣。我們看上面的例子:InternetLinux Box1 92.1 69.1.254192.163,1.1-62eth1sthdA (6010% telnet2C% www20% ftp50% other29-19015% telnet30% wyw2跑M25% otherFigure我們在分配A和B的速度的時候我們設置了 cell都為2048。也就 是說雖然A與B的rate值不一樣但是他們峰值的速度是一樣的。假 如在某段時間內A用戶網(wǎng)絡流量很少或

20、者幾乎是沒有的,但是這時 候B用戶的流量很大,這樣B用戶將會借用A用戶的網(wǎng)絡流量,當 然B用戶的總速度是不會超過cell定義的速度的。注:ceil的數(shù)值應該至少和它所在的類的速率一樣高,也就是說ceil應該至少和它的任何一個子類一樣高。第二章HTB程序實現(xiàn)對于HTB的內核實現(xiàn)包括兩部分第一部分為:用戶空間命令的解析以及傳遞消息到內核空間 第二部分為HTB流量控制算法的實現(xiàn)2.0用戶傳遞消息的格式我們對消息的封裝使用如下的格式:首先是消息頭然后接下來就是消息的數(shù)據(jù)部分了。數(shù)據(jù)部分是按照 類型、長度、參數(shù)值 的 格式來填充數(shù)據(jù)包的。如下所示:消息頭消息模板TC_MSG傳遞的數(shù)據(jù)其中消息頭有如下的參

21、數(shù)struct nl msghdr _u32nlmsgen;/* Len gth of message in cludi ng header */_u16nl msg_type;/* Message content */_u16nl msg_flags;/* Additional flags */_u32nl msg_seq;/* Seque nee nu mber */_u32nlmsg_pid;/* Sending process PID */;系統(tǒng)中為支持QOS定義了如下的消息類型:在文件 RTNETLINK.H中RTM_NEWQDISC = 36,#defi ne RTM_NEWQDI

22、SC RTM_NEWQDISC RTM_DELQDISC,#defi ne RTM_DELQDISCRTM_GETQDISC,#defi ne RTM_GETQDISCRTM_DELQDISCRTM_GETQDISCRTM_NEWTCLASS#defi ne RTM_NEWTCLASSRTM_DELTCLASS,#defi ne RTM_DELTCLASSRTM_GETTCLASS,#defi ne RTM_GETTCLASS=40,RTM_NEWTCLASSRTM_DELTCLASSRTM_GETTCLASSTC_MSG結構如下: struct tcmsgun sig ned char tc

23、m_family;un sig ned char tcm_padl; un sig ned shorttcm_pad2;tcm_ifi ndex;u32tcm_ha ndle;u32tcm_pare nt;u32tcmnfo;;數(shù)據(jù)部分的格式有如下:struct rtattrun sig ned shortrta_le n;un sig ned shortrta_type;;nlmsg_le nnl msg_typenl msg_flagsnl msg_seqnlmsg_pid消息模板TC_MSGrta_type 16 bitsrta_le n 16 bitsValues 32 bits其中數(shù)

24、據(jù)部分的rta_type就是傳遞的參數(shù)類型:我們根據(jù)HTB 可能的參數(shù)類型,定義如下的參數(shù)類型:定義在文件PKT_SCHED.H 中。(我們這里省略一些定義的結構體可以去看看源文件)/* HTB sectio n */ #define TC HTB NUMPRIO#define TC HTB MAXDEPTH#define TC HTB PROTOVER3 /* the same as HTB andenumTCA_HTB_UNSPEC,TCA_HTB_PARMS,TCA_HTB_INIT,TCA_HTB_CTAB,TCA_HTB_RTAB,_TCA_HTB_MAX,;2.1 HTB 命令的解

25、析由于 TC 關于 QOS 方面的命令基本格式如下:Usage: tc OPTIONS OBJECT COMMAND | help ntc -force -batch filenwhere OBJECT := qdisc | class | filter | action n OPTIONS := -statistics | -details | -raw可以看出 TC 命令中 OBJECT := qdisc | class | filter | action 也就是 用于建立 QDISC 以及建立分類 CLASS , 建立過濾器 FILTER或者是其他的動作 ACTION。LINUX內核中為

26、這不同的命令 分別建立了相應的命令解析結構,大致如下:struct qdisc_utilstruct qdisc_util *next;const char *id;int (*parse_qopt)(struct qdisc_util *qu, int argc, char *argv, struct nlmsghdr *n);int (*print_qopt)(struct qdisc_util *qu, FILE *f, struct rtattr *opt);int (*print_xstats)(struct qdisc_util *qu, FILE *f, struct rtatt

27、r *xstats);int (*parse_copt)(struct qdisc_util *qu, int argc, char *argv, struct nlmsghdr *n);int (*print_copt)(struct qdisc_util *qu, FILE *f, struct rtattr *opt);我們只列出 qdisc_util 部分其他的 如 FILTER 以及 ACTION 的 解析結構請參照 tc_util.c 這個文件。 可以看出 qdisc_util 這個結構是 個鏈表。對于不同的策略我們都可以編譯然后插入到這個鏈表當中。 當然其中的函數(shù)指針根據(jù)不同的解

28、析類型指向不同的函數(shù)。 比如我們 講的 HTB :這個文件在 q_htb.c 中struct qdisc_util htb_qdisc_util = .id=htb,.parse_qopt= htb_parse_opt,.print_qopt= htb_print_opt,.print_xstats= htb_print_xstats,.parse_copt= htb_parse_class_opt,.print_copt= htb_print_opt,;htb_parse_opt, 用于解析 qdisc htb 參數(shù)部分的命令的。htb_parse_class_opt, 用于解析 class

29、 htb 參數(shù)部分的命令的 。 舉例消息解析過程 一個命令: tc qdisc add dev ifbr0 root handle 1: htb default 12這個命令為某個網(wǎng)絡接口 eth0 增加一個 qdisc 。 命令首先在用戶空間被 iproute2 分析:分析tc: main(int argc, char *argv) 被調用,此函數(shù)在 tc/tc.c 中;分 析 tc qdisc : do_qdisc(argc-2, argv+2); 被 調 用 , 此 函 數(shù) 在tc/tc_qdisc.c 中;分析 tc qdisc add :tc_qdisc_modify(RTM_NEW

30、QDISC,NLM_F_EXCL|NLM_F_CREATE, argc-1, argv+1);被調用,此函數(shù)在tc/tc_qdisc.c中,在這個函數(shù)中,將分析完這一行tc的命令, 分析 htb default 12 :前面分析完后,接下來就開始分析后面的部分了,程序發(fā)現(xiàn)是用htb,所以就根據(jù)這個標記找到htb_qdisc_util 這個結構,然后用其中的函數(shù)htb_parse_opt對其后面的參數(shù)進行解 析,并且根據(jù)上面提到的格式填充數(shù)據(jù)包。最后返回tc_qdisc_modify中,tc_qdisc_modify這個函數(shù)最終完成發(fā)送消息到內核空間,用于 控制相關的操作。其他的命令基本上也是一

31、樣的。只是不同的命令走 的分支不一樣。2.2 HTB內核程序的實現(xiàn)HTB關鍵是對不同數(shù)據(jù)包進行不同的流量控制,以達到控制的目的。對于流量的控制使用的是令牌桶的算法如下圖:雷由此接口安說前報r堆坤發(fā)i冬X7通過2*0對于一個數(shù)據(jù)包在內核中總的操作是入隊和出隊, 入隊只是根據(jù)分類把數(shù)據(jù)包放入不同的隊列中,如果隊列滿了就要根據(jù)策略丟棄數(shù)據(jù)包。出隊的過程中就是根據(jù)策略從隊列中取出數(shù)據(jù)包,當然 HTB 和TBF 一樣速度的限制是在出隊的時候才進行。2.2.1 數(shù)據(jù)包進隊我們首先來看看進隊的操作:static int htb_enqueue(struct sk_buff *skb, struct Qdis

32、c *sch)struct htb_class *cl = htb_classify(skb,sch,&ret);!=else if (cl-un.leaf.q-enqueue(skb, cl-un.leaf.q)NET_XMIT_SUCCESS ) sch-stats.drops+;cl-stats.drops+;return NET_XMIT_DROP; else cl-stats.packets+; cl-stats.bytes += skb-len;htb_activate (q,cl);return NET_XMIT_SUCCESS;進隊首先調用的是分類器,查看數(shù)據(jù)包要放到那個隊列中,然后再進行進 隊操作。至于分類過程我們看看下圖:Packet contentskbclass i fyx :yoclassidclasstcf_result當然這些結果是用戶傳遞進來的信息,我們只是進行匹配然后找到分類結果Tcf_result。當然分類結果有時候我們只保存了分類的CLASSID但是我們有時候也保存了 CLASS根據(jù)不同的策略有時候是不同的:

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
  • 4. 未經(jīng)權益所有人同意不得將文件中的內容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
  • 6. 下載文件中如有侵權或不適當內容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論