TCPIP协议栈与 *** 作系统的关系

TCPIP协议栈与 *** 作系统的关系,第1张

ARP(AddressResolutionProtocol)地址解析协议它是用于映射计算SNMP(SimpleNetworkManagementP)网络管理协议它是TCP/IP协议中的一部份,它为本地和远端的网络设备管理提供了一个标准化途径,是分布式环境中的集中化管理的重要组成部份。AppleShareprotocol(AppleShare协议)它是Apple机上的通信协议,它允许计算机从服务器上请求服务或者和服务器交换文件AppleTalk协议它是Macintosh计算机使用的主要网络协议。WindowsNT服务器有专门为Macintosh服务,也能支持该协议。BGP4(BorderGatewayProtocolVertion4)边界网关协议-版本4它是用于在自治网络中网关主机(每个主机有自己的路由)之间交换路由信息的协议BOOTP协议它是一个基于TCP/IP协议的协议,它可以让无盘站从一个中心服务器上获得IP地址,现在我们通常使用DHCP协议进行这一工作。CMIP(CommonManagementInformationProtocol)通用管理信息协议它是建立在开放系统互连通信模式上的网络管理协议。相关的通用管理信息服务(CMIS)定义了访问和控制网络对象,设备和从对象设备接收状态信息的方法Connection-orientedProtocol/ConnectionlessProtocol面向连接的协议/无连接协议在广域网中,两台计算机建立物理连接过程所使用的协议,这种物理连接要持续到成功地交换完数据为止。DHCP(DynamicHostConfigurationProtocol)动态主机配置协议它是在TCP/IP网络上使客户机获得配置信息的协议,它是基于BOOTP协议,并在BOOTP协议的基础上添加了自动分配可用网络地址等功能。FTP(FileTransferProtocol)文件传输协议HDLC(High-LevelDataLinkControl)高层数据链路协议>

应用程序(浏览器)调用 Socket 库的 connect :

connect(< 描述符 >, < 服务器 IP 地址和端口号 >, … )

浏览器提供了服务器的 IP 地址和端口号(这能唯一标识一个进程,这模式叫Socket),这些信息会传递给 协议栈 ( *** 作系统的网络控制软件叫作协议栈)中的 TCP 模块。

然后就开始 三次握手 :TCP为了提供可靠的传送,客户端和服务端先发送无内容只有头部的包,来确认能力没问题, 这样就证明连接是通的, 可以正式发数据了 并且核对了Seq值

主要是为了防止 服务器开销的浪费

2次握手以后, 两个应用程序之间建立了一个全双工 (full-duplex) 的通信。

这个全双工的通信将占用两个计算机之间的通信线路,直到它被一方或双方关闭为止。

如果没有第三次,就是请求方的返回, 不确认 请求方真的可以收到数据 (可能延时导致客户端放弃收这次响应了),

不知道对客户端来说连接已经创建失败了,服务端就一直傻等客户端的永远不会发生(客户端认为已经失败,重新开始握手)的正式发生请求,太浪费了, 会被攻击

包含很多字段,重点是发送方和接收方的端口号,和控制位

客户端(发送方)的套接字准确找到了服务器(接收方)的套接字,也就是搞清楚了我应该连接哪个套接字。

头部中的控制位的 SYN 比特(TCP头控制位的其中一位)设置为 1 ,表示连接开始

TCP 头部创建好之后,接下来 TCP 模块会将信息传递给 IP 模块并委托它进行发送。IP 模块执行网络包发送 *** 作后,网络包就会通过网络到达服务器,然后服务器上的 IP 模块会将接收到的数据传递给 TCP 模块,

服务器的 TCP 模块根据 TCP 头部中的信息找到端口号对应的套接字,也就是说,从处于等待连接状态的套接字中找到与 TCP 头部中记录的端口号相同的套接字就可以了。当找到对应的套接字之后,套接字中会写入相应的信息,并将状态改为正在连接

上述 *** 作完成后,服务器的 TCP 模块会返回响应,这个过程和客户端一样,在 TCP 头部中设置发送方和接收方端口号以及

SYN 比特,设置为1,表示Seq已设置,

