首先,我们要讨论的是在non-satruated的环境下DCF的工作原理。也就是说,在一次成功的传输之后,某个站点并不一定立马有数据接入,可能等一段时间才有新数据成为HOLpacket。
站点要传送数据的必要条件是,先侦听到一段长为DIFS的空闲段。如果新接入数据的站点在DIFS段中某一点发现信道变忙,那么就延迟等待,直到侦听到DIFS长的空闲段。我认为,以上只会在一种情况下发生,也就是前段所述,某个站的数据没有在上次传送成功后立马接入,而是在过了一段时间再接入。刚接入时可能信道空闲,别的站都在侦听,但还没有侦听到DIFS时,别的站已经侦听到DIFS长的空闲了,这时别的站就可发送数据,那么这个站就必须延迟等待。另一方面,在侦听到DIFS的空闲段后,站点需要在传送数据前产生一个随机的退避时间,也就是backofftime。退避时间是slotted的,我们把每个solt的长度设为a(实际中a的长度由物理层信道特性决定),站点只可以在每个slot的开端传数据。在退避区间[0,CW-1]内随机选取。在第一次尝试传送时,CW=W,也就是最小争用窗口的尺寸(长度由物理层特性决定)。在每个空闲时隙后,退避时间计数器减1。一旦侦听到信道繁忙,计数器立即进入“Frozen”状态,停止计数。当再次侦听到信道中有长为DIFS的空闲段后,计数器重新接着上次未递减完的数值开始计数。当计数器为0时,站点立马传输数据。若此时有两个或以上的站点同时传送数据,那么传送就发送冲突。
接下来我们介绍在DCF协议中,站点是如何确认传送成功还是冲突的。在一次成功的传送之后,目的站点会在一个SIFS(包含了传播延迟)的空闲间隔后发送一个ACK确认帧给源站点。SIFS的长度小于DIFS,这样就保证了在这段SIFS的间隔内不会有别的数据接入。若源站点在等待了ACK_TIMEOUT后依然没有收到ACK确认帧,那么则认为此次传送失败。此时,将CW加倍,在等待DIFS后,重新开始backoff。CW窗口的最大值为,K代表传送失败的最大次数。若站点在K次传送后依然失败,则将这个数据包丢弃。
关于几个问题的回答:
1. 一个站点在发包之后的DIFS时间内到底有没有可能会检测到信道忙?如果会,接下来这个站点要干什么?
答:有可能的。正如我之前所说,因为在non-satruated的环境下,一个站点发包之后,并不一定立即有包到达,若在这种情况下,则有可能在新包到达后,还没有侦听到DIFS时,就有别的站开始发包,那么信道就忙。此时,该站点就延迟等待,直到侦听到DIFS长的空闲后开始backoff。
2. 一个站点在成功发包之后的那个DIFS是怎么回事,ACK又是怎么回事,它们的时序关系是怎样的?
答:一个完整传送段由以下几部分组成: 数据帧,SIFS,ACK以及下一个DIFS的前大部分(出去最后一个slot)。虽然DIFS表示信道空闲,但是它是包含在Transmissionperiod中的,在整段Transmissionperiod中,我们认为信道都为忙。
3. 一个站点在“Frozen”状态结束之后有没有可能在一个DIFS后依然“Frozen”?
答: 是有可能的。因为退避时间在[0,CW-1]内随机选取的,若此时站点B的backofftime正好选取为0,那么在DIFS后直接传送,A站点继续“Frozen”。