7.5.6 发送、接收和确认
本节介绍发送、接收和确认的基本过程。
7.5.6.1 发送
每个设备应当把它当前的 DSN 值存储在 MAC 子层的 PIB 属性 macDSN 中,然后将其初始化为一个随机值。选择随机数的算法超出了本标准的范围。 每次产生一个数据帧或者 MAC 命令帧, MAC 子层将把 macDSN 的值复制到输出帧 MHR 的序列号码字段中,然后将其加 1。不管设备要与多少其它设备通信,每一个设备都只产生一个 DSN。 macDSN 的值允许循环。
每个协调器应当把它当前的 BSN 值存储在 MAC 子层的 PIB 属性 macBSN 中,然后将其初始化为一个随机值。选择随机数的算法超出了本标准的范围。 每次产生一个信标帧, MAC 子层将把 macBSN 的值复制到输出帧 MHR 的序列号码字段中,然后将其加 1。macBSN 的值允许循环。
如果源地址字段存在,它应当包含发送帧的设备的地址。当一个设备已经连接并且分配有一个短地址(即 macShortAddress 的值不等于 0xfffe 或者 0xffff)时,它将尽可能的优先使用此短地址,而不是扩展地址(即 aExtendedAddress)。当设备没有连接到 PAN 时,它将在所有需要源地址字段的通信中使用其扩展地址。 如果源地址字段不存在,则认为帧的发送设备为 PAN 协调器, 此时的目的地址字段中应包含接收设备的地址。
如果目的地址字段存在,它应当包含发送帧的设备的地址。该地址可能是短地址,也可能是扩展地址。如果目的址字段不存在,则认为帧的的接收者是 PAN 协调器,此时的源地址字段中应包含发送设备的地址。
如果目标和源寻址信息都存在,MAC 子层将对目标和源 PAN 标识符进行比较。如果二者的 PAN 标识符相同,帧控制字段中的 PAN 标识符压缩子字段将设置为 1,并在发送帧中省略源 PAN 标识符。如果二者的 PAN 标识符不相同,帧控制字段中的 PAN 标识符压缩子字段将设置为 0,并在发送帧中同时包含目标和源 PAN 标识符字段。如果只存在目的寻址信息或只存在源寻址信息,帧控制字段中的 PAN 标识符压缩子字段将设置为 0,并在发送帧中只包括一个 PAN 标识符字段。
在信标使能的 PAN 中,设备在发送帧前需要尝试去获取信标。如果设备当前没有跟踪信标(参考 5.1.4.1 节),它就不知道信标什么时候会出现,因此它需要打开设备的接收机以搜索信标,并使其(最多)持续 [aBaseSuperframeDuration × (2n + 1)], 其中 n 是 macBeaconOrder 的值。如果在这段时间后没有找到信标,设备将使用非时隙版的 CSMA/CA 算法(参考 5.1.1.4 节)访问信道并发送帧。如果设备找到了信标(无论是通过前面的方法搜索信标,还是因为设备当前正在跟踪信标),设备将在超帧的合适时间发送帧:在 CAP 时期,使用时隙版的 CSMA/CA 算法访问信道并发送帧;在 CFP 时期,不使用 CSMA/CS 算法而直接在保护时隙中发送帧。
在非信标使能的 PAN 中,设备通过非时隙版的 CSMA/CA 算法访问信道并发送帧(参考 5.1.1.4 节)。
不管是信标使能的 PAN 还是非信标使能的 PAN,如果传输是直接的,由上层发送的原语引起的,并且 CSMA/CA 算法访问信道失败,上层都将得到通知。如果传输是间接的,并且 CSMA/CA 算法访问信道失败,帧会一直保留在事务队列中直到再次请求且被发送成功,或者直到该事务溢出。
设备应当按照 7.2.1 节中所述的输出帧安全处理方法处理帧。
如果输出帧安全处理返回的状态不是 SUCCESS,MLME 将发出相应的确认原语或者 MLME-COMM-STATUS.indication 原语,并将状态参数设置为帧安全处理所返回的状态,以表示遇到了错误,并停止发送该帧。
如果输出帧安全处理返回的状态是 SUCCESS,MAC 子层将发送该帧。
7.5.6.2 接收和拒绝
每一个设备都可以选择 MAC 子层是否在空闲时间打开其接收机。在这段空闲时间里,MAC 子层仍然为来自上层的收发机任务请求提供服务。收发机任务指的是带有确认接收(如果需要)的收发请求。 每次收发任务结束时, MAC 子层将根据 macBeaconOrder 和 macRxOnWhenIdle 的值来请求物理层打开或关闭它的接收机。如果 macBeaconOrder 小于 15,macRxOnWhenIdle 的值只在输入超帧的 CAP 空闲时间内才有用。如果 macBeaconOrder 等于 15,macRxOnWhenIdle 的值在所有时间都起作用。
由于无线通信的特性,设备的接收机开启后,会接收到其无线通信范围内所有遵循该标准并工作在相同信道的设备的消息。因此,MAC 子层应具有对接收的帧进行过滤的能力,过滤出上层需要的帧。
对于第一级过滤,它将丢弃所有帧检验字段不正确的帧。在接收到帧时,将根据帧的头部和有效载荷来重新该帧的校验值,并与该帧尾部的帧校验字段进行比较。如果两者相等,则认为该帧正确;否则,则认为该帧不正确,并将之丢弃。
过滤的第二级取决于 MAC 子层当前是否工作在混杂模式。在混杂模式下,MAC 子层在第一级过滤后,将所有的帧直接发送给上层而不进行更多的过滤。如果 macPromiscuousMode 为 TRUE,则 MAC 子层工作于混杂模式。
如果 MAC 子层不工作在混杂模式(即 macPromiscuousMode 为 FALSE),它将只接收满足下列所有第三级过滤条件的帧:
—— 帧类型子字段不包含保留帧类型
—— 帧版本子字段不包含保留值
—— 如果帧中包含目标 PAN 标识符,则应与 macPANId 匹配,或者为广播 PAN 标识符
—— 如果帧中包含短目标地址,它应与 macShortAddress 匹配,或者为广播地址。如果帧中包含扩展目标地址,它应与 aExtendedAddress 匹配。
—— 如果帧类型表明该帧为信标帧,源 PAN 标识符应与 macPANId 匹配,或者为广播 PAN 标识符
—— 如果在数据帧或者 MAC 命令帧中仅包含源地址字段,该接收设备必须是 PAN 协调器,并且源 PAN 标识符必须与 macPANId 匹配。
如果上述条件中有任何一条不满足,MAC 子层将不做任何处理,直接丢弃该帧。如果上述所有条件都满足,MAC 子层则认为该帧是有效的,并做进一步处理。对于非广播类型的有效帧,如果帧类型子字段表示为数据帧或者 MAC 命令帧,并且帧控制字段中的确认请求子字段设置为 1, MAC 子层将发送确认帧。在发送确认帧之前,接收到的数据帧或者 MAC 命令帧中的序列号将被复制到确认帧的序列号中。这样,事务的发起者才能确认它已收到了相应的确认帧。
如果帧控制字段中的 PAN 标识符压缩子字段设置为 1,并且帧中包含目标和源寻 址信息,MAC 子层将认为省略的源 PAN 标识符字段和目标 PAN 标识符字段相等。
设备将使用 7.2.3 节中所述的输入帧安全处理过程处理该帧。
如果输入帧安全处理返回的状态不是 SUCCESS,MLME 将发出相应的确认原语或者 MLME-COMM-STATUS.indication 原语,并将状态参数设置为帧安全处理所返回的状态,以表示遇到了错误。
如果有效帧为数据帧,MAC 子层将把该帧送到上层。 该过程可通过发送包含帧信息的 MCPS-DATA.indiction 原语来实现,且原语中安全相关参数应设置为由安全处理过程返回的参数。
如果有效帧为 MAC 命令帧或者信标帧,它将被 MAC 子层处理,相应的确认或指示原语将被送到上层,且原语中安全相关参数应设置为由安全处理过程返回的参数。
5.1.6.3 从协调器提取待处理数据
在信标使能的 PAN 中,设备可以通过检查所接收的信标帧的内容来判断是否有待处理的数据(参考 5.1.4.1 节)。如果信标帧的地址列表字段中包含设备地址,并且 macAutoRequest 为 TRUE,设备的 MLME 将在 CAP 期间给协调器发送一个数据请求命令(参考 5.3.4),并将其帧控制字段的确认请求子字段设置为 1。当正在执行主动或被动扫描时收到信标帧是唯一的例外情况。在如下两种情况下,MLME 也会给协调器发送数据请求命令。第一种就是当 MLME 收到 MLME-POLL.request 原语时。设备可能在请求命令确认后的 macRequestWaitTime 之后发送数据请求命令,如在连接的过程中(译注:这里没明白,翻译可能有问题,待改正)。如果数据请求命令将被发送给 PAN 协调器,则可以省略目标地址信息。
如果数据请求命令是由 MLME-POLL.request 原语引发的,MLME 将根据该原 语的参数 SecurityLevel、KeyIdMode、KeySource 和 KeyIndex 执行数据请求命令中的安全处理过程(参考 7.2.1 节)。否则,MLME 将根据 macAutoRequestSecurityLevel,macAutoRequestKeyIdMode,macAutoRequestKeySource 和 macAutoRequestKeyIndex 等 PIB 属性来执行数据请求命令中的安全处理过程(参考 7.2.1 节)。
协调器接收到数据请求命令后,它将发送确认帧来确认接收。如果协调器在发送确认帧(参考 5.1.6.4.2 节)之前有足够的时间来判断该设备是否有待处理数据,它应该把该确认帧的帧控制字段中的帧待处理子字段设置为相应的值。否则,协调器直接在群确认帧中将该子字段设为 1。
如果设备接收到确认帧,且该帧中的帧待处理子字段为 0,它将认为协调器中没有待处理的数据。
如果设备接收到确认帧,且该帧中的帧待处理子字段为 1,设备应当打开它的接收机,并使之持续最多 macMaxFrameTotalWaitTime,以接收从协调器传输过来的数据帧。如果协调器中确实有请求设备的待处理数据,它将按照本节描述的一种机制将帧发送给设备。否则,协调器按照本节描述的一种机制发送一个有效载荷长度为零的、不需要确认的数据帧给设备,表示没有数据。
跟随在确认帧之后的数据帧应当以如下机制发送:
—— 如果 MAC 子层能在 macSIFSPeriod 到 (macSIFSPeriod + aUnitBackoffPeriod) 之间的某个退避周期边界开始传输数据,且竞争访问阶段中还有足够的时间来传输消息、等待一个合适的帧间间隔和进行确认,则不使用 CSMA/CA。如果在这个数据帧之后没有接收到所请求的确认帧,则需要等待一个新的数据请求命令后重新开始。
—— 否则,使用 CSMA/CA。
如果请求数据的设备在 macMaxFrameTotalWaitTime 内没有接收到来自协调器的数据帧,或者虽然接收到了数据帧,但是该帧的有效载荷长度为零,设备将认为在协调器处没有待处理的数据。如果设备确实接收到了数据帧,如果被要求进行确认,它将回送确认帧。
如果所接收到数据帧的帧待处理字段为 1,协调器处依然还有待处理的数据。此时,设备需要再次发送数据请求命令给协调器,并提取数据。
在图 23 中,上层给 MLME 发送了轮询请求,然后 MLME 给协调器发送了数据请求命令。相应的确认帧的帧待处理(FP)字段被设置为 0。MLME 接收到确认帧后立即向上层发送了轮询请求确认原语。

