網絡原理-TCP/IP

網絡原理學習筆記:TCP/IP 核心概念

本文是我在學習網絡原理時整理的筆記,主要涵蓋傳輸層、網絡層和數據鏈路層的核心協議和概念,特別是 TCP, UDP, IP, 和以太網。

一、傳輸層 (Transport Layer)

傳輸層負責提供端到端(進程到進程)的數據傳輸服務。它建立在網絡層之上,為應用層提供通信支持。主要協議有 UDP 和 TCP。

1.1 UDP協議 (User Datagram Protocol)

UDP 是一種簡單的、面向數據報的傳輸層協議。

UDP 報文段格式 (UDP Segment Format):

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):

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 - 建立連接):
      1. 客戶端 -> 服務器: 發送 SYN 包 (標志位 SYN=1, seq=x) 請求建立連接。客戶端進入 SYN_SENT 狀態。
      2. 服務器 -> 客戶端: 收到請求后,如果同意連接,則回復 SYN-ACK 包 (標志位 SYN=1, ACK=1, seq=y, ack=x+1)。服務器進入 SYN_RCVD 狀態。
      3. 客戶端 -> 服務器: 收到 SYN-ACK 包后,回復 ACK 包 (標志位 ACK=1, seq=x+1, ack=y+1)。客戶端進入 ESTABLISHED 狀態。服務器收到此 ACK 后也進入 ESTABLISHED 狀態。連接建立完成。
      • 目的: 確認雙方的發送和接收能力都正常。
    • 四次揮手 (Four-Way Handshake - 斷開連接):
      1. 主動方 -> 被動方: 數據發送完畢后,發送 FIN 包 (標志位 FIN=1, seq=u) 請求關閉連接。主動方進入 FIN_WAIT_1 狀態。
      2. 被動方 -> 主動方: 收到 FIN 后,回復 ACK 包 (標志位 ACK=1, ack=u+1, seq=v)。被動方進入 CLOSE_WAIT 狀態。主動方收到此 ACK 后進入 FIN_WAIT_2 狀態。(此時被動方可能還有數據要發送)
      3. 被動方 -> 主動方: 當被動方也準備好關閉連接(應用層調用 close),發送 FIN 包 (標志位 FIN=1, ACK=1, seq=w, ack=u+1)。被動方進入 LAST_ACK 狀態。
      4. 主動方 -> 被動方: 收到被動方的 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

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): 將數據包從路由器的輸入端口移動到合適的輸出端口。

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 AND 255.255.255.0 = 192.168.1.0
    • 在這個例子中,前 24 位 (192.168.1) 是網絡部分,后 8 位是主機部分。
    • 該子網可容納的主機數 = 2^(主機位數) - 2 = 2^8 - 2 = 254 臺。(減去全 0 的網絡地址和全 1 的廣播地址)。
  • CIDR (Classless Inter-Domain Routing - 無類別域間路由):
    • 使用更靈活的表示法:在 IP 地址后面加上 / 和網絡部分的位數(即子網掩碼中 1 的個數)。
    • 例如,192.168.1.0/24 表示網絡部分是前 24 位,等同于子網掩碼 255.255.255.0
    • CIDR 取代了過去 A/B/C 類地址的劃分方式,使得 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:A508-00-27-7D-99-A50800.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 地址 就像你的 身份證號碼 或者你家門口的 門牌號。當快遞員(相當于數據幀)到達你所在的小區或樓棟(相當于本地網絡/子網)時,他需要根據這個更具體的本地標識(門牌號/身份證)找到你本人(具體的網卡)。在一個小區內部(局域網內)找人,可能直接看門牌號就夠了,不需要寫完整的家庭住址。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/bicheng/75141.shtml
繁體地址,請注明出處:http://hk.pswp.cn/bicheng/75141.shtml
英文地址,請注明出處:http://en.pswp.cn/bicheng/75141.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

EF Core 執行原生SQL語句

文章目錄 前言一、執行查詢&#xff08;返回數據&#xff09;1&#xff09; 使用 FromSqlRaw或 FromSqlInterpolated 方法&#xff0c;適用于 DbSet<T>&#xff0c;返回實體集合。2&#xff09;結合 LINQ 查詢3&#xff09;執行任意原生SQL查詢語句&#xff08;使用ADO.N…

