关于802.11 Wifi的MAC协议的问题。
我们已经学习到,当一个站点收到数据后,它会等待SIFS时间。然后再发送数据包。在网上寻找答案时,总是提到的原因是为了给ACK数据包更高的优先级。这是可以理解的,因为当一个站点想要发送正常数据时,它首先必须等待DIFS时间(而DIFS比SIFS大)。
但是为什么要等待呢?为什么不立即发送ACK?站点知道数据已经到达并且CRC是正确的,那么为什么要等待?
关于802.11 Wifi的MAC协议的问题。
我们已经学习到,当一个站点收到数据后,它会等待SIFS时间。然后再发送数据包。在网上寻找答案时,总是提到的原因是为了给ACK数据包更高的优先级。这是可以理解的,因为当一个站点想要发送正常数据时,它首先必须等待DIFS时间(而DIFS比SIFS大)。
但是为什么要等待呢?为什么不立即发送ACK?站点知道数据已经到达并且CRC是正确的,那么为什么要等待?
SIFS = 基于物理传输速率的RTT + 接收器帧处理延迟(物理处理延迟+ MAC处理延迟)+ 帧处理延迟(用于组成响应CTS / ACK)+ RF调谐器延迟(从RX到TX的变化)
在发射端,在最后一个PHY符号之后(例如RTS),需要更改为RX模式(在RF上)。因此,我认为SIFS是一种RX侧计算而不是TX侧。
我不能确定,但听起来像是一种类似于IP的优化策略。如果你不需要每个数据包都有ACK确认,那么稍微等待一下就有意义了,这样如果更多的数据包到达,你就可以用一个单独的ACK确认它们所有。
例如:客户端快速地向服务器发送了400个数据包。服务器不必回复400个ACK,只需等待客户端稍事休息后再发送一个单独的ACK即可。结合客户端即使在重负载下也会稍事休息(因为其未确认数据包缓冲区已满),这种方法是可行的。
这在ACK(n)
表示“我已经接收到包括第n
个数据包在内的所有数据包”的系统中是可能的。
使用这种策略可以获得更好的性能和更少的流量。只要接收方等待发送ACK的时间小于发送方在没有ACK的情况下重新传输的时间(考虑传输延迟),就不应该有问题。
SIFS=D+M+Rx/Tx
其中,
D=(接收器延迟(RF延迟)和物理层收敛过程(PLCP)前导/头的解码)
M=(MAC处理延迟)
Rx/Tx=(收发器切换时间)
所有这些延迟都无法避免,因此在发送确认之前必须等待SIFS时间。
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层。