(嵌入式八股)No.2 通信协议(一个月左右)
2.1 在学习通信协议之前要了解一下什么是同步通信和异步通信。
同步通信(Synchronous Communication)
同步通信是指发送方和接收方共享一个共同的时钟信号,数据传输在时钟信号的控制下进行。发送方和接收方的时钟信号必须严格同步,数据的发送和接收都与时钟信号的边沿对齐。
特点
时钟同步:发送方和接收方共享一个时钟信号,通常由发送方提供。
数据传输效率高:由于时钟信号的存在,数据可以连续传输,没有额外的起始位和停止位,因此传输效率较高。
硬件需求较高:需要额外的时钟信号线,硬件连接和设计相对复杂。
适合高速通信:由于数据传输效率高,适合高速数据传输场景。
应用场景(了解即可)
高速数据传输:如SPI(Serial Peripheral Interface)、I2S(Inter-IC Sound)等协议。
与外部存储器通信:如与Flash存储器或SDRAM通信。
音频和视频数据传输:如I2S协议用于音频数据传输。
示例
SPI协议:主设备提供时钟信号(SCLK),数据通过MOSI(Master Out Slave In)和MISO(Master In Slave Out)引脚传输。
I2S协议:用于音频数据传输,包含时钟信号和数据线。
异步通信(Asynchronous Communication)
异步通信是指发送方和接收方不需要共享时钟信号,数据传输通过数据帧的起始位和停止位来同步。发送方和接收方各自独立工作,不需要严格的时间同步。
特点
无共享时钟:发送方和接收方不需要共享时钟信号。
数据传输效率较低:每个数据帧都需要包含起始位和停止位,增加了额外的开销。
硬件需求较低:只需要数据线(TX和RX)和地线(GND),不需要额外的时钟信号线。
适合低速通信:由于传输效率较低,通常用于低速通信场景。
应用场景
低速通信:如UART(Universal Asynchronous Receiver/Transmitter)协议,常用于串口通信。
调试和开发:如通过串口调试助手输出调试信息。
简单设备连接:如连接传感器、蓝牙模块等。
示例
UART协议:通过TX(发送)和RX(接收)引脚传输数据,数据帧包含起始位、数据位、校验位和停止位。
RS-232/RS-485:基于UART协议的串行通信标准,常用于工业通信。
总结:
🔹 同步通信:时钟对齐、连续传输、效率高。
🔹 异步通信:自带起止位、独立时钟、简单灵活。
2.2 UART和USART
UART(Universal Asynchronous Receiver/Transmitter)这个地方推荐学习一下串口空闲中断
UART是一种异步串行通信协议,主要用于设备之间的数据传输。它通过一个发送引脚(TX)和一个接收引脚(RX)实现数据的发送和接收。由于是异步通信,发送和接收双方不需要共享时钟信号,而是通过数据帧的起始位和停止位来同步数据传输。
特点
- 异步通信:不需要共享时钟信号。
- 数据帧格式:包含起始位、数据位、校验位(可选)和停止位。
- 硬件需求低:只需要TX和RX引脚,以及地线(GND)。
- 适合低速通信:常用于串口通信、传感器数据采集等场景。
- 简单易用:编程和硬件连接相对简单。
数据帧格式
- UART的数据帧通常包含以下部分:
- 起始位:1位低电平,用于标识数据帧的开始。
- 数据位:可以是5、6、7或8位,具体取决于通信协议的设置。
- 校验位:可选,用于检测数据传输错误。可以是奇校验、偶校验或无校验。
- 停止位:1或2位高电平,用于标识数据帧的结束。
USART(Universal Synchronous/Asynchronous Receiver/Transmitter)
USART是一种更通用的串行通信协议,支持同步和异步两种通信模式。在异步模式下,USART的工作方式与UART相同;在同步模式下,USART需要一个外部时钟信号来同步数据传输。
特点
支持同步和异步通信:
异步模式:与UART相同,不需要共享时钟信号。
同步模式:需要外部时钟信号,数据传输效率更高。
数据帧格式:
异步模式:包含起始位、数据位、校验位(可选)和停止位。
同步模式:不包含起始位和停止位,数据直接与时钟信号同步传输。
硬件需求:
异步模式:只需要TX和RX引脚,以及地线(GND)。
同步模式:需要额外的时钟信号线(CLK)。
适合多种场景:
异步模式:适合低速通信,如串口通信。
同步模式:适合高速通信,如与外部存储器或高速设备通信。
数据帧格式
异步模式:
起始位:1位低电平。
数据位:可以是5、6、7或8位。
校验位:可选。
停止位:1或2位高电平。
同步模式:
数据位:直接与时钟信号同步传输,不包含起始位和停止位。
特性 | UART | USART |
通信模式 | 只支持异步通信 | 支持同步和异步通信 |
数据帧格式 | 包含起始位、数据位、校验位、停止位 | 异步模式:与UART相同同步模式:不包含起始位和停止位 |
硬件需求 | TX、RX、GND | 异步模式:TX、RX、GND同步模式:TX、RX、CLK、GND |
适合场景 | 低速通信、串口调试 | 异步模式:低速通信同步模式:高速通信、多机通信 |
传输效率 | 较低(需要起始位和停止位) | 异步模式:较低同步模式:较高 |
编程复杂度 | 简单 | 异步模式:简单同步模式:复杂 |
常见协议 | UART、RS-232、RS-485 | UART、SPI、I2S |
- 232和485最好也了解一下。由于秋招基本没问后续再补充吧.....
2.3 SPI
SPI(Serial Peripheral Interface)是一种高速、全双工、同步的串行通信协议,广泛应用于嵌入式系统中,用于微控制器(MCU)与各种外围设备(如传感器、存储器、显示器等)之间的通信。 它通过一组引脚实现主设备(Master)与从设备(Slave)之间的通信。SPI支持全双工通信,即主设备和从设备可以同时发送和接收数据。
特点
- 同步通信:主设备提供时钟信号(SCLK),数据传输与时钟信号同步。
- 全双工:主设备和从设备可以同时发送和接收数据。
- 高速通信:支持较高的数据传输速率,通常可达几兆比特每秒(Mbps)。
- 多设备通信:可以通过片选引脚(CS)连接多个从设备。
- 硬件需求:需要4根引脚(SCLK、MOSI、MISO、CS),硬件连接相对复杂。
- 适合场景:与外部存储器(如Flash、EEPROM)、传感器、显示器等设备通信。
SPI通信通常涉及以下引脚:
- SCLK(Serial Clock Line):时钟信号线,由主设备提供。
- MOSI(Master Out Slave In):主设备数据输出引脚,用于向从设备发送数据。
- MISO(Master In Slave Out):主设备数据输入引脚,用于接收从设备发送的数据。
- CS(Chip Select):片选引脚,用于选择当前通信的从设备。每个从设备需要一个独立的CS引脚。
通信原理
SPI 是一种同步通信,数据在时钟信号 SCLK 的控制下传输。主机控制时钟频率、极性、相位,从机被动响应。
- 主机将 CS 拉低,选中目标从机;
- 主机开始产生 SCLK;
- 主机通过 MOSI 发送数据,从机同时通过 MISO 回传数据;
- 每个时钟沿(上升沿或下降沿)发送/接收 1 bit;
- 传输完成后,主机拉高 CS,结束一次通信。
SPI 是全双工通信:发送和接收可以同时进行(一个时钟沿主发从收,另一个沿主收从发)。
几种模式要知道:
参数 | 含义 |
CPOL (Clock Polarity) | 时钟极性,决定空闲时 SCLK 电平(0=低,1=高) |
CPHA (Clock Phase) | 时钟相位,决定在哪个时钟沿采样(0=第1沿,1=第2沿) |
模式 | CPOL | CPHA | 时钟空闲电平 | 采样沿 |
Mode 0 | 0 | 0 | 低 | 上升沿采样,下降沿输出 |
Mode 1 | 0 | 1 | 低 | 下降沿采样,上升沿输出 |
Mode 2 | 1 | 0 | 高 | 下降沿采样,上升沿输出 |
Mode 3 | 1 | 1 | 高 | 上升沿采样,下降沿输出 |
注意:主机与从机的 CPOL、CPHA 必须一致 才能正确通信。

