参考资料 bluetooth core V5.0 VOL6 PartB:2.4DATA CHANNEL PDU和 4.5.9 Acknowledgment and Flow Control
2.4节中介绍 数据通道PDU的包头包括一下信息
其中,SN (Sequence Number)表示本次序列号。NESN (Next Expected Sequence Number)表示下一次期望的序列号。
- 对于每个连接,链路层有两个参数,transmitSeqNum和nextExpectedSeqNum,每个参数的大小为1位。
-
transmitSeqNum参数用于标识链路层发送的报文。nextExpectedSeqNum参数被对等端用来确认上一个数据通道发送的PDU,或请求重发发送的上一个数据通道PDU。
注意:这里要认为SN 和NESN 是数据包中包头中的,而transmitSeqNum和nextExpectedSeqNum是本地存储的。
原文如下:
- transmitSeqNum和nextExpectedSeqNum参数在进入连接状态时被设置为零。
-
新的数据通道PDU是链路层第一次发送的数据通道PDU。上一个数据通道PDU是由链路层重发的数据通道PDU。
- 重发数据通道PDU时,发送的数据通道PDU的LLID字段、SN字段和负载必须等于链路层发送的上一个数据通道PDU的LLID字段、SN字段和负载。
-
对于每个发送的新数据通道PDU,报头的SN位应设置为transmitSeqNum。如果一个数据通道PDU被重发,那么SN位不应该被改变。
-
在接收到数据通道PDU后,SN位应与nextExpectedSeqNum进行比较。如果位是不同的,那么这是一个重发数据通道PDU, nextExpectedSeqNum不应该被改变。如果位是相同的,那么这是一个新的数据通道PDU, nextExpectedSeqNum可以加1(参见章节4.5.9.1)。
- 当发送数据通道PDU时,报头的NESN位应设置为nextExpectedSeqNum。
- 在接收到数据通道PDU时,如果该数据通道PDU的NESN位与transmitSeqNum相同,则最后发送的数据通道PDU未被确认,应重新发送。如果数据通道PDU的NESN位与transmitSeqNum不相同,则表示上一次发送的数据通道PDU已被确认,transmitSeqNum加1,可以发送新的数据通道PDU。
分析如下:
这里是wireshark 抓包的部分截图
首先对于74458,假设此时是第一次数据发送。主从机的原始transmitSeqNum(后面写tSN)和nextExpectedSeqNum(后面写tNESN)都是0,此时是主机发送,从机接收。
根据第1条,从机接收时,该数据的SN:与从机的tNESN:0相同,说明这是一个新的PDU,并且tNESN+1为1.这里不进行第3条分析,因为假设是第一次发送数据。
74459行,主机接收,从机发送。从机发送的SN NESN分别是0 1;根据第1条,主机接收时,该数据的SN:0与主机的tNESN:0相同,是新的PDU,更新tNESN :0+1=1;根据第3条,该数据的NESN:1与tSN:0不同,表示上一次发送的已被绝人,更新tNESN:0+1=1;,可以发送新数据。
74460行,主机发送,从机接收,主机发送的SN NESN分别是1 1 ;根据第,1条,从机的tNESN更新为0;根据第三条从机的tSN更新为1,
同理,继续更新。
对于74469行,主机接收,从机发送。从机发送的SN NESN分别是1 0,而主机的tSN 和tNESN为1 1。根据第1条,主机接收数据的SN:1与主机的tNESN:1相同,说明这是个新数据,主机的tNESN应该更新为0,根据第3条,该数据的NESN:0与主机的tSN:1不同,说明上一条数据被从机确认,tSN应更新为0;可以发送新的数据,主机的tSN tNESN应该变成 0 0.但是没有遍,依旧是1 1,所以74470行发送了1 1 。
对于74470行,主机发送,从机接收。主机应该发送 0 0.但是却发送了1 1,说明上一个数据主机没有正确接收。根据第1条,从机接收数据SN:1与从机的tNESN:0不同,tNESN不更新。根据第3条通道的NESN:1与从机的tSN:1相同,说明上一次发送的数据没被确认需要重新发送。
所以对于74471行,从机需要继续发送 1 0 ,即74469行数据。主机接收,根据第1条,该数据的SN:1与主机的tNESN1,相同,,,这是一个新数据数据,tNESN跟心为0,仍0。根据第3条,该数据NESN0 与主机的tSN1不同,tSN更新为0.
NO. | 主机 transmitSeqNum | 主机 nextExpectedSeqNum | 从机 transmitSeqNum | 从机 nextExpectedSeqNum |
74458 | 0 | 0 | 0 | 0 |
74459 | 0 | 1 | ||
74460 | 1 | 1 | ||
74461 | 1 | 0 | ||
74462 | 0 | 0 | ||
74463 | 0 | 1 | ||
74464 | 1 | 1 | ||
74465 | 1 | 0 | ||
74466 | 0 | 0 | ||
...... | ||||
74469 | 1 | 0 | ||
74470 | 0/1 | 0/1 | ||
74471 | 1 | 0 | ||
74472 | 0 | 0 |
以上是对文字的分析。
这里对流程图进行分析
增加是SN NESN 都是本地的,即transmitSeqNum(后面写tSN)和nextExpectedSeqNum。
这里要明确:
本地的transmitSeqNum(后面写tSN)和nextExpectedSeqNum就是其上一次发送的SN NESN。
对于74460行,为主机发送,看左图,此处的判断要看发送之前的参数,即74459行,NESN为1,。SN为主机tSN=0(看74458行)。两个不同,所以,更新本地tSN=1,再发送数据。
在发送之前,由于74459行,是主机接收,本地tNESN=0,与当前SN=0,相同,要增加tNESN=1.所以,此时主机的tSN=1,tNESN=1.
视觉规律:斜对角线SN等于NESN,且以连续2个交替变化,则说明没有重发。否则说明数据传输出现问题。