为什么在发送ACK之前等待SIFS时间?

时间:2010-01-08 20:44:44

标签: macos network-protocols wifi protocols

有关802.11 Wifi的MAC协议的问题。

我们了解到,当一个电台收到数据时,它会等待SIFS时间。然后它发送数据包。在线搜索时,总是提到的原因是为ACK数据包提供更高的优先级。这是可以理解的,因为当一个站想要发送正常数据时(DIFS大于SIFS),它首先必须等待DIFS时间。

但为什么要等呢?为什么不马上发送ACK?该站知道数据已到达且CRC是否正确,为什么要等?

6 个答案:

答案 0 :(得分:11)

理论上可以知道CRC在来自线路的接收数据的确切末端是正确的,但实际上,您需要累积最后一个块中的所有样本以运行IFFT,反卷积, FEC,然后,最后,最后,在最终从波形中获取输入数据后,您知道CRC是否正确。此外,有时您需要打开发送电路来发送ACK,这会妨碍接收性能。如果处理链中的每个步骤都是瞬时的,并且如果发送电路肯定不会干扰接收电路,并且如果没有为构建ACK的波形所需的准备时间,则可以发送在获得波形的最后一位后立即确认。但是,虽然这个链中的每个元素都需要一些确定的时间,但它并不是瞬时的。 SIFS为接收器提供了从PHY获取数据,验证并发送响应的时间。

免责声明:我对Homeplug比802.11更熟悉。

答案 1 :(得分:3)

这就是因为分布式协调功能(DCF)和点协调功能(PCF)模式可以在一个小区内共存。也就是说,基站可以使用轮询,同时小区可以使用CSMA / CA进行分布式协调。

因此,在SIFS期间,可以发送控制帧或下一个片段。在PIFS期间,可以发送PCF帧,并且在DIFS期间可以发送DCF帧。在SIFS和PIFS期间,PCF可以发挥其神奇作用。

即使并非所有基站都支持PCF,所有站点都必须等待,因为有些站点可能会支持它。

<强>更新

我现在理解这一点的方法是,在SIFS期间,电台可以发送RTS,CTS或ACK,并且在发送方开始发送之前有足够的时间切换回接收模式。如果这是正确的,它将在SIFS期间发送ACK。然后它将变为接收模式并等待SIFS过去。当SIFS结束时,发射器将开始发送。

此外,PCF由PIFS控制,PIFS在SIFS之后和DIFS之前,因此与此讨论无关(我的错误)。即,SIFS&lt; PIFS&lt; DIFS&lt; EIFS。

来源:This PDF (page 8)Computer Networks by Andrew S. Tanenbaum

答案 2 :(得分:1)

SIFS = RTT(基于PHY传输速率)+接收器处的帧处理延迟(PHY处理延迟+ MAC处理延迟)+帧处理延迟(用于组成响应CTS / ACK)+ RF TUNER DELAY(从RX到TX的更改) )

发送器侧,在最后的PHY符号(例如RTS之后)之后,改变到RX模式(在RF处)所需的时间。所以,我会看到SIFS作为RX侧计算而不是TX侧。

答案 3 :(得分:0)

我不能肯定地说,但这听起来像是一种类似于IP的优化策略。如果你不需要对每个数据包进行ACK,那么有必要暂停一下,这样,如果有更多数据包到达,你可以用一个ACK确认它们。

示例:客户端快速向服务器发送400个真正的数据包。而不是服务器发回400个ACK,它可以简单地等到客户端在发送单个ACK之前休息一下。结合客户端即使在负载很重的情况下也会休息的可能性(它必须在未确认的数据包缓冲区填满时),这是可行的。

ACK(n)表示“我已收到所有内容并包括数据包#n的系统中,这是可能的。

通过使用此类策略,您将获得更好的性能和更少的流量。只要接收方的发送前等待时间小于发送方的重发时间(考虑到传输延迟),就应该没有问题。

答案 4 :(得分:0)

关于802.11的快速崩溃课程:

802.11本质上是一个巨大的计时器系统。 802.11的最常见实现使用分布式协调功能DCF。 DCF允许节点进入和离开用于802.11的无线电信道的范围,并以分布式方式协调,应该发送和接收数据(忽略本讨论中隐藏和暴露的节点问题)。在任何节点开始在信道上发送数据之前,它们都必须等待一段DIFS,其中确定信道是空闲的,如果它在DIFS周期期间空闲,则第一个获取信道的节点开始发送。在标准802.11中,即非802.11e实现和非802.11n,传输的每个单个数据分组需要由物理层PHY确认分组确认,而不管所使用的上层协议如何。在发送数据分组之后,SIFS时间段需要到期,在SIFS到期之后,可以发送去往已经“采取”信道控制的节点的控制帧,在这种情况下发送确认帧。 SIFS允许发送数据包的节点从发送模式切换到接收模式。如果数据包确实丢失并且在SIFS / ACK超时发生后没有收到ACK,则调用指数退避。指数后退,a.k.a争用窗口(CW),从值CWmin开始,在某些Linux实现中,这是15个时隙,其中时隙时间根据正在使用的802.11协议而变化。然后,CW值从1到任何为CW计算的上限。如果当前数据包丢失,则CW从15增加到30,然后在1到30之间选择随机值。每次连续丢失时CW会加倍到1023,此时它会达到限制。成功接收数据包后,CW将重置为CWmin。

关于802.11n / 802.11e: 每个数据包仍然需要被确认,但是当使用802.11e(在802.11n中实现)时,可以以两种不同的方式将多个数据包聚合在一起A-MSDU或A-MPDU。 A-MSDU是一个巨型帧,对于正在发送的整个聚合分组具有一个校验和,其中包含许多子帧,其中包含需要发送的每个数据帧。如果A-MSDU帧中存在任何错误并且需要重新发送,则需要重新发送每个子帧。然而,当使用A-MPDU时,每个子帧具有小的报头和校验和,其允许在其下一次发送节点获得信道时自身/在另一聚合帧内重传其中具有错误的任何子帧。 。利用这些聚合分组发送方案,存在block-ack的概念。 block-ack包含来自起始序列号的帧的位图,这些帧刚刚在聚合数据包中发送并正确或错误地接收。聚合帧发送的使用极大地提高了吞吐量性能,因为发送节点每次信道获取可以发送更多数据,也允许无序分组发送。但是,无序数据包发送极大地使802.11 MAC层复杂化。

答案 5 :(得分:0)

SIFS = d + M +接收/发送

其中,

D =(接收器延迟(RF延迟)和物理层会聚过程(PLCP)前导码/报头的解码)

M =(MAC处理延迟)

Rx / Tx =(收发器周转时间)

首先,无法避免延迟,因此必须在发送确认之前等待SIFS时间