計網 TC 流量控制

參考資料

總結的很好很全面 實際上是linux手冊的中文翻譯233
這個基本概念補充的更全一些
linux TC的設計論文
driver queue 和 qdisc 和socket buffer之間的關係

QDisc層之上就沒有數據包隊列了。這意味着Linux協議棧將數據包直接放在QDisc隊列中 或者當QDisc隊列已滿時將數據包又返回存放到更上面的層中(例如:socket緩衝區中)
在這裏插入圖片描述

breif summary

  • 輸出斷口處建立一個隊列進行TC
  • 方式分類
    • shaping (僅針對輸出
    • scheduling (僅針對輸出
    • policing (僅針對輸入
    • dropping (僅針對輸入輸出均可

三個機制

qdisc 排隊規則

classless QDisc [ 不可分類的QDisc]

			* [p|b]fifo
			* pfifo_fast -- 按TOS分爲三個band
			* redn(Random Early Detection)  -- 非常適用於高帶寬的情況
			* Sfq(Stochastic Fairness Queueing)
			* Tbf(Token Bucket Filter)
  1. 如果沒有可分類QDisc,不可分類QDisc只能附屬於設備的根
  2. 一個網絡接口上如果沒有設置QDisc,pfifo_fast就作爲缺省的QDisc

CLASSFUL QDISC(分類QDisc)

  • CBQ(Class Based Queueing)
  • HTB(Hierarchy Token Bucket)
  • PRIO

class 類別

  • CLASSFUL QDISC可以包含class,並且在其上附有filter句柄,而classless QDISC就沒有class和filter之說了
  • class僅存在於classful qdisc中(例如,HTB和CBQ)。class非常靈活,可以始終包含多個child class或單個child qdisc [1]。

不提倡使用一個沒有child class的classful qdisc,它會帶來極其複雜的流量控制方案。

  • leaf class (contains a qdisc(default is FIFO) ) & root class(inner class)

filter 過濾器

術語混餚

  • root qdisc and ingress qdisc實際上指的不是兩類qdisc,而是qdisc機制部署的位置—— egress/root (outbound traffic) and ingress (inbound traffic).
  • 每個device兩個都有
    • 最主要且更常見的是egress qdisc,稱爲root qdisc
    • ingress 則沒有child class 但是有filter 作爲策略上的過濾

    In short, you can do much more with an egress qdisc because it contains a real qdisc and the full power of the traffic control system. An ingress qdisc can only support a policer.

Theory Of Operation

類形成一棵樹,其中每個類都有一個父級。一個班級可能有多個孩子。一些qdiscs允許在運行時添加類(CBQ,HTB),而其他qdiscs是使用靜態子代數創建的。 允許動態添加類的Qdiscs可以具有零個或多個子類,可以將流量入隊。 此外,每個類都包含一個葉子qdisc,默認情況下它具有pfifo行爲,儘管可以將另一個qdisc附加到位。這個qdisc可能再次包含類,但是每個類只能有一個葉子qdisc。

  • 當數據包進入有類別的qdisc時,可以將其分類爲其中的一個類別。可以使用三個條件,儘管並非所有qdiscs都將使用所有三個條件:

    • tc filters

    如果將tc過濾器附加到類上,請先諮詢它們以獲取相關說明。過濾器可以匹配數據包頭的所有字段,也可以匹配ipchains或iptables應用的防火牆標記。

    • Type of Service(TOS)

    一些qdiscs內置了用於基於TOS字段對數據包進行分類的規則。

    • skb-> priority

    用戶空間程序可以使用SO_PRIORITY選項在該字段中對class-id進行編碼。

樹中的每個節點都可以擁有自己的過濾器,但是較高級別的過濾器也可以直接指向較低的類。 如果分類不成功,則將數據包排隊到附加到該類的葉子qdisc上。

linux TC設計理念 ( ref3

2-4節介紹了基本概念; 第5至8節更詳細地描述了Linux內核中的TC元素;第9節介紹了作者已實現的排隊規則。

概念介紹

在這裏插入圖片描述

  • class自己本身不負責存儲數據包 使用queue ,一般說成qdisc(我們普通認爲的queue實際上就是pfifo qdisc),然後裏面還可以繼續層層嵌套
  • 多個filter可以對對應同一個class

在這裏插入圖片描述

  • TBF token bucket filter 令牌桶過濾器 強制以最高速度爲1Mbps的速度發包

基本流程

在這裏插入圖片描述

qdisc

  • 對於所有這些功能,排隊規則通常由指向相應結構Qdisc的指針引用。 當數據包在接口上排隊(net / core / dev.c中的dev_ queue_xmit)時,設備的排隊規則(include / linux / netdevice.c中的struct device的eld qdisc)被調用。 然後,dev_queue_xmit在該設備上的include / net / pkt_sched.h中調用qdisc_喚醒,以嘗試發送剛剛入隊的數據包。
  • qdisc_wakeup立即在net / sched / sch_generic.c中調用qdisc_restart,這是輪詢隊列規則和發送數據包的主要功能。 qdisc_restart rst嘗試從設備的排隊規則中獲取數據包,如果成功,它將調用設備的hard_start_xmit函數以實際發送數據包。 如果由於某種原因發送失敗,則數據包將通過其requeue功能返回到排隊規則
  • 當排隊規則注意到某個數據包可能由於發送而到期時,排隊規則也可以調用qdisc_wakeup。 在計時器到期時。 TBF是這種排隊規則的一個示例。 也可以通過net / core / dev.c中net_bh的qdisc_ run_queues調用qdisc_restart。 net_ bh是網絡堆棧的\ bottom-half“處理程序,並在將數據包排隊等待進一步處理時執行。
  • 這裏說明了requeue是爲了使丟棄的包重新進入隊列
  • 請注意,排隊規則永遠不會直接調用傳遞功能。 相反,他們必須等到被輪詢爲止。

class

filter

Policing

管制的目的是確保流量不超過特定範圍。 爲簡單起見,我們將對policing進行廣泛的定義,並考慮它包括各種以某種方式依賴於交通量的交通控制行動。

  • 我們考慮四種類型的管制機制:(1)通過過濾器進行管制決策;(2)拒絕對數據包進行排隊;(3)從“內部”排隊規則中丟棄數據包;以及(4)在排隊時丟棄數據包 圖11至15說明了這四種機制。

第一種 對過濾器進行管制決策

  • 是決策者做出的決定(圖11)。 過濾器的分類功能可以返回三種類型的值以指示策略決策(這些值在include / linux / pkt_cls.h中聲明:

TC_POLICE_OK不需要特殊處理。
TC_POLICE_RECLASSIFY數據包已被過濾,但在特定範圍之外,應重新分類(請參見下文)。
過濾器選擇了TC_POLICE_SHOT過濾器,發現該過濾器超出範圍,因此應將其丟棄。

第二種 拒絕對數據包進行排對

第二種類型的管制發生在排隊規則無法使數據包排隊時(圖13)。
在這種情況下,它通常會簡單地丟棄該數據包(即通過調用kfree_skb)。 一些排隊規則還向調用排隊規則提供更復雜的反饋,併爲它提供了使數據包排隊的第二次機會:如果已經設置了reshape_fail回調函數(在結構Qdisc中),則\ inner“排隊規則可以調用它來代替允許 “外部”排隊規則以選擇不同的類別。

第三種 從“內部”排隊規則中丟棄數據包

如果排隊規則決定在某個分組被“排隊”之後從“內部”排隊規則中丟棄某個數據包,則應用第三個策略機制,例如,以便爲更重要的類的數據包創建空間(圖14)。 sch_cbq的cbq_dequeue_prio函數通過cbq_under_limit使用它來從超出限制的類中刪除數據包。

第四種(圖15) 丟棄已經成功排隊的數據包

如果排隊規則的排隊功能認爲新數據包比一些舊數據包更重要,則可以丟棄舊數據包並將新數據包排隊。 。 它通過返回零來向呼叫者表明這一點。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章