在图 24 中,上层给 MLME 发送了轮询请求,然后 MLME 给协调器发送了数据请求命令。相应的确认帧的帧待处理(FP)字段被设置为 1。MLME 接收到确认帧后开启设备的接收机接收来自协调器的数据。接收到数据后,MLME 向上层发送了轮询请求确认原语。

5.1.6.4 确认和重传
在发送数据帧和 MAC 命令帧时,需要将帧的确认请求字段设为为合适的值。信标帧和确认帧的确认请求字段总是被设为不需要确认。相似地,所有的广播帧的确认请求字段也需要被设为不需要确认。
5.1.6.4.1 无确认
确认请求字段被设置为不需要确认(参考 5.2.1.1.4 节)的帧不需要接收者进行确认。帧的发送者总是假设该帧发送成功。
图 25 描述了发送不需要确认的帧的消息流程图。

5.1.6.4.2 确认
确认请求字段被设置为需要确认(参考 5.2.1.1.4 节)的帧需要接收者进行确认。如果接收者成功接收到帧,它应当立即产生并发送确认帧,且该帧的 DSN 字段来自于被确认的数据帧或者 MAC 命令帧。
在非信标使能的 PAN 中,或者信标使能 PAN 的免竞争访问期间,确认帧的传输应当在设备接收到数据帧或 MAC 命令帧的最后一个符号后的 macSIFSPeriod 时刻开始。在信标使能 PAN 的竞争访问阶段,确认帧的传输应当在设备接收到数据帧或 MAC 命令帧的最后一个符号后的 macSIFSPeriod 时刻开始,或者在退避周期边界开始。在后一种情形下,确认帧的传输应当在设备接收到数据帧或者 MAC 命令帧后的 macSIFSPeriod 到(macSIFSPeriod + aUnitBackoffPeriod)之间开始。
图 26 描述了发送需要确认的帧的消息流程图。

