LL层要做的事情非常多,比如具体选择哪个射频通道进行通信,怎么识别空中数据包,具体在哪个时间点把数据包发送出去,怎么保证数据的完整性,ACK如何接收,如何进行重传,以及如何对链路进行管理和控制等等。...如何通过无线发送一个数据包 假设有设备A和设备B,设备A要把自己目前的电量状态83%(十六进制表示为0x53)发给设备B,该怎么做呢?...为此,BLE只使用37(2402MHz) /38(2426MHz) /39(2480MHz)三个信道进行广播和扫描,因此广播不支持跳频。由于广播是一对多的,所以广播也无法支持ACK。...像有线UART,很容易理解,就是用线(Rx和Tx等)把设备A和设备B相连,即为连接。用“线”把两个设备相连,实际是让2个设备有共同的通信媒介,并让两者时钟同步起来。...BLE应用是实打实的东西,不能像上面讲述协议栈一样泛泛而谈,必须结合具体的蓝牙芯片和蓝牙协议栈来讲解,为此后面将以Nordic芯片及协议栈作为范例,来具体讲解如何开发BLE应用,以及如何通过代码去理解BLE
通过CPU主频的限制,让小核的功耗有明确的上限,这就有了天然的隔离和保障。...大核完成了一次消息透传后,通过拉高电平告诉小核,并开了while循环等待低电平到来,小核恢复状态后通过拉低电平去通知大核,然而这个时候又轮到小核透传消息,所以又把电平拉高了。...解决方案:动态调节BLE的连接间隔时间,在需要BLE通讯时将连接间隔调低,数据传输完成后,将连接间隔调高,让系统休眠下去。 就是在ble的各种状态下要设置好正确的连接间隔。...原因分析:游泳算法被disable的时候没有正确置空游泳识别函数(之前是通过设置回调函数的方式挂载游泳识别函数),导致系统认为游泳识别的函数一直在被挂载,从而不停的执行游泳识别函数。...如何做到?
后续的章节会对每一部分单独进行详细的讲解。 00-蓝牙的历史 蓝牙(英语:Bluetooth),一种无线通讯技术标准,用来让固定与移动设备,在短距离间交换资料,以形成个人局域网(PAN)。...图片 02-物理层 BLE的物理层定义了如何使用无线电发射器/接收器来编码和解码用于传输和接收的数字数据,以及应用的其他无线电相关参数和属性。...LL层要做的事情非常多,比如具体选择哪个射频通道进行通信,怎么识别空中数据包,具体在哪个时间点把数据包发送出去,怎么保证数据的完整性,ACK如何接收,如何进行重传,以及如何对链路进行管理和控制等等。...定义了蓝牙设备配对、认证、解密等行为的安全操作,SMP用来管理BLE连接的加密和安全的,如何保证连接的安全性,同时不影响用户的体验,这些都是SMP要考虑的工作。...,比如设备地址、名称、配对秘钥和设备的外观特征值,用于区分是什么设备,手机还是电脑;明确了作为一个低功耗蓝牙设备的基本需求,包含哪些层级以及如何协同工作的。
服务端调用了 listen 函数使其处于监听状态,此时可以开始 accept (接收)客户端的连接。 SYN_SENT:表示客户端已经发送了 SYN 报文段,则会处于该状态。...服务端发送完 ACK+SYN 并收到来自客户端的 ACK 后进入该状态,客户端收到来自服务器的 SYN+ACK 并发送 ACK 后也进入该状态。 FIN_WAIT_1:表示主动关闭连接。...而服务器端却认为新的连接已经建立了,并在一直等待客户端发送数据,这样服务器端一直处于等待接收数据,直到超出计数器的设定值,则认为客户端出现异常,并且关闭这个连接。在这个等待的过程中,浪费服务器的资源。...主要有两个原因: TIME_WAIT 确保有足够的时间让对端收到了ACK,如果被动关闭的那方没有收到 ACK,就会触发被动端重发 FIN。...如果主动关闭方在 TIME_WAIT 状态不等待一段时间就直接释放连接并进入 CLOSED 状态,那么主动关闭方无法收到来自被动关闭方重发的 FIN+ACK 报文段,也就不会再发送一次确认 ACK 报文段
窗口大小指明了自确认号指定的八位组开始,接收方在必须停止传输并等待确认之前发送方可以接收的数据段的八位组长度。...(2)服务器端接收到来自客户端的TCP报文之后,结束LISTEN阶段。...而有时候,接收方希望催促发送方尽快补发某个 TCP 段,这个时候可以使用快速重传能力。 例如段 1、段 2、段 4 到了,但是段 3 没有到。 接收方可以发送多次段 3 的 ACK。...为了不让发送方误以为段 3 已经收到了,在快速重传的情况下,接收方即便收到发来的段 4,依然会发段 3 的 ACK(不发段 4 的 ACK),直到发送方把段 3 重传。...换句话说,因为UDP发送者不能够检测拥塞,所以像使用包队列和丢弃技术的路由器这样的网络基本设备往往就成为降低UDP过大通信量的有效工具。
· 目录 · 一、Core的Ble蓝牙功能介绍 · 二、完整代码 · 三、用shineblink.com提供的免开发App,让自己的硬件能够很轻松的拥有和手机App交互能力 前言 ShineBlink...0x0002)用来接收手机的数据 手机蓝牙可以通过ATT Write方式向Rx Characteristic发送数据Tx Characteristic (UUID: 0x0003)用来向手机发送数据...如果手机蓝牙为Tx Characteristic使能了notification,那么设备就可以通过发送notification的方式向手机蓝牙发送数据 更多关于ble蓝牙的内容请参阅此处。...") --开始大循环 while(GC(1) == true) do --查询是否收到来自手机端蓝牙的数据,如果收到就通过Uart0转发出去 ble_recv_flag,ble_recv_tab...App交互能力 shineblink.com提供的免开发App对接Core的方式十分简单,能够让你的硬件设备立刻拥有一款专属的App,更多详情请参见此处: http://shineblink.com/#
,实际上所谓链路其实就是始发与一个设备,通过一根线,终止于另一个设备。...如果一直等下去,那么将无法发现数据的丢失,协议将不可用,如果等待时间过短,可能确认还在路上,因此等待时间是个问题,另外如何去管理这个超时时间也是一个问题。...疑难杂症12:Nagle算法和延迟ACK 延迟ACK会延长ACK到达发送端的时间,由于标准Nagle算法只允许一个未被确认的TCP分段,那无疑在接收端,这个延迟的ACK是毫无希望等待后续数据到来最终进行积累确认的...直到收到新的ACK,说明直到收到第三个冗余ACK时期发送的TCP分段都已经到达对端了,此时进入正常阶段开始加性增加拥塞窗口。...6.其它 疑难杂症22:如何学习TCP 很多人发帖问TCP相关的内容,接下来稀里哗啦的就是让看《TCP/IP详解》和《Unix网络编程》里面的特定章节,我觉得这种回答很不负责任。
2. tcp的可靠性如何保证 分块传送:数据被分割成最合适的数据块(UDP的数据报长度不变) 等待确认:通过定时器等待接收端发送确认请求,收不到确认则重发 确认回复:收到确认后发送确认回复(不是立即发送...设想一个场景,最后这个ack丢失了,接收方没有收到 这时候接收方会重新发送fin给发送方 这个等待时间就是为了防止这种情况发生,让发送方重新发送ack 总结:预留足够的时间给接收端收ack。...) 应用层接收请求的连接,将从该队列中移除 当新的请求到来时,先判断队列情况来决定是否接收这个连接 积压值的含义:tcp监听的端点已经被tcp接收,但是等待应用层接收的最大值。...tcp收集这些分组,确认到来之前以一个分组的形式发出去 优点:自适应。确认到达的快,数据发送越快。确认慢,发送更少的组。 使用注意:局域网很少使用该算法。且有些特殊场景需要禁用该算法 3....窗口大小慢慢被调为0 如何解决:ZWP技术。发送zwp包给接收方,让接收方ack他的窗口大小。 5.2 糊涂窗口综合征 如何发生:接收方太忙,取不完数据,导致发送方越来越小。
,自增数值就是发送的字节数,建立连接时连接报文段长度为1)。...客户端收到服务器的 ACK 报文段后随即进入 FIN-WAIT-2 状态,此时还能收到来自服务器的数据,直到收到 FIN 报文段。...户端收到来自服务器的 FIN 报文段后,向服务器发送 ACK 报文,随后进入 TIME-WAIT 状态,等待 2MSL(2 * Maximum Segment Lifetime,两倍的报文段最大存活时间...服务器在接收到客户端的 ACK 报文后会随即进入 CLOSED 状态,由于没有等待时间,一般而言,服务器比客户端更早进入 CLOSED 状态。...),利用特定散列函数计算出一个 cookie 值。
先假设有这么一个需求:我们需要用手机通过BLE(低功耗蓝牙)连接8个蓝牙设备,成功连接到8个蓝牙设备后,弹出提示框,提示使用者已经成功连接了多少个蓝牙设备。...如果有这个疑问,可以移步到我在知乎回答的问题:如何用简单明了的话解释一下什么是 Objective-C 中的委托?或许可以解答你的部分疑问。...,可以通过[NSNotificationCenter defaultCenter]获得,利用这个通告中心,我们可以「发通告」、「监测(接收)通告」,利用这个机制,实现回调。...上面这个例子,可以说成:「当成功连接8个蓝牙设备后,向通告中心发布kNotificationAllDevicesDidConnected通告(一个字符串),并通过userInfo(一个字典)这个参数传递设备的数量...总结 上面,简单实现了Objective-C中的4种回调。 那究竟该使用哪种回调呢?
答案:让 B 告诉 A 第二个,丢了的包怎么办? 答案:重传 于是你设计了如下方案,A 每发一个包,都必须收到来自 B 的确认(ACK),再发下一个,否则在一定时间内没有收到确认,就重传这个包。 ?...效率问题 停止等待虽然能解决问题,但是效率太低了,A 原本可以在发完第一个数据包之后立刻开始发第二个数据包,但由于停止等待协议,A 必须等数据包到达了 B ,且 B 的 ACK 包又回到了...A 在发送的数据包中增加一个序号(seq),同时 B 要在 ACK 包上增加一个确认号(ack),这样不但解决了停止等待协议的效率问题,也通过这样标序号的方式解决了顺序问题。 ?...当 A 不断发送数据包时,已发送的最后一个序号就往右移动,直到碰到了窗口的上边界,此时 A 就无法继续发包,达到了流量控制。 ?...如果 A 收到了比原窗口值小的窗口大小,比如 win = 4,则 A 暂时不会改变窗口大小,更不会将窗口上边界向左移动,而是等着 ACK 的到来,不断将左边界向右移动,直到窗口大小值收缩到新大小为止。
Weak指针如何注册到Weak表中、如何维护hash表可以参考objc-weak.m中的其它源码。 从实现中可以看出,Weak指针的使用涉及到Hash表的增删改查,有一定的性能开销。...(如果A在time_wait过程中,收到FIN报文,表示发送的ACK丢包了,重新发) 如何下载一个超大的文件?支持断点续下、暂停、取消的功能。...RunLoop 此段,部分摘自文章 简单运行执行runlooprun函数并不会让系统停住等待事件,而是需要在运行runloop之前添加source,只有在有source的情况下线程才会停下来监听各种事件...RunLoop 和 帧率之间的关系 用户操作设备,相关的操作事件被系统生成并通过UIKit的指定端口分发。事件在 内部排成队列,一个个的分发到Main run loop 去做处理。...UIApplication对象是第一个接收到时间的对象,它决定事件如何被处理。触摸事件分发到主窗口,窗口再分发到对应出发触摸事件的 View。其他的事件通过其他途径分发给其他对象变量做处理。
1 简介 上一篇文章的分析中,我们发现Yale智能门锁的通信中存在两个问题,本篇文章将分为两个部分描述如何利用这两个问题: a. 嗅探BLE通信获取productInfo; b....2 嗅探BLE通信,获取productInfo Yale门锁的BLE通信没有加密,所以我们通过嗅探的方式可以直接获取Authentication Request和Authentication Response...回想上一篇文章,在生成Payload并发送Authentication Response之前,调用过一个makeACKFrame的函数,从函数名看,这个函数的作用是将Payload封装成ACK Frame...除了product_info外,还有一个module_addr字段需要注意,这个字段应该填写门锁的蓝牙地址,这个地址可以在门锁附近,使用nRF Connect扫描周围设备获取。 ?...首先我们从Yale Bluetooth Key这款app的Log着手,定位到了app中的关键代码,随后通过对关键代码的分析,发现了门锁与手机之间的身份认证环节存在漏洞,最终通过嗅探门锁与手机之间的BLE
广播态的设备可以回到Standby状态,连接成功后也可切换为Connection状态; Scanning State:可以通过广播通道接收数据的状态,由Standby状态进入。...,比如可以让听讲座的众多观众借助支持该通信模式的蓝牙耳机同步听到一个演讲者等时广播的音频数据流; Master/Central — Slave/Peripheral:主从设备通过数据信道传输数据,连接通信是一种一对一的通信方式...BLE 链路层的报文可以看作是带标签的数据,由一个设备发送、一个或多个设备接收,标签指明了数据由谁发出,以及应该由哪些设备接收。...和本地设备已发送的Packet 不同,判断为ACK 信号也即对端设备已成功接收前一个packet,要求本地设备发送new data,同时tSqNo 自增 1。...正是本地设备下一个期望接收的packet,判断对端设备发来的packet 是new data,本地设备接收该packet,同时nExSqNo 自增 1。
滑动窗口 TCP使用的被称为滑动窗口协议的另一种形式的流量控制方法,该协议允许发送方在停止并等待确认前可以连续发送多个分组。...如果接收方处理速度比不上发送方发送速度,导致缓存中没有空间,可通过确认信息修改窗口大小,甚至可设置为0,则发送方将暂时停止发送 假设接收方应用一直不读取缓存中数据,当ACK6到达发送方后,此时携带的窗口大小变成了...当接收端发现丢了一个中间包的时候,发送三次前一个包的 ACK,于是发送端就会快速地重传,不必等待超时再重传。...第二个问题是 TCP 的拥塞控制要等到将中间设备都填充满了,才发生丢包,从而降低速度,这时候已经晚了。其实 TCP 只要填满管道就可以了,不应该接着填,直到连缓存也填满。...它企图找到一个平衡点,就是通过不断地加快发送速度,将管道填满,但是不要填满中间设备的缓存,因为这样时延会增加,在这个平衡点可以很好的达到高带宽和低时延的平衡。 ?
顺序与丢包问题 接下来,我们结合上述图例,用一个例子来看下 TCP 如何处理顺序与丢包问题的。...而在接收端看来: 1、2、3、4、5 是已经完成 ACK,但还没读取的; 6、7 是等待接收的; 8、9 是已经接收,但是没有 ACK 的。...如果接收方处理的太慢,导致缓存中没有空间了,可以通过确认信息修改窗口的大小,甚至可以设置为 0,则发送方将暂时停止发送。 ...而如果接收端一直不处理数据,则随着确认的包越来越多,窗口越来越小,直到为 0。 ? 当这个窗口大小通过包 14 的确认到达发送端的时候,发送端的窗口也调整为 0,于是,发送端停止发送。...它企图找到一个平衡点,就是通过不断的加快发送速度,将管道填满,但是不要填满中间设备的缓存,因为这样时延会增加,在这个平衡点可以很好的达到高带宽和低时延的平衡。
答案:让 B 告诉 A 第二个,丢了的包怎么办? 答案:重传 于是你设计了如下方案,A 每发一个包,都必须收到来自 B 的确认(ACK),再发下一个,否则在一定时间内没有收到确认,就重传这个包。 ?...你管它叫停止等待协议。 只要严格按照这个协议执行,虽然 A 无法保证 B 一定能收到包,但 A 能够确认 B 是否收到了包,收不到就重试,尽最大努力让这个通信过程变得可靠。...效率问题 停止等待虽然能解决问题,但是效率太低了,A 原本可以在发完第一个数据包之后立刻开始发第二个数据包,但由于停止等待协议,A 必须等数据包到达了 B ,且 B 的 ACK 包又回到了...办法如下: A 在发送的数据包中增加一个序号(seq),同时 B 要在 ACK 包上增加一个确认号(ack),这样不但解决了停止等待协议的效率问题,也通过这样标序号的方式解决了顺序问题。 ?...如果 A 收到了比原窗口值小的窗口大小,比如 win = 4,则 A 暂时不会改变窗口大小,更不会将窗口上边界向左移动,而是等着 ACK 的到来,不断将左边界向右移动,直到窗口大小值收缩到新大小为止。
在低功耗低成本的物联网设备中,通常把Host 与Controller 放到同一个Soc 芯片上,这时物理的HCI 就没有存在的必要了,Host 与Controller 之间直接通过API 来交互(下图左边的方案...,比如具体选择哪个射频通道进行通信,怎么识别空中数据包,具体在哪个时间点把数据包发送出去,怎么保证数据的完整性,ACK如何接收,如何进行重传,以及如何对链路进行管理和控制等等。...class”,两者都是对一组元素据及其操作方法的封装,且都尽量封装为可重用的); GAP(Generic Access Profile) :定义了设备如何发现其它设备、连接到其它设备、读取其它设备的信息并和它们进行绑定的相关...,为了避免该问题,BLE 使用了“白化器”来随机化要发送的数据,接收端也使用“白化器”恢复原数据,避免传输连续相同的比特序列。...BLE使用的GFSK 调制技术 BLE 侧重于低功耗,如何实现低功耗呢?
C/S架构: Client:客户端 Server:服务端 优点:软件的使用稳定,并且可以节省网络资源 如QQ、pycharm等,手机端的微信、王者荣耀等等 缺点:1.若用户想在同一台设备上使用多个软件...2)服务器收到连接释放报文,发出确认报文,ACK=1,ack=u+1,并且带上自己的序列号seq=v,此时,服务端就进入了CLOSE-WAIT(关闭等待)状态。...5)客户端收到服务器的连接释放报文后,必须发出确认,ACK=1,ack=w+1,而自己的序列号是seq=u+1,此时,客户端就进入了TIME-WAIT(时间等待)状态。...1.服务端套接字函数 方法 用途 s.bind() 绑定(主机,端口号)到套接字 s.listen() 开始TCP监听 s.accept() 被动接受TCP客户的连接,(阻塞式)等待连接的到来 2....send,sendall在待发送数据量大于己端缓存区剩余空间时,数据不丢失,循环调用send直到发完) s.recvfrom() 接收UDP数据 s.sendto() 发送UDP数据 s.getpeername
超时重发如何确定呢? 重发超时是指在重发数据之前,等待确认应答到来的那个特定时间间隔。如果超过这个时间仍未收到确认应答,发送端将进行数据重发。...此时,等待确认应答的时间将会以2倍、4倍的指数函数延长。 此外,数据也不会被无限、反复地重发。达到一定重发次数之后,如果仍没有任何确认应答返回,就会判断为网络或对端主机发生了异常,强制关闭连接。...这个跟前面每个段接收ACK后才能继续发送新一个段的情况相比,即使RTT变长也不会影响网络的吞吐量。 窗口大小就是指无需等待确认应答ACK而继续发送数据的最大值。...[image] 如上图所示,主机A的1001-2000序列号的报文丢失了,它会一直收到来自主机B的一个1001的ACK,这个ACK就像在跟主机A提醒 “我想接收从1001开始的数据”。...TCP还使用了滑动窗口控制提高了数据传输效率 有收获? 如果大家有所收获的话 可以转发+点赞,让更多人可以看到这篇文章,也是给我一个大大的鼓励哟!
领取专属 10元无门槛券
手把手带您无忧上云