網絡協議棧的位置
用戶在應用層的各種請求最終會下達給操作系統,操作系統內除了進程管理、文件管理、內存管理、驅動管理之外,還有一個內嵌的軟件協議棧,協議棧將用戶的數據進行各種封包后,通過網卡將數據傳遞到網絡當中,數據在網絡內部經過各種路由轉發,最終將數據傳送到了目標服務器。
網絡協議棧各部分所處位置:
應用層是位于用戶層的。 這部分代碼是由網絡協議的開發人員來編寫的,比如HTTP協議、HTTPS協議以及SSH協議等。
傳輸層和網絡層是位于操作系統層的。 其中傳輸層最經典的協議叫做TCP協議,網絡層最經典的協議叫做IP協議,這就是我們平常所說的TCP/IP協議。
數據鏈路層是位于驅動層的。 其負責真正的數據傳輸。
網絡協議棧中各層的功能
-
物理層
傳輸原始比特流(0/1),定義電壓、光信號等物理特性。 -
數據鏈路層
節點間幀傳輸(如 MAC 地址),錯誤檢測(CRC 校驗),控制物理層訪問。(負責數據真正的發送過程) -
網絡層
IP 地址尋址與路由選擇(如路由器跨網絡轉發數據包)。(發去哪) -
傳輸層
端到端可靠傳輸(TCP)或快速傳輸(UDP),通過端口號區分應用。 -
應用層
為應用程序提供協議(HTTP/FTP/DNS 等),直接處理用戶數據 -
層狀結構的本質是軟件工程上面的解耦,此時層與層之間只有接口的相互調用關系,此時我們就可以讓研究不同領域的開發人員編寫不同層的代碼,最后再將各層的代碼聯調起來,由于每一層的代碼都是對應領域的專業人員編寫的,因此代碼聯調后整體的性能也是很高的。
并且這樣的層狀結構可以增加代碼的可維護性和可擴展性。比如有一天你覺得數據鏈路層的代碼已經無法承擔起通信的能力了,那么此時我們就可以用一個新的協議對它進行替換,而其他各層對應的協議都不用換,這就叫做可擴展性。而如果協議棧的某一層出現了問題,我們只要確定了是哪一層出了問題,就可以直接去對應層去找問題,這就叫做代碼的可維護性。
MAC 地址?
- 定義:唯一標識網絡設備的物理地址,固化在網卡中,格式為
00:1A:2B:3C:4D:5E
(6 字節)。- 作用:在局域網(如以太網)中直接定位設備,數據鏈路層通過 MAC 地址實現設備間幀的精確投遞。
- 特點:
- 前 3 字節為廠商標識(由 IEEE 分配),后 3 字節由廠商自定義。
- 用于交換機 / 路由器轉發數據時構建 MAC 地址表。
- CRC 校驗(循環冗余校驗)
- 定義:一種數據鏈路層的錯誤檢測技術,通過數學算法生成校驗碼,附加到數據幀尾部。
- 原理:發送方用生成多項式(如 CRC-32)計算數據的余數作為校驗值;接收方重新計算并比對,不一致則判定數據損壞。
- 特點:
- 檢測能力極強(如 CRC-32 可檢測所有≤32 位的突發錯誤)。
- 僅用于檢錯,不糾錯(發現錯誤后直接丟棄幀,觸發重傳)。
#include <iostream>
#include <vector>// 計算 CRC-16 校驗值
uint16_t crc16(const std::vector<uint8_t>& data) {const uint16_t polynomial = 0x8005;uint16_t crc = 0xFFFF;for (uint8_t byte : data) {crc ^= static_cast<uint16_t>(byte) << 8;for (int i = 0; i < 8; ++i) {if (crc & 0x8000) {crc = (crc << 1) ^ polynomial;} else {crc <<= 1;}}}return crc;
}int main() {std::vector<uint8_t> data = {0x01, 0x02, 0x03, 0x04};uint16_t result = crc16(data);std::cout << "CRC-16 校驗值: 0x" << std::hex << result << std::endl;return 0;
}
不同協議層對數據包有不同的稱謂,在傳輸層叫做段(segment),在網絡層叫做數據報(datagram),在鏈路層叫做幀