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

19

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

我们已经学习到,当一个站点收到数据后,它会等待SIFS时间。然后再发送数据包。在网上寻找答案时,总是提到的原因是为了给ACK数据包更高的优先级。这是可以理解的,因为当一个站点想要发送正常数据时,它首先必须等待DIFS时间(而DIFS比SIFS大)。

但是为什么要等待呢?为什么不立即发送ACK?站点知道数据已经到达并且CRC是正确的,那么为什么要等待?

6个回答

12
理论上,从线路接收到数据的确切结尾时可以知道CRC是否正确,但实际上需要累积最后一个块中的所有样本才能运行IFFT、反卷积、前向纠错编码(FEC),最终在从波形中获取输入数据之后,你才能知道CRC是否正确。此外,有时需要打开发送电路来发送ACK,这可能会影响接收性能。如果处理链中的每个步骤都是瞬间完成的,如果发送电路确实不干扰接收电路,并且建立ACK波形不需要任何提前时间,那么在获取波形的最后一位后立即发送ACK是可能的。但是,虽然该链中的每个元素都需要一定的确定时间,但并非瞬间完成。短间隙帧间间隔(SIFS)给接收器足够的时间从物理层获取数据、验证数据并发送响应。
免责声明:我对Homeplug比对802.11更加熟悉。

这似乎得到了我找到的一个链接的证实: http://protocols.netlab.uky.edu/~calvert/classes/571/lectureslides/WiFi.pdf 它指出:“SIFS = 站点感知帧结束并开始传输所需的时间”。 - Omega
SIFS 的作用是限制硬件设计者解码和检查帧的时间。这是必要的,因为 802.11 最初是严格按顺序传递的,所以发送方在收到当前数据包的确认或放弃后才能继续下一个数据包。为了获得合理的性能,接收方必须对确认的最大延迟时间有限制。 - Andrew McGregor

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 < PIFS < DIFS < EIFS。
来源:这个PDF(第8页)Andrew S. Tanenbaum的计算机网络

在DCF和PCF两种模式下,在SIFS期间不发送任何数据。每个协议在发送分段之前总是等待SIFS时间。因此,这并不能解释为什么它(指:DCF和PCF)在接收数据后不立即发送ACK。 - Omega
@Omega:问题在于,基站必须支持DCF,但可以选择支持PCF。其他站点必须支持DCF,并可以支持PCF。如果它们不支持PCF,它们仍然必须等待,因为其他人可能支持它。 - Christian V

2

SIFS = 基于物理传输速率的RTT + 接收器帧处理延迟(物理处理延迟+ MAC处理延迟)+ 帧处理延迟(用于组成响应CTS / ACK)+ RF调谐器延迟(从RX到TX的变化)

在发射端,在最后一个PHY符号之后(例如RTS),需要更改为RX模式(在RF上)。因此,我认为SIFS是一种RX侧计算而不是TX侧。


0

我不能确定,但听起来像是一种类似于IP的优化策略。如果你不需要每个数据包都有ACK确认,那么稍微等待一下就有意义了,这样如果更多的数据包到达,你就可以用一个单独的ACK确认它们所有。

例如:客户端快速地向服务器发送了400个数据包。服务器不必回复400个ACK,只需等待客户端稍事休息后再发送一个单独的ACK即可。结合客户端即使在重负载下也会稍事休息(因为其未确认数据包缓冲区已满),这种方法是可行的。

这在ACK(n)表示“我已经接收到包括第n个数据包在内的所有数据包”的系统中是可能的。

使用这种策略可以获得更好的性能和更少的流量。只要接收方等待发送ACK的时间小于发送方在没有ACK的情况下重新传输的时间(考虑传输延迟),就不应该有问题。


我认为噪音是一个主要问题,帧更经常被分成较小的片段进行传输。对于每个片段,接收器将发送ACK进行确认,以便只重新传输坏的片段。 - Christian V
这就是802.11块ACK的工作方式,但原始规范中确实有SIFS,并且没有块ACK。此外,在MPDU被添加之前,802.11严格按顺序传递数据。 - Andrew McGregor

0

SIFS=D+M+Rx/Tx

其中,

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

M=(MAC处理延迟)

Rx/Tx=(收发器切换时间)

所有这些延迟都无法避免,因此在发送确认之前必须等待SIFS时间。


0

802.11的快速入门课程:

802.11本质上是一个巨大的定时器系统。最常见的802.11实现使用分布式协调功能(DCF)。DCF允许节点进入和离开用于802.11的无线电信道范围,并以分布式方式协调谁应该发送和接收数据(忽略此讨论中的隐藏和暴露节点问题)。在任何节点可以开始在信道上传输数据之前,它们都必须等待一段DIFS时间,在此期间确定信道是否空闲。如果在DIFS期间信道空闲,则抓住信道的第一个节点开始传输。在标准的802.11中,即非802.11e实现和非802.11n,每个传输的数据包都需要由物理层(PHY)确认包进行确认,而不管使用的上层协议是什么。在发送数据包后,需要经过SIFS时间段,然后可以发送到控制帧,该控制帧目的地为“控制”信道的节点,此时会传输确认帧。 SIFS允许发送数据包的节点从发送模式切换到接收模式。如果数据包丢失并且在SIFS / ACK超时后未收到ACK,则会调用指数退避。指数退避,又称争用窗口(CW),从CWmin值开始,某些Linux实现中为15个时隙,其中时隙时间取决于正在使用的802.11协议。然后从1到已计算出的CW上限选择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时,每个子帧都具有一个小标题和校验和,允许任何具有错误的子帧单独/在下一次发送节点获得通道时在另一个聚合帧内进行重传。对于这些聚合包发送方案,存在块确认的概念。块确认包含从刚刚在聚合包中发送并正确或错误接收的起始序列号的帧的位图。使用聚合帧发送大大提高了吞吐量性能,因为发送节点可以在每个信道获取时发送更多数据,还可以允许无序数据包发送。但是,无序数据包发送极大地复杂化了802.11 MAC层。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接