第 6 章 通訊協定 TCP
TCP/IP 協定組
埠號
TCP 的特性 資料確認與重送 流量控制 連線導向 若目的端未收到某一部份資料, 來源端便可利用重送的機制, 重新傳送該資料。 能視情況調整資料傳輸的速度。 連線導向 利用 TCP 傳輸資料時, 必須先建立 TCP 連線, 彼此協調必要的參數。
圖 12-4 資料流傳送
圖 12-5 送出緩衝器與接收緩器
圖 12-6 TCP 分段
TCP 傳送機制 確認與重送 Sliding Window Send / Receive Window Window Size 與流量控制 以 Byte 為處理單位 雙向傳輸
確認與重送機制 (1) 確認封包已送達
確認與重送機制 (2) 得知封包未送達則重送
Sliding Window 機制 (1) 一開始傳送時, 來源端的 Sliding Window ( 將看得見的 3 個封包送出 )
Sliding Window 機制 (2) 收到目的端回應的 ACK1 後, Sliding Window 便將 Packet 1標示為『完成』
Sliding Window 機制 (3) Sliding Window 往右滑動一格, 再將新進入的 Packet 4 送出
Sliding Window 機制 (4) Sliding Window 會隨著收到的 ACK 封包變化
Send / Receive Window 機制 TCP 來源端的 Sliding Window 稱為 Send Window ( 運作原理先前已說過 )。 TCP 目的端的 Sliding Window 稱為 Receive Window。(用來記錄連續收到的封包與沒有連續收到的封包)
Receive Window 機制 (1) 傳送一開始時, 目的端的 Sliding Window ( 即 Receive Window )
Receive Window 機制 (2) 若目的端先收到 Packet 3, 則只將其標示為『收到』, 而不送出 ACK, 也不移動 Receive Window
Receive Window 機制 (3) 收到最左邊的 Packet 1 後, 送出 ACK 1, 並將 Receive Window 右移一格
Receive Window 機制 (4) 收到 Packet 2 後, 送出 ACK 2 與 ACK 3, 並將 Receive Window 右移二格
Receive Window 機制 (5) Send/Receive Window 的變化情形
Window Size 與流量控制機制 靠 Sliding Window 的大小來調整流量。 Window Size 是由目的端決定。 藉由 ACK 封包, 通知來源端調整傳送封包的速度。
以 Byte 為處理單位機制 (1) 將 TCP 載送的資料視為一個個 Byte 串連而成的 Bytes Stream。並利用序號 (Sequence Number) 來識別資料。
以 Byte 為處理單位機制 (2) ↑ Packet 1、2、3 的序號 ↑ 序號與封包之間的關係
以 Byte 為處理單位機制 (3) ACK 1、2、3 的回應序號
以 Byte 為處理單位機制 (4) 以 Byte 為單位定義 Send Window 的邊界:
以 Byte 為處理單位機制 (5) 以 Byte 為單位定義 Receive Window 邊界:
雙向傳輸機制 (1) 將 TCP 連線想像成由兩條管道所構成的雙向傳輸:
雙向傳輸機制 (2)
TCP 連線 – 連線定義 (1) 由連線兩端的 IP 位址與連接埠編號所定義:
TCP 連線 – 連線定義 (2) B 伺服器可和同一用戶端的不同連接埠建立多條連線, 或是和不同的用戶端同時建立連線
TCP 連線 – 建立連線 在建立連線時, 必須交換以下資訊: 雙方的 Initial Sequence Number。 雙方的 Window Size。 雙方支援的 TCP 選擇性功能。 建立連線的過程稱為『Handshaking』
建立連線 ( Handshaking ) 3 步驟
三路交握
TCP 連線 – 中止連線 經由特定的連線中止步驟, 才能將連線所用的資源 (連接埠、記憶體等等) 釋放出來。 雙方都可以主動提出中止連線的要求。
中止連線 4 步驟
TCP 封包格式 將 TCP 封包交付給 IP (Network 層的協定), 成為 IP Payload:
TCP 表頭
TCP 的運作
封裝及解封裝
多工及解多工
Source Port (來源連接埠編號) 長度為 2 Bytes, 記錄來源端上層應用程式所用的 TCP 連接埠編號。
Destination Port (目的連接埠編號) 長度為 2 Bytes, 記錄目的端上層應用程式所用的 TCP 連接埠編號。
Sequence Number (序號) 長度為 4 Bytes。 記錄 TCP 資料的第 1 Byte, 在『來源端→目的端』傳輸管道 Bytes Stream 中的編號。
Acknowledge Number (回應號碼) 長度為 4 Bytes。 記錄『來源端←目的端』傳輸管道中, 已收到連續性資料在『來源端←目的端』 Bytes Stream 中的編號。
Data Offset (資料長度) 長度為 4 Bits, 記錄 TCP 表頭的長度。 單位為 4 Bytes。例如此欄位值是 5, 代表 TCP 表頭的長度為 20 Bytes。
Reserved (保留) 長度為 6 Bits, 保留用途。
Flags (特殊用途位元) 長度為 6 Bits, 每個 Bit 可代表 TCP 封包的一種 Flag。共有 6 種 Flag: Urgent Acknowledge Push Reset Synchronize Finish
Window (視窗大小) 長度為 2 Bytes。 設定來源端的 Receive Window 大小, 用來控制『來源端←目的端』的流量。
在TCP,送出者窗口的大小完全由接收者窗口所控制,不過實際的窗口可能因為網路壅塞而更小。
有關滑動窗口的幾個觀念 : 1.來源端不需要將整個窗口大小的資料一 次送完。 2.窗口的大小可由目的端的要求,而增大 或減少。 3.目的端可在任何時候送出回應。
Checksum (檢查碼) 長度為 2 Bytes, 記錄錯誤檢查碼。 運作方式與 UDP 的錯誤檢查碼相同。
Urgent Pointer (緊急資料指標) 長度為 2 Bytes。 當 Urgent Flag 設為 1 時, 本欄位記錄 TCP 資料中, 屬於 Urgent 資料的最後一個 Byte。
Options 與 Padding Options 欄位長度不定, 可用來擴充 TCP 的功能。 Padding 欄位是為了讓 TCP 表頭 (包含 Options 欄位) 剛好是 4 Bytes 的倍數。
TCP 常見的選擇性功能 MSS SACK-Permitted SACK
MSS (Maximum Segment Size) 在連線建立時, 用來指定所能傳送 TCP 資料最大的長度。 預設值為 MTU 減去 IP 表頭的最小長度, 再減去 TCP 表頭的最小長度。 以乙太網路為例, MSS 預設值為 1460。
SACK-Permitted 與 SACK SACK-Permitted:在連線建立時, 雙方互相溝通是否要使用 SACK 功能。
擷取建立 TCP 連線時的封包 第一步驟的封包 (1)
擷取建立 TCP 連線時的封包 第一步驟的封包 (2) 1. Browser 所用的連接埠, 屬於 Registered / Dynamic。 2. Web Server 所用的連接埠。已被解讀為 HTTP 所用的 Well-Known 連接埠。 3. 由 Browser 端系統隨機選取的 Initial Sequence Number (ISN Browser → Server)。 4. 尚未收到 Web Server 的 ISN, 所以此處為 0。 5. TCP 表頭的長度。 6. Flag 欄位, 只有 SYN Flag 設為 1。
擷取建立 TCP 連線時的封包 第一步驟的封包 (3) 7. Browser 預設的 Receive Window 大小。 8. 錯誤檢查碼。 9. 由於 Urgent Flag 未設, 所以此欄位為 0。 10.MMS 選項, 乙太網路值為 1460 Bytes。 11.TCP 特別的選項, 沒有任何功能, 可用來在選項之間補白 12.SACK-Permitted 選項, 表示 Browser 端可接受帶有 SACK 選項的 ACK 封包。
擷取建立 TCP 連線時的封包 第二步驟的封包 (1)
擷取建立 TCP 連線時的封包 第二步驟的封包 (2) 1. Web Server 所用的連接埠, 自動以 Hypertext Transfer Protocol 取代 80。 2. Browser 所用的連接埠。 3. 由 Web Server 端系統隨機選取的 Initial Sequence Number ( ISN Browser ← Server )。 4. ISN (Browser → Server) + 1。 5. TCP 表頭的長度。
擷取建立 TCP 連線時的封包 第二步驟的封包 (3) 6. Flag 欄位, ACK 與 SYN Flag 皆設為 1。 7. Web Server 預設的 Receive Window 大小。 8. 錯誤檢查碼。 9. 由於 Urgent Flag 未設, 所以此欄位為 0。 10.MMS 選項, 乙太網路值為 1460 Bytes。 11.SACK-Permitted 選項, 表示 Web Server 端可接受帶有 SACK 選項的 ACK 封包。
擷取建立 TCP 連線時的封包 第三步驟的封包 (1)
擷取建立 TCP 連線時的封包 第三步驟的封包 (2) 1. ISN ( Browser → Server ) + 1。 2. ISN ( Browser ← Server ) + 1。 3. TCP 表頭的長度。由於未使用任何選項, 因此長度為 20 Bytes。 4. Flag 欄位, 只有 ACK Flag 皆設為 1。 5. Browser 的 Receive Window 大小。
擷取傳送資料時的 TCP 封包 HTTP GET (1)
擷取傳送資料時的 TCP 封包 HTTP GET (2) 1. 連線建立完畢後, Browser → Server 的 Sequence Number 仍停留在 ISN (Browser → Server) + 1。 2. 連線建立完畢後, Browser ← Server 的 Sequence Number 仍停留在 ISN (Browser ← Server) + 1。 3. 未使用任何選項, 因此表頭長度為 20 Bytes。 4. Flag 欄位, ACK 與 Push Flag 皆設為 1。
擷取傳送資料時的 TCP 封包 HTTP Response 1. 連線建立完畢後, Browser ← Server 的 Sequence Number 仍停留在 ISN (Browser ← Server) + 1。 2. ISN (Browser → Server) + 1 + 345。