網絡原理學習筆記:TCP/IP 核心概念
本文是我在學習網絡原理時整理的筆記,主要涵蓋傳輸層、網絡層和數據鏈路層的核心協議和概念,特別是 TCP, UDP, IP, 和以太網。
一、傳輸層 (Transport Layer)
傳輸層負責提供端到端(進程到進程)的數據傳輸服務。它建立在網絡層之上,為應用層提供通信支持。主要協議有 UDP 和 TCP。
1.1 UDP協議 (User Datagram Protocol)
UDP 是一種簡單的、面向數據報的傳輸層協議。
UDP 報文段格式 (UDP Segment Format):
- 16位源端口號 (Source Port): 標識發送方進程。
- 16位目的端口號 (Destination Port): 標識接收方進程。
- 16位UDP長度 (Length): 表示整個UDP報文段(UDP首部+UDP數據)的總長度(字節),最大為 65535 字節 (理論值,實際受 IP 層限制約為 64KB)。
- 16位檢驗和 (Checksum): 用于檢測 UDP 報文段(首部和數據)在傳輸中是否出錯。如果出錯,報文將直接被丟棄。此字段在 IPv4 中可選,但在 IPv6 中是強制的。
UDP的特點:
- 無連接 (Connectionless): 發送數據前無需建立連接。只需知道對方的 IP 和端口號即可發送數據報。
- 不可靠 (Unreliable): 不保證數據報一定到達,不保證順序,不保證不重復。沒有確認機制,沒有重傳機制。如果因網絡問題無法將報文傳輸給對方,UDP 不會向應用層返回任何錯誤信息。
- 面向數據報 (Datagram-Oriented): 應用層交給 UDP 多長的報文,UDP 就照樣發送,即一次發送一個報文。接收方也一次接收一個完整的報文。它保留了消息的邊界,不會發生粘包問題,但可能丟包或亂序。
- 開銷小,效率高: 頭部只有 8 字節,協議處理簡單快速。
1.2 TCP協議 (Transmission Control Protocol)
TCP 的全稱為傳輸控制協議,是一種面向連接的、可靠的、基于字節流的傳輸層協議。它旨在對數據的傳輸進行精確控制,確保數據可靠、有序地到達。
TCP 報文段格式 (TCP Segment Format):
- 源/目的端口號 (Source/Destination Port): 各 16 位,表示數據從哪個進程來,要到哪個進程去。
- 32位序號 (Sequence Number -
seq
): 由發送方填充,表示本報文段所發送數據的第一個字節在整個數據流中的字節編號。 - 32位確認序號 (Acknowledgement Number -
ack
): 由接收方填充,表示期望收到對方下一個報文段數據的第一個字節的序號。也就是說,序號ack-1
為止的所有數據都已成功接收。僅當ACK
標志位為 1 時有效。 - 4位首部長度 (Header Length / Data Offset): 表示 TCP 首部有多少個 32位字(即多少個 4 字節)。乘以 4 即可得到首部的字節長度。最小值為 5 (20 字節),最大值為 15 (60 字節)。無選項時為 20 字節。
- 6位保留 (Reserved): 保留給以后使用,當前必須置為 0。
- 6位標志位 (Flags):
URG
: 緊急指針(Urgent Pointer)有效。指示報文中有緊急數據,應優先處理。ACK
: 確認序號(Acknowledgement Number)字段有效。建立連接后,所有傳送的報文段都必須將ACK
置為 1。PSH
: 推送(Push)功能。接收方接到PSH=1
的報文時,應盡快將數據交付給應用層,而不是等待緩沖區填滿。RST
: 重置連接(Reset)。用于異常中斷連接(如連接請求到不存在的端口、連接異常)。SYN
: 同步序號(Synchronize)。用于發起連接請求。SYN=1, ACK=0
表示連接請求;SYN=1, ACK=1
表示同意連接。FIN
: 結束連接(Finish)。表示發送方數據已發送完畢,請求斷開連接。
- 16位窗口大小 (Window Size): 用于流量控制。表示接收方當前可用的接收緩沖區的大小(單位是字節)。告知發送方還能發送多少數據。
- 16位檢驗和 (Checksum): 用于差錯檢測。覆蓋 TCP 首部和數據部分。發送方計算并填充,接收方驗證。
- 16位緊急指針 (Urgent Pointer): 只有當
URG
標志位為 1 時,該字段才有效。它是一個偏移量,指出緊急數據在數據部分的結束位置。 - 選項 (Options): 長度可變,最大為 40 字節。用于協商 MSS (Maximum Segment Size)、窗口擴大因子、時間戳等。
- 數據 (Data / Payload): 有效載荷,包含應用層的數據。長度可變。
1.2.1 TCP 核心機制
TCP 通過多種機制來保證可靠性和效率:
-
1. 確認應答 (Acknowledgement - 可靠性):
- 目的: 保證數據的可靠傳輸,發送方需要知道接收方是否成功收到了數據。
- 機制: 發送方發送數據(攜帶
seq
),接收方收到后回復一個ACK
報文(攜帶ack
),ack
值為seq + 數據長度
,表示期望收到的下一個字節序號。
-
2. 超時重傳 (Timeout Retransmission - 可靠性):
- 目的: 處理數據包或確認包在網絡中丟失的情況。
- 機制:
- 發送丟包: 發送方發送數據后啟動一個計時器。如果在計時器到期前未收到對應的
ACK
,則認為數據包丟失,重新發送該數據包。 - 應答丟包: 接收方發送了
ACK
,但在網絡中丟失。發送方未收到ACK
,同樣會觸發超時重傳。接收方收到重復的數據包時,根據序號可以識別并丟棄。
- 發送丟包: 發送方發送數據后啟動一個計時器。如果在計時器到期前未收到對應的
- 超時時間: TCP 動態計算 RTO (Retransmission Timeout),基于 RTT (Round-Trip Time) 的測量。
- 快速重傳: 作為優化,如果發送方收到三個或以上的重復
ACK
(指示同一個丟失的包),它會不等超時計時器到期就立即重傳該數據包。
-
3. 連接管理 (Connection Management - 可靠性):
- 目的: 安全地建立和終止 TCP 連接,確保雙方都準備好收發數據,并且所有數據都傳輸完畢。
- 三次握手 (Three-Way Handshake - 建立連接):
- 客戶端 -> 服務器: 發送
SYN
包 (標志位SYN=1
,seq=x
) 請求建立連接。客戶端進入SYN_SENT
狀態。 - 服務器 -> 客戶端: 收到請求后,如果同意連接,則回復
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
狀態。服務器收到此ACK
后也進入ESTABLISHED
狀態。連接建立完成。
- 目的: 確認雙方的發送和接收能力都正常。
- 客戶端 -> 服務器: 發送
- 四次揮手 (Four-Way Handshake - 斷開連接):
- 主動方 -> 被動方: 數據發送完畢后,發送
FIN
包 (標志位FIN=1
,seq=u
) 請求關閉連接。主動方進入FIN_WAIT_1
狀態。 - 被動方 -> 主動方: 收到
FIN
后,回復ACK
包 (標志位ACK=1
,ack=u+1
,seq=v
)。被動方進入CLOSE_WAIT
狀態。主動方收到此ACK
后進入FIN_WAIT_2
狀態。(此時被動方可能還有數據要發送) - 被動方 -> 主動方: 當被動方也準備好關閉連接(應用層調用
close
),發送FIN
包 (標志位FIN=1, ACK=1
,seq=w
,ack=u+1
)。被動方進入LAST_ACK
狀態。 - 主動方 -> 被動方: 收到被動方的
FIN
后,回復ACK
包 (標志位ACK=1
,seq=u+1
,ack=w+1
)。主動方進入TIME_WAIT
狀態(等待 2*MSL 時間,確保最后的ACK
到達對方)。被動方收到此ACK
后進入CLOSED
狀態。主動方等待TIME_WAIT
結束后也進入CLOSED
狀態。連接斷開。
- 目的: 確保雙方數據都傳輸完畢,并各自確認連接關閉。
- 主動方 -> 被動方: 數據發送完畢后,發送
-
4. 滑動窗口 (Sliding Window - 效率):
- 目的: 提高傳輸效率,允許發送方在收到一個
ACK
之前連續發送多個報文段。 - 機制:
- 發送窗口: 發送方維護一個窗口,表示當前允許發送但尚未收到確認的數據范圍。收到
ACK
后,窗口向前滑動。 - 接收窗口: 接收方根據自己的緩沖區大小,通過 TCP 頭部的 窗口大小 (Window Size) 字段告知發送方自己還能接收多少數據。
- 發送窗口: 發送方維護一個窗口,表示當前允許發送但尚未收到確認的數據范圍。收到
- 窗口大小限制了在途(未確認)的數據量。
- 目的: 提高傳輸效率,允許發送方在收到一個
-
5. 流量控制 (Flow Control - 效率/可靠性):
- 目的: 防止發送方發送數據太快,導致接收方緩沖區溢出而處理不過來。
- 機制: 接收方通過 TCP 頭部的 16位窗口大小 (Window Size) 字段,告知發送方自己當前可用的接收緩沖區大小。發送方根據這個值動態調整自己的發送速率,確保發送的數據量不超過接收方的處理能力。如果窗口大小為 0,發送方暫停發送數據(除了探測報文)。
-
6. 擁塞控制 (Congestion Control - 可靠性/效率):
- 目的: 防止過多數據注入網絡導致網絡擁塞(路由器過載、丟包率增加),維護網絡穩定性。
- 機制: TCP 通過感知網絡擁塞狀況(如丟包、超時)來動態調整擁塞窗口 (
cwnd
) 的大小,從而控制發送速率。與流量控制(點對點)不同,擁塞控制是全局性的考量。主要算法包括:慢啟動 (Slow Start)、擁塞避免 (Congestion Avoidance)、快速重傳 (Fast Retransmit)、快速恢復 (Fast Recovery)。
-
7. 延遲應答 (Delayed ACK - 效率):
- 目的: 減少網絡中純
ACK
包的數量,降低協議開銷。 - 機制: TCP 接收方收到數據后,不立即發送
ACK
,而是稍等片刻(比如 200ms 或等待有數據要發回時)。如果這段時間內有數據要發給對方,就可以將ACK
捎帶在數據包中一起發送。
- 目的: 減少網絡中純
-
8. 捎帶應答 (Piggybacking - 效率):
- 目的: 提高傳輸效率,將數據回復和確認應答合并在一個 TCP 報文段中發送。
- 機制: 當接收方既要發送確認
ACK
,又有數據要發送給對方時,將ACK
信息搭載在包含數據的 TCP 報文段中一起發送,而不是單獨發送一個ACK
包。
-
9. 面向字節流 (Byte Stream - 特性):
- 概念: TCP 為上層應用層提供的是一個無邊界的、有序的字節流服務。TCP 不關心應用層發送的消息的邊界。發送方寫入多少次、每次寫多少字節,與接收方讀取多少次、每次讀多少字節沒有必然聯系。
-
10. 粘包問題 (Sticky Packets - 應用層問題):
- 現象: 由于 TCP 是面向字節流的,接收方從緩沖區讀取數據時,可能一次讀到了多個應用層消息(粘在一起),或者一個消息的一部分。這被稱為“粘包”或“半包”問題。
- 原因: 這是 TCP 字節流特性在應用層數據處理上的體現,并非 TCP 協議本身的錯誤。
- 解決方案 (應用層): 需要應用層協議自行解決。常見方法有:
- 使用固定長度的消息。
- 在消息之間使用特殊的分隔符(如
\r\n
)。 - 在每個消息頭部添加一個字段來表示該消息的長度。
-
11. 異常情況處理 (Exception Handling):
- TCP 設計了處理各種網絡異常情況的機制:
- 丟包 (Packet Loss): 通過超時重傳和快速重傳機制恢復。
- 包損壞 (Packet Corruption): 通過 16位檢驗和 (Checksum) 檢測。損壞的包會被接收方丟棄,發送方通過超時重傳或快速重傳機制恢復。
- 失序包 (Out-of-Order Packets): 通過 32位序號 (Sequence Number) 識別。接收方會緩存失序的包,等待中間缺失的包到達后,按序重新組裝并交給應用層。
- 重復包 (Duplicate Packets): 通過 序號 識別并直接丟棄。
- 連接重置 (Connection Reset): 如果收到一個指向不存在的連接的報文段,或發生嚴重錯誤,TCP 會發送一個帶有
RST
標志位的報文段,強制中斷連接。在 Java 等應用中,這可能表現為SocketException: Connection reset
。 - 半打開連接 (Half-Open Connection): 一方異常崩潰(如宕機),另一方不知情。當存活方嘗試發送數據時,會因為收不到
ACK
而超時,或者如果崩潰方恢復并收到舊連接的數據,可能會回復RST
。
- TCP 設計了處理各種網絡異常情況的機制:
1.3 TCP 和 UDP 的對比
特性 | TCP (Transmission Control Protocol) | UDP (User Datagram Protocol) |
---|---|---|
連接性 | 面向連接 (Connection-Oriented) | 無連接 (Connectionless) |
可靠性 | 可靠傳輸 | 不可靠 (盡力而為 - Best Effort) |
傳輸單元 | 字節流 (Byte Stream) | 數據報 (Datagram) |
頭部開銷 | 較大 (至少 20 字節) | 小 (固定 8 字節) |
傳輸效率 | 相對較低 (因確認、重傳等機制) | 相對較高 |
流量控制 | 有 (滑動窗口) | 無 |
擁塞控制 | 有 | 無 |
應用場景 | 文件傳輸 (HTTP, FTP), 郵件 (SMTP), 遠程登錄 (Telnet, SSH) 等要求高可靠性的場景 | 實時音視頻傳輸 (RTP), DNS 查詢, SNMP, 直播, 游戲等對實時性要求高、能容忍少量丟包的場景, 以及廣播/多播 |
應用層問題 | 可能出現粘包問題 (需應用層解決) | 可能出現丟包、亂序 (需應用層處理) |
總結: TCP 和 UDP 沒有絕對的優劣之分。它們是程序員可以根據具體應用場景和需求選擇的工具。需要可靠性時選 TCP,需要速度和實時性或廣播時選 UDP。
二、網絡層 (Network Layer)
網絡層位于傳輸層之下,數據鏈路層之上。
- 核心功能: 實現數據包(Packet/Datagram)在不同網絡之間的路由和轉發。它負責將數據從源主機傳送到目的主機,即使它們位于不同的網絡(局域網)中。
- 關鍵任務:
- 邏輯尋址 (Logical Addressing): 使用 IP 地址 (
IP Address
) 來唯一標識網絡中的主機和設備。 - 路由 (Routing): 根據目的 IP 地址,查找路由表,決定數據包的下一跳轉發路徑。路由器 (Router) 是執行此功能的關鍵設備。
- 轉發 (Forwarding): 將數據包從路由器的輸入端口移動到合適的輸出端口。
- 邏輯尋址 (Logical Addressing): 使用 IP 地址 (
2.1 IP 協議 (Internet Protocol)
IP 協議是網絡層的核心協議,是 TCP/IP 協議棧的基石。目前主要有兩個版本:IPv4 和 IPv6。這里主要討論更常用的 IPv4。
- 特點:
- 無連接 (Connectionless): 發送 IP 數據報前不需要建立連接。每個數據報都獨立尋址和路由,可能走不同的路徑到達目的地。
- 不可靠 / “盡力而為” (Best Effort Delivery): IP 協議不保證數據報一定能到達目的地,不保證按序到達,也不保證數據報在傳輸過程中不損壞、不丟失或不重復。可靠性由上層協議(如 TCP)負責。
2.1.1 基本概念 (Basic Concepts)
- IP 地址 (IP Address): 一個 32 位(IPv4)或 128 位(IPv6)的數字標識符,用于在網絡中唯一標記一臺主機或網絡接口。IPv4 地址通常寫成點分十進制形式(如
192.168.1.1
)。 - 數據報/包 (Datagram/Packet): 網絡層傳輸數據的基本單元,包含 IP 頭部 (Header) 和數據載荷 (Payload)。載荷通常是來自上層(如 TCP 或 UDP)的報文段。
- 路由 (Routing): 路由器根據其內部維護的路由表 (Routing Table),查找 IP 數據報中的目的 IP 地址,決定將該數據報轉發給哪個下一跳 (Next Hop) 路由器或直接發送給目標主機(如果目標在本地網絡)。
- 分片與重組 (Fragmentation & Reassembly): 當一個 IP 數據報的大小超過了下一跳鏈路的最大傳輸單元 (Maximum Transmission Unit - MTU) 時,發送方(或中間路由器,僅限 IPv4)可以將其分割成多個更小的片段(分片)進行傳輸。每個分片都有自己的 IP 頭部。目標主機的 IP 層負責將接收到的所有分片根據標識信息重新組裝成原始的數據報。
2.1.2 IP 協議頭格式 (IPv4 Header Format)
IPv4 數據報由頭部和數據部分組成。頭部通常為 20 字節(無選項字段時),包含以下關鍵信息:
- 版本 (Version): 4 位。指明 IP 協議版本,IPv4 為 4。
- 首部長度 (IHL - Internet Header Length): 4 位。表示 IP 頭部有多少個 32位字(4字節)。最小值為 5(即 20 字節),最大為 15(60 字節)。
- 服務類型 (Type of Service - TOS / Differentiated Services - DS): 8 位。用于指示期望的服務質量(如低延遲、高吞吐量)。現多被 DSCP/ECN 字段使用。
- 總長度 (Total Length): 16 位。整個 IP 數據報(頭部+數據)的總字節數。最大為 65535 字節。
- 標識 (Identification): 16 位。唯一標識一個數據報。當數據報被分片時,所有分片具有相同的標識號,用于重組。
- 標志 (Flags): 3 位。
- 第 0 位:保留,必須為 0。
- 第 1 位:
DF
(Don’t Fragment) -DF=1
表示禁止分片;DF=0
允許分片。 - 第 2 位:
MF
(More Fragments) -MF=1
表示后面還有分片;MF=0
表示這是最后一個分片(或未分片)。
- 片偏移 (Fragment Offset): 13 位。表示該分片的數據部分相對于原始數據報數據部分的偏移量(以 8 字節為單位)。第一個分片的偏移量為 0。
- 生存時間 (Time To Live - TTL): 8 位。數據報在網絡中允許經過的最大路由器跳數。每經過一個路由器,TTL 值減 1。當 TTL 減到 0 時,數據報被丟棄,并通常會向源主機發送一個 ICMP 超時消息。防止數據包在網絡中無限循環。
- 協議 (Protocol): 8 位。指示 IP 包數據部分承載的是哪個上層協議。常用值:
1
(ICMP),6
(TCP),17
(UDP)。 - 首部檢驗和 (Header Checksum): 16 位。用于校驗 IP 頭部的完整性(注意:僅校驗頭部,不校驗數據部分)。每經過一個路由器,由于 TTL 等字段會改變,需要重新計算校驗和。
- 源 IP 地址 (Source IP Address): 32 位。發送方主機的 IP 地址。
- 目的 IP 地址 (Destination IP Address): 32 位。接收方主機的 IP 地址。
- 選項 (Options): 可變長度 (0 到 40 字節)。用于擴展功能,如記錄路由、時間戳等。實際中較少使用,且會增加處理開銷。
- 填充 (Padding): 如果選項字段存在且長度不是 4 字節的整數倍,則添加 0 比特進行填充,以確保 IP 頭部總長度是 4 字節的整數倍。
2.2 地址管理 (Address Management)
如何有效地分配、組織和使用 IP 地址。
2.2.1 網段劃分 (Subnetting)
- 目的: 將一個大的 IP 網絡(如 ISP 分配的地址塊)劃分成多個更小的、邏輯上獨立的子網絡(Subnet)。這有助于:
- 網絡管理: 更方便地管理不同部門或區域的網絡。
- 提高效率: 限制廣播域,減少網絡流量。
- 增強安全性: 在子網間設置訪問控制。
- 機制: 通過子網掩碼 (Subnet Mask) 來實現。子網掩碼是一個 32 位的值,結構與 IP 地址類似,用于區分 IP 地址中的網絡部分和主機部分。
- 將 IP 地址和子網掩碼進行按位與 (AND) 運算,可以得到該 IP 地址所在的網絡地址 (Network Address)。
- 子網掩碼中,值為
1
的位對應 IP 地址的網絡部分,值為0
的位對應 IP 地址的主機部分。
- 示例:
- IP 地址:
192.168.1.100
- 子網掩碼:
255.255.255.0
(二進制11111111.11111111.11111111.00000000
) - 網絡地址 =
192.168.1.100
AND255.255.255.0
=192.168.1.0
- 在這個例子中,前 24 位 (
192.168.1
) 是網絡部分,后 8 位是主機部分。 - 該子網可容納的主機數 = 2^(主機位數) - 2 = 2^8 - 2 = 254 臺。(減去全 0 的網絡地址和全 1 的廣播地址)。
- IP 地址:
- CIDR (Classless Inter-Domain Routing - 無類別域間路由):
- 使用更靈活的表示法:在 IP 地址后面加上
/
和網絡部分的位數(即子網掩碼中1
的個數)。 - 例如,
192.168.1.0/24
表示網絡部分是前 24 位,等同于子網掩碼255.255.255.0
。 - CIDR 取代了過去 A/B/C 類地址的劃分方式,使得 IP 地址分配更加高效。
- 使用更靈活的表示法:在 IP 地址后面加上
2.2.2 特殊的 IP 地址 (Special IP Addresses)
這些地址具有特殊含義,不能分配給普通主機接口:
- 網絡地址 (Network Address): 主機部分全為 0 的地址(如
192.168.1.0/24
)。它代表整個子網,不能分配給單個主機。 - 廣播地址 (Broadcast Address): 主機部分全為 1 的地址(如
192.168.1.255/24
)。向該地址發送數據包,會到達該子網內的所有主機。 - 回環地址 (Loopback Address):
127.0.0.1
是最常用的回環地址,整個127.0.0.0/8
網段都屬于回環地址范圍。它代表本機。發送到回環地址的數據包會直接被本機的 IP 棧接收,常用于網絡軟件測試或本地進程間通信。域名localhost
通常解析為此地址。 - 全零地址 (Zero Address):
0.0.0.0
。通常表示 “任意” 或 “未知” 地址。- 在服務器綁定監聽時,
0.0.0.0
表示監聽本機所有可用的網絡接口。 - 在 DHCP 客戶端請求 IP 地址的初始階段,源 IP 地址可能使用
0.0.0.0
。
- 在服務器綁定監聽時,
- 受限廣播地址 (Limited Broadcast Address):
255.255.255.255
。發往此地址的數據包只會廣播到發送者所在的物理網段 (廣播域),不會被路由器轉發到其他網絡。
2.2.3 IP 地址的數量限制 (IP Address Quantity Limits)
- IPv4: 使用 32 位地址,理論上最多有 2^32 ≈ 43 億個地址。然而,由于地址分配方式、保留的特殊地址段(如私有地址、回環地址)、網絡和廣播地址的開銷等原因,可用的全球唯一(公網)地址遠少于此數,并且已基本耗盡。
- IPv6: 使用 128 位地址,提供 2^128 ≈ 3.4 x 10^38 個地址。這是一個極其龐大的數字,足以滿足可預見的未來全球所有設備和應用的需求,是解決 IPv4 地址耗盡問題的根本方案。
2.2.4 私有 IP 地址和公網 IP 地址 (Private and Public IP Addresses)
為了緩解 IPv4 地址耗盡問題,并允許組織內部網絡使用 IP 地址而無需向互聯網管理機構申請,RFC 1918 定義了以下三段私有 IP 地址 (Private IP Addresses):
- 范圍 1:
10.0.0.0
-10.255.255.255
(CIDR:10.0.0.0/8
) - 范圍 2:
172.16.0.0
-172.31.255.255
(CIDR:172.16.0.0/12
) - 范圍 3:
192.168.0.0
-192.168.255.255
(CIDR:192.168.0.0/16
)
特點:
- 私有地址: 可以在任何組織內部(如家庭、學校、公司局域網)自由使用和重復使用,無需注冊。這些地址不能在公共互聯網 (Internet) 上進行路由。
- 公網 IP 地址 (Public IP Addresses): 指除了私有地址、特殊地址(回環、廣播等)之外的所有 IP 地址。這些地址需要向互聯網注冊機構(通常通過 ISP)申請獲得,是全球唯一的,可以在互聯網上直接訪問。
NAT (Network Address Translation - 網絡地址轉換):
- 目的: 允許使用私有 IP 地址的內部網絡設備能夠訪問公共互聯網。
- 機制: 通常在連接內部網絡和外部互聯網的路由器(NAT 網關)上實現。當內部主機(使用私有 IP)訪問外部服務器(使用公網 IP)時,NAT 網關將數據包的源 IP 地址從私有 IP 替換為網關的公網 IP(通常還需要轉換端口號,稱為 NAPT 或 PAT)。當外部服務器的響應返回到網關時,網關再根據記錄將目的 IP 地址從公網 IP 換回原來的私有 IP,并將數據包轉發給內部主機。
- 優點: 極大地節約了 IPv4 公網地址;提供了一定程度的內部網絡安全(內部主機不易被外部直接訪問)。
- 缺點: 破壞了端到端的地址透明性;某些依賴端到端連接的應用(如一些 P2P 應用、VoIP)可能需要特殊處理(如 NAT 穿透)。
三、數據鏈路層 (Data Link Layer)
數據鏈路層位于物理層之上,網絡層之下。
- 主要作用: 負責在同一個局域網 (LAN) 內的相鄰節點之間,或者在兩個直接相連的節點之間(點對點鏈路),可靠地傳輸數據幀 (Frame)。它處理的是節點到節點 (Node-to-Node / Hop-to-Hop) 的通信。
- 核心功能:
- 組幀 (Framing): 將網絡層遞交下來的數據包(如 IP 數據報)封裝成幀,添加數據鏈路層特定的頭部 (Header) 和尾部 (Trailer) 信息。
- 物理尋址 (Physical Addressing): 使用 MAC 地址 (Media Access Control Address) 來標識源和目的設備的網絡接口卡 (NIC)。
- 流量控制 (Flow Control): (在某些鏈路類型上)控制發送速率,防止快的發送方淹沒慢的接收方。
- 差錯控制 (Error Control): 檢測(有時也糾正)在物理線路上傳輸時可能發生的比特錯誤。通常通過在幀尾部添加幀檢驗序列 (Frame Check Sequence - FCS) 來實現檢測(如 CRC 校驗)。出錯的幀通常會被丟棄。
- 介質訪問控制 (Media Access Control - MAC): 當多個設備共享同一個傳輸介質時(如早期的總線型以太網或現在的 Wi-Fi 無線網絡),需要一套規則來協調誰可以在何時使用介質發送數據,以避免或解決沖突。常見協議有 CSMA/CD (用于傳統以太網) 和 CSMA/CA (用于 Wi-Fi)。
3.1 認識以太網 (Understanding Ethernet)
- 定義: 以太網(Ethernet)是目前應用最廣泛的一種局域網 (LAN) 技術標準(IEEE 802.3 系列標準)。它定義了物理層(如線纜類型、接口、信號編碼)和數據鏈路層(如幀格式、MAC 地址、訪問控制方法)的規范。
- 特點: 技術成熟、成本低廉、速率多樣(從 10 Mbps 到 10 Gbps、40 Gbps、100 Gbps 甚至更高)、易于部署和管理。
- 演進:
- 早期: 使用同軸電纜的總線型結構或集線器 (Hub) 連接,所有設備共享帶寬,采用 CSMA/CD 協議避免沖突,工作在半雙工模式。
- 現代: 普遍使用交換機 (Switch) 連接設備(通常使用雙絞線或光纖)。每個設備連接到交換機的一個獨立端口,交換機基于 MAC 地址進行幀轉發。這使得設備通常可以工作在全雙工模式(同時收發數據),沖突域被大大縮小(每個端口一個沖突域),極大地提高了網絡性能和效率。
3.1.1 以太網幀格式 (Ethernet Frame Format)
以太網傳輸的基本數據單元是幀 (Frame)。最常用的是 Ethernet II (也稱 DIX Ethernet V2) 幀格式:
字段 | 大小 (Bytes) | 描述 |
---|---|---|
目的 MAC 地址 | 6 | 接收方網絡接口卡 (NIC) 的物理地址。可以是單播、多播或廣播地址。 |
源 MAC 地址 | 6 | 發送方網絡接口卡 (NIC) 的物理地址。 |
類型 (Type) | 2 | 指示幀的數據部分(Payload)承載的是哪種上層協議(網絡層協議)。例如:0x0800 表示 IPv4,0x0806 表示 ARP,0x86DD 表示 IPv6。 |
數據 (Data Payload) | 46 - 1500 | 包含來自上層(網絡層)的數據,如 IP 數據報。如果上層數據不足 46 字節,數據鏈路層會進行填充 (Padding) 以滿足最小幀長要求 (64 字節,不含前導碼)。 |
幀檢驗序列 (FCS) | 4 | 對整個幀(從目的 MAC 地址到數據部分結束)進行 CRC (Cyclic Redundancy Check) 循環冗余校驗。接收方用它來檢測幀在傳輸過程中是否出現比特錯誤。 |
注意:
- 最小/最大幀長: 以太網幀(從目的 MAC 到 FCS)的最小長度為 64 字節,最大長度為 1518 字節。
- 前導碼 (Preamble) & 幀起始定界符 (SFD): 在物理傳輸時,每個以太網幀前面還有 7 字節的前導碼(用于時鐘同步)和 1 字節的幀起始定界符 (Start Frame Delimiter)(標記幀的開始)。這兩個字段共 8 字節,有時不計入幀的正式長度。
- IEEE 802.3 格式: 還有一種稍有不同的 IEEE 802.3 格式,它使用相同的 2 字節字段來表示長度 (Length)(如果值 ≤ 1500 或 1536,取決于具體標準),而不是類型。需要配合 LLC 子層來標識上層協議。現代網絡中,Ethernet II 格式更為普遍。
3.1.2 認識 MAC 地址 (Understanding MAC Address)
- 定義: MAC 地址(Media Access Control Address),也稱為物理地址 (Physical Address) 或硬件地址 (Hardware Address)。它是在網絡設備(主要是網卡 NIC)出廠時就被燒錄在硬件中的一個唯一標識符。
- 格式: 一個 48 位 (6 字節) 的二進制數。通常表示為 12 位的十六進制數,并用冒號 (
:
)、破折號 (-
) 或點 (.
) 分隔開,每 2 位十六進制數為一組(代表 1 字節)。- 示例:
08:00:27:7D:99:A5
或08-00-27-7D-99-A5
或0800.277D.99A5
- 示例:
- 唯一性: 由 IEEE(電氣和電子工程師協會)負責管理和分配。
- 前 3 個字節(24 位)是組織唯一標識符 (Organizationally Unique Identifier - OUI),由 IEEE 分配給硬件制造商。
- 后 3 個字節(24 位)由制造商自行分配,確保在其生產的設備中唯一。
- 理論上,全球每個網絡接口的 MAC 地址都是唯一的(盡管可以通過軟件手段臨時修改或偽造)。
- 作用域: MAC 地址主要用于本地局域網 (LAN) 內部的通信。它用于標識同一廣播域內的具體設備接口。當數據包需要跨越路由器到達另一個網絡時,源和目的 MAC 地址會逐跳改變。
3.2 對比理解 MAC 地址和 IP 地址 (Comparing MAC Address and IP Address)
理解 MAC 地址和 IP 地址的區別與聯系對于掌握網絡通信至關重要。它們在 TCP/IP 協議棧的不同層級工作,共同完成數據從源到目的的傳輸。
特性 | MAC 地址 (物理地址) | IP 地址 (邏輯地址) |
---|---|---|
層級 | 數據鏈路層 (Layer 2) | 網絡層 (Layer 3) |
用途 | 在本地網絡 (同一廣播域) 內唯一標識一個網絡接口卡 (NIC) | 在整個互聯網或跨網絡環境中唯一標識一臺主機或路由器接口 |
作用范圍 | 本地局域網 (LAN),不跨越路由器 | 全局 (公網 IP) 或 跨網絡 (私網 IP 需經 NAT) |
地址類型 | 硬件地址 (通常固化在網卡 ROM 中) | 邏輯地址 (軟件配置,可手動設置或通過 DHCP 動態獲取) |
格式 | 48 位,通常表示為 6 字節十六進制數 | 32 位 (IPv4) 或 128 位 (IPv6),通常表示為點分十進制等 |
分配/管理 | IEEE 分配 OUI 給制造商,制造商分配后半部分 | IANA/RIR/ISP 分配公網地址段,網絡管理員分配內部地址 |
變化性 | 通常固定不變 (與硬件綁定),但可被軟件修改/偽造 | 可以改變 (主機移動到不同網絡時,IP 地址通常會改變) |
誰主要使用 | 交換機 (Switch) - 根據目的 MAC 地址在本地 LAN 內轉發幀 | 路由器 (Router) - 根據目的 IP 地址在不同網絡間轉發數據包 |
數據傳輸中 | 逐跳改變 (Hop-by-Hop) - 每經過一個路由器,源/目的 MAC 地址都會更新為當前跳發送者和接收者的 MAC 地址 | 端到端不變 (End-to-End) - 源 IP 和目的 IP 地址在整個傳輸過程中通常保持不變 (NAT 除外) |
簡單類比:
- IP 地址 就像你的 家庭住址(例如:XX 市 XX 區 XX 路 XX 號)。這個地址用于跨城市、跨區域的長途通信,標識你的最終目的地,需要郵政系統(相當于路由器)來規劃路線。
- MAC 地址 就像你的 身份證號碼 或者你家門口的 門牌號。當快遞員(相當于數據幀)到達你所在的小區或樓棟(相當于本地網絡/子網)時,他需要根據這個更具體的本地標識(門牌號/身份證)找到你本人(具體的網卡)。在一個小區內部(局域網內)找人,可能直接看門牌號就夠了,不需要寫完整的家庭住址。