BLE 抓包分析之重传机制

参考资料 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位不应该被改变。

  1. 在接收到数据通道PDU后,SN位应与nextExpectedSeqNum进行比较。如果位是不同的,那么这是一个重发数据通道PDU, nextExpectedSeqNum不应该被改变。如果位是相同的,那么这是一个新的数据通道PDU, nextExpectedSeqNum可以加1(参见章节4.5.9.1)。

  2. 当发送数据通道PDU时,报头的NESN位应设置为nextExpectedSeqNum。
  3. 在接收到数据通道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

744580000
7445901
7446011
7446110
7446200
7446301
7446411
7446510
7446600
......
7446910
744700/10/1
7447110
7447200

 以上是对文字的分析。

这里对流程图进行分析

 增加是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=1tNESN=1.

视觉规律:斜对角线SN等于NESN,且以连续2个交替变化,则说明没有重发。否则说明数据传输出现问题。

 

  • 2
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值