要点: 这些方法尽管没有在其它的发行版中试验过,我想它正常工作大概没什么问题.下面是运行的环境:
Note: Previous versions of this document specified a method of bandwidth control that involved patching the existing sch_prio queue. It was found later that this patch was entirely unnecessary. Regardless, the newer methods outlined in this document will give you better results (although at the writing of this document 2 kernel patches are now necessary. :) Happy patching.)
化繁为简,所有的设定依照下面这个布局进行:
<-- 128kbit/s -------------- <-- 10Mbit -->
Internet <--------------------> | ADSL Modem | <--------------------
1.5Mbit/s --> -------------- |
| eth0
V
-----------------
| |
| Linux Router |
| |
-----------------
| .. | eth1..ethN
| |
V V
Local Network
Packet Queues是一个容器, 当数据不能被网络设备立既送走的时候, Packet Queues 负责暂时收留它们. 除非被设定成另外一种方式,否则数据包是按 FIFO (first in, first out 最早进入Queues的数据将被最快发送走) 进行排队.
ADSL的带宽由不对称的 1.5Mbit/s downstream(向下传输)和128kbit/sec upstream(向上传输)组成. Linux 路由器(主机)同ADSL modem的连结速率在10Mbits/s左右.如果 Linux 路由器同 Local Network(本地网络) 的连结速率也在10Mbits/s左右,路由器和Local Network(本地网络)的Queues(队列)就不会存在.但以10Mbits/s到达ADSL modem的数据包却要以128kbit/sec 传输到Internet.因此数据包将在ADSL modem形成Queues,ADSL modem将不能应付而产生数据包丢失现象. TCP就是用来控制类似这样的情况,它调整传输窗口的大小以达到利用带宽的最佳效果.
TCP控制Queues(队列)以利用带宽. 较大的FIFO Queues将延长数据包的传送时间.
另一种同FIFO有点相似的Queues(队列)是 n-band priority queue, 它取代FIFO只有一个队列的做法, 数据包分级别排出多个FIFO Queues(队列), 每一个Queues都有优先级别的设定, 总是从级别高的Queues将数据dequeued(出列). 使用这种方法,FTP和telnet同时上载数据包的时候, telnet的数据包将得到更高的优先级别.单独的telnet数据包将被立既发送.
Linux 使用一种新的Queues: Hierarchical Token Bucket (HTB 译为分级型式的队列容器). 它有点像n-band priority queue, 但n-band priority queue在每个级别中只有限制数据通讯的能力. HTB有一项更加先进的功能:在已有的级别之上能够建立一个新的级别通讯.更多的信息请参照: http://www.lartc.org/
从Internet发送至ADSL modem的数据包入站和数据包出站的Queues大至相同. 不管怎样, queue 会集在您的ISP那里. 因为这样您大概不能直接控制数据包如何排队或以哪种形式分配优先权. 只有一种方法来缩短这里的反应时间:期望向您发送数据包的时候不要太快. 不幸的是,您无法直接控制数据包的到达速度. 这里有一些方法将发送者的速度减慢: