降低 TCP ACK 延迟造成的网络性能损失

http://blog.donews.com/jackqq/archive/2007/11/28/1232355.aspx

最近买了一台新机器,装了 FreeBSD 7-stable,却遇到了一个问题。

别人在我的 http 上下载东西的时候,我从外面进来的 ssh 被挤得几乎不动了。

以前的机器上跑着 FreeBSD 5-stable,不知道是机器配置低达不到饱和,还是 5-stable 没有这个问题,或者是我 ssh 的很少根本没注意。前两种不大可能, ADSL 512Kbps 的上行速率应该很容易撑满, 5-stable 不是起因请看下面的分析。

昨天晚上回来查 ssh QoS,发现一种解释。这种问题的起因是网络拥塞导致 TCP ACK 延迟增大,连接的两端就陷入等待、重发和慢启动的循环状态里啦。

换一种说法,如果 TCP ACK 拥有更高的优先级,那么下行带宽将被更好地利用。尤其是像我这样的家庭用户,提供上传服务是次要的,主要是自己下载,当然最重要的是控制,也就是 ssh。

所以应该为 TCP ACK 提供更好的 QoS,起码也应该让 ssh 的 TCP ACK 畅通无阻。

这样一来, pf(4) / altq(4) 似乎是不二之选了。但是学会它们还是需要时间的。以后再说吧。

我今天想了一个用 ipfw(8) dummynet(4) 实现目前最低目标的方法。把出站数据放到一个 pipe 里,限制速度;而 ssh 的出站流量跳过这个 pipe 即可。配置文件如下:

# loopback
add 1 pass all from any to any via lo0
add 2 deny all from any to 127.0.0.0/8
add 3 deny all from 127.0.0.0/8 to any

# open
add 65500 pass all from any to any

# ssh (skip throttling)
add 22 skipto 60000 all from me ssh to any

# outbound throttling
pipe 1 config bw 480Kb/s
add 50000 pipe 1 all from me to not 192.168.1.0/24

原文地址:https://www.cnblogs.com/gmth/p/3140768.html