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

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡(jiǎn)介

1、HTB相關(guān)TC命令以及內(nèi)核實(shí)現(xiàn)介紹文檔編號(hào):00-6201-100當(dāng)前版本:創(chuàng)建日期:2008-9-1編寫作者:wanghuaijiaHTB相關(guān)TC命令以及內(nèi)核實(shí)現(xiàn)介紹前言3關(guān)于此文檔3參考資料3第一章HTB介紹41.0HTB命令介紹52.0Rateceiling速率限度12第二章HTB程序?qū)崿F(xiàn)132.0用戶傳遞消息的格式14HTB命令的解析16舉例消息解析過程17HTB內(nèi)核程序的實(shí)現(xiàn)182.2.1數(shù)據(jù)包進(jìn)隊(duì)192.2.2數(shù)據(jù)包的出隊(duì)21關(guān)于此文檔本文檔是本人學(xué)習(xí)LINUX流量控制的過程中的學(xué)習(xí)總結(jié)。主要講述了HTB的原理以及內(nèi)核的實(shí)現(xiàn)部分,不過重點(diǎn)講的是原理部分,以及如何根據(jù)需

2、要給數(shù)據(jù)流分類,控制不同數(shù)據(jù)流的速度。參考資料網(wǎng)絡(luò)資源。HTB相關(guān)TC命令以及內(nèi)核實(shí)現(xiàn)介紹在介紹HTB前我們看看在TC下的速度換算:tc采用如下規(guī)定來描述帶寬:mbps=1024kbps=1024*1024bps=>byte/smbit=1024kbit=>kilobit/s.mb=1024kb=1024*1024b=>bytembit=1024kbit=>kilobit.內(nèi)定:數(shù)字以bps和b方式儲(chǔ)存。但當(dāng)tc輸出速率時(shí),使用如下表示:1Mbit=1024Kbit=1024*1024bps=>byte/s第一章HTB介紹HTB意味著是一個(gè)更好理解更容易掌握的可以

3、快速替換LINUXCBQ隊(duì)列規(guī)定的隊(duì)列,CBQ和HTB都可以幫助你限制你的鏈路上的出口帶寬,但是CBQ配置很復(fù)雜而且精度又不夠,在HTB問世后,HTB就逐漸的代替CBQ,成為人們進(jìn)行流量控制的工具。他允許你把一條物理鏈路模擬成幾條更慢的鏈路,或者是把發(fā)出的不同類型的流量模擬成不同的連接,在他們的實(shí)際應(yīng)用中,你必須指定怎么分配物理鏈路給各種不同的帶寬應(yīng)用并且如何判斷每種不同的應(yīng)用的數(shù)據(jù)包是怎么樣被發(fā)送的。應(yīng)用HTB我們可以很好的規(guī)劃我們的帶寬,根據(jù)不同的需要為網(wǎng)絡(luò)中的主機(jī)或者本機(jī)上的不同業(yè)務(wù)分配不同的帶寬。1.0HTB命令介紹案例:我們有兩不同的用戶A和B,都通過網(wǎng)卡eth0連接到interne

4、t,我們想分配60kbps的帶寬給A和40kbps的帶寬給B。HTB可以保障提供給每個(gè)類帶寬的數(shù)量是它所需求的最小需求或者等于分配給它的數(shù)量.當(dāng)一個(gè)類需要的帶寬少于分配的帶寬時(shí),剩余的帶寬被分配給其他需要服務(wù)的類.注:這里這種情況被稱為”借用”剩余帶寬,我們以后將用這個(gè)術(shù)語,但無論如何,好像很不好因?yàn)檫@個(gè)”借用”是沒有義務(wù)償還的.為了此目的,我們利用HTB來為我們服務(wù):服務(wù)模型如下:1:121:1030kbps10kbps60kbps1我們使用的TC命令如下:tcqdiscadddevifbr0roothandle1:htbdefault12這個(gè)命令建立QDISC的根類型。默認(rèn)情況下選擇的類為

