嵌入式大厂面经 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编程等)、开发工具(交叉编译、调试工具等)以及实际项目经验分享。专栏将采用理论结合实践的方式,每个知识点都会附带相关的面试真题和答案解析。

全部评论

相关推荐

点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客企业服务