Unity LOD Group動態精度切換算法(基于視錐+運動速度)技術詳解

一、動態LOD技術背景與核心挑戰 1. 傳統LOD系統的局限 靜態閾值切換&#xff1a;僅基于距離的切換在動態場景中表現不佳 視覺突變&#xff1a;快速移動時LOD層級跳變明顯 性能浪費&#xff1a;靜態算法無法適應復雜場景變化 對惹&#xff0c;這里有一個游戲開發交流小組&…

MyBatis復雜查詢——一對一、一對多

目錄 &#xff08;一&#xff09;復雜查詢&#xff1a;1對1關系 【任務】數據庫里有學生表(student)和學生證信息表(student_card)&#xff0c;表結構如下所示&#xff0c;要求使用MyBatis框架查詢所有的學生信息以及每位學生的學生證信息 解決方案1&#xff1a;關聯查詢實現…

【服務端】使用conda虛擬環境部署Django項目

寫在開頭 為了與客戶端的Deep search配合&#xff0c;需要整一個后臺管理來保存和管理deep search的數據資料。選擇前端框架Vue-Vben-Admin Django后臺服務來實現這個項目。 廢話結束&#xff0c;從零開始。。。。 一、環境搭建 1. 安裝 Anaconda 下載 Anaconda&#xff1…

Python爬蟲-爬取大麥網演出詳情頁面數據

前言 本文是該專欄的第50篇,后面會持續分享python爬蟲干貨知識,記得關注。 本文,筆者以大麥網平臺為例。基于Python,實現獲取演出詳情頁面的演出信息。 廢話不多說,具體實現思路和詳細邏輯,筆者將在正文結合完整代碼進行詳細介紹。接下來,跟著筆者直接往下看正文詳細內…

多onnx模型導出合并調研(文本檢測+方向分類+文本識別)

