TCP/IP 封包解析

紀錄 2026/04/08 計算機網路課程。


TCP/IP 封包格式

TCP/IP 封包的 Header 預設就是 20 個 Byte。

TCP 格式:

image

Image Source:https://www.geeksforgeeks.org/computer-networks/tcp-ip-packet-format/

  • Source Port、Destination Port 各佔 2 Byte(16 bit),通常題目只要求到這邊就好。
  • Sequence Numbers 佔 4 Byte(32 bit)。

IP 格式:

image

Image Source:https://www.geeksforgeeks.org/computer-networks/tcp-ip-packet-format/

  • Version 佔 4 bit(1 個 16 進位數字)。
  • IHL(Internet Header Length)也佔 4 個 bit。
  • Type-of-Service 佔 1 個 byte。
  • Total Length 佔 2 byte。
  • Flags 佔 3 byte(填入 1 個 16 進位數字)。
  • Fragmentation offset 佔 13 個 byte(3 個 16 進位數字)。

範例題目

與課上講義的範例題目不同,我自己重寫一個新的題目:

1
2
3
4
5
45 00 00 28 AB CD 40 00 40 06 C1 44 C0 A8 01 0A

08 08 04 04 01 BB D4 31 00 00 00 01 00 00 00 00

50 02 20 00 A1 B2 00 00 ....

以上是 IP header + TCP header 之封包資料內容,試回答下列問題:

(1) Source IP address 為何?
(2) Destination IP address 為何?
(3) IP header 中的 checksum 為何?
(4) 這個 checksum 正確嗎?
(5) Source port number 為何?
(6) Destination port number 為何?
(7) 該封包是什麼方向發送?(Client -> Server / Server -> Client)是什麼服務?

解題方法:

由於 Internet Protocol Stack 五層的封包是由上往下封裝起來的,因此要先看到 IP 封包的格式圖,從 45 00... 開始,填滿整張表:

32_bits_2

填完後,從 01 BB ... 往 TCP 的封包格式圖填入:

32_bits_1

都填完以後,就會發現我們已經得知了以下這幾點資訊:

  1. Source / Destination 的 IP 位址
  2. Source / Destination 的 Port Number
  3. IP 的 Header Checksum

把十六進位轉換成十進位後就是答案了:

  1. Source IP : 192.168.1.10
  2. Destination IP : 8.8.4.4
  3. Checksum : (C144)16(C144)_{16}
  4. Source Port : 443(HTTPS 的 Port Number)
  5. Destination Port : 54321

由於 Source Port 是 443,由 HTTPS 的服務做發送封包的行為,因此會是一個 Server -> Client 的方向。(註:若兩個 Port Number 若非常見號碼,則可能需要從 TCP Header 去看)

最後就是驗證 checksum 是否正確了,做法如下:

  1. 在 IP 封包格式當中,除了 Checksum 以外的十六進位都做相加。
  2. 全部加起來的結果再與 checksum 做一補數加法,判斷是否 = FFFF,若等於就表示 checksum 正確,否則錯誤。

以此例來說,具體算起來是這樣:

  1. 4500 + 0028 = 4528
  2. 4528 + ABCD = F0F5
  3. F0F5 + 4000 = 130F5 → 進位加回尾數:30F5 + 1 = 30F6
  4. 30F6 + 4006 = 70FC
  5. 70FC + C0A8 = 131A4 → 進位加回尾數:31A4 + 1 = 31A5
  6. 31A5 + 010A = 32AF
  7. 32AF + 0808 = 3AB7
  8. 3AB7 + 0404 = 3EBB

總和為 3EBB,接著加上封包內的 Checksum 值 C1443EBB + C144 = FFFF

結果為 FFFF,因此 Checksum 是正確的。

另一個算法是 F - B = 4F - B = 4F - E = 1F - 3 = C,也可以得到 C144,其實就是同樣的原理。