You are currently browsing the 巴鲁 blog archives for 八月, 2011


【译】在各种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实现。

【译】ACK Timeouts及其对远程链路的影响

所有的802.11a/b/g无线设备使用IEEE规范定义的计时常量来侦听其他使用无线媒介的载波并避免冲突(802.3只侦听冲突),也用来重传丢失的帧。需重点考虑的常量有slottime,CTS timeout和ACK timeout。在多站(multiple stations)互联环境中的冲突避免或其中一个站尝试模拟全双工通信时,slottime显得更为重要;而ACK timeouts对点对点通信更为重要。其他的可抑制最大链路距离的参数有SIFS (Short Inter Frame Spacing,短帧间隔), DIFS (Distributed IFS,分布式协调功能帧间隔) 和PIFS (Point Coordination IFS,点协调功能帧间隔)。DIFS是stations在开始新的传输序列前,用来检测射频空闲状态的时间。SIFS是station在发送或接收一个RTS,CTS或ACK帧前必须等待的时长。PIFS是AP的一种称为点协调功能(point coordination function)的特殊访问模式下的DIFS。这些计时常量在定义时,赋予了RTS,CTS和ACK帧更高的优先级(例如,一旦包传输序列开始了,station将一直把持信道,直到传输完成)

在802.11b中,IEEE硬性规定了以下值:

  • slottime=20µs
  • SIFS=10µs
  • PIFS=SIFS+Slottime=30µs
  • DIFS=SIFS+2×Slottime=50µs

在802.11g中:

  • Slottime=9µs
  • SIFS=10µs
  • DIFS=SIFS+2×Slottime=28µs

在802.11a中:

  • Slottime=9µs
  • SIFS=16µs
  • DIFS=SIFS+2×Slottime=34µs

在2.4G 802.11n中:

  • slottime=9µs(纯ERP环境)或20µs(若有NoERP STA)
  • RIFS=2µs
  • SIFS=10µs
  • DIFS= SIFS+2×Slottime=28µs或50µs

在5G 802.11n中:

  • slottime=9µs
  • RIFS=2µs
  • SIFS=16µs
  • DIFS= SIFS+2×Slottime=34µs

注:DIFS/SIFS/PIFS被用作物理层载波侦听,而MAC层使用CTS和ACK timeouts实施冲突检测。CTS和ACK timeouts的默认值因厂家设定而异。

Continue reading →

【译】802.11中的time out值是多少?

在802.11a/b/g中,所有的数据传输都要求接收机(the receiving radio)确认;如果发射机没有收到接收机发来的ACK,发射机就会发起若干重传尝试(注:有一些方法使用多播或多媒体特性发送无确认数据包)。因为发射机在等待一段有限的时间(ack timeout)后,就会尝试重传,因此确认(acknowledgments)会对长距离链路有影响。如果确认超时时间(ack timeout)设置得太短,发射机就可能在接收到接收机传来的ACK之前开始发起重传,而且这个重传还会干扰到正在空中传输(“on it’s way”)的ACK。(注:重传会发生在一个随机的random backoff后)。最终导致的结果就是实际的吞吐量很低,而重传次数很高。如果,相反的,ACK timeout设置得过长,接收机因收不到ACK而确实需要重传数据时,就会先等待一段不必要的长ACK timeout,这就带来了时间上的损失,从而降低链路的吞吐量。

除了ACK timeout,一些其他的计时常数也需要做出调整以适应长距离链路。这些计时常量用于协议的冲突侦听和避免部分。

设置的底线是,确定两无线端站的距离(或者移动环境下的最大距离),计算以微秒为单位的包传送时间,并将ACK timeout设置为比CTS timeout(一个来回传输的时间)稍高一点的值,并将slot time设置为单向传输时间值。这些设置在/proc/sys/dev/athX中表现为slottime,ctstimeout,acktimeout。最简单的方式是使用驱动所带的athctrl工具来更改设置。例如,athctrl –d 15000表示为相距约15000米(约9.4英里)的设备设置相关合理参数。有一点很重要,所有互相通信的设备需使用相同的参数值。因此,在点对多点环境中,其中一台client距离AP 10000米,另一台距离AP 15000米,则需在每台设备上都执行athctrl –d 15000(即按照最远的那台设备与AP的距离做参数调整)。

英文原文见:http://forums.wi-fiplanet.com/showpost.php?s=346e8ea4a7346fae75108b7f68ec0909&p=26917&postcount=2