嵌入式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。所以中间的 ACKFIN 分两次发,共四次。
为什么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 (查连接状态)。