5.1.6.4.3 重传
发送帧的确认请求字段设置为不需要确认时,发送帧的设备将认为该帧已经成功被接收,因此不对帧进行重传。
设备在发送确认请求字段被设置为需要确认的数据帧或 MAC 命令帧后,需要最多等待 macAckWaitDuration,以接收相应的确认帧。如果在该时间内接收到了确认帧,且该帧的 DSN 与发送帧的 DSN 相同,设备将认为传输成功,因此也不需要进行重传。如果在该时间内接收到了确认帧,或者即使接收到了确认帧,但是其 DSN 与发送帧的 DSN 不同,设备将认为传输失败。
如果传输失败,且传输的方式是间接传输,协调器不会重传该数据帧或者 MAC 命令帧。改帧将继续保留在协调器的事务处理队列中,并只能在收到新的数据请求命令后才能被提取。如果收到了新的数据请求命令,发送设备将使用与原始发送所用的同一个 DSN 发送该帧。
如果传输失败,且传输的方式是直接传输,设备将重复发生该数据帧或者 MAC 命令帧,并等待确认。重传的次数最多为 macMaxFrameRetries 次。被发送帧将包含与原始发送所使用的同一个 DSN。如果重传能够在原始发送的竞争期或者保护时隙内完成时,才能进行重传。如果时间不够,重传将延时到下一次超帧的相同时期。如果在 macMaxFrameRetries 次重传之后仍然没有收到确认帧,MAC 子层将认为发送失败并通知上层。
如果被重传的帧的安全处理字段被设为 1,该帧在重传时不需要经过 7.2.1 节所述的输出帧安全处理过程进行处理。
5.1.6.5 混杂模式
设备可通过设置 macPromiscuousMode 来激活混杂模式。如果 MLME 被要求将 macPromiscuousMode 设为 TRUE,它将打开物理层的接收机。
当处于混杂模式时,MAC 子层将根据 5.1.6.2 节的方法处理接收的帧,并使用 MCPS-DATA.indication 原语将接收到的所有正确帧传递给上层。如图 35 所示,参数源和目标寻址模式都被设为 0x00,MSDU 包括 MHR 和 MAC 有效载荷,msduLength 包含 MHR 和 MAC 有效载荷总长度(单位是字节),mpduLinkQuality 为有效。
如果 MLME 被要求将 macPromiscuousMode 设为 FALSE,它将根据 macRxOnWhenIdle 的值来设置物理层的接收机。
5.1.6.6 传输场景
由于无线媒介的缺陷,发送的帧不可能总能到达目的地。一共有三种不同的传输场景:
—— 数据传输成功。发送设备的 MAC 子层通过物理层数据服务将数据帧发送给接收设备。在等待确认时,发送设备的 MAC 子层启动计时器。该定时器在等待 macAckWaitDuration 后超时。接收者的 MAC 子层接收到数据帧,回送确认帧,将数据帧传递给上层。发送者的 MAC 子层在定时器到期前接收到确认帧,然后关闭并复位计时器。此时数据发送结束, 发送设备的 MAC 子层向上层发送成功确认信息。图 27 描述了数据传输成功时的消息流程图。

