如何检测长寿命连接并对其进行标记以进行整形

如何检测长寿命连接并对其进行标记以进行整形

我想检测打开时间超过一分钟(或超过 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(或类似协议)随机存活,有些存活数秒后断开,有些存活数分钟或数小时后断开。很少有存活时间超过一天的。

摘要:连接的长度与连接是否为“批量”以及连接是否应被视为批量无关。

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

使用流量整形来限制下载流量是有益还是有害?

相关内容