以下內容面向嵌入式/系統方向的初學者與面試備考者,全面梳理了以下幾大板塊,并在每個板塊末尾列出常見的面試問答思路,幫助你既能夯實基礎,又能應對面試挑戰。
一、TCP/IP 協議
1.1 TCP/IP 五層模型概述
-
鏈路層(Link Layer)
-
包括網卡驅動、以太網、Wi?Fi、PPP 等。負責把數據幀(Frame)在相鄰節點間傳輸。
-
-
網絡層(Internet Layer)
-
最典型的是 IP 協議 (IPv4/IPv6)。負責 路由選路、分片與重組。
-
其他:ICMP(Ping、目的不可達等)、ARP/ND (地址解析協議/鄰居發現)。
-
-
傳輸層(Transport Layer)
-
TCP(Transmission Control Protocol):面向連接、可靠傳輸、有序到達、流量控制與擁塞控制。
-
UDP(User Datagram Protocol):無連接、不保證可靠性、低開銷。
-
-
會話層、表示層(合并在“應用層”討論)
-
應用層(Application Layer)
-
HTTP/HTTPS、FTP、SMTP/POP3、DNS、Telnet、SSH 等。
-
面試常問:
請簡述 TCP/IP 模型與 OSI 七層模型的對應關系。
TCP 與 UDP 的區別?各有什么典型應用場景?
DNS 查詢過程是怎樣的?(迭代查詢 vs 遞歸查詢)
1.2 IP 協議要點
-
IP 地址與子網掩碼
-
IPv4:32 位,常見寫法
192.168.1.10/24
(子網掩碼 255.255.255.0)。 -
IPv6:128 位,常見壓縮寫法
fe80::1ff:fe23:4567:890a/64
。
-
-
分片與重組
-
當數據包超過鏈路層最大傳輸單元(MTU)時,IP 層會分片。目的主機負責重組。
-
-
路由選擇
-
路由表:根據目的 IP 匹配最長前綴,選擇下一跳。
-
默認網關、直連網絡、三層交換等。
-
面試常問:
如何計算某 IP 的網絡地址、廣播地址?
什么是 CIDR?為什么要劃分子網?
簡述 IP 分片過程及可能帶來的問題(性能、重組失敗)。
1.3 TCP 核心機制
-
三次握手(Three?way Handshake)
-
客戶端發送 SYN, seq = x
-
服務器收到 SYN, 回復 SYN?ACK, seq = y, ack = x+1
-
客戶端收到 SYN?ACK, 回復 ACK, ack = y+1;連接建立
-
-
四次揮手(Four?way Teardown)
-
主動關閉方發送 FIN, seq = a
-
對端回復 ACK, ack = a+1
-
對端發送 FIN, seq = b
-
主動關閉方回復 ACK, ack = b+1;連接關閉
-
-
流量控制(窗口機制):
-
發送端發送窗口(rwnd)由接收端根據緩沖區大小告知。
-
-
擁塞控制(慢啟動、擁塞避免、快速重傳、快速恢復):
-
擁塞窗口(cwnd)從 1 MSS 開始,遇到丟包或超時則觸發相應算法。
-
面試常問:
TCP 三次握手的目的?如果少一次會發生什么?
TCP 四次揮手與三次揮手有什么區別?為什么需要四次?
怎么理解 TCP 的流量控制與擁塞控制?
如何粗略計算 RTT?什么是滑動窗口?
1.4 UDP 與其他協議
-
UDP(User Datagram Protocol)
-
“不可靠”傳輸:不保證到達、不保證順序。
-
頭部開銷小,僅 8 字節:
源端口(2B) | 目標端口(2B) | 長度(2B) | 校驗和(2B)
。 -
常見應用:DNS 查詢、VoIP、視頻流、DHCP。
-
-
ICMP(Internet Control Message Protocol)
-
用于網絡診斷(ping)、不可達報告、TTL 超時等。
-
-
常見端口號
-
HTTP:80,HTTPS:443,DNS:53,SSH:22,FTP:21,SMTP:25,POP3:110,IMAP:143 等。
-
面試常問:
為什么 DNS 通常使用 UDP?遇到數據包丟失怎么辦?
簡述 ICMP 報文類型(Echo Request/Reply,Destination Unreachable 等)。
常見的服務器如何處理端口搶占和端口復用?
二、C 語言基礎
以下內容面向零基礎讀者,從最基本的概念開始,一步步推進到鏈表、環形隊列和指針的“進階姿勢”。
2.1 結構體(struct
)
2.1.1 概念
-
定義:把多個不同類型的變量組合成一個“整體”,類似現實世界中“一個學生有姓名、年齡、成績”。
-
語法:
struct Student {char name[32];int age;float score; };
-
用法:
struct Student s1; strcpy(s1.name, "Alice"); s1.age = 20; s1.score = 92.5f; printf("Name=%s, Age=%d, Score=%.1f\n", s1.name, s1.age, s1.score);
-
內存對齊:
-
結構體成員通常按自然對齊方式存放,字段之間可能插入“填充字節(Padding)”以保證訪問效率。
-
sizeof(struct)
可能 > 各成員大小之和。
-
面試常問:
struct A { char c; int x; }
與struct B { int x; char c; }
誰更省空間,為什么?如何傳遞結構體到函數?按值還是按引用?優缺點?
什么是匿名結構體,什么時候用?
2.2 聯合體(union
)
2.2.1 概念
-
定義:聯合體的所有成員 共用同一塊內存,只要給其中一個成員賦值,就修改了這塊內存。
-
語法:
union Data {int i;float f;char str[20]; };
-
用法:
union Data d; d.i = 100; printf("d.i=%d, d.f=%f\n", d.i, d.f); // f 與 i 共享內存,值不確定
-
大小:
-
聯合體的
sizeof
等于其最大成員的大小,再加上對齊需要的填充。
-
面試常問:
結構體和聯合體有什么區別?各自適用場景?
為什么聯合體可節省內存?舉例說明。
如何安全地在聯合體里存放二進制數據(如網絡協議報文)?
2.3 枚舉(enum
)
2.3.1 概念
-
定義:枚舉是一組具名整型常量的集合,讓代碼更易讀。
-
語法:
enum Weekday { MON = 1, TUE, WED, THU, FRI, SAT, SUN };
-
如果不顯式賦值,默認從 0 開始自動 +1。
-
-
用法:
enum Weekday today = WED; if (today == WED) { printf("It's Wednesday\n"); }
-
底層本質:枚舉常量本質是整型 (C 默認
int
)。
面試常問:
枚舉常量的底層類型是什么?可以指定底層類型嗎?
枚舉 vs
#define
的區別?哪種更好?如何把枚舉轉為字符串?有哪些常見技巧?