TCP 校驗和計算


傳輸控制協議 (TCP) 校驗和是一種用於檢測 TCP 資料包中錯誤的方法。校驗和的計算方法是將 TCP 標頭和資料中的所有欄位的二進位制值視為一個大整數,然後對該整數執行按位取反操作。

要計算 TCP 校驗和,需要執行以下步驟:

  • 將 TCP 標頭中的校驗和欄位設定為零。

  • 連線源和目標 IP 地址、保留欄位、協議欄位(對於 TCP 設定為 6)、TCP 長度和 TCP 資料的二進位制值。

  • 將得到的二進位制值視為一個大整數,並對其進行按位取反操作。

  • 然後將得到的值轉換為 16 位二進位制,並將其放置在 TCP 標頭的校驗和欄位中。

以下是一個 TCP 校驗和可能如何計算的示例:

假設源 IP 地址為 192.168.0.1,目標 IP 地址為 192.168.0.2,保留欄位為 0,協議欄位為 TCP 的 6,TCP 長度為 40 位元組,TCP 資料為“Hello, World!”。

  • 將 TCP 標頭中的校驗和欄位設定為零。

  • 源和目標 IP 地址的二進位制值(分別為 11000000 10101000 00000000 00000001 和 11000000 10101000 00000000 00000010)、保留欄位 (0000000000000000)、協議欄位 (00000110)、TCP 長度 (00011000) 和 TCP 資料 (01001000 01100101 01101100 01101100 01101111 00101100 00101111 01110111 01101111 01110010 01101100 01100100 00100001) 被連線起來。

  • 將得到的二進位制值視為一個大整數,並對其進行按位取反操作(在本例中,假設結果為 01010101 01010101)。

  • 然後將得到的值轉換為 16 位二進位制,並將其放置在 TCP 標頭的校驗和欄位中 (01010101 01010101)。

需要注意的是,校驗和是在 TCP 段上計算的,校驗和欄位是在傳送段之前計算的,並在接收段之後進行驗證。接收方再次計算校驗和,並將其與校驗和欄位進行比較。如果計算出的校驗和值與接收到的校驗和值匹配,則假定段在接收過程中沒有錯誤;否則,段將被丟棄。

這是 TCP 校驗和計算方式的基本概述。它是一種重要的技術,可以確保網路傳輸過程中資料的完整性,這對於維護安全可靠的通訊至關重要。

TCP 標頭

傳輸控制協議 (TCP) 標頭是一組包含在 TCP 段開頭的欄位。標頭包含用於控制 TCP 連線的建立、維護和終止的資訊。TCP 標頭通常為 20 位元組長,但如果包含選項,則最多可達 60 位元組。

TCP 標頭中的欄位包括:

  • 源埠 - 16 位欄位,標識段源自的源主機上的埠。

  • 目標埠 - 16 位欄位,標識段傳送到的目標主機上的埠。

  • 序列號 - 32 位欄位,標識當前段中第一個資料位元組的位元組號。

  • 確認號 - 32 位欄位,確認接收了直到此欄位中值的所有位元組。

  • 資料偏移量 - 4 位欄位,指示 TCP 標頭中 32 位字的數量。

  • 保留 - 6 位欄位,保留供將來使用。

  • 標誌 - 6 位欄位,包含各種控制標誌,包括 URG、ACK、PSH、RST、SYN 和 FIN 標誌。

  • 視窗 - 16 位欄位,指示接收視窗的大小。

  • 校驗和 - 16 位欄位,用於檢測 TCP 段中的錯誤。

  • 緊急指標 - 16 位欄位,如果設定了 URG 標誌,則指示當前段中緊急資料的最後一個位元組的位元組號。

還有一些可選欄位,例如:

  • TCP 選項 - 可變長度欄位,可用於在標頭中包含其他資訊。

源 IP 地址、源埠、目標 IP 地址和目標埠的組合形成每個 TCP 連線的唯一識別符號,稱為套接字。序列號和確認號以及視窗和標誌欄位用於控制 TCP 連線期間的資料流。

TCP 使用標頭中的欄位提供可靠的面向連線的通訊服務。它保證傳送的資料被接收,並且按正確的順序接收。這就是 TCP 通常用於需要可靠資料傳輸的應用程式(如檔案傳輸和電子郵件)的原因。

示例

TCP 校驗和的計算方法是將 TCP 標頭和資料中的所有欄位的二進位制值視為一個大整數,然後對該整數執行按位取反操作。以下是如何計算 TCP 校驗和的幾個示例:

示例 1

假設源 IP 地址為 192.168.1.1,目標 IP 地址為 192.168.1.2,保留欄位為 0,協議欄位為 TCP 的 6,TCP 長度為 40 位元組,TCP 資料為“Hello, World!”。

  • 源 IP 地址 (11000000 10101000 00000001 00000001)、目標 IP 地址 (11000000 10101000 00000001 00000010)、保留欄位 (0000000000000000)、協議欄位 (00000110)、TCP 長度 (00011000) 和 TCP 資料 (01001000 01100101 01101100 01101100 01101111 00101100 00101111 01110111 01101111 01110010 01101100 01100100 00100001) 的二進位制值被連線起來。

  • 將得到的二進位制值視為一個大整數,並對其進行按位取反操作。

  • 假設步驟 2 的結果為 10101010 10101010(示例編號)

  • 然後將得到的值轉換為 16 位二進位制,並將其放置在 TCP 標頭的校驗和欄位中 (10101010 10101010)。

示例 2

假設源 IP 地址為 172.16.1.1,目標 IP 地址為 172.16.1.2,保留欄位為 0,協議欄位為 TCP 的 6,TCP 長度為 100 位元組,TCP 資料為“TCP checksum calculation example.”。

  • 源 IP 地址 (10101100 00010000 00000001 00000001)、目標 IP 地址 (10101100 00010000 00000001 00000010)、保留欄位 (0000000000000000)、協議欄位 (00000110)、TCP 長度 (01100100) 和 TCP 資料 (01010100 01100011 01110000 01100011 01100011 01100101 01110011 01110100 01101001 01101110 01101011 01101001 01101110 01101111 01101110 01101001 01101110 01101011 01101001 01101110 01101011 01101001 01101110 01101011 01101001) 的二進位制值被連線起來。

  • 將得到的二進位制值視為一個大整數,並對其進行按位取反操作。

  • 假設步驟 2 的結果為 11110011 11110011(示例編號)

  • 然後將得到的值轉換為 16 位二進位制,並將其放置在 TCP 標頭的校驗和欄位中 (11110011 11110011)。

值得一提的是,以上示例僅用於說明目的,可能不反映實際結果,因為這取決於資料包中的實際資料。此外,這些是校驗和計算方式的示例,而不是實際的資料包。

更新於: 2023 年 2 月 8 日

15K+ 次瀏覽

開啟你的 職業生涯

透過完成課程獲得認證

開始學習
廣告