??主頁:吾名招財 ??簡介:工科學碩,研究方向機器視覺,愛好較廣泛… ???簽名:面朝大海,春暖花開! 多onnx模型合并導出調研(文本檢測+方向分類+文本識別) 引言1,嘗試合并兩個模型(文本方向分類+文本識別模型)(并行合并)(1)文本方向分類(2)文本識別模型(…

Flink介紹——實時計算核心論文之S4論文詳解

引入 在上一篇我們對Flink的發展歷史有了全局的了解&#xff0c;下面我們會通讀幾篇分布式實時處理相關的重要論文&#xff0c;從S4到Storm&#xff0c;再從MillWheel到Dataflow&#xff0c;最后到Flink。 通過深入梳理分布式實時處理技術的發展脈絡&#xff0c;了解這些年技…

【商城實戰(97)】ELK日志管理系統的全面應用

【商城實戰】專欄重磅來襲!這是一份專為開發者與電商從業者打造的超詳細指南。從項目基礎搭建,運用 uniapp、Element Plus、SpringBoot 搭建商城框架,到用戶、商品、訂單等核心模塊開發,再到性能優化、安全加固、多端適配,乃至運營推廣策略,102 章內容層層遞進。無論是想…

Linux系統-ls命令

一、ls命令的定義 Linux ls命令&#xff08;英文全拼&#xff1a;list directory contents&#xff09;用于顯示指定工作目錄下之內容&#xff08;列出目前工作目錄所含的文件及子目錄)。 二、ls命令的語法 ls [選項] [目錄或文件名] ls [-alrtAFR] [name...] 三、參數[選項…

游戲被外掛攻破?金融數據遭篡改?AI反作弊系統實戰方案(代碼+詳細步驟)

一、背景與需求分析 隨著游戲行業與金融領域的數字化進程加速,作弊行為(如游戲外掛、金融數據篡改)日益復雜化。傳統基于規則的防御手段已難以應對新型攻擊,而AI技術通過動態行為分析、異常檢測等能力,為安全領域提供了革命性解決方案。本文以游戲反作弊系統和金融數據安…

Node.js 路由 - 初識 Express 中的路由

目錄 Node.js 路由 - 初識 Express 中的路由 1. 什么是路由&#xff1f; 2. 安裝 Express 3. 創建 server.js 4. 運行服務器 5. 測試路由 5.1 訪問主頁 5.2 訪問用戶路由 5.3 發送 POST 請求 6. 結語 1. 什么是路由&#xff1f; 路由&#xff08;Routing&#xff09…

面經-項目

項目 項目(重點)問題1:描述在網頁中題目點擊提交后到題目結果出現的一系列后臺反應【1】如何獲取到用戶提交的代碼的?【2】_1. 題目細節都有哪些?【2】_2. 題目信息怎么存儲的?【3】負載均衡算法的實現?【4】oj_server怎么連接對應的compile_server(編譯主機)的?【5】oj_…

網絡基本概念認識(2)

目錄 前言&#xff1a; 局域網協議 MAC/IP地址 Socket編程 TCP/UDP 網絡字節序 前言&#xff1a; 本文同樣作為博主的二刷網絡課程的文章&#xff0c;主要涵蓋的主題還是網絡基本概念的認識&#xff0c;從上一篇文章遺漏的點加上引入的一些知識點共同組成當前的知識點。…

Kafka中的消息是如何存儲的?

大家好&#xff0c;我是鋒哥。今天分享關于【Kafka中的消息是如何存儲的&#xff1f;】面試題。希望對大家有幫助&#xff1b; 1000道 互聯網大廠Java工程師 精選面試題-Java資源分享網 在 Kafka 中&#xff0c;消息是通過 日志&#xff08;Log&#xff09; 的方式進行存儲的。…

openEuler24.03 LTS下安裝ZooKeeper集群

目錄 前提條件 ZooKeeper集群規劃 下載ZooKeeper 解壓 配置環境變量 配置ZooKeeper 配置zoo.cfg 配置myid 分發到其他機器 修改其他機器myid 啟動集群 關閉集群 集群啟停腳本 前提條件 準備3臺Linux機器&#xff0c;并安裝好Java8 ZooKeeper集群規劃 node2node3…

Python 實現機器學習小項目實戰教程*

markdown 復制 Python 實現機器學習小項目實戰教程 本教程將通過一個完整的機器學習項目案例&#xff0c;從數據預處理到模型部署&#xff0c;幫助初學者快速掌握機器學習核心流程。項目以經典的鳶尾花分類為例&#xff0c;使用 Scikit-learn 庫實現。 1. 項目概述 目標 構…

rust學習筆記21-閉包

在 Rust 中&#xff0c;閉包&#xff08;Closures&#xff09; 是一種可以捕獲其環境中的變量的匿名函數。它們非常靈活&#xff0c;既可以作為普通函數使用&#xff0c;也可以捕獲和操作定義它們的作用域中的變量。閉包是 Rust 中處理短小邏輯代碼塊的強大工具&#xff0c;特別…

linux實現rsync+sersync實時數據備份

1.概述 rsync(Remote Sync) 是一個Unix/linux系統下的文件同步和傳輸工具 2.端口和運行模式 tcp/873 采用C/S模式&#xff08;客戶端/服務器模式&#xff09; 3.特點 可以鏡像保存整個目錄和文件第一次全量備份(備份全部的文件),之后是增量備份(只備份變化的文件) 4. 數…

【第30節】MFC編程:ListCtrl控件和TreeCtrl控件

目錄 引言 一、高級控件ListCtrl 二、高級控件TreeCtrl 三、Shell控件 四、CImageList 五、綜合代碼示例 引言 在MFC編程里&#xff0c;高級控件能大幅提升應用程序的交互性與功能性。接下來&#xff0c;咱們會詳細講講ListCtrl和TreeCtrl這兩個高級控件。不僅會介紹它們…

為什么 ThreadLocalMap 的 key 是弱引用 value是強引用

問題一&#xff1a;為什么 ThreadLocalMap 的 key 是弱引用&#xff1f; 【假設 Entry 的 key 是對 ThreadLocal 對象的強引用】&#xff1a;這個 Entry 又持有 ThreadLocal 對象和 value 對象的強引用。如果在其他地方都沒有對這個 ThreadLocla 對象的引用了、然后在使用 Thr…