带宽限制(比如 ipfw)是如何工作的?

How does bandwidth limiting (with, say, ipfw) work?

我对制作带宽控制实用程序很感兴趣,我需要动态限制传出或入站流量。为此,我可以使用 ipfw 管道,但这会产生对 ipfw 的依赖。 像 ipfw 这样的程序如何在系统调用/套接字级别控制带宽?我的目标是实现类似的功能,为我的特定需求量身定制。

所有带宽限制器的工作原理都很简单——过滤(丢弃)数据包。然而,实施要复杂得多,需要对 TCP/IP 堆栈和过滤不同类型流量的后果有很好的了解。

带宽限制器是根据称为 令牌桶 的东西建模的。令牌(代表要发送或接收的数据)定期添加到桶中。由于如果桶已满,桶的容量有限,新令牌将被丢弃(它们溢出)。此存储桶用于管理流量。如果桶中有足够的令牌,令牌的数量将减少适当的数量(与数据包的大小成比例),然后发送或接收数据包。如果桶中没有足够的令牌,则丢弃数据包。这是基本解释,请阅读 wiki 或其他资源。

流量管理有两种基本类型——监管整形。两者之间的基本区别在于整形器有一个队列或一个可以容纳一定量数据的缓冲区。如果由于令牌数量少而无法立即发送数据包,则将数据包放在此缓冲区中,并在有足够的令牌后发送。此技术通常用于传出流量,而监管用于传入流量。

之后你应该想知道更多不同的令牌桶机制,如何避免 TCP 流的全局同步,RED/WRED 对非 TCP 流量有什么影响,以及很多其他的东西链接到队列和 QoS。换句话说,我认为满足依赖性比实现所有这些更容易,所以我建议您使用已经可用的工具并在它们之上构建您需要的东西。