5、12.tcclassadddevifbr0parent1:classid1:1htbrate100kbpsceil100kbps這個(gè)命令在根的基礎(chǔ)上建立一個(gè)類,速度為100Kbps起到總速度限制的作用。tcclassadddevifbr0parent1:1classid1:10htbrate30kbpsceil100kbpstcclassadddevifbr0parent1:1classid1:11htbrate10kbpsceil100kbpstcclassadddevifbr0parent1:1classid1:12htbrate60kbpsceil100kbps這兩命令是進(jìn)行分流作用,在

6、前面建立的底下建立三個(gè)類,速度控制分別為30kbps,10kbps和60,并且都設(shè)置ceil為100kbps至于ceil我們稍后討論。接下來我們使用分類器進(jìn)行設(shè)置使不同的數(shù)據(jù)包分發(fā)到不同的類進(jìn)行發(fā)送數(shù)據(jù)。tcfilteradddeveth0protocolipparent1:0prio1u32matchipsrc64matchipdport800xffffflowid1:10tcfilteradddeveth0protocolipparent1:0prio1u32matchipsrc64matchipdport900xffffflowid1:11這樣

7、來白ip64且目的端口號(hào)為80的數(shù)據(jù)包都會(huì)發(fā)送到類1:10所對(duì)應(yīng)的隊(duì)列中,白ip64且目的端口號(hào)為90的數(shù)據(jù)包都會(huì)發(fā)送到類1:11所對(duì)應(yīng)的隊(duì)列中,其他不匹配的數(shù)據(jù)包都會(huì)發(fā)送到類1:12所對(duì)應(yīng)的隊(duì)列中,這是默認(rèn)的隊(duì)列,前面已經(jīng)定義。當(dāng)然這只是簡(jiǎn)單的配置,我們也可以根據(jù)白己的需要配置成更為復(fù)雜的隊(duì)列規(guī)定,接下來我們舉如下的例子:假如內(nèi)網(wǎng)中的用戶通過網(wǎng)卡eth0與外界通訊,這樣我們可能需要配置我們的通訊規(guī)則。我們可能有如下的需求:Internet64sthiLinuxSoxetho-6210%telnet20%w

8、ww20%ftp50%other192.158.1129-19015%telnet30%www30%flp25%otherFigure2+8,3我們希望制定以上的控制規(guī)則,以便保證不同用戶的不同需求。當(dāng)然帶寬比例是相對(duì)的,也就是說在忙的時(shí)候會(huì)趨向于以上的帶寬比例。不忙的時(shí)候忙的服務(wù)可以借用不忙用戶的帶寬。假如我們總帶寬為2048Mbps。這樣我們分配給A,B的帶寬分別為1228Mbps,820Mbps。帶寬分配如下所示:telnet(12ntnru好了按照以上的模型我們開始建立規(guī)則。首先我們需要為網(wǎng)卡建立一個(gè)根類型(QDISC)這個(gè)是必須的步驟#tcqdiscadddevethOroothan

9、dle1:0htbcrn-4i接下來我們?cè)诟愋拖陆⒆宇悾刂瓶偹俣热鐖D示按照上圖的步驟我們應(yīng)該在這個(gè)類的底下建立兩個(gè)子類,來進(jìn)行速度的分發(fā)#tcclassadddevethOparent1:1classic!1:2htbrate1228kbitceil2048kbit#tcclassadddevethOparent1:1classic!1:3htbrate20kbitceil2048Kbitcm-43我們繼續(xù)根據(jù)上圖建立如下子類:CLASS1:2的子類:#tcclassadddevethOparent1:2classid1:21htbrate122kibitceil1228kbit#tcc

10、lassadddevethOparent1classid1:22htbrate246kbitceil1228kibit#tcclassadddevethOparent1:2classiid1:23htbrate246kbitceil1228kbtt#tcclassadddevethOparent1:2classid1:24htbIrate614kbitceil1223kbttcm-45CLASS1:3的子類:#tcclassadddevethOparent1:3classid1:31htb1rate122kbitceil820kbit#tcclassadddevethOparent1:3cla

11、ssid1:32htbrate246kbitcell820kbit#tcclassadddevethOparent1:3classid1:33htbrate246kbitcell820kbit#tcclassadddevethOparent1:3classid1:34htbrate206kbitceil820kbit接下來我們?yōu)槿~子節(jié)點(diǎn)掛載pfifo的隊(duì)列規(guī)定,當(dāng)然你也可以根據(jù)白己的需要定義白己的隊(duì)列規(guī)定。命令如下:tcqdiscadddevethOparent1:21handle210tcqdiscadddevethOparent1:22handle220tcqdiscadddevethOp

