如何檢測長期連接並將其標記為整形

如何檢測長期連接並將其標記為整形

我想檢測已打開超過一分鐘(或超過 N 個位元組或 M 個資料包)的 TCP 連接,因此我可以將它們分類為批量流量(“下載”)並取消它們的優先級。

我可以使用 iptables/netfilter/conntrack 檢測長時間運行的流,並將它們標記為由 tc 整形嗎?

我想我也許可以使用 TCP“序號”作為流長度的某種度量,但不幸的是它不是從零開始!也許使用 netfilter/conntrack 進行連接追蹤可以確定正確的序號或位元組總數以及連接的持續時間,並選擇是否標記資料包。

(我還可以提到我正在這樣做入口使用 ifb0 虛擬介面。我目前正在使用 tbf 隊列(帶有 sfq)來限制低優先級資料。無論如何,任何解決方案都可以應用於出口,例如,對於連接有限的網頁伺服器,想要取消下載優先權以加快小請求的速度。


更新:使用 conntrackd 我可以看到連接列表,以及每個連接啟動的時間。我已開始使用此列表來檢測我想要限制的 IP/連接埠對(60 秒後)。但也存在不少問題:

  • conntrack(d) 似乎不會在連接關閉時立即將其從清單中清除!因此,我最終將所有連接標記為限制,甚至是那些已經完成的連接。
  • 在 conntrack 中設定標記似乎沒有在資料包中設定標記(據 tc 所知)。 (這不僅僅是因為conntrack 看到ifb0 之後的資料包:我也看不到出口資料包上的任何標記。)所以我剛剛向tc 添加新的過濾器進行限制,從長遠來看,這遠非理想。
  • conntrack(d) 不會告訴我每個連線使用了多少頻寬。所以我無法區分間歇性(例如iosocket)會話和大量下載。 (無論如何,這是一個難題:如果我們已經有 5 個下載並且開始了新的下載,我們如何知道他正在嘗試泛洪?他不會達到接近最大速率的任何位置。)

任何與上述有關的建議將不勝感激。

(好的一面是,即使我無法正確分類下載,只需使用 tfb 將傳入資料限制為最大降速的 80%,就可以防止連線溢出,並且比以前更容易建立新連線。)

答案1

連接的預期壽命和實際壽命與連接是否應特殊成形無關。

一些例子:

SSH,可能壽命很長,幾分鐘、幾小時、幾天、幾週、甚至幾個月。仍然需要高優先權來響應用戶互動。

Bittorrent(或類似協定),隨機存在,有些持續幾秒鐘,然後斷開連接,有些持續幾分鐘或幾小時,然後斷開連接。很少有一次持續超過一天的。

摘要:連接的長度與連接是否為「批量」連接以及是否應將連接視為批量連接無關。

不一定有直接相關,但有用:

使用流量整形來限制下載流量是有益還是有害?

相關內容