MAC层的主要功能是确保可靠的单跳消息传递。以下是有关这些功能的更多详细信息。
在同一个空间内,如果多个无线节点同时发送信号,就会互相在空间中形成干扰,导致数据变形,CSMA-CA机制就是用于避免这种情况。简单来说就是一个listen before talk的机制,发之前先听一下。听的目的,就是判断一下当前这个信道上有没有别人在用这个信道。
假设有一个节点正在listen,他将根据接收到的信号的RSSI来做出判断
如果在当前环境里,我能接收到的信号强度小于一个门限,比如小于-75 dBm,我就认为这个信道上没有人在发送,那我就可以开始发送了,

如果听到有一个节点正在发送,但是因为他发的信号强度比较小,那么我仍然检测不到他的信号。这个时候我能听到的信号强度还是小于这个门限的,所以我还是可以继续发送。因为两者之间隔得比较远,两个限号之间碰不到。

假如有一个节点离我很近,他在发信号。我听的时候,我能够检测到他的信号强度大于这个门限,那这时候我就不能发送了。我就需要等一等,然后过一段时间我再来听一下,看看能不能发送了,

802.15.4允许多个网络位于同一通道上。因此,需要采取某种方式来避免来自不同网络的数据包在空中碰撞而造成通信错误。MAC子层使用CSMA-CA(Carrier Sense Multiple Access/Collision Avoidance)控制对无线电的访问。避免碰撞是通过CCA(Clear Channel Assessment)完成的。
随机退避允许多个节点交错传输,因此它们总是可以在某个时间点找到干净的无线空间来作数据传输。尽管比特率很低,因为数据包比较小(128 bytes),即使在非常嘈杂的信道上每一个节点也可以成功地完成数据传输。
MAC层还为节点提供了一种方法,该方法可通过确认得知节点已成功接收到1跳单播传输,并且已通过验证CRC保留了所传输消息的完整性。
多跳传输应在每个跳上进行确认。节点执行CCA检查并发送消息后,它会等待MAC确认。如果未收到消息,则该节点应尝试多次重发该消息,直到其最终成功或最大的重试次数已用尽。

MAC层的每一帧都是需要确认的,实际上是在中间的每一跳都要去做这样的确认的。比如网络中的节点A,需要给节点D发送一个报文,这个通信通常是在应用层进行的,也就是A的应用层要发一个包到D的应用层,因为A和D隔得比较远,中间需要经过几个中间节点,这种情况下数据报文的传输过程:
由此可见,在MAC层是逐跳的确认,在APS层是端到端的确认。
如果说节点A发给节点B的时候,MAC层发现没有收到这个MAC层的确认,就需要在MAC去重传。
如果最终发现一段时间之后,没有收到目的节点给它发APS Ack,最终在APS层也会有一个重传
下图演示了MAC帧格式(ZigBee的帧格式):

前面的Preamble、SPD和PHY header这些字段都是在物理层由硬件添加的。其中PHY header(物理层头部)是一个字节,这个字节的最高bit预留做其他的用途,剩余的7个bit用于表示这个MAC帧的长度,最多能够表示的长度是127。也就是MAC层最大的帧长度是127个字节。
在MAC header中有一个2个字节的Frame control字段,该字段的0~2位会标识出这个帧的类型,主要有4种类型的帧:
在每个MAC帧的末尾,有两个字节的CRC用于验证数据包的完整性。无线信号在空中传播容易受到干扰,导致某些比特变化了,这个时候CRC就会不对了,这个帧就会被丢弃掉了。
(注:任何相关问题,欢迎在文末技术交流QQ群中交流讨论。)

