限制传入stream量

我从来没有完全理解是否有可能限制传入stream量。 我意识到,没有直接的方法来控制远程服务器发送数据包的速率(除非你控制两个端点),但考虑到这个限制,下载pipe理器到底如何让我成功地设置下载速度限制?

TCP慢速启动和限速传入stream量之间是否有任何联系? 是否可以使用慢启动描述的方法来人为地限制发送者发送数据包的速率?

作为一个额外的考虑,应该注意的是,我想实现stream量整形的服务器自己build立了PPPoE连接,并作为networking其余部分的路由器。

更新:迄今为止的答案已经给出了我所问的问题的一个公平的概述,但我仍然不知道下载pipe理器如何能够限制传入stream量,更具体地说,是否有可能实现类似的策略Linux网关盒子。

下载pipe理器最有可能按照滴stream式文件中的解释工作。

利用BSD套接字的过程可以执行它自己的速率限制。 对于上游限制,应用程序可以通过简单地限制写入套接字的数据的速率来实现。 同样,对于下游限制,应用程序可能会限制从套接字读取的数据的速率。 然而,这个工程的原因并不是很明显。 当应用程序忽略从套接字中读取一些数据时,它的套接字接收缓冲区填满了。 这反过来会导致接收TCP通告一个较小的接收器窗口(rwnd),从而在底层TCP连接上产生反压,从而限制其数据stream。 最终,这种“滴stream”效应实现了端到端的速率限制。 根据networking堆栈中所有层的缓冲,这种影响可能需要一段时间才能传播。

如果偶尔需要对UNIX系统上的单个程序进行速率限制,一个简单的解决scheme就是涓stream 。 真正的stream量整形,就像你在网关上执行一样,可以用tc来完成。 这在第9章中有logging。Linux高级路由和stream量控制HOWTO的带宽pipe理排队规则 。

在56k调制解调器与4 Mbps DSl线路的情况下,通常没有形成速度差异的形状,这只是链路速度的差异。

传入stream量很难形成的原因是传输介质中没有缓冲区。 你要么接受传入的数据,要么丢失数据。 对于stream量即将离开接口,您可以根据需要缓冲和重新sorting数据包(或至less达到设备中的可用缓冲区内存)。

对于在TCP之上有层的协议(我不知道这是否是洪stream的情况),这将是一个简单的问题,请求进一步的数据。 否则,应用程序需要与OS进行通信,以延迟对数据包的确认。 大多数基于UDP的协议必须在应用特定的协议中具有ACK /重发逻辑,所以在这一点上,对它们进行调整是微不足道的。

一种可能的方法是在DSL路由器的局域网侧对互联网上的stream量进行调整,因为那时您将在出口端口上进行调整。

我无法回答为什么你还没有find任何解决scheme,允许形成传入的数据(并不知道任何closures我的头顶上),但至于如何发送者知道接收器可以接收数据有多快:

TCP / IP的基本devise是,对于源发送到目的地的每个数据包,它必须等待目的地回复(带有ACK数据包),说明它接收到数据包。

所以,如果你有一个4Mbps的发送者和一个56Kbps的接收者,那么发送者必须在发送数据包之间等待接收者响应每个数据包(有一些技术细节可以减less这个开销,但前提仍然是一个摘要水平)。

那么如果发送者已经发送了56Kbps的数据,然后尝试发送更多的数据呢?

数据包丢失了。 (好吧,可能在交换机的缓冲区中排队,但是当这个缓冲区填满时,数据包就会丢失)。 由于数据包丢失了,接收方永远不会收到数据包,因此从不发送ACK数据包。 由于发送方永远不会收到这个ACK包(因为它从来没有被发送,但也可能会丢失,或者可能会造成networking中断),因此发送方需要重新发送额外的包。 它坐下并尝试重新发送数据包直到它通过并且ACK应答回到它。

所以,回顾一下,一旦发送方已经超出了接收方的带宽,就必须一遍又一遍地停止和重新发送下一个数据包,直到有足够的可用带宽通过。 这有效地将发送速度降低到客户可以接收的最大速度。 (在这种情况下,有一种优化方法可以减less数据包重发次数,每次重发数据包时,发送方的速度基本上都会下降,但这已经超出了本简化描述的范围。

你可以用ifb接口来做。

使用ifb接口,可以将eth0的入口stream(或其他)路由到ifb0(例如)的出口,并在那里应用限制规则。

查看Linux基金会的这个url: http : //www.linuxfoundation.org/collaborate/workgroups/networking/ifb

而这个脚本,限制包围和超越bandwight: https : //github.com/rfrail3/misc/blob/master/tc/traffic-control.sh

查看wonderdershaper: http : //lartc.org/wondershaper/

关于传入stream量:

 This is slightly trickier as we can't really influence how fast the internet ships us data. We can however drop packets that are coming in too fast, which causes TCP/IP to slow down to just the rate we want. Because we don't want to drop traffic unnecessarily, we configure a 'burst' size we allow at higher speed. Now, once we have done this, we have eliminated the downstream queue totally (except for short bursts), and gain the ability to manage the upstream queue with all the power Linux offers. 

使用UFW(简单防火墙) http://ubuntuforums.org/showthread.php?t=1260812

这个线程显示了一个简单的例子,默认情况下,在30秒内有6个命中的IP被拒绝:

sudo ufw limit ssh/tcp

还有一个更“高级”的命令,具有指定的时间和命中数值

sudo iptables -A INPUT -i eth0 -p tcp --dport 22 -m state --state NEW -m recent --set --name SSH

sudo iptables -A INPUT -i eth0 -p tcp --dport 22 -m state --state NEW -m recent --update --seconds 60 --hitcount 8 --rttl --name SSH -j DROP