1. 程式人生 > >TCP 包頭詳解

TCP 包頭詳解

拒絕 頭部 ext 出現 miss segment offset size com

TCP(Transmission Control Protocol 傳輸控制協議)是一種面向連接的、可靠的、基於字節流的傳輸層通信協議。當應用層向TCP層發送用於網間傳輸的、用8位字節表示的數據流,TCP則把數據流分割成適當長度的報文段,最大傳輸段大小(MSS)通常受該計算機連接的網絡的數據鏈路層的最大傳送單元(MTU)限制。之後TCP把數據包傳給IP層,由它來通過網絡將包傳送給接收端實體的TCP層。

技術分享圖片
src port:源端口,2個字節,是一個大於1023的16位數字,由基於TCP應用程序的用戶進程隨機選擇

dst port:目的端口,2個字節,指明接收者所用的端口號,一般由應用程序來指定

Sequence number

:順序號,4個字節,用來標識從 TCP 源端向 TCP 目的端發送的數據字節流,它表示在這個報文段中的第一個數據字節的順序號。如果將字節流看作在兩個應用程序間的單向流動,則 TCP 用順序號對每個字節進行計數。序號是 32bit 的無符號數,序號到達 (2^32) - 1 後又從 0 開始。當建立一個新的連接時, SYN 標誌變 1 ,順序號字段包含由這個主機選擇的該連接的初始順序號 ISN ( Initial Sequence Number )

Acknowledgement number:確認號,4個字節,包含發送確認的一端所期望收到的下一個順序號。因此,確認序號應當是上次已成功收到數據字節順序號加 1 。只有 ACK 標誌為 1 時確認序號字段才有效

Offset:報頭長度,4位,給出報頭中 32bit 字的數目。需要這個值是因為任選字段的長度是可變的。這個字段占 4bit , 即TCP 最多有 60(15*4) 字節的首部

Resrvd:保留區域,6位,保留給將來使用,目前必須置為 0

Control Flags(6位)控制位包括

**URG**:為 1 表示緊急指針有效,為 0 則忽略緊急指針值

**ACK**:為 1 表示確認號有效,為 0 表示報文中不包含確認信息,忽略確認號字段

**PSH**:為 1 表示是帶有 PUSH 標誌的數據,指示接收方應該盡快將這個報文段交給應用層而不用等待緩沖區裝滿

**RST**:用於復位由於主機崩潰或其他原因而出現錯誤的連接。它還可以用於拒絕非法的報文段和拒絕連接請求。一般情況下,如果收到一個 RST 為 1 的報文,那麽一定發生了某些問題

**SYN**:同步序號,為 1 表示連接請求,用於建立連接和使順序號同步( synchronize )

**FIN**:用於釋放連接,為 1 表示發送方已經沒有數據發送了,即關閉本方數據流

Window Size:窗口大小,2個字節,表示從確認號開始,本報文的源方可以接收的字節數,即源方接收窗口大小。窗口大小是一個 16bit 字段,因而窗口大小最大為 65535(2^16 - 1)

Checksum:校驗和,2個字節,對整個的 TCP 報文段(包括 TCP 頭部和 TCP 數據),以 16 位字進行計算所得。這是一個強制性的字段,要求由發送端計算和存儲,並由接收端進行驗證

Urgent Pointer:緊急指針,2個字節,是一個正的偏移量,和順序號字段中的值相加表示緊急數據最後一個字節的序號。 TCP 的緊急方式是發送端向另一端發送緊急數據的一種方式。 只有當URG 標誌置 1 時緊急指針才有效

Option and Pad:選項和填充,n*4字節,常見的可選字段是最長報文大小 MSS(Maximum Segment Size) 。每個連接方通常都在通信的第一個報文段(為建立連接而設置 SYN 標誌的那個段)中指明這個選項,它指明本端所能接收的最大長度的報文段。選項長度不一定是 32 位字的整數倍,所以要加填充位,使得報頭長度成為整字數

Data:數據,不定長度,為上層協議封裝好的數據

TCP 包頭詳解