优缺点
优点 | 缺点 |
传输速率高(MHz级,远快于UART/I²C) | 没有统一标准协议(需手动定义帧格式) |
全双工通信 | 无应答机制(可靠性较低) |
硬件简单,寄存器配置灵活 | 从机数量受限于片选线数量 |
支持多从机扩展 | 线数较多(≥4根) |
SPI加速小技巧:(来源硬汉嵌入式)
2.4 IIC(面试问的最多)
I²C(Inter-Integrated Circuit),也称为IIC或TWI(Two-Wire Interface),是一种广泛应用于嵌入式系统中的同步串行通信协议。它主要用于微控制器(MCU)与各种低速外围设备(如传感器、EEPROM、显示屏等)之间的通信。它通过两条信号线(SDA和SCL)实现多个设备之间的通信。I²C协议支持多种设备共享同一条总线,每个设备都有唯一的地址。
数据帧结构(熟悉)(还要熟悉读写流程(比如读写某一个从机或者读写某一个从机的寄存器))
- 起始条件(Start Condition):SCL为高电平时,SDA从高电平变为低电平。
- 停止条件(Stop Condition):SCL为高电平时,SDA从低电平变为高电平。
- 地址帧:主设备发送从设备的地址,地址为7位或10位,后面跟随一个读/写位(R/W)。
- 数据帧:每个数据帧包含8位数据,后面跟随一个应答位(ACK/NACK)。
- 应答位(ACK/NACK):从设备在接收到数据后发送一个应答位(ACK)或不发送应答位(NACK)。
特点
- 多主多从:支持多个主设备和多个从设备共享同一条总线。
- 同步通信:数据传输由主设备提供的时钟信号(SCL)同步。
- 低速通信:通常用于低速设备,数据传输速率一般在100 kbps(标准模式)到400 kbps(快速模式)之间。
- 硬件需求低:只需要两条信号线(SDA和SCL)。
- 简单易用:协议简单,硬件和软件实现相对容易。
- 支持设备多:每个设备都有唯一的地址,支持多个设备共享总线。
引脚定义
I²C通信通常涉及以下两条信号线:
- SDA(Serial Data Line):数据线,用于传输数据。
- SCL(Serial Clock Line):时钟线,由主设备提供,用于同步数据传输。
两根线都采用开漏(Open-Drain)结构 + 上拉电阻,因此:
- 设备只能输出“低电平”;
- “高电平”由上拉电阻拉起;
- 这样可以实现多主竞争与“线与”(wired-AND)机制。
- 注:要明白为什么用开漏输出和上拉电阻,以及线与机制(这个和CAN ID仲裁原理差不多)
I²C通信中,数据以字节为单位传输,每个字节包含8位数据。数据传输的顺序和时钟信号由协议定义。
工作原理
- 起始条件:主设备拉低SDA线,表示通信开始。
- 发送地址帧:主设备发送从设备的地址(7位或10位),并指定读/写操作(R/W位)。从设备根据地址判断是否响应。
- 发送数据帧:主设备发送数据,从设备接收数据。每个数据帧包含8位数据,后面跟随一个应答位(ACK/NACK)。
- 停止条件:主设备拉高SDA线,表示通信结束。
硬件连接
- 总线共享:所有设备共享SDA和SCL两条信号线。每个设备通过唯一的地址进行通信。
- 上拉电阻:SDA和SCL线需要连接到电源(VCC)的上拉电阻,以确保信号的稳定性。
- 设备连接:主设备和从设备的SDA引脚连接在一起。主设备和从设备的SCL引脚连接在一起。所有设备的GND引脚连接在一起。
应用场景
- 与传感器通信:与温度传感器(如DS18B20)、湿度传感器(如DHT11)、加速度传感器(如MPU6050)等通信。
- 与存储器通信:与EEPROM(如24C02)通信。
- 与显示屏通信:与I²C接口的LCD或OLED显示屏通信。
- 与外部设备通信:与I²C接口的其他设备(如实时时钟模块RTC)通信。
常见问题与调试技巧(面试会问)
1. 上拉电阻问题
- 阻值过大问题:SCL和SDA线从低电平恢复到高电平的时间变长(RC充电时间常数),在高波特率(如400kHz或1MHz)下,信号上升沿缓慢,违反I²C时序要求,导致通信失败或数据错误。解决方法:选择合适的上拉电阻阻值。
- 阻值过小问题:当设备将线路拉低时,流过上拉电阻的电流过大,可能超过设备I/O引脚的灌电流能力,甚至损坏设备。解决方法:选择合适的上拉电阻阻值。
- 选型建议上拉电阻阻值通常在1kΩ到10kΩ之间。具体选择取决于总线电容(连接的设备数量、PCB走线长度)、工作电压和通信速率。速率越高、总线电容越大,上拉电阻应越小。经验法则是先从4.7kΩ或2.2kΩ开始尝试。
2. 地址错误
- 7位 vs 8位地址问题:很多数据手册提供的是7位从机地址,但有些I²C驱动或库函数要求传入8位地址(7位地址左移1位,并包含读写位)。地址格式错误会导致通信失败。解决方法:仔细阅读数据手册和驱动文档,确认传入的地址格式是否正确。
- 地址冲突问题:总线上有两个从设备使用相同地址,通信会混乱。解决方法:确保每个从设备的地址唯一。
- 设备未上电/未初始化问题:从设备未正确上电或未完成初始化,不会响应I²C地址。解决方法:检查从设备的电源和初始化状态。
3. ACK/NACK问题
- 原因地址错误(从机未收到地址)。从机正忙(内部操作未完成)。从机未正常工作(硬件故障)。数据格式不正确导致从机无法解析。
- 调试方法使用逻辑分析仪查看NACK发生在哪个字节之后,帮助定位问题。
4. 总线被锁死
- 原因某个设备在I²C传输过程中突然复位、掉电或出现异常,将SDA线永久拉低,导致总线“锁死”。
- 解决方法主机尝试发送9个时钟脉冲(在SCL线上产生9个时钟周期,但不关心SDA),让从机完成当前字节传输并释放SDA线。如果SDA线仍被拉低,可能需要复位从设备或整个系统。有些I²C控制器有硬件复位总线的功能。
5. 逻辑分析仪的作用
- 功能调试I²C问题的“上帝视角”,能清晰捕获SCL和SDA上的波形,并自动解析出START/STOP、地址、数据和ACK/NACK。帮助定位时序问题、数据错误、ACK/NACK异常。
- 补充工具必要时(如检查上升下降时间、波形电平)需要使用示波器进行波形抓取。
IIC总线仲裁
仲裁:仲裁与同步类似,仅在系统中使用多个主机时才会涉及到,从站不参与仲裁过程。首先要理解一下仲裁是干啥的?所谓仲裁就是在多主机模式下,哪一个主机能获取介质的访问权限,获得权限的主机才可以传输 I2C 通信报文。只有在总线空闲时,主机才可以开始传输。两个主机可以在 START 的最小保持时间内产生 START 条件这种情况会导致总线上出现有效的 START 条件。然后需要仲裁以确定哪个主机将完成其传输。
仲裁是一位一位地进行。节点发送 1 个位后,回读比较总线上所呈现的数据与自己发送的是否一致。是,继续发送;否则,退出竞争。SDA 线的仲裁可以保证 I2C 总线系统在多个主节点同时企图控制总线时通信正常进行并且数据不丢失。总线系统通过仲裁只允许一个主节点可以继续占据总线。

