在TCP / IP方面,一个办公室的下载速度限制器是如何工作的?

假设一个人的办公室,他们希望限制HTTP下载到他们的互联网连接速度的最大40%带宽,以便它不阻挡其他stream量。

我们说“这不是你的防火墙支持的”,他们说“我们曾经可以用我们的Netgear / DLink / DrayTek做到这一点”是不可避免的。

想想看,下载是这样的:

HTTP GET request Server sends file data as TCP packets Client acknowledges receipt of TCP packets Repeat until download finished. 

速度取决于服务器向您发送数据的速度,以及您承认速度的速度。

所以,为了限制下载速度,你有两个select:

1)指示服务器向你发送数据更慢 – 我不认为有任何协议function要求在TCP或HTTP。

2)通过限制上传速度更慢地确认数据包,同时也破坏了上传速度。

设备如何做到这一限制? 有没有标准的方法?

TCP本身实现拥塞控制。

这些限速器只会将数据包丢到极限以外。 TCP处理这个问题,确保数据包全部到达并全部到达; 客户端不会确认丢弃的数据包,而是由服务器重新发送。

服务器的TCP堆栈将重新发送数据包,并且还会在其发送速率上回拨一点点,因为它认为它和客户端之间存在拥塞。 它会加快速度,直到限速器再次丢包,依此类推。

我听说过最好的描述,TCP的固有节stream方法是有意义的,最近的安全播客 。 引用史蒂夫·吉布森:

所以通过普遍的协议,TCP是这个非常聪明的协议,它做了一个叫做“慢启动”的东西。 它通常被允许发送一些没有确认的数据包。 所以这个想法是,让我们把东西搬到这里。 通常这个数字是两个。 所以当TCP启动时,它可以一个接一个地发送两个数据包。 没有第一个承认,它会发送第二个。 但是等待。 然后,节stream的规则是,我们允许未收到的数据包的数量每增加一个我们收到的确认。

所以我们来考虑一下。 我们允许我们收到的每个确认都将未确认的数据包的数量增加一个。 所以我们首先发出两个包,作为我们一致同意的开始。 他们得到承认。 所以我们有我们的第一个承认。 我们让自己发送两个。 现在,收到这第一个确认,我们增加了一到三。 所以我们现在可以再发送三个数据包而不需要进一步的确认。 当我们之前发送的信息回复到原来的信息时,我们会将其增加到四个。 这被称为“拥塞窗口”。 这不是一个在线发送的窗口,也就是说,它不像接收窗口,它是TCP头部的16位,它告诉我们有多less数据可以发送。 这是一个窗口。 它基本上是TCP堆栈为了避免连接而维护的一个计数器,这个想法在某些时候会打破。

如果我们不断增加未确认的数据包的数量,每次我们收到一个确认,我们就可以发送一个数据包,但是在某些时候我们会达到一个极限。 而且这个系统的优点在于,当我们开始尝试发送数据包的速度比最薄弱的环节快时,就会在路由器之间进行链接,在某些时候,我们会发现最弱的链路断开的点。 它会丢弃我们试图发送的数据包,因为我们试图发送它们太快。 所以从另一端的确认停止,因为数据不再通过。

而TCP所做的是,如果它没有收到 – 这在策略上有所不同。 随着时间的推移,战略,实际的拥塞避免策略已经有很大的变化。 像Tahoe和Reno这样的名字,以及一些其他的名字,如果你做一些谷歌search和维基百科,你会看到,具体到什么行为。 但是这个想法是,当发送者意识到其数据不再通过,因为它缺less确认,它会迅速降低发送速率。 通常,它把它分成两半。 所以它大大缩小了它,然后回到增加它。

所以本质上这意味着丢失数据包是“我们不能更快地发送数据”的信号function,而且在连接的每一端,在互联网上的TCP发送器总是有点 – 试图超过两个端点之间可用的最大速度,也就是说,最薄弱的环节,无论在哪里,总是把它推到极限。 所以考虑到有一点比发送数据包的能力弱,他们会find它,因为它们会把数据包抽出来。 只要有数据要发送,并且有高带宽的连接,发送方就会增加发送的速率,也就是未完成数据包的数量,这些数据包允许作为确认回来,积极地继续向上移动这个数字,直到推得太远。 然后它退出了很多,然后再次前进。

所以这就是TCP连接之间实际上正在发生的事情,可能我不知道多大百分比,但互联网上stream量的绝大部分是TCP连接。 我们所有在内核中的操作系统,即所谓的TCP栈,都有这些计数器。 当我们发送一个文件,当我们上传一个大文件,或者我们正在接收一个网页时,另一端的服务器正在做同样的事情。 它在个别连接的基础上推送尽可能多的尚未被确认的数据包,从而提高数据包速率,直到达到开始失败或口吃的程度。 然后退后,让事情恢复,然后再次开始工作。

所以最终成为一种自我节制系统,我认为这是一种限制,它确实显得有些时髦和粗糙。“

所以,为了限制下载速度,你有两个select:

1)指示服务器向你发送数据更慢 – 我不认为有任何协议function要求在TCP或HTTP。

2)通过限制上传速度更慢地确认数据包,同时也破坏了上传速度。

3)您的路由器/防火墙设备将传入数据放入QoS存储桶,并且只按照您请求的速率清空存储桶。 传入的数据将会适应这个速度,因为里面的计算机只能以这个速度看到确认收到。 此外,偶尔(有目的地)丢弃的数据包对于减慢连接非常有效。

当试图find处理这个问题的设备时,请在configuration/文档中查找QoS(服务质量)。 Linux(或BSD)盒也是这个方便的。

您使用支持QoS(服务质量)限制的防火墙或设备。

你可以build立一个Linux系统作为办公室网关,并使用stream量整形来实现这一点。 只需要安装多个网卡,然后每台机器都指向一个网关。

作为奖励,你可以configuration一个代理服务器,以帮助减轻stream量。 像鱿鱼一样。 可能有交钥匙路由设备分布,也可以做到这一点。

HTTP协议不提供限制使用的带宽的设施,即使这样做,这也是客户端设置,networkingpipe理员无法控制。

带宽限制(也称为“服务质量”)通常在路由器/防火墙上pipe理,路由器/防火墙处理所有进出networking的传入和传出stream量; 支持这种方式的人通常可以configuration策略,例如“让任何一台客户端计算机最多使用10%的可用带宽”,或者“通过FTP提供SMTP优先级,这样即使有人正在大量下载电子邮件”。

如何实现这一点取决于所使用的路由器/防火墙,但最基本的方法是丢弃超过configuration的限制的数据包; TCP将确保它们得到转发,并最终能够通过瓶颈。