【译】在各种OS下更改 ACK timeout的方法

通过改变ACK/CTS timeout和Slottime可以提升长距离链路的吞吐性能,见http://www.air-stream.org/ACK_Timeouts

RouterOS

ACK Timeout选项可在Winbox GUI网卡接口设置的“Advanced”标签中找到—-须确保“Advanced Mode”被勾选。RouterOS有一个特性,可以自动计算ACK Timeout,这是默认选项并且在大多数情况下都工作得很好。若要手动设置ACK Timeout,直接输入以微秒为单位的数字,然后点击apply即可。

使用athctrl修改Atheros网卡

athctrl是一个Linux下基于指定的以米为单位的最大距离更改ACK Timeout,CTS Timeout和Slottime的小工具。它的使用方法是:

athctrl  [-h] [-i device] [-d distance]

目前基于atheros的网卡的acktimeout/ctstimeout的可能的最大值是409µs,可以工作的最大距离约为53-57km。

举例

athctrl  -d 1000

设置wifi0的最大距离为1000米

athctrl  -i wifi1 -d 5000

设置wifi1的最大距离为5000米

OpenWrt + Madwifi

物理层参数存储在/proc/sys/dev/wifiX中。查看参数,比如wifi0的acktimeout

OpenWrt:~# sysctl dev.wifi0.acktimeout
dev.wifi0.acktimeout = 22

举例

我想设置我的802.11a网卡wifi0,使其工作于8km的链路上。默认的slottime是9µs,默认的acktimeout就是上面的命令所得到的22µs。在原始的300米基础上,距离每增加300米,我都必须将slottime加1,acktimeout加2。这意味着,我必须为slottime添加额外的(8000-300)/300=25.7µs。保险起见,向上取26。因此,我的slottime就是9+26=35,acktimeout和ctstimeout都将是22+26*2=74。

这些设置可通过如下方式完成:

OpenWrt:~# sysctl -w dev.wifi0.acktimeout=74
dev.wifi0.acktimeout = 74
OpenWrt:~# sysctl -w dev.wifi0.ctstimeout=74
dev.wifi0.ctstimeout = 74
OpenWrt:~# sysctl -w dev.wifi0.slottime=35
dev.wifi0.slottime = 35

为使设置的参数在系统启动时不变,我们需要将以下内容添加到/etc/sysctl.conf中:

dev.wifi0.ctstimeout=74
dev.wifi0.acktimeout=74
dev.wifi0.slottime=35

BSD

可以在基于BSD的系统中使用sysctl访问和修改参数,格式是相似的。

举例

以修改网卡wl1为例:

~# sysctl -w dev.wl.1.acktimeout=74
dev.wl.1.acktimeout: 22 -> 74
~# sysctl -w dev.wl.1.ctstimeout=74
dev.wl.1.ctstimeout: 22 -> 74
~# sysctl -w dev.wl.1.slottime=35
dev.wl.1.slottime: 9 -> 35

为使设置的参数在系统启动时不变,我们需要将以下内容添加到/etc/sysctl.conf中:

dev.wl.1.acktimeout=74
dev.wl.1.ctstimeout=74
dev.wl.1.slottime=35

OpenWrt Whiterussian + Broadcom

使用工具dctrl修改Whiterussian中的nbd或nvram设置,可以指定station之间的最大距离。dctrl的使用方法是:

dctrl  [以米为单位的最大距离]

在Whiterussian RC5或更高版本中,nvram中的wl0_distance能用来控制以米为单位的最大距离。一个称为sdist的小工具,可以用来验证是否正确修改了寄存器。在更改nvram后,记得运行/sbin/wifi重新加载wifi设置。

举例:

使用sdist检查初始值,然后将wl0_distance改为20km,重新加载wifi设置。检查wifi卡的寄存器是否正确修改了,然后执行nvram commit (committing the nvram),以便系统重启后wl0_distance设置保持不变。

OpenWrt:~# ./sdistshm: 0x9reg 684: 0×207
OpenWrt:~# nvram set wl0_distance=20000
OpenWrt:~# /sbin/wifi
OpenWrt:~# ./sdist
shm: 0x8f
reg 684: 0x28d
OpenWrt:~# nvram commit

HostAP+Prism?

Do we care?

Note about Atheros:如果使用802.11g,将station的工作模式锁定为11g是一个很好的主意,这可以防止当有11b客户端尝试连接时,slottime发生重置。这可以通过在Linux/Madwifi下使用iwpriv <interface> mode 11g,在BSD下使用 ifconfig <interface> mode 11g实现。

Tags: , ,

{ 2 comments to read ... please submit one more! }

  1. 有时间希望能和博主多多交流。

{ 0 Pingbacks/Trackbacks }

发表评论

电子邮件地址不会被公开。 必填项已用 * 标注

*

您可以使用这些 HTML 标签和属性: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong>