嵌入式大厂面经 11(持续更新中!)

这是一个嵌入式大厂面试题专栏,每天更新高频面试题。专栏将包含题目描述、详细解析、相关知识点扩展以及实际代码示例。内容涵盖操作系统、驱动开发、通信协议等核心领域,并结合实际项目经验进行分析。每道题目都会附带面试官可能的追问方向,帮助大家更好地准备面试!

1. TCP和UDP的区别

TCP(传输控制协议)和UDP(用户数据报协议)是传输层的两种主要协议,它们在以下几个方面有显著区别:

连接性

  • TCP:面向连接的协议,通信前需要通过三次握手建立连接,通信结束后需要四次挥手释放连接。
  • UDP:无连接协议,不需要建立连接就可以直接发送数据,也不需要维护连接状态。

可靠性

  • TCP:提供可靠传输,通过序列号、确认应答、超时重传等机制确保数据完整无误地到达目的地。
  • UDP:不保证可靠传输,数据包可能丢失、重复或乱序,应用层需要自行处理这些问题。

数据传输

  • TCP:面向字节流,将应用层数据视为一连串无结构的字节流,TCP会将这些数据分段传输。
  • UDP:面向报文,以报文为单位进行传输,保留应用层数据的边界。

传输效率

  • TCP:由于需要建立连接、保证可靠性,传输效率相对较低,有较大的协议开销。
  • UDP:没有连接管理、可靠性保证的开销,传输效率高,延迟低。

应用场景

  • TCP:适用于对可靠性要求高的应用,如网页浏览、文件传输、电子邮件等。
  • UDP:适用于实时性要求高、允许少量数据丢失的应用,如视频会议、在线游戏、流媒体等。

头部开销

  • TCP:头部至少20字节,最多60字节(含选项)。
  • UDP:头部固定8字节,开销小。

2. TCP的三次握手和四次挥手

三次握手(建立连接)

  1. 第一次握手:客户端发送SYN包(SYN=1, seq=x)给服务器,进入SYN_SENT状态。
  2. 第二次握手:服务器收到SYN包,回复SYN+ACK包(SYN=1, ACK=1, seq=y, ack=x+1),进入SYN_RCVD状态。
  3. 第三次握手:客户端收到SYN+ACK包,回复ACK包(ACK=1, seq=x+1, ack=y+1),双方进入ESTABLISHED状态,连接建立成功。

为什么需要三次握手?

  • 防止历史连接请求突然到达服务器,导致错误连接。
  • 同步双方的初始序列号,确保可靠传输的基础。
  • 确认双方的收发能力都正常。

四次挥手(释放连接)

  1. 第一次挥手:客户端发送FIN包(FIN=1, seq=u),表示不再发送数据,进入FIN_WAIT_1状态。
  2. 第二次挥手:服务器收到FIN包,回复ACK包(ACK=1, ack=u+1),表示已收到关闭请求,进入CLOSE_WAIT状态,客户端收到后进入FIN_WAIT_2状态。
  3. 第三次挥手:服务器处理完剩余数据后,发送FIN包(FIN=1, seq=v),表示服务器也准备关闭连接,进入LAST_ACK状态。
  4. 第四次挥手:客户端收到FIN包,回复ACK包(ACK=1, ack=v+1),进入TIME_WAIT状态,等待2MSL(最大报文生存时间)后关闭连接。

为什么需要四次挥手?

  • TCP是全双工通信,每个方向的连接需要单独关闭。
  • 服务器收到客户端的FIN后,可能还有数据需要发送,所以先回复ACK,等数据发送完毕后再发FIN。
  • TIME_WAIT状态是为了确保最后一个ACK能够到达服务器,防止新连接收到旧连接的数据包。

3. 解决TCP丢包问题

尽管TCP设计为可靠传输协议,但在网络环境不佳时仍可能出现丢包问题。以下是解决TCP丢包的主要方法:

1. 调整TCP参数

  • 重传超时时间(RTO):根据网络RTT动态调整,避免过早或过晚重传。
  • 拥塞窗口(cwnd):控制发送速率,避免网络拥塞导致的丢包。
  • 接收窗口(rwnd):合理设置接收缓冲区大小,避免接收方缓冲区溢出。
  • 禁用Nagle算法:减少小数据包的延迟,提高实时性。

2. 应用层确认机制

  • 在应用层实现额外的确认机制,对关键数据进行确认。
  • 设计合理的超时重传策略,根据业务需求调整重传间隔和次数。
  • 使用序列号标识数据包,便于检测丢包和重传。

3. 断点续传机制

  • 记录已传输数据的位置,在连接中断后能够从断点处继续传输。
  • 对大文件传输特别有效,避免从头开始重传整个文件。
  • 实现文件分块传输,每块单独确认,只重传丢失的块。

4. 网络状况监测与自适应

  • 实时监测网络RTT和丢包率,评估网络质量。
  • 根据网络状况动态调整传输策略,如发送速率、数据包大小等。
  • 在网络拥塞时主动降低发送速率,避免雪崩效应。

5. 连接保活与自动重连

  • 使用TCP keepalive机制或应用层心跳包检测连接状态。
  • 在连接断开时实现自动重连机制,减少人工干预。
  • 设计会话恢复机制,确保重连后能够继续之前的业务处理。

通过综合应用这些方法,可以有效提高TCP通信在不稳定网络环境下的可靠性和效率,特别适用于工业控制、物联网等对通信质量有较高要求的场景。

嵌入式面试八股文全集 文章被收录于专栏

这是一个全面的嵌入式面试专栏。主要内容将包括:操作系统(进程管理、内存管理、文件系统等)、嵌入式系统(启动流程、驱动开发、中断管理等)、网络通信(TCP/IP协议栈、Socket编程等)、开发工具(交叉编译、调试工具等)以及实际项目经验分享。专栏将采用理论结合实践的方式,每个知识点都会附带相关的面试真题和答案解析。

全部评论
点赞 回复 分享
发布于 今天 09:08 山西

相关推荐

🔥 2024春招必备 | 嵌入式开发面试八股文合集 📚亲爱的嵌入式开发小伙伴们,春招季即将到来!🌸 是时候武装自己的知识库,准备迎接面试挑战啦!我们精心整理了这份嵌入式开发面试八股文合集,帮助你在2024春招中脱颖而出!💪嵌入式面试八股文合集:https://www.nowcoder.com/creation/manager/columnDetail/mPZ4kk📌 C语言基础篇1️⃣ 指针与内存- 指针常量vs常量指针的区别?- 野指针和悬空指针的成因及如何避免?- 内存对齐的原理及实际意义?- 如何实现一个安全的strcpy函数?- malloc/free与new/delete的区别?2️⃣ 预处理与编译- 宏定义的优缺点及注意事项?- static关键字的五种用法?- volatile关键字的作用及应用场景?- 程序的内存分布(代码段、数据段、BSS段、堆、栈)?- 编译过程的四个阶段及其作用?💻 数据结构与算法1️⃣ 基础数据结构- 链表:如何检测链表中的环?- 栈与队列:应用场景及区别?- 树:二叉树的遍历方式及应用?- 哈希表:解决冲突的方法?2️⃣ 常见算法- 排序算法的时间复杂度对比?- 二分查找的实现及优化?- 嵌入式系统中的内存优化算法?- 位操作在嵌入式中的应用?🐧 Linux系统编程1️⃣ 进程与线程- 进程与线程的区别?- 进程间通信的方式及优缺点?- 线程同步的方法?- 死锁的条件及预防措施?2️⃣ 文件与IO- 文件描述符的概念及管理?- 阻塞IO vs 非阻塞IO vs 异步IO?- select/poll/epoll的区别及应用场景?- Linux设备驱动的基本框架?🔌 嵌入式硬件与通信1️⃣ STM32开发- STM32启动过程详解?- 中断优先级管理及嵌套?- DMA工作原理及应用场景?- 定时器的工作模式及配置?2️⃣ 通信协议- I2C、SPI、UART的区别及应用场景?- CAN总线的特点及应用?- Modbus协议的帧格式及异常处理?- TCP/IP协议栈在嵌入式系统中的实现?⚡ 实时操作系统1️⃣ RTOS基础- 什么是实时操作系统?硬实时vs软实时?- FreeRTOS的任务调度机制?- 信号量、互斥量、消息队列的使用场景?- 优先级反转问题及解决方案?2️⃣ 系统设计- 嵌入式系统的启动流程设计?- 低功耗设计的关键技术?- 看门狗的工作原理及应用?- 嵌入式系统的可靠性设计?📝 实战经验分享1️⃣ 调试技巧- 如何高效定位内存泄漏问题?- 使用JTAG/SWD进行硬件调试的技巧?- 常见的嵌入式系统崩溃原因分析?- 性能瓶颈分析与优化方法?2️⃣ 项目经验- 如何设计一个可靠的通信协议栈?- 嵌入式产品的测试策略?- 固件升级(OTA)的实现方案?- 嵌入式系统安全性设计的关键点?---🎯 2024春招备战指南:1. 每天复习1-2个知识点,一个月就能覆盖全部重点!2. 结合实际项目经验,准备2-3个可深入讲解的案例3. 刷题平台上针对性练习算法题,提高编程能力4. 模拟面试,锻炼表达能力和逻辑思维💼 面试技巧:- 遇到不会的问题,坦诚表达并展示解决问题的思路- 主动展示自己的项目经验和技术亮点- 准备一些有深度的问题向面试官提问- 保持积极的学习态度和良好的沟通能力🌟 祝各位嵌入式开发者在2024春招中取得理想的offer!记住:机会总是留给有准备的人!加油!💯
点赞 评论 收藏
分享
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客企业服务