嵌入式大厂面经 11(持续更新中!)
这是一个嵌入式大厂面试题专栏,每天更新高频面试题。专栏将包含题目描述、详细解析、相关知识点扩展以及实际代码示例。内容涵盖操作系统、驱动开发、通信协议等核心领域,并结合实际项目经验进行分析。每道题目都会附带面试官可能的追问方向,帮助大家更好地准备面试!
1. TCP和UDP的区别
TCP(传输控制协议)和UDP(用户数据报协议)是传输层的两种主要协议,它们在以下几个方面有显著区别:
连接性
- TCP:面向连接的协议,通信前需要通过三次握手建立连接,通信结束后需要四次挥手释放连接。
- UDP:无连接协议,不需要建立连接就可以直接发送数据,也不需要维护连接状态。
可靠性
- TCP:提供可靠传输,通过序列号、确认应答、超时重传等机制确保数据完整无误地到达目的地。
- UDP:不保证可靠传输,数据包可能丢失、重复或乱序,应用层需要自行处理这些问题。
数据传输
- TCP:面向字节流,将应用层数据视为一连串无结构的字节流,TCP会将这些数据分段传输。
- UDP:面向报文,以报文为单位进行传输,保留应用层数据的边界。
传输效率
- TCP:由于需要建立连接、保证可靠性,传输效率相对较低,有较大的协议开销。
- UDP:没有连接管理、可靠性保证的开销,传输效率高,延迟低。
应用场景
- TCP:适用于对可靠性要求高的应用,如网页浏览、文件传输、电子邮件等。
- UDP:适用于实时性要求高、允许少量数据丢失的应用,如视频会议、在线游戏、流媒体等。
头部开销
- TCP:头部至少20字节,最多60字节(含选项)。
- UDP:头部固定8字节,开销小。
2. TCP的三次握手和四次挥手
三次握手(建立连接)
- 第一次握手:客户端发送SYN包(SYN=1, seq=x)给服务器,进入SYN_SENT状态。
- 第二次握手:服务器收到SYN包,回复SYN+ACK包(SYN=1, ACK=1, seq=y, ack=x+1),进入SYN_RCVD状态。
- 第三次握手:客户端收到SYN+ACK包,回复ACK包(ACK=1, seq=x+1, ack=y+1),双方进入ESTABLISHED状态,连接建立成功。
为什么需要三次握手?
- 防止历史连接请求突然到达服务器,导致错误连接。
- 同步双方的初始序列号,确保可靠传输的基础。
- 确认双方的收发能力都正常。
四次挥手(释放连接)
- 第一次挥手:客户端发送FIN包(FIN=1, seq=u),表示不再发送数据,进入FIN_WAIT_1状态。
- 第二次挥手:服务器收到FIN包,回复ACK包(ACK=1, ack=u+1),表示已收到关闭请求,进入CLOSE_WAIT状态,客户端收到后进入FIN_WAIT_2状态。
- 第三次挥手:服务器处理完剩余数据后,发送FIN包(FIN=1, seq=v),表示服务器也准备关闭连接,进入LAST_ACK状态。
- 第四次挥手:客户端收到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编程等)、开发工具(交叉编译、调试工具等)以及实际项目经验分享。专栏将采用理论结合实践的方式,每个知识点都会附带相关的面试真题和答案解析。