有几个步骤可以优化upstream bandwidth(向上传输的带宽).第一是将Linux路由器至ADSL modem的传输带宽降低到 ADSL modem至Internet的带宽以下.在 Linux 路由器形成数据包队列.
第二,在路由器设定队列的优先权和组织方法.
我们将从telnet , 多人连线游戏以及交互软件来考查队列的优先权.
使用 HTB 控制队列,我们可以同时设定带宽控制和队列优先权,并且优先级别不会相互制约.
第三,设定防火墙使用fwmark区分数据包的次序.
我们将使用HTP控制数据包到达 ADSL modem 的速率, 为了缩短反应时间,我们必须保证不在 ADSL modem 形成哪怕是只有一个数据包的队列.
Note: previous claims in this section (originally named N-band priority queuing) were later found to be incorrect. It actually WAS possible to classify packets into the individual bands of the priority queue by only using the fwmark field, however it was poorly documented at the writing of version 0.1 of this document
现在,我们仍不知如何完善性能, 我们只是将队列从ADSL modem 转移到Linux路由器上而巳. 如果现在有100个 数据包的普通队列出现在当前的设定中,我将不敢想像它的结果, 但这只是一时的危机而巳.
HTB当中每个相邻的队列可以分配到一个优先权.在不同的级别当中设定不同的类型.自从我们可以为每个级别设定一个最小保证值, 我们就拥有了控制数据包的出列和发送次序能力. HTB可以很好地做到这点并且不会让优先级相互制约..
设定了级别以后,我们使用过滤器将通信进行级别划分.有几种方法可以实现,但我们只介绍常用的iptables/ipchains. 我们将使用iptables设定一些规则将不同的通信划入到不同的级别当中.
Note: originally this document used ipchains to classify packets. The newer iptables is now used.
这里有一个简单的描述,出站的数据包如何从0x00的等级开始,划入4个不同的等级当中:
将任何"较小"的数据包级别设定为0x02,Outbound ACK packets from inbound downloads should be sent promptly to assure efficient downloads. This is possible using the iptables length module.
当然,它还可以依据您的需求来设定.
要加快反应您至少要做两件以上的事情. 首先, 将最大传输单元(MTU)设定在1500bytes以下, 降低这个值就会缩短平均等待时间, 这会减轻网络的负载(恢复了实际可用的吞吐量),因为每个数据包中有40bytes的IP和TCP信息. 另外加快反应的方法是将队列长度缩短至100以下,这可以省去ADSL10秒相当于清空一个1500byteMTU的时间.
通过使用 Intermediate Queuing Device (IMQ)队列中间件, 我们可以像处理出站数据包一样将入站数据包送入队列当中. 这个案例中的数据包优先权非常简单. 将不属于TCP范围内的通讯级别设定为 0x00, 属于TCP范围内的通讯级别设定为 0x01, 也可以将"较小"的TCP数据包通讯级别设定为 0x00,我们将把标准的FIFO队列级别设定为 0x00 , 我们把Random Early Drop (RED) 队列级别设定为0x01 RED将在数据包看起来失去控制的时候(队列将要溢出), 减慢传输或将数据包丢弃. 我们将最大化入站速率(速率小于实际能够达到的).We'll also rate-limit both classes to some maximum inbound rate which is less than your true inbound speed over the ADSL modem.
我们必须限制入站的通讯,以防止ISP的队列饱和, 这样相当于缓冲5秒的数据, 问题是现在唯一的控制途径是将数据包丢弃.这些数据包以经从ADSL modedm那里得到了一些带宽. 但是这些数据包却被丢弃了,这些被丢弃的数据包最终会吃掉更多的带宽. 当我们限制通讯的时候, 我们限制了来自本地网络的数据包传送比率. 因为因为我们丢弃的哪些数据包所以实际入站的传送比率在此之上. 我们实际上限制的入站比ADSL modem实际能达到的比率还要低. 在实际当中, 我将自己的1.5mbit/s downstream ADSL 限制在700kbit/sec ,使它能并发5个下载的连结. TCP会话越多,浪费在丢弃数据包的带宽就越多,并且数率比您的限制还要低.
更好的途径来控制TCP通讯是操作 TCP window, 但是这个好像离题了(我知道有一种...)