嵌入式Linux网络编程 相关面试题整理
这份整理将涵盖 OSI模型/TCP-IP模型、TCP/UDP协议细节、HTTP/HTTPS/MQTT应用层协议、Socket编程实战、网络调试 等核心板块。
搭配下面的播客使用效果更佳
📂 第一板块:网络模型与基础协议
这部分是计算机网络的基石,考察对分层架构的理解。
| 问题 | 级别 | 详细解答 |
|---|---|---|
| OSI七层模型,哪七层,分别有什么作用 | 重点 | 1. 物理层:传输比特流(网线、集线器、中继器)。 2. 数据链路层:MAC地址寻址、帧传输(交换机、网卡驱动)。 3. 网络层:IP选址与路由选择(路由器、IP协议)。 4. 传输层:端到端连接与可靠传输(TCP/UDP)。 5. 会话层:建立、管理会话。 6. 表示层:数据格式转换、加密解密。 7. 应用层:为应用程序提供服务(HTTP, FTP)。 |
| TCP/IP四层模型,哪四层,分别有什么作用 | 必问 | 1. 应用层:负责具体应用逻辑(HTTP, FTP, DNS, SMTP)。 2. 传输层:负责端到端的数据传输(TCP, UDP)。 3. 网络层:负责寻址和路由(IP, ICMP)。 4. 数据链路层:负责物理信号与数字信号转换(驱动程序、网卡)。 |
| 网络7层协议,TCP属于哪一层 | 了解 | TCP属于 传输层。 |
| 应用层有哪些协议 | 必问 | 1. HTTP (超文本传输协议) 2. FTP (文件传输协议) 3. DNS (域名解析) 4. SMTP (发送邮件) 5. POP3 (接收邮件) 6. Telnet (远程终端) 7. SSH (安全外壳) 8. MQTT (物联网消息协议) |
| 传输层有哪些协议 | 必问 | TCP (传输控制协议) 和 UDP (用户数据报协议)。 |
| 端口与socket的区别 | 重点 | 端口:标识主机上应用的逻辑接口号(如80端口)。 Socket:操作系统提供的编程接口(句柄),由 IP + 端口 + 协议 唯一确定一个网络连接端点。 |
| 子网掩码有什么用 | 重点 | 用于区分 IP 地址的 网络部分 和 主机部分,确定设备是否在同一个子网内,从而决定是直接通信还是通过网关路由。 |
| ICMP协议与ping命令的工作原理 | 了解 | ICMP:封装在 IP 包中,用于传递网络控制信息(如报错、不可达)。 ping原理:利用 ICMP 协议发送 Echo Request (回显请求) 报文,目标主机收到后回复 Echo Reply (回显应答),从而判断网络连通性。 |
| 访问www.baidu.com,在以太网中的第一个数据包 | 了解 | ARP请求包。 请求发生在数据链路层和网络层之间 电脑要把数据发出去,需要先知道网关(路由器)的 MAC 地址才能封装以太网帧,因此先广播发送 ARP 请求查询网关对应的 MAC 地址。 |
📂 第二板块:TCP 协议详解 (核心重灾区)
TCP 是面试中问得最细的部分,必须掌握握手、挥手及可靠性机制。
| 问题 | 级别 | 详细解答 |
|---|---|---|
| 简述TCP协议 | 必问 | TCP 是面向连接的、可靠的、基于字节流的传输层协议。在通信前需三次握手建立连接,通过校验和、序列号、确认应答、重传控制、滑动窗口、拥塞控制等机制保证数据可靠性。 |
| TCP三次握手过程以及作用 | 必问 | 以两个陌生人打电话举例 1. 第一次:客户端发送 SYN (seq=x),进入 SYN_SENT。(客户端给服务端说:你好,是服务器吗?你能听到我说话吗?) 2. 第二次:服务端收到后回复 SYN+ACK (seq=y, ack=x+1),进入 SYN_RCVD。(服务器回答说:能听到,请问客户端你能听到我吗?) 3. 第三次:客户端回复 ACK (ack=y+1),双方进入 ESTABLISHED。(客户端回答说:是的,我也可以听到,线路确定,可以开始交流了) 作用:确认双方的接收和发送能力都正常,交换初始序列号 (ISN)。 |
| TCP三次握手中syn为什么有两个 | 了解 | 连接是双向的,双方都需要发起自己的连接请求 (SYN) 来同步序列号。 |
| TCP三次握手中,第二步中,为什么是ack+syn | 了解 | 服务端将“确认客户端的请求 (ACK)”和“发起服务端的请求 (SYN)”合并在一个包发送,提高效率。 |
| 第三次握手,ack确认应答哪个 | 重点 | 应答第二步服务端发来的 SYN。 |
| 三次握手过程中可以携带数据吗 | 重点 | 第三次握手可以。前两次不行(防止泛洪攻击),第三次时客户端已认为连接建立,可携带数据。 |
| 什么是半连接队列 | 了解 | 服务端收到第一次 SYN 后,连接处于 SYN_RCVD 状态,此时连接放入 半连接队列。当收到第三次 ACK 后,移入 全连接队列。若队列满,可能导致丢包。 |
| TCP为什么是三次握手,而不是两次 | 重点 | 防止失效的连接请求突然到达服务端。若只有两次,服务端收到旧的 SYN 就会建立连接并一直等待,浪费资源。三次握手要求客户端再次确认,能避免此问题。 |
| TCP四次挥手过程 | 必问 | 1. 第一次:主动方发 FIN,进入 FIN_WAIT_1。A说完了,A不会给B发任何新数据了 2. 第二次:被动方回 ACK,进入 CLOSE_WAIT;主动方进 FIN_WAIT_2。B说:ok,我知道A说完了,但我还没说完 (此时半关闭) 3. 第三次:被动方发 FIN,进入 LAST_ACK。B说:好了,现在我也说完了 4. 第四次:主动方回 ACK,进入 TIME_WAIT;被动方关闭。A说:好的,可以完全结束了 |
| TCP结束时为什么要四次握手 | 重点 | TCP 是全双工的。主动方发 FIN 只是说“我不发数据了,但我还能收”。被动方收到后回 ACK,但可能还有数据没发完,等发完了再发自己的 FIN。所以中间的 ACK 和 FIN 分两次发,共四次。 |
| 为什么TIME_WAIT状态需要经过2MSL | 重点 | 1. 确保最后一个ACK能到达:若丢失,被动方会重传 FIN,主动方需在 2MSL 内再次发送 ACK。2. 防止旧报文干扰:等待 2MSL 可让网络中所有残留报文过期消失,避免干扰新连接。 |
| TIME_WAIT过多有什么危害及优化 | 了解 | 危害:占用端口资源(客户端)和内存资源(服务端),导致无法建立新连接。 优化:1. 调整内核参数(如 tcp_tw_reuse)。2. 改用长连接。 |
| TCP如何保证数据传输的可靠性 | 必问 | 1. 确认应答 (ACK):每发数据需收到确认。 2. 超时重传:没收到 ACK 则重发。 3. 序列号:解决乱序和重复问题。 4. 校验和:检测数据是否损坏。 5. 流量控制 (滑动窗口):防止发太快把接收方撑死。 6. 拥塞控制:防止网络拥堵 (慢启动、拥塞避免)。 |
| TCP滑动窗口机制 | 了解 | 允许发送方在收到 ACK 前连续发送多个包。窗口大小决定了无需等待确认可发送的最大数据量,提高吞吐率。 |
| TCP流量控制机制 | 了解 | 接收方通过 ACK 报文中的 窗口大小 字段告诉发送方自己还能收多少数据。若接收区满了,窗口置 0,发送方停止发送。 |
| TCP超时重传机制 | 了解 | 若超过 RTO 时间未收到 ACK,认为丢包并重传。RTO 通常基于 RTT (往返时间) 动态计算。Linux 默认重传间隔指数递增 (500ms, 1s, 2s…)。 |
| 如何处理TCP粘包问题 | 必问 | 本质:TCP 是流式协议,无边界。 解决方法: 1. 定长发送:每包固定长度。 2. 特殊分隔符:如尾部加 \r\n。3. 头部加长度字段 (最常用):包头存数据长度,先读头,再读对应长度的数据。 |
| TCP建立连接之后怎么保持长连接 | 必问 | 1. TCP Keepalive:开启内核保活机制,定时发空包探测。 2. 应用层心跳包:程序定时发自定义心跳包 (HeartBeat),若超时无响应则断开重连。 |
| 当关闭连接最后一个ACK丢失怎么办 | 了解 | 被动方收不到 ACK 会重传 FIN。主动方在 TIME_WAIT 状态下收到重传的 FIN,会再次发送 ACK 并重置 2MSL 计时器。 |
| TCP连接发生错误的异常处理(1004/1006) | 了解 | 1004:连接被重置或异常关闭。 1006:WebSocket 非正常关闭。 处理:捕获错误,释放资源,尝试重连。 |
📂 第三板块:UDP 协议与对比
UDP 虽简单,但考察重点在于“如何让它变得可靠”以及与 TCP 的对比。
| 问题 | 级别 | 详细解答 |
|---|---|---|
| 简述UDP协议及应用场景 | 必问 | 定义:无连接、不可靠、面向报文的传输协议。 场景:音视频通话 (允许丢包但求快)、游戏 (实时性)、DNS (包小)、广播/组播、物联网 (省电)。 |
| TCP与UDP的区别 | 必问 | 1. 连接:TCP 面向连接;UDP 无连接。 2. 可靠性:TCP 可靠 (重传/排序);UDP 不可靠 (丢包不负责)。 3. 速度:UDP 快,头部开销小 (8字节 vs TCP 20字节)。 4. 传输方式:TCP 是字节流;UDP 是数据报。 5. 通信:TCP 是一对一;UDP 支持一对一、一对多 (广播/组播)。 |
| 如何让UDP变得可靠 (RUDP) | 重点 | 在 应用层 实现可靠性机制: 1. 添加 Seq/Ack 机制。 2. 添加 超时重传 机制。 3. 添加 滑动窗口 控制流量。 例如:QUIC 协议。 |
| UDP点播、组播、广播的区别 | 重点 | 单播 (Unicast):一对一。 广播 (Broadcast):一对所有 (局域网内)。需设置 SO_BROADCAST。组播 (Multicast):一对一组 (特定组播组)。需设置组播地址 (D类 IP)。 |
| TCP和UDP一次性最多传输多少个字节 | 了解 | MTU 通常是 1500 字节。 TCP:1500 - 20 (IP头) - 20 (TCP头) = 1460 字节 (MSS)。 UDP:1500 - 20 (IP头) - 8 (UDP头) = 1472 字节。 |
📂 第四板块:应用层协议 (HTTP/MQTT/Modbus)
应用层协议考察实际开发中的数据交互格式。
| 问题 | 级别 | 详细解答 |
|---|---|---|
| HTTP协议及GET/POST区别 | 必问 | HTTP:无状态的超文本传输协议。 GET:获取资源,参数在 URL 中,不安全,长度受限。 POST:提交数据,参数在 Body 中,相对安全,适合上传/修改。 HTTPS:HTTP + SSL/TLS,加密传输。 |
| HTTPS如何加密 | 了解 | 混合加密: 1. 非对称加密 (RSA):握手阶段交换 Session Key。 2. 对称加密 (AES):数据传输阶段使用 Session Key 加密内容。 |
| MQTT协议及关键词 | 必问 | 定义:轻量级发布/订阅消息协议,基于 TCP,适合物联网。 关键词: 1. Broker (代理/服务器) 2. Topic (主题) 3. Publish/Subscribe (发布/订阅) 4. QoS (0:至多一次, 1:至少一次, 2:只有一次) 5. Keep Alive (保活) |
| 了解MODBUS协议么 | 重点 | 定义:工业控制标准协议 (PLC/传感器)。 特点:主从模式 (Master/Slave)。 模式:Modbus-RTU (串口二进制)、Modbus-TCP (以太网)。 |
| HTTP请求发送到后端需要做什么 | 了解 | DNS解析 → 建立 TCP 连接 → (HTTPS握手) → 构建请求头/体 → 发送 → 等待响应 → 关闭/复用连接。 |
| 客户端与服务器通信采用什么格式 | 重点 | 常用:JSON (易读)、XML (繁琐)、Protobuf (二进制高效)、CSV。 |
| 文件断点续传原理 | 重点 | 核心:记录传输位置 (Range)。 下次连接时,客户端请求头带上 Range: bytes=1024-,告诉服务器从 1024 字节开始传,而非重头开始。 |
📂 第五板块:Socket 编程与 IO 模型
这是代码实操部分,必须掌握 API 调用流程。
| 问题 | 级别 | 详细解答 |
|---|---|---|
| 使用bind等函数写出TCP建立连接的流程 | 必问 | Server端:socket() → bind() (绑端口) → listen() (监听) → accept() (阻塞等待) → recv/send() → close()。Client端: socket() → bind() (可选) → connect() (发SYN) → send/recv() → close()。顺序:先起 Server 阻塞在 accept,再起 Client 调 connect。 |
| 使用TCP/UDP时,客户端是否要使用bind函数 | 重点 | 不是必须的。若不绑定,内核会自动分配一个临时端口。通常服务端必须 Bind 固定端口,客户端随意。 |
| 使用TCP协议如何获取IP地址及端口号 | 了解 | 使用 struct sockaddr_in 结构体。1. sin_addr.s_addr 存 IP (用 inet_addr / inet_ntoa 转换)。2. sin_port 存端口 (用 htons / ntohs 转换)。3. getpeername() 可获取对端 IP/端口。 |
| 服务器IO设计模型 | 重点 | 1. 同步阻塞 IO:普通 read/write,没数据卡死。 2. 同步非阻塞 IO:O_NONBLOCK,没数据返回错误,需轮询。 3. IO 多路复用 (Select/Poll/Epoll):一个线程监控多个 Socket,效率高 (Reactor模式)。 4. 异步 IO (AIO):系统读完通知你 (Proactor模式)。 |
| 多路复用机制 (Select/Epoll) | 必问 | 定义:单线程同时监听多个文件描述符 (FD) 的可读/可写状态。 Select:轮询所有的 FD,有数量限制 (1024),效率随连接数增加下降。(服务员询问每桌客人是否需要服务) Epoll:事件驱动,无上限,只有活跃的 FD 会触发回调,效率极高。(给每个客人加个铃铛,客人摇铃铛来让服务员服务) |
| mcu下tcp协议如何保证有序? | 了解 | 即使在单片机 (MCU) 上,TCP 协议栈 (如 LwIP) 内部依然通过 序列号 (Seq) 和 重排序队列 来保证应用层读到的数据是有序的。 |
| 网络如何调试 | 重点 | 1. 抓包:Wireshark (PC端), tcpdump (Linux端)。 2. 连通性:ping, telnet (测端口)。 3. 路由:traceroute。 4. 状态:netstat -anp (查连接状态)。 |