Linux流量控制工具TC

onephone發表於2017-01-17

tc是用來提供流量控制的強大工具,自己在進行DDoS攻擊模擬、網路負載測試中一直使用!本文是簡單的使用介紹, 流量控制工具TC詳細說明有詳細的介紹

概要

  1. 簡介
    • netem是linux核心版本提供的一個網路模擬功能模組
    • tc 是 Linux 系統中的一個工具,全名為traffic control(流量控制)。tc 可以用來控制 netem 的工作模式
    • 如果想使用 netem ,需要至少兩個條件,一個是核心中的 netem 功能被包含,另一個是要有 tc 。
  2. 原理
    • TC用於Linux核心的流量控制,主要是通過在輸出埠處建立一個佇列來實現流量控制。
    • 一般只能限制網路卡傳送的資料包,不能限制網路卡接收的資料包,所以可以通過改變傳送次序來控制傳輸速率。Linux流量控制主要是在輸出介面排列時進行處理和實現的

簡單使用

以下功能一般是基於無類佇列,可完成如下功能如下(故障模擬)

1. 模擬延遲傳輸

以使用netem(Token Bucket Filter)為例

  1. tc qdisc add dev ens33 root netem delay 100ms
    • 該命令將 ens33 網路卡的傳輸設定為延遲100毫秒傳送
  2. tc qdisc del dev ens33 root netem delay 100ms
    • 刪除
  3. tc qdisc add dev ens33 root netem delay 100ms 10ms
    • 該命令將 ens33 網路卡的傳輸設定為延遲 100ms ± 10ms (90 ~ 110 ms 之間的任意值)傳送
    • 更真實的情況下,延遲值不會這麼精確,會有一定的波動,可以用該命令來模擬出帶有波動性的延遲值
  4. tc qdisc add dev ens33 root netem delay 100ms 10ms 30%
    • 該命令將 ens33 網路卡的傳輸設定為 100ms ,同時,大約有 30% 的包會延遲 ± 10ms 傳送。
    • 進一步加強這種波動的隨機性

2. 模擬網路丟包

以netem為例

  1. tc qdisc add dev ens33 root netem loss 1%
    • 該命令將 ens33 網路卡的傳輸設定為隨機丟掉 1% 的資料包。
  2. tc qdisc add dev ens33 root netem loss 1% 30%
    • 設定丟包的成功率
    • 該命令將 ens33 網路卡的傳輸設定為隨機丟掉 1% 的資料包,成功率為 30% 。

3. 模擬包重複

  1. tc qdisc add dev ens33 root netem duplicate 1%
    • 該命令將 ens33 網路卡的傳輸設定為隨機產生 1% 的重複資料包 。

4. 模擬包損壞

  1. tc qdisc add dev ens33 root netem corrupt 0.2%
    • 該命令將 ens33 網路卡的傳輸設定為隨機產生 0.2% 的損壞的資料包 。 (核心版本需在2.6.16以上)

5. 模擬包亂序

  1. tc qdisc change dev ens33 root netem delay 10ms reorder 25% 50%
    • 該命令將 ens33 網路卡的傳輸設定為:有 25% 的資料包(50%相關)會被立即傳送,其他的延遲 10 秒。
  2. tc qdisc add dev ens33 root netem delay 100ms 10ms
    • 該命令會在一定程度上打亂髮包的次序

流量控制模擬

以tbf(Token Bucket Filter)為例,詳細內容見流量控制工具TC詳細說明,tbf更適合用來控制速率。百度百科介紹

  1. 簡介
    令牌桶過濾器(TBF)是一個簡單的佇列規定:只允許以不超過事先設定的速率到來的資料包通過,但可能允許短暫突發流量朝過設定值。

    • TBF很精確,對於網路和處理器的影響都很小。所以如果您想對一個網路卡限速,它應該成為您的第一選擇!
    • TBF的實現在於一個緩衝器(桶),不斷地被一些叫做“令牌”的虛擬資料以特定速率填充著。 (token rate)。桶最重要的引數就是它的大小,也就是它能夠儲存令牌的數量。
    • 每個到來的令牌從資料佇列中收集一個資料包,然後從桶中被刪除。這個演算法關聯到兩個流上——令牌流和資料流,有三種情形:
      1) 資料流以等於令牌流的速率到達TBF。這種情況下,每個到來的資料包都能對應一個令牌,然後無延遲地通過佇列。
      2) 資料流以小於令牌流的速度到達TBF。通過佇列的資料包只消耗了一部分令牌,剩下的令牌會在桶裡積累下來,直到桶被裝滿。剩下的令牌可以在需要以高於令牌流速率傳送資料流的時候消耗掉,這種情況下會發生突發傳輸。
      3) 資料流以大於令牌流的速率到達TBF。這意味著桶裡的令牌很快就會被耗盡。導致TBF中斷一段時間,稱為“越限”。如果資料包持續到來,將發生丟包。
    • 令牌的積累可以導致越限的資料進行短時間的突發傳輸而不必丟包,但是持續越限的話會導致傳輸延遲直至丟包。
  2. 示例
    tc qdisc add dev ens33 root tbf rate 100mbit latency 50ms burst 1000
    tc qdisc change dev ens33 root tbf rate 200mbit latency 50ms burst 1000
    tc qdisc change dev ens33 root tbf rate 300mbit latency 50ms burst 1000
    tc qdisc del dev ens33 root tbf rate 300mbit latency 50ms burst 1000

  3. 測試情況(依賴具體的硬體)
    image_1b6b77v4adon3gul0bq8a1tba9.png-15.4kB

TC進階

  1. 流量控制工具TC詳細說明
  2. Traffic Control HOWTO
  3. Linux 高階流控

相關文章