1. TCP 報文首部
1.1 源端口和目標端口
每個TCP段都包含源端和目的端的端口號,用于尋找發端和收端應用進程。這兩個值加上IP首部中的源端IP地址和目的端IP地址唯一確定一個TCP連接
端口號分類
- 熟知端口號(well-known port)
- 已登記的端口(registered port)
- 臨時端口號(ephemeral port)
1.1.1 熟知端口號(well-known port)
熟知端口號由專門的機構由 IANA 分配和控制,范圍為 0~1023。為了能讓客戶端能隨時找到自己,服務端程序的端口必須要是固定的。很多熟知端口號已經被用就分配給了特定的應用,比如 HTTP 使用 80端口,HTTPS 使用 443 端口,ssh 使用 22 端口。
1.1.2 已登記的端口(registered port)
已登記的端口不受 IANA 控制,不過由 IANA 登記并提供它們的使用情況清單。它的范圍為 1024~49151。
1.1.3 臨時端口號(ephemeral port)
如果應用程序沒有調用 bind() 函數將 socket 綁定到特定的端口上,那么 TCP 和 UDP 會為該 socket 分配一個唯一的臨時端口。IANA 將 49152~65535 范圍的端口稱為臨時端口(ephemeral port)或動態端口(dynamic port),也稱為私有端口(private port),這些端口可供本地應用程序臨時分配端口使用。
1.2 序列號
TCP 是面向字節流的協議,通過 TCP 傳輸的字節流的每個字節都分配了序列號,序列號(Sequence number)指的是本報文段第一個字節的序列號
序列號用來標識從T C P發端向T C P收端發送的數據字節流,它表示在這個報文段中的的第一
個數據字節。如果將字節流看作在兩個應用程序間的單向流動,則 T C P用序號對每個字節進
行計數。序號是32 bit的無符號數,序號到達23 2-1后又從0開始。
1.2.1 初始序列號(Initial Sequence Number, ISN)
在建立連接之初,通信雙方都會各自選擇一個序列號,稱之為初始序列號。在建立連接時,通信雙方通過 SYN 報文交換彼此的 ISN
當建立一個新的連接時, S Y N標志變1。序號字段包含由這個主機選擇的該連接的初始序號I S N(Initial Sequence Number)。該主機要發送數據的第一個字節序號為這個 I S N加1,因為
S Y N標志消耗了一個序號
1.3 確認號
TCP 使用確認號(Acknowledgment number, ACK)來告知對方下一個期望接收的序列號,小于此確認號的所有字節都已經收到。
既然每個傳輸的字節都被計數,確認序號包含發送確認的一端所期望收到的下一個序號。因此,確認序號應當是上次已成功收到數據字節序號加 1。只有A C K標志(下面介紹)為 1時確認序號字段才有效。
1.4 TCP Flags
TCP 有很多種標記,有些用來發起連接同步初始序列號,有些用來確認數據包,還有些用來結束連接。TCP 定義了一個 8 位的字段用來表示 flags,大部分都只用到了后 6 個
- U R G 緊急指針(u rgent pointer)有效(見2 0 . 8節)。
- A C K 確認序號有效。
- P S H 接收方應該盡快將這個報文段交給應用層。
- R S T 重建連接。
- S Y N 同步序號用來發起一個連接。這個標志和下一個標志將在第 1 8章介紹。
- F I N 發端完成發送任務。
1.5 窗口大小
T C P的流量控制由連接的每一端通過聲明的窗口大小來提供。窗口大小為字節數,起始
于確認序號字段指明的值,這個值是接收端正期望接收的字節。窗口大小是一個 16 bit字段,
因而窗口大小最大為 6 5 5 3 5字節。
TCP 協議引入了「TCP 窗口縮放」選項 作為窗口縮放的比例因子,比例因子值的范圍是 0 ~ 14,其中最小值 0 表示不縮放,最大值 14。比例因子可以將窗口擴大到原來的 2 的 n 次方,比如窗口大小縮放前為 1050,縮放因子為 7,則真正的窗口大小為 1050 * 128 = 134400。窗口縮放值在三次握手的時候指定,如果抓包的時候沒有抓到 SYN 包,wireshark 是不知道真正的窗口縮放值是多少的。
1.6 緊急指針
只有當U R G標志置1時緊急指針才有效。緊急指針是一個正的偏移量,和序號字段中的值
相加表示緊急數據最后一個字節的序號。 T C P的緊急方式是發送端向另一端發送緊急數據的
一種方式。
1.7 檢驗和
檢驗和覆蓋了整個的T C P報文段:T C P首部和T C P數據。這是一個強制性的字段,一定是
由發端計算和存儲,并由收端進行驗證。
1.8 可選項
常用的選項有以下幾個:
-
MSS:最大段大小選項,是 TCP 允許的從對方接收的最大報文段
最常見的可選字段是最長報文大小,又稱為 MSS (Maximum Segment Size)。每個連接方通常都在通信的第一個報文段(為建立連接而設置 S Y N標志的那個段)中指明這個選項。它指明本端所能接收的最大長度的報文段。 -
SACK:選擇確認選項
-
Window Scale:窗口縮放選項
參考資料
《深入理解 TCP 協議:從原理到實戰》