上图显示了两个主机的仲裁程序。实际使用中连接到总线的主机数量可能会更多。当主机产生的 DATA1 的内部数据电平与 SDA 线上的实际电平之间存在差异时,DATA1 输出将关闭。从而主机 1 退出竞争,没有获得总线的控制权。
2.5 CAN
入门推荐大家看一本书《CAN入门书》。可以si我获取
CAN(Controller Area Network,控制器局域网络)是一种高性能、高可靠性的串行通信协议,广泛应用于汽车电子、工业自动化、智能交通等领域。它支持多主通信,能够实现设备之间的高效数据传输。
相比 UART / SPI / I²C,CAN 是一个高可靠、抗干扰、多节点的总线系统,并且具备优先级仲裁与自动错误检测机制。
特点
- 多主通信:支持多个节点(设备)共享同一条总线,每个节点都可以作为主设备发起通信。
- 高可靠性:具有错误检测和自动重传机制,能够保证数据传输的可靠性。
- 实时性:支持优先级机制,高优先级的消息可以优先传输。
- 高传输速率:标准CAN(CAN 2.0A/B)支持最高1 Mbps的传输速率,而CAN FD(Flexible Data-rate CAN)支持更高的传输速率。
- 硬件需求低:只需要两条信号线(CAN_H和CAN_L),硬件连接简单。
- 简单易用:协议简单,硬件和软件实现相对容易。
引脚定义
CAN通信通常涉及以下两条信号线:
- CAN_H(CAN High):高电平信号线。
- CAN_L(CAN Low):低电平信号线。
以高速CAN协议为例,当表示逻辑1时(隐性电平),CAN_High和CAN_Low线上的电压均为2.5v, 即它们的电压差VH-VL=0V;
而表示逻辑0时(显性电平), CAN_High的电平为3.5V,CAN_Low线的电平为1.5V, 即它们的电压差为VH-VL=2V。
在CAN总线中,必须使它处于隐性电平(逻辑1)或显性电平(逻辑0)中的其中一个状态。假如有两个CAN通讯节点,在同一时间,一个输出隐性电平, 另一个输出显性电平,类似I2C总线的“线与”特性将使它处于显性电平状态,显性电平的名字就是这样来的,即可以认为显性具有优先的意味。
数据帧结构
CAN协议定义了多种数据帧格式,包括数据帧、远程帧、错误帧和过载帧。以下是数据帧的结构:
数据帧结构(务必熟悉)
- 帧起始位(Start of Frame):1位,始终为显性电平(逻辑0)。
- 仲裁字段(Arbitration Field):标识符(Identifier):11位(标准帧)或29位(扩展帧)。RTR(Remote Transmission Request):1位,数据帧为显性电平(逻辑0),远程帧为隐性电平(逻辑1)。
- 控制字段(Control Field):6位,包含数据长度码(DLC)。
- 数据字段(Data Field):0到8字节,具体长度由DLC决定。
- 校验字段(CRC Field):15位,包含CRC校验码和CRC界定符(1位)。
- 应答字段(Acknowledge Field):2位,包含应答位(ACK)和应答分隔符。
- 帧结束(End of Frame):7位,始终为隐性电平(逻辑1)。
工作原理
- 总线仲裁:CAN总线采用位仲裁机制,当多个节点同时发送数据时,通过比较标识符的位值来决定优先级。较低的标识符值具有较高的优先级。
- 错误检测:CAN协议支持多种错误检测机制,包括CRC校验、位错误、填充错误等。当检测到错误时,节点会发送错误帧,通知其他节点。这个地方了解一下CAN总线的Busoff状态:在CAN总线通信中,Busoff(总线关闭)状态是一个重要的错误状态,它表示某个节点(设备)由于检测到过多的错误而被强制从总线上断开,以防止其继续干扰总线的正常通信。(在《CAN基础》PDF里面有)
- 自动重传:发送节点在检测到错误后会自动重传数据,直到成功为止。
- 接收节点:接收节点根据标识符过滤接收的数据帧,只有匹配的帧才会被接收。(这个MASK掩码也要了解一下,面试会问的)
硬件连接
- CAN物理层的形式主要有两种,下图中的CAN通讯网络是一种遵循ISO11898标准的高速、 短距离“闭环网络”,(开环应该不如闭环重要吧,了解了解就可以)它的总线最大长度为40m,通信速度最高为1Mbps,总线的两端各要求有一个“120欧”的电阻。(防止信号反射、保证阻抗匹配、稳定差分信号。)
- 顺便了解一下CAN收发器: CAN收发器在CAN总线通信中起着至关重要的作用。它不仅实现了逻辑电平与差分信号之间的转换,还提供了抗干扰、总线保护、驱动能力等功能。通过使用CAN收发器,可以确保CAN总线通信的可靠性和稳定性,满足汽车电子、工业自动化等领域的严格要求。
延伸CAN FD
CAN FD(Controller Area Network Flexible Data-rate) 是由 Bosch 公司在 2012 年推出的 CAN 总线的改进版本,主要目标是:
提高数据传输效率,增加每帧数据长度,并支持更高的波特率。
因此,它被广泛应用于汽车电子、高速传感网络和工业控制等场景中。
主要特点
- 更高的数据传输速率:CAN FD支持两种速率:仲裁速率(Arbitration Phase)和数据速率(Data Phase)。仲裁速率与传统CAN总线相同,最高可达1 Mbps;而数据速率可以显著提高,最高可达8 Mbps。通过在数据传输阶段切换到更高的速率,CAN FD能够在保持传统CAN总线兼容性的同时,显著提高数据传输效率。
- 更大的数据负载:传统CAN总线的单帧数据最大长度为8字节,而CAN FD支持更大的数据负载,最大可达64字节。这使得CAN FD能够更高效地传输大量数据,减少数据帧的数量,从而降低总线负载。
- 兼容传统CAN总线:CAN FD协议在设计上完全兼容传统CAN总线,这意味着传统CAN设备可以无缝接入CAN FD网络。CAN FD控制器能够识别和处理传统CAN数据帧,确保两种协议的数据帧可以共存于同一总线上。
- 增强的错误检测能力:CAN FD协议引入了更强大的错误检测机制,包括CRC校验码的扩展和改进,进一步提高了数据传输的可靠性。
关键新增字段
- EDL(Extended Data Length)位
标志此帧为 CAN FD 帧;
若为 1 表示 CAN FD 格式,否则为经典 CAN。
BRS(Bit Rate Switch)位
表示是否在数据段使用更高波特率;
1:仲裁段低速,数据段高速;
0:整帧都用同一速率。
- ESI(Error State Indicator)位
标识发送节点是否处于错误被动状态;
正常发送节点置 0,错误被动节点置 1。
- Data Field(数据段)
可达 64 字节,远高于经典 CAN 的 8 字节。
项目 | 经典 CAN | CAN FD |
最大数据长度 | 8 字节 | 64 字节 |
位速率 | 整帧相同速率 | 仲裁段(低速) + 数据段(高速) |
CRC 校验 | 15 位 | 17 位或 21 位 CRC(取决于数据长度) |
帧结构 | 固定格式 | 新增 EDL、BRS、ESI 位 |
控制器兼容性 | 只能识别经典帧 | FD 控制器可兼容经典帧 |
传输速率 | 一般 ≤ 1 Mbps | 最高可达 8 Mbps(典型 2~5 Mbps) |
有效载荷效率 | 低 | 显著提高(尤其在大数据量场景) |
2.6 TCP和UDP
TCP的三次握手
第一次握手:客户端发送网络包,服务端收到了。
这样服务端就能得出结论:客户端的发送能力、服务端的接收能力是正常的。
第二次握手:服务端发包,客户端收到了。
这样客户端就能得出结论:服务端的接收、发送能力,客户端的接收、发送能力是正常的。不过此时服务器并不能确认客户端的接收能力是否正常。
第三次握手:客户端发包,服务端收到了。
这样服务端就能得出结论:客户端的接收、发送能力正常,服务器自己的发送、接收能力也正常。
为什么要三次握手?两次不行吗?
如客户端发出连接请求,但因连接请求报文丢失而未收到确认,于是客户端再重传一次连接请求。后来收到了确认,建立了连接。数据传输完毕后,就释放了连接,客户端共发出了两个连接请求报文段,其中第一个丢失,第二个到达了服务端,但是第一个丢失的报文段只是在某些网络结点长时间滞留了,延误到连接释放以后的某个时间才到达服务端,此时服务端误认为客户端又发出一次新的连接请求,于是就向客户端发出确认报文段,同意建立连接,不采用三次握手,只要服务端发出确认,就建立新的连接了,此时客户端忽略服务端发来的确认,也不发送数据,则服务端一致等待客户端发送数据,浪费资源。
四次挥手
- 第一次挥手:客户端发送一个 FIN 报文,报文中会指定一个序列号。此时客户端处于 FIN_WAIT1 状态。即发出连接释放报文段(FIN=1,序号seq=u),并停止再发送数据,主动关闭TCP连接,进入FIN_WAIT1(终止等待1)状态,等待服务端的确认。
- 第二次挥手:服务端收到 FIN 之后,会发送 ACK 报文,且把客户端的序列号值 +1 作为 ACK 报文的序列号值,表明已经收到客户端的报文了,此时服务端处于 CLOSE_WAIT 状态。即服务端收到连接释放报文段后即发出确认报文段(ACK=1,确认号ack=u+1,序号seq=v),服务端进入CLOSE_WAIT(关闭等待)状态,此时的TCP处于半关闭状态,客户端到服务端的连接释放。客户端收到服务端的确认后,进入FIN_WAIT2(终止等待2)状态,等待服务端发出的连接释放报文段。
- 第三次挥手:如果服务端也想断开连接了,和客户端的第一次挥手一样,发给 FIN 报文,且指定一个序列号。此时服务端处于 LAST_ACK 的状态。即服务端没有要向客户端发出的数据,服务端发出连接释放报文段(FIN=1,ACK=1,序号seq=w,确认号ack=u+1),服务端进入LAST_ACK(最后确认)状态,等待客户端的确认。
- 第四次挥手:客户端收到 FIN 之后,一样发送一个 ACK 报文作为应答,且把服务端的序列号值 +1 作为自己 ACK 报文的序列号值,此时客户端处于 TIME_WAIT 状态。需要过一阵子以确保服务端收到自己的 ACK 报文之后才会进入 CLOSED 状态,服务端收到 ACK 报文之后,就处于关闭连接了,处于 CLOSED 状态。即客户端收到服务端的连接释放报文段后,对此发出确认报文段(ACK=1,seq=u+1,ack=w+1),客户端进入TIME_WAIT(时间等待)状态。此时TCP未释放掉,需要经过时间等待计时器设置的时间2MSL后,客户端才进入CLOSED状态。
- 保证客户端发送的最后一个ACK报文段能够到达服务端。
- 防止“已失效的连接请求报文段”出现在本连接中。
MSL是Maximum Segment Lifetime的英文缩写,可译为“最长报文段寿命”,它是任何报文在网络上存在的最长时间,超过这个时间报文将被丢弃。
两个理由:
WIFI和蓝牙后面补充,这个加分项,掌握最好,时间有限的情况下先把前面的掌握!
#牛客创作赏金赛##找工作八股要背到什么程度?#从入门到上岸,一站式搞定求职! 本硕纯机械,无竞赛无论文,后转行嵌入式软件开发(因为课题组师哥转嵌入式拿到30Woffer之后狠狠心动),秋招最终收获35W+offer可以为27届或者28届的的UU们提供参考,可以关注一下!!!
查看6道真题和解析