TCP協議之包頭詳解

TCP 協議是一個很是重要的協議,並且很是複雜,在使用中也能夠說是咱們最多見的報文之一了,可是使用了這麼久,仍是有不少人不是很瞭解,下面這篇文章給你們介紹下TCP包頭,來幫助你們更好的理解TCP。緩存

先大概介紹下TCP協議:網絡

TCP    TRANSMISSION CONTROL PROTOCOL       即傳輸控制協議

在網路中,TCP協議處於第四層傳輸層 ,在它下面還有物理層(光纜,光纖,無線信道等)數據鏈路層(交換層面),網絡層,它是面向鏈接的,可靠的,基於字節流的通訊協議,當應用層向TCP層發送用於網間傳輸的、用8位字節表示的數據流,TCP則把數據流分割成適當長度的報文段,最大傳輸段大小(MSS)一般受該計算機鏈接的網絡的數據鏈路層的最大傳送單元(MTU)限制。以後TCP把數據包傳給IP層,由它來經過網絡將包傳送給接收端實體的TCP層。
下圖TCP的協議的首部,TCP數據以及它們在網絡層被封裝後的示意圖,這裏重點講首部部分.TCP協議之包頭詳解ide

首部固定部分各字段意義以下:性能

源端口、目標端口:計算機上的進程要和其餘進程通訊是要經過計算機端口的,而一個計算機端口某個時刻只能被一個進程佔用,因此經過指定源端口和目標端口,就能夠知道是哪兩個進程須要通訊。源端口、目標端口是用16位表示的,可推算計算機的端口個數爲2^16個,即65536指針

序列號:表示本報文段所發送數據的第一個字節的編號。在TCP鏈接中所傳送的字節流的每個字節都會按順序編號。因爲序列號由32位表示,因此每2^32個字節,就會出現序列號迴繞,再次從0 開始

確認號:
表示接收方指望收到發送方下一個報文段的第一個字節數據的編號。也就是告訴發送方:我但願你(指發送方)下次發送的數據的第一個字節數據的編號爲此確認號code

數據偏移:表示TCP報文段的首部長度,共4位,因爲TCP首部包含一個長度可變的選項部分,須要指定這個TCP報文段到底有多長。它指出 TCP 報文段的數據起始處距離 TCP 報文段的起始處有多遠。該字段的單位是32位(即4個字節爲計算單位),4位二進制最大表示15,因此數據偏移也就是TCP首部最大60字節blog

下面的六個控制位,用來表示說明報文段的性質.進程

URG:表示本報文段中發送的數據是否包含緊急數據。後面的緊急指針字段(urgent pointer)只有當URG=1時纔有效同步

ACK:表示是否前面確認號字段是否有效。只有當ACK=1時,前面的確認號字段纔有效。TCP規定,鏈接創建後,ACK必須爲1,帶ACK標誌的TCP報文段稱爲確認報文段it

PSH:提示接收端應用程序應該當即從TCP接收緩衝區中讀走數據,爲接收後續數據騰出空間。若是爲1,則表示對方應當當即把數據提交給上層應用,而不是緩存起來,若是應用程序不將接收到的數據讀走,就會一直停留在TCP接收緩衝區中

RST:若是收到一個RST=1的報文,說明與主機的鏈接出現了嚴重錯誤(如主機崩潰),必須釋放鏈接,而後再從新創建鏈接。或者說明上次發送給主機的數據有問題,主機拒絕響應,帶RST標誌的TCP報文段稱爲復位報文段

SYN:在創建鏈接時使用,用來同步序號。當SYN=1,ACK=0時,表示這是一個請求創建鏈接的報文段;當SYN=1,ACK=1時,表示對方贊成創建鏈接。SYN=1,說明這是一個請求創建鏈接或贊成創建鏈接的報文。只有在前兩次握手中SYN才置爲1,帶SYN標誌的TCP報文段稱爲同步報文段

FIN:表示通知對方本端要關閉鏈接了,標記數據是否發送完畢。若是FIN=1,即告訴對方:「個人數據已經發送完畢,你能夠釋放鏈接了」,帶FIN標誌的TCP報文段稱爲結束報文段
窗口大小:表示如今容許對方發送的數據量,也就是告訴對方,從本報文段的確認號開始容許對方發送的數據量,達到此值,須要ACK確認後才能再繼續傳送後面數據,由Window size value *Window size scaling factor(此值在三次握手階段TCP選項Window scale協商獲得)得出此值

校驗和:提供額外的可靠性

緊急指針:標記緊急數據在數據字段中的位置

選項部分:其最大長度可根據TCP首部長度進行推算。TCP首部長度用4位表示,選項部分最長爲:(2^4-1)*4-20=40字節

TCP包頭常見選項

最大報文段長度MSS(Maximum Segment Size),一般1460字節

指明本身指望對方發送TCP報文段時那個數據字段的長度。好比:1460字節。數據字段的長度加上TCP首部的長度纔等於整個TCP報文段的長度。MSS不宜設的太大也不宜設的過小。若選擇過小,極端狀況下,TCP報文段只含有1字節數據,在IP層傳輸的數據報的開銷至少有40字節(包括TCP報文段的首部和IP數據報的首部)。這樣,網絡的利用率就不會超過1/41。若TCP報文段很是長,那麼在IP層傳輸時就有可能要分解成多個短數據報片。在終點要把收到的各個短數據報片裝配成原來的TCP報文段。當傳輸出錯時還要進行重傳,這些也都會使開銷增大。所以MSS應儘量大,只要在IP層傳輸時不須要再分片就行。在鏈接創建過程當中,雙方都把本身可以支持的MSS寫入這一字段。 MSS只出如今SYN報文中。即:MSS出如今SYN=1的報文段中MTU和MSS值的關係:MTU=MSS+IP Header+TCP Header通訊雙方最終的MSS值=較小MTU-IP Header-TCP Header

窗口擴大 Window Scale
爲了擴大窗口,因爲TCP首部的窗口大小字段長度是16位,因此其表示的最大數是65535。可是隨着時延和帶寬比較大的通訊產生(如衛星通訊),須要更大的窗口來知足性能和吞吐率,因此產生了這個窗口擴大選項

時間戳 Timestamps能夠用來計算RTT(往返時間),發送方發送TCP報文時,把當前的時間值放入時間戳字段,接收方收到後發送確認報文時,把這個時間戳字段的值複製到確認報文中,當發送方收到確認報文後便可計算出RTT。也能夠用來防止迴繞序號PAWS,也能夠說能夠用來區分相同序列號的不一樣報文。由於序列號用32爲表示,每2^32個序列號就會產生迴繞,那麼使用時間戳字段就很容易區分相同序列號的不一樣報文

相關文章
相關標籤/搜索