丢包重传是数据通信应用里面一项非常重要的功能,特别是在无线通信中是一项决定通信协议先进程度的指标。今天主要着重介绍如何检测丢包,之后再介绍重传机制。
如何检测丢包?
要想丢包重传,首先必须得检测到丢包,没有丢包就没有重传。在无线通信中,对于丢包的检测通常有两种方式:载波监听和应答机制。
01
载波侦听
载波侦听是一种常见的丢包检测方法,而在载波侦听基础之上又发展出CSMA/CA。CSMA/CA也可以看做一种重传机制,我们经常使用的Wi-Fi和ZigBee就采用了这种机制。通信设备在发送消息前,会打开接收并维持一段很短的时间。在这个很短的时间内,无线单元会检测同频段是否有其它的干扰信号,例如ZigBee设备在做载波侦听时,既要检测是否有Wi-Fi、蓝牙在发射信号,又会检测是否有其它的ZigBee在发射信号。如果干扰信号来自Wi-Fi或者蓝牙,ZigBee设备会测量它的功率有没有自己大,功率没自己大就压过去,功率比自己大就果断丢包;而ZigBee设备在载波侦听时如果遇到其它的ZigBee设备,不管对方功率是否比自己大,都会主动丢包,即让别人先走。
02
应答机制
判断丢包的另一个方法是增加应答机制,通常通信协议都会有OSI七层模型。七层协议中从链路层开始,每一层都可以添加应答机制。层级越低越接近硬件,应答机制的响应就越快。
OSI七层模型
我们还是以ZigBee的应答机制为例。ZigBee的OSI模型,具有应答机制的目前仅限MAC层(数据链路层)和APS层(传输层)。但是在实际应用中,很多时候还会为应用层添加应答机制。MAC层的应答是响应最快的,也叫做MAC-ACK,通常都在ZigBee的无线收发单元中硬件自动产生。接收端设备收到ZigBee数据帧后120微秒以广播的方式发出来。同时MAC-ACK也是ZigBee中最短的帧,帧长只有5字节,加上帧前导码和同步帧累计11字节。按照ZigBee的250kbps传输速率每个字节需要32微秒,一个MAC-ACK帧的占空时间352微秒。也就意味着发送端在发送一个MAC帧后,会在120+352=472微秒后收到该MAC帧对应的MAC-ACK。同样ZigBee的MAC层也规定发送端如果在540微秒内没有收到对应的MAC-ACK则认为是丢包。
MAC-ACK采用广播发送,首先可以减少MAC-ACK帧中表示地址的字段,减少帧长度,让ACK帧占空时间更短,发送端可以根据MAC-ACK帧中的帧序号来判断是否自己的MAC-ACK;其次MAC-ACK采用广播的方式,也可以提醒其它的ZigBee设备自己正在通信,其它的ZigBee设备如果这个时候也在进行载波侦听,就能主动避让正在通信的设备。在ZigBee的MAC层,载波侦听和MAC-ACK是双管齐下,这样能保证丢包检测的准确性。另外ZigBee的广播消息是不会产生MAC-ACK的。
ZigBee参考模型
多元化的丢包检测机制
ZigBee除了MAC层有应答机制,传输层和应用层也有应答机制。ZigBee是一个多跳的Mesh网络,而MAC层的传输只能满足单跳传输,因此ZigBee在传输层也做了应答,也叫做APS-ACK。ZigBee发送端把一个消息传输给ZigBee接收端,中间会经过多个ZigBee路由器节点的转发。接收端收到消息后,会通过相同的路由路径,把APS-ACK发给发送端,发送端收到APS-ACK就认为发送消息到达了接收端。如果发送端在6秒(默认值)后没有收到APS-ACK则会认为数据丢包。
ZigBee的系统中通常都只对应用层开放接口,在应用层开放的接口中最常见的就是一个叫做“AF Data Confirm”的检测接口,它综合了MAC层丢包(含MAC-ACK丢包和载波侦听丢包)、网络层丢包及传输层丢包等底层丢包信息。ZigBee的顶层应用中可以知道当前发送的消息是否丢包。
应用层的应答
MAC层和传输层的丢包检测,都属于系统层的丢包。还有一种丢包就是应用层的丢包,比如一个调光开关给一个空调设备发了一条“把亮度调到50%”的指令。这条指令如果不丢包,会有什么结果?肯定是空调会去执行“把亮度调到50%”,但是空调只有温度没有亮度,也就是说这条指令发给了不该发的目标。这个时候就需要应用层的应答来解决这个问题。比如空调收到了“把亮度调到50%”后,可以向发送端回复应用层应答“看清楚我不是灯泡”。
全部0条评论
快来发表一下你的评论吧 !