12、arent1:23handle230#tcqdiscadddevethOparent1:24handle240tcqdiscadddevethOparent1:31handle310tcqdiscadddevethOparent1:32handle320tcqdiscadddevethOparent1:33handle330pfifolimit10pfifolimit10pfifolimit10pfifolimit10pfifolimit10pfifolimit10pfifolimit10pfifolimit10cm-47tcqdiscadddevethOparent1:34handle340

13、這樣我們根據(jù)需要框架是已經(jīng)搭建完成了,不過我們還不知道哪些包進(jìn)入哪個(gè)類進(jìn)行處理。接下來我們講根據(jù)需求建立分類器。當(dāng)然我們使用的是功能強(qiáng)大的U32分類器,首先我們?yōu)锳網(wǎng)絡(luò)分配規(guī)則:#tcfilteradddevethOparent1:0protocolipprio1u32matchipdst192.168.1/26matchipsport23Oxfffflowid1:21filteradddevethOparent1:0protocolipprio1u32matchipdst192.168.1/26matchipsport80Oxfffflowid1:22#tcfilteradddevethOp

14、arent1:0protocolipprio1u32matchipdst192,168.1/26matchipsport20OxfTfflowid1:23#tcfilteradddevethOparent1:0protocolIpprio1u32matchipdst192.166.106matchipsport21OxfTfflowid1;23filteradddevethOparent1:0protocolipprio1u32matchipdst192.166.16flowid1:24接下來我們?yōu)锽網(wǎng)絡(luò)匹配規(guī)則:#tcfilteradddevethOparent1:0protocolippr

15、io1u32matchipdst192168.129/26matchipsport23Oxfffflowid1:31#tcfilteradddevethOparent1:0protocolipprio1u32matchipdst192.168.129/26matchipsport80Oxfffflowid1:32#tcfilteradddevethOparent1:0protocolipprio1u32matchipdst192.168.129/26matcliipsport20Oxfffflowid1:33#tcfilteradddevethOparent1:0protocolipprio1

16、u32matchipdst192.168.129/26matchipsport21Oxfffflowid1:33filteradddevethOparent1:0protocolipprio1u32matchipdst192.166.129/28flowid1:34這樣我們就大功告成了。2.0Rateceiling速率限度我們看到了上面配置過程中一直有這個(gè)參數(shù),我們接下來討論下這個(gè)參數(shù)的用途。參數(shù)ceil指定了一個(gè)類可以用的最大帶寬,用來限制類可以借用多少帶寬.缺省的ceil是和速率一樣。我們看上面的例子:InternetLinuxBox54192.163,1.1-62e

17、thlsthdA(60>10%telnet2C%www20%ftp50%other29-19CB(4m)15%telnet30%vww3D%伽25%otherFigure我們?cè)诜峙銩和B的速度的時(shí)候我們?cè)O(shè)置了cell都為2048。也就是說雖然A與B的rate值不一樣但是他們峰值的速度是一樣的。假如在某段時(shí)間內(nèi)A用戶網(wǎng)絡(luò)流量很少或者幾乎是沒有的,但是這時(shí)候B用戶的流量很大,這樣B用戶將會(huì)借用A用戶的網(wǎng)絡(luò)流量,當(dāng)然B用戶的總速度是不會(huì)超過cell定義的速度的。注:ceil的數(shù)值應(yīng)該至少和它所在的類的速率一樣高,也就是說ceil應(yīng)該至少和它的任何一個(gè)子類一樣高。第二章HT