ACK 比特((TCP头控制位的其中另一一位)设为1 ,表示ACK确认号(告知对方收到数据的第几个字节的,这次是发生方的Seq+1)有效,已经收到对方之前发的数据了,

将 TCP头部传递给 IP 模块,并委托 IP 模块向客户端返回响应。

然后,网络包就会返回到客户端,通过 IP 模块到达 TCP 模块,

通过 TCP 头部的信息确认连接服务器的 *** 作是否成功。如果 SYN 为 1 则表示连接成功,这时会向套接字中写入服务器的 IP 地址、端口号等信息,同时还会将状态改为连接完毕。

最后一个步骤,客户端也需要 将 ACK 比特设置为 1 ,表示ACK号生效(值为服务端发来的Seq+q),并发回服务器,告诉服务器刚才的响应包已经收到。

当这个服务器收到这个返回包之后,连接 *** 作才算全部完成。现在,套接字就已经进入随时可以收发数据的状态了,大家可以认为这时有一根管子把两个套接字连接了起来。当然,实际上并不存在这么一根管子,不过这样想比较容易理解,网络业界也习惯这样来描述。这根管子,我们称之为 连接 。只要数据传输过程在持续,也就是在调用 close 断

开之前,连接一直存在。

建立连接之后,协议栈的连接 *** 作就结束了,也就是说 connect 已经

执行完毕,控制流程被交回到应用程序。

SYN flood洪水攻击 防范 待看

保活机制:

>

OSI模型由7个层组成,层层堆积:物理层、数据链路层、网络层、传输层、会话层、表示层和应用层。每一层都处理某特定的通信任务,使用基于协议的通信来与协议栈的下一层交换数据。两个网络设备间的通信就是通过在每一设备的协议栈中上上下下来完成的。例如,有一工作站要与一服务器进行通信,任务从工作站的应用层开始,经由较低的层格式化某类信息,直至数据到达物理层,然后通过网络传输到服务器。服务器于协议栈的物理层获取信息,向上层发送信息以解释信息,直到到达应用层。每一层可用其名称称呼,也可用其在协议栈中的位置表明。例如,最底层可称为物理层或第1层。

最底层执行的功能与物理通信相关,如构建帧、传输含有包的信号;中间层协调结点间的网络通信,如确保通信会话无中断、无差错地持续进行。最高层的工作直接影响软件应用和数据表示,包括数据格式化、加密以及数据与文件传输管理。总括起来,这些层称为协议栈。在后续章节中,我们将详细讨论这7个层。

1、物理层

OSI模型的最底层为物理层。包含以下各项:

数据传输介质(电线电缆、光纤、无线电波和微波)。

网络插头。

网络拓扑结构。

信令与编码方法。

数据传输设备。

网络接口。

信令出错检验。

物理层使用的设备要传输、接收包含数据的信号,需负责产生、携带并检查电压。网络信号传输有模拟和数字两种。模拟传输可不断变化,如同具有正负级电压的波形。模拟传输应用的实例如普通无线电信号和电话信号,因为它们对于声音再生可以有无限的范围。与此类似,模拟电视和计算机的监视器可以在任一范围再现上百万种颜色。在使用模拟调制解调器进行通信的WAN中使用的便是模拟通信,例如,用户可以通过Internet服务提供商( ISP )利用该调制解调器进行Internet 访问。

在信号传输中,物理层处理数据传输速率,监控数据出错频率,并处理电压电平。物理网络问题,如通信电缆裂断、电磁干扰等均会影响物理层性能。附近的电力马达、高压线、照明设备和其他电气设备都会引起干扰。电磁干扰 (Electromagnetic Interference,EMI )和无线电频率干扰(Radio Frequency Interference,RFI )是物理层干扰的两大起因。风扇、电梯电动机、轻便加热器和空调设施等电力设备产生的磁场会产生电磁干扰;网络信号传输中要用到的电力设备(如有线电视部件、广播电视站、业余无线电报务器、荧光灯中的镇流设备、计算机或电视以及C B电台)将以相同的频率释放无线电波,而这种无线电波就是无线电频率干扰的起因。

2、数据链路层

LAN中数据链路层的作用是构造帧。每一帧均以特定的方式格式化,使得数据传输可以同步以将数据可靠地在结点间传送。这一层将格式化数据,以便作为帧编码为传输结点发送的电子信号,由接收结点解码,并检验错误。数据链路层创建了所谓的“数据链路帧”,包含着由地址和控制信息组成的域,如下所示:

帧的起始点( SOF )。

发送帧的设备的地址(源地址)。

接收帧的设备的地址(目标地址)。

管理或通信控制信息。

数据。

差错检验信息。

报尾(或称帧的末端)标识符。

只要在两个结点间建立了通信,它们的数据链路层就在物理(通过物理层)和逻辑(通过协议)上连接起来了。通信首先由用于数据流定时的短信号集的传输建立。链接一确立,接收端的数据链路层就将信号解码为单独的帧。数据链路层检查接收的信号,以防接收到的数据重复、不正确或是接收不完整。如果检测到了错误,就要求从发送结点一帧接一帧地重新传输数据。数据链接错误检测过程由循环冗余校验 (Cyclic Redundancy Check,CRC )处理。循环冗余校验( CRC )是一种错误检测方法,为帧中包含的整个信息域( SOF,寻址方法、控制信息、数据、CRC和EOF )计算出一个值。这个值由数据链路层插入到发送结点靠近帧的末端的位置上。当数据链路层将帧向上传送到上一层时,该值可确保帧是以接收时的顺序发送的。

数据链路层包含两个重要的子层:逻辑链接控制(Logic Link Control,LLC )和介质访问控制(Media Access Control,MAC )。LLC可对两个结点间的通信链接进行初始化,并防止链接的中断,从而确保了可靠的通信。而MAC则用来检验包含在每一帧中的地址信息。例如,工作站上的MAC子层检验工作站接收的每一个帧,如果帧的地址与工作站的地址相匹配,就将大多数网络设备都有自己唯一的地址,永久存在于设备的网络接口设备的芯片上。

该地址称为设备地址或物理地址,以16进制进行编码,如0004AC8428DE。地址的前半部分指示特定的网络厂商;如果设备只有一个接口,那么后半部分对于接口或设备而言是唯一的。许多厂商在后半部分中用一个编码来标识设备(如计算机、网桥、路由器或网关)的类型。

两种网络设备不能拥有同样的物理地址,这一点是很重要的。这是网络设备生产商们实施的一种保护措施。如果两个以上的设备拥有同样的地址,在网络上传递帧时就会引起混淆。

用于LLC子层和网络层(协议栈中数据链路层的高一级)间的通信的服务有两种。类型1是无连接服务,无连接服务并不建立发送和接收结点间的逻辑连接。这里并不检查帧是否是按发送时的顺序接收的,也并不回答帧已经被接受,而且也没有错误恢复。

类型2是面向连接的服务。在面向连接的服务中,在完整的通信开始之前,会在发送结点和接收结点之间建立逻辑连接。帧中包含有顺序号,由接收结点来检查,以确保其按发送时的顺序进行处理。由于建立了通信,所以发送结点不会让传输数据的速度高于接收结点处理数据的速度。当数据成功传输后,接收结点会通知发送结点已经接收到数据。如果发现了错误,就要重新传输数据。

3、网络层

协议栈中向上的第3层为网络层。这一层沿网络控制包的通路。所有的网络都由物理路由 (电缆路径)和逻辑路由(软件路径)组成。网络层读取包协议地址信息并将每一个包沿最优路径 (包括物理的和逻辑的)转发以进行有效传输。这一层允许包通过路由器从一个网络发送到另一个网络。网络层控制包的通路,有些象交通控制器,沿几条不同路径中最有效的那一条来路由包。为确定最优路径,网络层需要持续地收集有关各个网络和结点地址的信息,这一过程称为发现。并非所有的协议都在网络层包含信息,这些协议是不可路由的。两种典型的不能被路由的网络协议是DEC公司的LAT和Microsoft 公司的NetBEUI。这两种协议通常不在需要路由的中型和大型网络中实施。可以将多个目标地址指定为一个组。带有组目标地址的包将被传递到多个计算机或网络设备。

网络层可以通过创建虚拟(逻辑)电路在不同的路径上路由数据。虚拟电路是用来发送和接收数据的逻辑通信路径。虚拟电路只针对于网络层。既然网络层沿着多个虚拟电路管理数据,那么数据到达时就有可能出现错误的顺序。网络层在将包传输给下一层前检查数据的顺序,如有必要就对其进行改正。网络层还要对帧编址并调整它们的大小使之符合接收网络协议的需要,并保证帧传输的速度不高于接收层接收的速度。

4、传输层

与数据链路层和网络层一样,传输层的功能是保证数据可靠地从发送结点发送到目标结点。例如,传输层确保数据以相同的顺序发送和接收,并且传输后接收结点会给出响应。当在网络中采用虚拟电路时,传输层还要负责跟踪指定给每一电路的唯一标识值。这一 I D称为端口、连接标识或套接字,是由会话层指定的。传输层还要确定包错误校验的级别,最高的级别可以确保包在可以接受的时间内无差错地从结点发送到结点。

用于在传输层间通信的协议采用了多种可靠性措施。0类是最简单的协议,不执行错误校验或流控制,依靠网络层来执行这些功能。1类协议监控包传输错误,如果检查到了错误,就通报发送结点的传输层让它重新发送包。2类协议监控传输层和会话层间的传输错误并提供流控制。流控制确保设备不会以高于网络或接收设备接收信息的速度来发送信息。3类协议除提供1类和2类协议的功能外,还可以在某些环境下恢复丢失的包。最后, 4类协议除执行3类协议的功能外,还具有扩展的错误监控和恢复能力。

传输层的另一种功能就是当网络使用不同的要求包大小各异的协议时,将消息分段为较小的单元。发送网络上由传输层分割的数据单元被接收端的传输层重新以正确的顺序组合, 以便网络层解释。

5、会话层

会话层负责建立并维护两个结点间的通信链接,也为结点间通信确定正确的顺序。例如,它可以确定首先传输哪个结点。会话层还可以确定结点可以传输多远的距离以及如何从传输错误中恢复。如果传输在低层中无意地中断了,会话层将努力重新建立通信。在某些工作站 *** 作系统中,可以将工作站从网络上断开,然后重新连接,之后无须登录便可继续工作。这是因为物理层断开又重新连接后,会话层也重新进行了连接。

这个层使每一个给定的结点与唯一的地址一一对应起来,就像邮政编码只与特定的邮政区域相关联。一旦通信会话结束,这一层就与结点断开了。

说明这一层上的通信的示例发生在工作站访问Internet上的服务器时。工作站和服务器都有唯一的用点号分开的二进制Internet 协议(IP)地址,如1227215122和145192022。会话层使用这一地址信息来帮助建立结点间的联系。一旦建立了联系,工作站可以登录了,通信会话就通过会话层建立起来了。

6、表示层

这一层处理数据格式化问题,由于不同的软件应用程序经常使用不同的数据格式化方案,所以数据格式化是必需的。在某种意义上,表示层有些像语法检查器。它可以确保数字和文本以接收结点的表示层可以阅读的格式发送。例如,从IBM大型机上发送的数据可能使用的是EBC DIC字符格式化,要使运行Windows 95或Windows 98的工作站可以读取信息,就必须将其解释为ASCII字符格式。

表示层还负责数据的加密。加密是将数据编码,让未授权的用户不能截取或阅读的过程。例如,计算机的帐户密码可以在LAN上加密,或者xyk号可以通过加密套接字协议层 (Secure Sockets Layer,SSL )在WAN上加密。

表示层的另一功能是数据压缩。当数据格式化后,在文本和数字中间可能会有空格也格式化了。数据压缩将这些空格删除并压紧数据,减小其大小以便发送。数据传输后,由接收结点的表示层来解压缩。

7、应用层

应用层是OSI模型的最高层,控制着计算机用户绝大多数对应用程序和网络服务的直接访问。这里的网络服务包括文件传输、文件管理、远程访问文件和打印机、电子邮件的消息处理和终端仿真。计算机程序员便是使用该层来将工作站连接到网络服务上,例如,可将应用程序链接到电子邮件中,或在网络上提供数据库访问。

Microsoft Windows 转向器贯穿应用层工作。转向器是使一台计算机对另一台可见,从而使得另一台计算机可以通过网络来访问它的一种网络服务。当用户共享Microsoft 网络上的文件夹时,其他计算机可以发现这台计算机并可以使用转向器访问该文件夹。

网络性能时分析抓包工具是一大利器,tcpdump/wireshark等抓包工具底层都是使用bpf提供的库,抓包位置在软中断从网卡队列(ring buffer)中读取数据后发送给协议栈时同时发给抓包程序一份,也就是只能知道同一seq数据包在网卡接口处一来一回的时间,比较难分析的延时问题都是偶尔的一次抖动(一天一次,几个小时一次这样),所以抖动的原因是发生在内核还是用户太就说不清了(在tcp各监控指标都看不出异常的情况下)。使用bpf可通过kprobe或者tracepoint在协议栈各层的关键函数中添加hook点,当数据包经过该函数时,打印出seq、network namespace、时间戳等关键信息,帮助我们快速定位或者缩小问题范围。

容器环境中,用户反馈在流量没有突增的情况下,请求redis p99时而发生抖动,频率大概是一天一次。排除redis服务端,以及容器的cpu、内存等问题。数据包在协议栈的耗时无法得知,所以决定完善tcp高级指标的监控。同时我们也需要一个工具,能够知道从网卡队列到tcp状态机之前的耗时。

大家可能看到发送过程没有4层的关键函数,因为调用ip_queue_xmit之前是没有填充完整的tcp协议头的,没办法在一个函数中获取到我们需要的完整系信息。

可以看到容器网卡发包后(__dev_queue_xmit)到veth收包(netif_rx),时间戳由608 ms 到了708 ms(为了直观,我们把时间戳由ns转化为了ms)。这样很快就能把问题缩小到网卡接口层。

>

这次介绍一下蓝牙协议栈(BLE)的基础知识,蓝牙协议栈组成如下图所示,首先我们说说GAP和GATT

GAP层是负责连接的,其中包含广播、扫描、连接、断开的过程和参数

11 角色

蓝牙设备的角色主要有中心(Central)和外围设备(Peripheral)两种,中心设备向外围设备发起连接。链路层的主机(Master)和从机(Slave)的概念跟中心和外围的概念是对应的。

除了中心和外围之外,还有Observer和Broadcaster角色,Observer一直进行监听,Broadcaster一直进行发送,这两种角色都只广播,不能发起连接或者被连接,这里就不详细说了

12 广播

建立连接之前,外围设备每隔一段时间发送一个广播包,让正在扫描的设备知道这是一个可以连接的设备,扫描设备才能对外围设备开始连接,这个广播包的时间间隔叫advertising interval,这个间隔可以在10ms到1024s之间,间隔的长短会影响建立连接所花时间。

中心要收到广播包之后才能发送连接请求,相应的,外围设备在发送广播包之后会等待连接请求。

蓝牙广播包最多可以包含31字节数据,包含设备名称和一些标志。中心收到广播包之后可以发送Scan Request以请求更多的广播信息,外围设备会回复一个同样是31个字节的Scan Response。

BLE有37个数据信道和3个广播信道,广播包,Scan Request,Scan Response使用广播信道

13 扫描

扫描是指中心监听广播包并且发送Scan request。扫描中有两个参数:Scan window(扫描窗口) 和Scan interval(扫描间隔)

14 发起连接

中心发起连接的过程类似于扫描的过程,中心收到广播包之后会发送一个连接请求给外围设备

15 连接

中心和外围设备连接上之后,中心会按照一定的连接间隔(Connection interval)向外围设备请求数据,这个间隔是由中心定的,在75ms到4s之间。

如果要提高吞吐量,可以在一个连接间隔中传输多个数据包,每个包最多可以包含20字节数据。如果要省电,并且外围设备并没有什么数据需要传输,可以跳过几个连接间隔,这称之为Slave latency。

如果外围设备没有在规定时间内响应中心的请求就会认为是连接中断,称之为Supervision Time-out(01s-32s),所以在使用Slave latency的时候要注意不要引起Supervision Time-out

这些参数是建立连接的时候中心确定的,如果建立连接之后外围设备想要更改,可以向中心发送Connection parameter update request。

整个数据交换的过程会在不同的频段中跳频(除了广播频段),跳频是自动完成的,不需要我们去管。

设备之间的数据传输是在GATT这层完成的

21 角色

除了GAP里面的角色,BLE在GATT里面也定义了两个角色,分别是GATT Server 和GATT Client,一般来说产生数据的设备是GATT Server,访问数据的设备是GATT Client,一个设备可以既是GATT Server也是GATT Client。这两个角色跟GAP中的角色并没有关系。

22 GATT结构

GATT Server通过属性表(Attribute table)来组织数据,

221 Attribute

上图中每一行就是一个属性Attribute。

每个属性具有一个handle,一个UUID,和一个Value。

Handle是Attribute的一个索引,每个Attribute的Handle都是唯一的。

UUID(universal unique identifier)表示的是Attribute中数据的类型信息。UUID在一个设备里面不是唯一的,可以有多个Attribute的UUID都一样

222 Characteristic

可以把Characteristic看作是上图中几行的集合(几个Attribute的集合)

每个Characteristic至少有两个Attribute,其中一个是声明,另一个包含数据。前面说过,蓝牙传输数据是通过GATT来传的,更具体的来说,是通过一个个Characteristic来传的。

223 Descriptors 描述符

Characteristic除了包含声明和数据之外,还可以有描述符(Descriptors,但不是必须有),Descriptors是用来进一步描述Characteristic(但不提供数据)的Attribute,比如说用自然语言描述该Characteristic是用来干什么的。

有一类特殊的描述符,叫CCCD(Client Characteristic Configuration Descriptor),支持Notify和Indicate的Characteristic 必须包含CCCD

224 Service

Service 是一个或者多个Characteristic的逻辑组合

一个GATT Service 通常包含了一些相关的功能,举例来说,一个人机界面Service包含了各种人机交互输入输出的数据,而其中的每个Characteristic 是一类信号或者设备

介绍几个常见的Service。

GAP GATT Service:作为Central或者Peripheral的BLE设备都需要有这个Service。这个Service包含了如何发现和连接设备的信息

Generic Attribute Service: GATT Server都要有这个Service,这个Service包含了GATT Server的信息

225 Profile

一个或者多个Service组合在一起称为Profile。Profile 是逻辑上的概念,自己并不具备单独的Attribute。

23 标准和自定义的Service和Characteristic

蓝牙联盟定义了一些标准的Profile, Service, Characteristic 和Attribute。由于Profile和Service是在具体应用中规定的,所以用户可以进行自定义

24 UUID

图2中每一个Attribute都有UUID,UUID是一个128位的数字,是用来描述Attribute的类型的

241 蓝牙联盟UUID

蓝牙联盟把UUID分为基础UUID(base UUID)和16位UUID。

蓝牙联盟规定的UUID都具有同样的base UUID:

0x0000xxxx-0000-1000-8000-00805F9B34FB

蓝牙联盟规定了一些16位UUID,替换掉base UUID中的xxxx就组成一个完整的128位UUID了。举例来说,0x2A37是一个16位Heart Rate Measurement Characteristic,那么对应的128位的UUID就是:

0x00002A37-0000-1000-8000-00805F9B34FB。

由于所有蓝牙联盟的UUID都具有同样的base UUID,所以用16位UUID就可以区分蓝牙联盟规定的Attribute了

但我们自定义的Attribute, Characteristic, Service,不能使用这个base UUID,因此也不能用16位UUID,只能使用制造商自定义的128位UUID。

25 空中接口 *** 作和属性

由于每个Attribute具有唯一的Handle,所以几乎所有的 *** 作都是通过Handle去完成,Characteristic常用的属性有:Write, Write without response, Read, Notify, Indicate。 Characteristic的属性决定了我们可以如何使用它

Write, Write without response

这两种属性允许GATT Client 对Server的characteristic的值进行写 *** 作,两者的区别是Write without response对写 *** 作不会有确认

Read

GATT Client可以读Server的Characteristic的值。

Notify 和Indicate

这两种属性表示的是当GATT Server 中该Characteristic 的值发生变化的时候会通知Client。两者的区别是Indicate 会进行确认但Notify不会

接下来举例说明一下前面介绍的概念

Thingy 的Services,作为Server需要有GAP Service和GATT Service,另外还有一个标准的Battery Service,后面是几个自定义的服务

详细的看看GAP Service,这个服务的Handle是1到9,那么把这些Characteristics和Attribute都打出来

可以看到这个Service的结构是这样的

这是一个标准的Service,使用标准Service/Characteristic的时候要符合蓝牙SIG对这个Service/Characteristic的规定,我们可以到 蓝牙SIG 看看是不是一致

以上就是BLE的一些基础知识和示例

以上就是关于TCP/IP协议栈与 *** 作系统的关系全部的内容,包括:TCP/IP协议栈与 *** 作系统的关系、低功耗蓝牙BLE协议栈简介、TCP三次握手(gold_axe)等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!

欢迎分享,转载请注明来源:内存溢出

原文地址:https://54852.com/web/9737332.html

(0)
打赏 微信扫一扫微信扫一扫 支付宝扫一扫支付宝扫一扫
上一篇 2023-05-01
下一篇2023-05-01

发表评论

登录后才能评论

评论列表(0条)

    保存