—— 数据帧丢失。发送设备的 MAC 子层通过物理层数据服务将数据帧发送给接收设备。在等待确认时,发送设备的 MAC 子层启动计时器。该定时器在等待 macAckWaitDuration 后超时。接收者的 MAC 子层没有接收到数据帧,因此也没有响应确认帧。发送者的 MAC 子层的定时器到到期前没有接收到确认帧,数据传输失败。如果本次传输是直接传输,发送者将重传数据。重传的次数最多为 macMaxFrameRetries 次。如果传输失败的总次数达到 (1 + macMaxFrameRetries) 次,发送者的 MAC 子层将向上层发送失败确认原语。如果此次传输是间接传输,该数据帧将会继续保留在事务队列中,直到接收到另一个数据请求并被确认,或者该事务到期 macTransactionPersistenceTime 。如果事务到期了,该事务的信息将被丢弃,MAC 子层将向上层发送失败确认原。图 28 描述了数据帧丢失的场景。

—— 确认帧丢失。发送设备的 MAC 子层通过物理层数据服务将数据帧发送给接收设备。在等待确认时,发送设备的 MAC 子层启动计时器。该定时器在等待 macAckWaitDuration 后超时。接收者的 MAC 子层接收到数据帧,回送确认帧,将数据帧传递给上层。发送者的 MAC 子层没有接收到确认帧,它的定时器会到期,传输失败。如果此次传输是直接传输,发送者将重传数据。重传的次数最多为 macMaxFrameRetries 次。如果传输失败的总次数达到 (1 + macMaxFrameRetries) 次,发送者的 MAC 子层将向上层发送失败确认原语。如果此次传输是间接传输,该数据帧将会继续保留在事务队列中,直到接收到另一个数据请求并被确认,或者该事务到期 macTransactionPersistenceTime 。如果事务到期了,该事务的信息将被丢弃,MAC 子层将向上层发送失败确认原。图 29 描述了确认帧丢失的场景。
