文章目录
- Framing
- Byte Count
- Flag Byte Method
- Byte Stuffing
- Medium Access Control (MAC)
- Static Channel Allocation
- Dynamic Channel Allocation
- Independent Traffic
- Single Channel
- Observable Collisions
- Continuous or Slotted Time
- Carrier Sense or No Carrier Sense
- Pure ALOHA
- Slotted ALOHA
- Carrier Sense Multiple Access (CSMA) Protocols
- CSMA with Collision Detection
- Collision-Free Protocols
- A Bit-Map Protocol
- Token Passing
- Multiple Access with Collision Avoidance (MACA)
- CSMA with Collision Avoidance
- Virtual channel sensing using CSMA/CA
- Interframe spacing in 802.11
- MAC: Energy Consumption Consideration
- References
数据链路层使用物理层的服务,在通信通道上发送和接收比特。它有许多功能,包括
- 为网络层提供服务接口
- 处理传输错误
- 调节数据流,使慢速接收者不被快速发送者"淹没"
为了实现这些目标,数据链路层从网络层获取数据包,并将其封装成帧(frames)进行传输。
Framing
每个帧包含一个帧头(frame header),一个用于容纳数据包的有效载荷字段( payload field ),以及一个帧尾(frame trailer)。
物理层所做的是接受一个原始比特流,并试图将其传送到目的地。如果信道有噪声,就像大多数无线和一些有线链路一样,物理层将在其信号中添加一些冗余,以将误码率降低到一个可接受的水平。即便这样,也很难保证数据链路层接收到的比特流没有错误。一些比特可能有不同的值(0 变成 1),收到的比特数可能少于、等于或多于传输的比特数。数据链路层需要检测这些错误并在必要时纠正错误。
数据链路层的通常做法是:
- 将比特流分解成不连续的帧
- 为每个帧计算校验和(checksum)
- 在传输时将校验和包含在帧中
当帧到达目的地时,检查和会被重新计算。如果新计算的校验和与帧中包含的校验和不同,数据链路层就知道可能发生了错误,并采取一些措施进行处理。例如直接将错误的帧丢弃,或者给物理层返回一个错误报告。
将比特流分解成不连续的帧,听起来好像很简单,但却大有文章。必须使接收机很容易找到新帧的开始,同时使用很少的信道带宽。我们下面就介绍几种组帧方法。
Byte Count
字节计数法使用帧头中的一个字段来指定帧中的字节数。当目的地的数据链路层看到字节数时,它知道后面有多少个字节,从而也知道了帧的终点位置在哪里。
很明显,这个方法最大的问题在于,如果帧头中的字节数字段在传输中出现错误,那后面一系列的定位都会出错,就像下面这个简单的例子:
即使校验和不正确,收端知道该帧是坏的,但仍然没有办法知道下一帧从哪里开始。
Flag Byte Method
将帧的开始和结束字节用特殊字节来标识。通常用相同的字节,称为标志字节,来作为起始和结束分隔符。两个连续的标志字节表示一帧的结束和下一帧的开始。
但如果负载中携带的数据流中含有标志字节,该怎么办?
Byte Stuffing
解决这个问题的一个方法是让发送方的数据链路层在数据中的每个标志字节之前插入一个特殊的转义字符(通常为 ESC)。这就是字节填充法。
然而,如果用来填充的转义字符出现在待发送的数据信息当中,又该如何处理呢?(无限套娃~~)
答案是在出现的这个转义字符前再插入一个转义字符。在接收方,第一个转义字符被移除,留下后面的数据字节。
Medium Access Control (MAC)
在任何广播网络中,都有一个关键问题,那就是在有竞争的情况下如何确定谁能使用这个信道。
在文献中,广播信道有时被称为多接入信道(multiaccess channels)或随机接入信道(random access channels)。用来决定谁接入多接入信道上的协议属于数据链路层的一个子层,称为 MAC。
MAC 的协议非常多,我们可以大致做个梳理:
Static Channel Allocation
在多个竞争用户之间分配单一信道的传统方法是使用一种复用方法(频分、时分…)。
在频分复用(FDM)中,如果有 N 个用户,带宽会被分成 N 个大小相等的部分,每个用户分配一个部分。由于每个用户都有一个私人频段,用户之间没有干扰。但如果一段时间内这 N 个用户只有少部分在利用带宽资源,那大量的带宽资源就被浪费掉了。
而且,如果超过 N 个用户想进行通信,其中一些用户会因为缺乏带宽而被拒绝,即使一些被分配到一个频段的用户几乎没有发送或接收任何东西。
因此,静态分配并不适合 WSN,因为 WSN 中的流量通常是突发性的。
Dynamic Channel Allocation
动态的信道分配基于以下五个基本假设。
Independent Traffic
该模型由N个独立的节点组成,每个节点都有一个程序或用户,生成用于传输的帧。一旦产生了一个帧,节点就什么也不做了,直到该帧被成功传输。且我们假设帧以恒定的速率生成。实际上,这个假设并不是一个特别好的网络流量模型。
Single Channel
一个单一的信道可用于所有的通信,所有节点可在这个信道上进行传输或接收数据,且不存在其它的通信方式。我们假设这些节点的能力相同,尽管协议可能赋予它们不同的角色(例如,优先级)。
Observable Collisions
如果两个帧同时传输,产生的信号就会出现乱码,这就叫冲突(Collision)。我们认为所有节点都能检测到发生了冲突,冲突的帧必须稍后再进行传输,且除了冲突造成的错误,没有其它错误发生。
Continuous or Slotted Time
时间可以假定是连续的,在这种情况下,数据帧传输可以在任何时刻开始。
另外,时间也可以被划分为不连续的时隙(槽,slots)。在这种情况下,数据帧的传输只能在时隙的起点处开始。一个槽可能包含 0、1 或更多的帧,分别对应空闲状态、一个成功的传输或冲突。
Carrier Sense or No Carrier Sense
有了载波监听的假设,节点可以在尝试使用信道之前来监听信道是否在使用。如果检测到信道不是空闲的,那么节点不会发送消息。
如果不进行载波监听,那么节点想发某个包也就发了,爱咋咋地吧。
Pure ALOHA
Pure ALOHA 的基本理念很简单:只要用户有数据需要发送,就让他们进行传输。这种情况下冲突自然不可避免。在每个节点向中心节点发送数据帧后,该中心节点将该帧重新广播给所有的节点。因此节点也就知道自己的数据帧有没有传送成功了。
如果数据帧传输失败了,节点等待一个随机的时间然后再次发送。注意,必须是随机的时间,否则两个冲突的节点都等待相同时间再传输,还是会发生冲突,一直相爱相杀下去。
固定大小的帧可以使 ALOHA 系统的吞吐量达到最大。
Slotted ALOHA
Slotted ALOHA 将时间划分为不连续的间隔,称为槽,每个间隔对应一个数据帧。这要求每个节点是同步的,即知道每个槽的准确起始时间。
Slotted ALOHA 可以使信道的最大利用率达到 1 e \frac{1}{e} e1。
Carrier Sense Multiple Access (CSMA) Protocols
我们前面已经提到过载波监听的概念。CSMA 主要有两种,坚持型(Persistent)和非坚持型(Non-persistent)。
1-Persistent:
当一个节点有数据要发送时,它首先监听信道,看是否有其他同志在发送数据。如果信道是空闲的,节点就会发送其数据。否则,节点会等待直到信道空闲,然后再发送数据帧。
该协议被称为 1-persistent,因为当它发现信道空闲时,会以 100% 的概率传输数据帧。
如果发生了冲突,那么节点会“静默”随机时间,然后再重复上面的所有流程。
你可能会觉得奇怪,既然可以监听信道,怎么还会有冲突发生呢?
如果两个节点在第三个节点的传输过程中准备传输帧,但都检测到信道忙,此时两个节点将礼貌地等待,直到传输结束,然后两个节点将同时开始传输,导致冲突。
此外,传输时延也会导致冲突的发生。 当一个节点发送数据帧后,如果此时另一个节点也刚好准备发送,且第一个节点的信号还没有到第二个节点这儿,那第二个节点会检测到信道空闲,也进行传输,Duang~
Non-Persistent:
相比 1-Persistent,Non-Persistent 显得 less greedy。如果节点检测到该信道已经在使用中,那它不会再持续监听信道,来等到信道空闲时立即传输数据。相反,它会等待一个随机的时间段,然后重复之前的流程。
因此,这种算法有更好的信道利用率,但比 1-persistent CSMA 的延迟更长。
p-persistent:
p-persistent 被用在 slotted 信道。当监听到信道空闲时,它以概率 p p p 发送数据帧,否则会等到下个时隙的开始。如果该时隙信道也是空闲的,那么继续以概率 p p p 发送数据帧。这个过程重复进行,直到该帧已被传输或另一节点开始传输。如果是后一种情况,那么这个节点属实是老倒霉蛋了,相当于发生了冲突。
下图比较了这几种 CSMA 连同 ALOHA 的信道利用率:
CSMA with Collision Detection
我们已经知道,如果两个节点监听到信道空闲并同时开始传输,会发生冲突。我们想要节点能够快速检测到冲突并立即停止传输,而不是继续将整个数据帧传完,因为此时的传输已经受到干扰,数据已经乱码,即使收到也没有意义。这样可以节约大量时间以及带宽成本。
这就有了 CSMA/CD。
节点的硬件必须在传输时持续监听信道,如果它读到的信号与它发出的信号不同,它就知道发生了冲突。 具体来说,如果发生冲突,信道上可以检测到超过发送节点本身发送的载波信号幅度的电磁波,由此判断出冲突的存在。如果一个节点检测到冲突,它将中止传输,等待一段随机时间,然后再次尝试。
如果两个节点同时监听到信道空闲,并开始传输,那么检测到冲突的最短时间为信号从一个节点传输到另一个节点所需的时间。
我们考虑如下的最坏情形:
假设信号在两个最远节点之间传输需要的时间为 τ \tau τ。在 t 0 t_0 t0 时刻,一个节点开始传输,就在传输即将完成之时,在 t 0 + τ − ϵ t_0 + \tau - \epsilon t0+τ−ϵ 时刻,另一个节点也开始传输,当然它会立刻检测到冲突并停止传输,但对于第一个节点来说,它可能会在 t 0 + 2 τ − ϵ t_0 + 2\tau - \epsilon t0+2τ−ϵ 时刻才会知道发生冲突了。
Collision-Free Protocols
冲突显然对系统的性能有很大影响,会浪费大量时间、带宽资源,且传输一个数据帧的时间也是不固定的。
我们现在假设以下场景:
有 N 个节点,有从 0 到 N - 1的唯一地址。可以允许部分节点在某个时间段不工作,同时我们也忽略传输时延。基于这些假设,我们还是要考虑相同的问题,哪个节点来使用信道?
A Bit-Map Protocol
我们划分有 N 个时隙,如果节点 0 需要发数据,那么它就在 slot 0 发送 1 比特,其它节点不可以在此时隙发送数据。
不管节点 0 在slot 0 有没有发送数据,节点 1 都可以在 slot 1 发送 1 比特它的数据,当然前提是它有数据帧需要发送的话。
这相当于,要发送数据帧的节点会在它对应的 slot 来发送一比特,告诉大家我有东西要发。在所有的 N 个 slot 过去之后,每个节点都知道了哪个节点要传输数据。这时,需要发送数据的节点便按照节点顺序(0~N-1)传输它们的数据,一个接一个,所以不会发生冲突。
当最后需要传输数据的节点传输完成之后,就再次回到逐一发送比特的阶段了。如果某个节点很不巧,过了它的 slot 之后正好要发数据,那它就得等下一轮了。
像这样的协议被称为保留协议(reservation protocols),因为它们事先保留了信道所有权并避免了冲突。
Token Passing
Bit-Map 协议的本质是,它让每个节点按照预定的顺序依次传送数据帧。
实现这个思路的另一种方法是以相同的预定顺序将一个叫做令牌(token)的信息从一个节点传到下一个节点。谁有这个 token,代表谁就可以进行传输。如果没有信息要传输,就直接将 token 传给下一个节点。
在令牌环协议(token ring protocol)中,网络的拓扑结构被用来定义节点的发送顺序。token 的传递,只需从一个方向进行接收,然后从另一个方向将其传送出去。
Multiple Access with Collision Avoidance (MACA)
Hidden node problem:
radio range 指两个节点可能会发生干扰的范围。在上图的情况中,A 和 C 都想给 B 发送数据,但因为 A 和 C 不在彼此的 radio range 内,如果 A 已经发了数据,C 还是会监听到信道空闲,也会发数据,结果两个节点都不能成功传输,在节点 B 处发生了冲突。我们把 A 和 C 叫作 Hidden node。
Exposed Node Problem:
现在 B 想给 A 传输数据,而 C 想给 D 传输数据。如果 B 已经发送数据,而因为 B 在 C 的 radio range 之内,C 此时会监测到信道忙,从而放弃给 D 传输数据。但其实 C 给 D 的传输是完全不受影响的。我们把 B 和 C 叫作 Exposed Node。
早期解决这些问题的一个有影响力的协议就是 MACA。
它的基本思想是让发送方“刺激”接收方输出一个短帧,所以附近的站点可以检测到这个短帧,并避免在即将到来的(大)数据帧期间进行传输。
我们看一个具体例子。
现在 A 要给 B 传输数据。A 首先会给 B 发送一个 RTS (Request To Send)帧,这个帧里包含了要发送的数据帧的长度。然后 B 会给 A 回复一个 CTS (Clear To Send)帧,也包含从 RTS 中得到的要发送数据帧的长度。A 接收到 CTS 后,就开始传输。
任何收到 RTS 的节点显然离 A 很近,必须保持足够长的“沉默”,以便 CTS 在不发生冲突的情况下传回给A。而任何收到 CTS 的节点显然接近 B,在即将到来的数据传输中也必须保持“沉默”,它们可以通过检查 CTS 帧来判断要传输的数据帧长度,从而决定要“沉默”的时间。
例如,节点 C 可以收到 RTS,但不会收到 CTS。只要它不干扰 CTS,在数据帧发送时,它就可以自由发送。
尽管这么小心翼翼了,还是有可能发生冲突。例如,当 B 和 C 同时给 A 发送 RTS 时,就会发生冲突,RTS 会丢失。这样,没有收到 CTS 回应的节点会等待随机时间后再进行尝试。
CSMA with Collision Avoidance
CSMA/CD 可以检测冲突,但无法避免冲突;对于 CSMA/CA,在发送包的同时不能检测到信道上有无冲突,只能尽量避免。
当节点需要第一个数据帧时,首先检测信道,在持续检测到信道空闲达一个 DIFS 之后,主机发送数据帧。接收节点正确接收到该数据帧,等待一个 SIFS 后马上发出对该数据帧的确认。若源站在规定时间内没有收到确认帧 ACK,就必须重传此帧,直到收到确认 ACK 为止,或者经过若干次重传失败后放弃发送。而如果在发送第一个数据帧时监测到信道忙,就会执行下面的随机退避算法。
在之后发送数据帧时,包括重传等情况,节点都会执行叫作随机退避(random back off)的算法。在 OFDM 物理层中,退避的时隙数在 0 到 15 的范围内选择。在持续检测到信道空闲达一个 DIFS 之后,开始对退避计时器(back off counter)倒计时,在每个时隙,如果监听到信道还是空闲的,就继续倒计时,直到计数器为 0,就开始发送数据帧。而如果在某个时隙监听到信道忙,那么就会冻结退避计时器,等待下一次检测到信道空闲 DIFS 后,再继续开始倒计时。
如果节点没有收到 ACK 确认,那么下次退避时会将退避时隙数翻倍再进行尝试,直到传输成功或者达到了最大重传次数。
节点 A 首先发送了一个数据帧,在此时间段内,节点 B 和 C 也准备要发送数据帧,但它们监测到信道忙,因此会等待信道空闲。在 A 收到 ACK 确认后,信道已经空闲。此时 B 和 C 都开始执行随机退避。因为 C 的随机退避时间比 B 短,所以 C 的计时器倒数到 0 之后率先开始传输数据帧。此时 B 的退避计时器会冻结,直到 C 收到 ACK 确认,B 的退避计时器继续倒计时,计时为 0 后,B 开始传输数据帧。(假设 DIFS 的时间包含在随机退避的时间之内)
Virtual channel sensing using CSMA/CA
802.11 定义的信道监测包括物理监听和虚拟监听两部分。物理监听就是监听信道中是否有有效的信号。而在虚拟监听中,每个节点通过跟踪网络分配向量(NAV)来记录信道的使用状态。每一帧都有一个 NAV 字段,说明后续的传输需要多长时间才能传输完成(包括后续 ACK 的时间)。收到这个帧的节点知道信道将在 NAV 指示的时间段内繁忙,不管它们是否能监测到物理信号,都不会再这段时间传输数据了。
下图中,A 想给 B 发送数据。其中,C 在 A 的 radio range,D 在 B 的 radio range。A 发送的 RTS 请求帧内含有后续传输需要的总时间,这会被 C 也捕捉到,从而在之后的时间保持“静默”;B 回传的 CTS 帧内也包含后续传输的时间,这会被 D 捕捉到。
此外,如果 A 的 ACK 计时器倒计时完成了 ACK 还没有到,那么它会认为发生冲突了,从而重新开始运行整个协议算法。
Interframe spacing in 802.11
我们上面提到的 SIFS、DIFS 都是帧间间隔(Interframe spacing)。常规数据帧之间的间隔为DIFS(DCF Inter Frame Spacing),最短的间隔是 SIFS(Short Inter Frame Spacing),ACK、RTS、CTS 都属于 SIFS。
两个 AIFS(Arbitration Inter Frame Space)间隔显示了两个不同优先级的例子。
短的 AIFS1,比 DIFS 短,但比 SIFS 长。它可以被 AP 用来将语音或其他高优先级的流量转移到发送线路的前端,先于常规流量发送。而 长的 AIFS4 则会使 AP 要发送的数据后于常规流量。
EIFS(Extended Inter Frame Spacing),仅由刚刚收到坏帧或未知帧的节点使用,以报告问题。由于接收器可能不知道正在发生什么,它应该等待一段较长时间,以避免干扰两个节点之间正在进行的对话。
MAC: Energy Consumption Consideration
MAC 层协议应确保节点以最小的能量消耗传输其信息。我们知道 WSN 中耗能的三个主要来源是感知、处理以及通信。而其中又以通信耗能最多。MAC 层设计又与通信息息相关,因此对能耗的设计考量非常重要。
在通信过程中,能源消耗的主要来源可以分类如下:
- Idle Listening:在监测信道时,没有从信道中检索到有用的信号。当一个节点收到一个不是发给自己数据包时,它在接收这个数据包时就相当于在浪费能量。
- Collisions
- Protocol Overhead:为了协调无线信道中的通信,MAC 协议需要传输控制数据包。尽管这些控制数据包为 MAC 协议的稳定工作做出了贡献,但它们需要尽可能节约能耗以提高能源效率。
- Transmit vs. Receiver Power
在传统网络中,由于节点的竞争性,每个节点的公平性是MAC层协议的一个重要方面。然而,在 WSN 中,系统对传感器提供的整体信息更感兴趣。因此,MAC 层协议应采取协作的方式,以便利用特定的应用信息来提高性能。例如,对于一些周期性流量的应用,就可以使用类似 token ring 这样的协议。
此外,由于传感器节点的高密度部署,每个节点收集的信息是高度相关的。来自空间上相隔甚远的传感器的数据比来自临近位置的传感器的高度相关的数据对 sink 更有用。在 MAC 层协议中利用传感器节点之间的关联性,可能可以进一步提高整体网络性能。
References
Wireless Sensor Networks, Ian F. Akyildiz, Mehmet Can Vuran. Chapter 5.