18、B程序?qū)崿F(xiàn)對(duì)于HTB的內(nèi)核實(shí)現(xiàn)包括兩部分第一部分為:用戶空間命令的解析以及傳遞消息到內(nèi)核空間第二部分為HTB流量控制算法的實(shí)現(xiàn)2.0用戶傳遞消息的格式我們對(duì)消息的封裝使用如下的格式:首先是消息頭然后接下來就是消息的數(shù)據(jù)部分了。數(shù)據(jù)部分是按照類型、長(zhǎng)度、參數(shù)值的格式來填充數(shù)據(jù)包的。如下所示:消息頭消息模板TC_MSG傳遞的數(shù)據(jù)_u32nlmsg_len;/*Lengthofmessageincludingheader*/_u16nlmsg_type;/*Messagecontent*/_u16nlmsg_flags;/*Additionalflags*/_u32nlmsg_seq;/*Seque

19、ncenumber*/_u32nlmsg_pid;/*SendingprocessPID*/;系統(tǒng)中為支持structnlmsghdr(其中消息頭有如下的參數(shù)QOS定義了如下的消息類型:在文件RTNETLINK.H中。RTM_NEWQDISC=36,#defineRTM_NEWQDISCRTMNEWQDISCRTM_DELQDISC,RTMDELQDISC#defineRTM_DELQDISCRTMGETQDISCRTM_GETQDISC,#defineRTMGETQDISCRTM_NEWTCLASS#defineRTM_NEWTCLASSRTM_DELTCLASS,#defineRTM_DE

20、LTCLASSRTM_GETTCLASS,#defineRTMGETTCLASS=40,RTMNEWTCLASSRTMDELTCLASSRTMGETTCLASSTC_MSG結(jié)構(gòu)如下:structtcmsg(unsignedchartcm_family;unsignedchartcm_padl;unsignedshorttcm_pad2;inttcm_ifindex;_u32tcm_handle;_u32tcm_parent;_u32tcm_info;數(shù)據(jù)部分的格式有如下:structrtattrunsignedshortrta_len;unsignedshortrta_type;nlmsg_l

21、ennlmsg_typenlmsg_flagsnlmsg_seqnlmsg_pidrtalen16bits消息模板TCMSGrta_type16bitsValues32bits其中數(shù)據(jù)部分的rta_type就是傳遞的參數(shù)類型:我們根據(jù)HTB可能的參數(shù)類型,定義如下的參數(shù)類型:定義在文件PKT_SCHED.H中。(我們這里省略一些定義的結(jié)構(gòu)體可以去看看源文件)/*HTBsection*/#defineTCHTBNUMPRIO#defineTC_HTB_MAXDEPTH8#defineTC_HTB_PROTOVER3/*thesameasHTBandenumTCA_HTB_UNSPEC,TCA_H

22、TB_PARMS,TCA_HTB_INIT,TCA_HTB_CTAB,TCA_HTB_RTAB,_TCA_HTB_MAX,;2.1HTB命令的解析由于TC關(guān)于QOS方面的命令基本格式如下:Usage:tcOPTIONSOBJECT(COMMAND|helpn""tc-force-batchfilen""whereOBJECT:=(qdisc|class|filter|actionn""OPTIONS:=(-statistics|-details|-raw可以看出TC命令中OBJECT:=qdisc|class|filter|actio

23、n也就是用于建立QDISC以及建立分類CLASS,建立過濾器FILTER或者是其他的動(dòng)作ACTION。LINUX內(nèi)核中為這不同的命令分別建立了相應(yīng)的命令解析結(jié)構(gòu),大致如下:structqdisc_utilstructqdisc_util*next;constchar*id;int(*parse_qopt)(structqdisc_util*qu,intargc,char*argv,structnlmsghdr*n);int(*print_qopt)(structqdisc_util*qu,FILE*f,structrtattr*opt);int(*print_xstats)(structqdi

24、sc_util*qu,FILE*f,structrtattr*xstats);int(*parse_copt)(structqdisc_util*qu,intargc,char*argv,structnlmsghdr*n);int(*print_copt)(structqdisc_util*qu,FILE*f,structrtattr*opt);我們只列出qdisc_util部分其他的如FILTER以及ACTION的解析結(jié)構(gòu)請(qǐng)參照tc_util.c這個(gè)文件。可以看出qdisc_util這個(gè)結(jié)構(gòu)是個(gè)鏈表。對(duì)于不同的策略我們都可以編譯然后插入到這個(gè)鏈表當(dāng)中。當(dāng)然其中的函數(shù)指針根據(jù)不同的解析類型指向

25、不同的函數(shù)。比如我們講的HTB:這個(gè)文件在q_htb.c中structqdisc_utilhtb_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,用于解析qdischtb參數(shù)部分的命令的。htb_parse_class_opt,用于解析classhtb參數(shù)部分的命令的。舉

26、例消息解析過程一個(gè)命令:tcqdiscadddevifbr0roothandle1:htbdefault12這個(gè)命令為某個(gè)網(wǎng)絡(luò)接口eth0增加一個(gè)qdisc。命令首先在用戶空間被iproute2分析:分析tc:main(intargc,char*argv)被調(diào)用,此函數(shù)在tc/tc.c中;分析tcqdisc:do_qdisc(argc-2,argv+2);被調(diào)用,此函數(shù)在tc/tc_qdisc.c中;分析tcqdiscadd:tc_qdisc_modify(RTM_NEWQDISC,NLM_F_EXCL|NLM_F_CREATE,argc-1,argv+1);被調(diào)用,此函數(shù)在tc/tc_qdi

27、sc.c中,在這個(gè)函數(shù)中,將分析完這一行tc的命令,分析.htbdefault12:前面分析完后,接下來就開始分析后面的部分了,程序發(fā)現(xiàn)是用htb,所以就根據(jù)這個(gè)標(biāo)記找到htb_qdisc_util這個(gè)結(jié)構(gòu),然后用其中的函數(shù)htb_parse_opt對(duì)其后面的參數(shù)進(jìn)行解析,并且根據(jù)上面提到的格式填充數(shù)據(jù)包。最后返回tc_qdisc_modify中,tc_qdisc_modify這個(gè)函數(shù)最終完成發(fā)送消息到內(nèi)核空間,用于控制相關(guān)的操作。其他的命令基本上也是一樣的。只是不同的命令走的分支不一樣。2.2HTB內(nèi)核程序的實(shí)現(xiàn)HTB關(guān)鍵是對(duì)不同數(shù)據(jù)包進(jìn)行不同的流量控制,以達(dá)到控制的目的。對(duì)于流量的控制使用

28、的是令牌桶的算法如下圖:對(duì)于一個(gè)數(shù)據(jù)包在內(nèi)核中總的操作是入隊(duì)和出隊(duì),入隊(duì)只是根據(jù)分類把數(shù)據(jù)包放入不同的隊(duì)列中,如果隊(duì)列滿了就要根據(jù)策略丟棄數(shù)據(jù)包。出隊(duì)的過程中就是根據(jù)策略從隊(duì)列中取出數(shù)據(jù)包,當(dāng)然HTB和TBF一樣速度的限制是在出隊(duì)的時(shí)候才進(jìn)行。2.2.1數(shù)據(jù)包進(jìn)隊(duì)我們首先來看看進(jìn)隊(duì)的操作:staticinthtb_enqueue(structsk_buff*skb,structQdisc*sch)(structhtb_class*cl=htb_classify(skb,sch,&ret);elseif(cl->un.leaf.q->enqueue(skb,cl->un

29、.leaf.q)!=NET_XMIT_SUCCESS)(sch->stats.drops+;cl->stats.drops+;returnNET_XMIT_DROP;else(cl->stats.packets+;cl->stats.bytes+=skb->len;htb_activate(q,cl);returnNET_XMIT_SUCCESS;進(jìn)隊(duì)首先調(diào)用的是分類器,查看數(shù)據(jù)包要放到那個(gè)隊(duì)列中,然后再進(jìn)行進(jìn)隊(duì)操作。至于分類過程我們看看下圖:Packetcontentclassifyx:yclassidclasstcf_result當(dāng)然這些結(jié)果是用戶傳遞進(jìn)來的信息,我們只是進(jìn)行匹配然后找到分類結(jié)果Tcf_result。當(dāng)然分類結(jié)果有時(shí)候我們只保存了分類的CLASSID但是我們有時(shí)候余保存了CLASS根據(jù)不同的策略有時(shí)候是不同的:我們也看看另外一種的分類吧:一Packetcontentskb/Filtercanueallpacketinfonnation1>十VAy?/Zf?rclassifyx:y*-<-rurJJSclass

溫馨提示

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

最新文檔

評(píng)論

0/150

提交評(píng)論