TCP協議規定了在不同主機間進行可靠資料流傳輸的通用方法,如 串連建立與釋放、報文編號、收到資料報後的確認、流量控制、發送逾時等等。靠死記硬背來學習這些東西,沒過幾天就又忘記了。我發現根據TCP報文格式來瞭解掌握這些知識,效果還是不錯的。看到下面這張圖(此圖來源於網路),就能回憶起關於TCP協議的大部分東西:
(該圖來源於網路)
Source Port,Destination Port:源連接埠號碼,目標連接埠號碼。IP實現了點到點的資料通訊,而TCP實現的是端到端的通訊。通訊端用一個IP與連接埠號碼來唯一標識。(其實連接埠號碼就是用來標識同一主機中的不同進程。)IP協議負責將資料轉送到目標主機,而TCP可以根據資料報中的連接埠號碼,將資料交給相應的程式進行處理。
Sequence Number:發送序號。IP實現點到點的通訊,這種通訊是不可靠的。IP資料報可能會丟失或亂序到達目標主機,而TCP提供一種可靠的通訊方式。它通過對發送的資料報進行編號(準確的說應該是對資料流進行編號)來實現可靠通訊。如:應用程式發送2048個位元組資料到目標主機,TCP協議首先將這些資料報打包成一個一個的資料報,然後對其進行編號。假設每個資料報攜帶的資料的長度是100個位元組,第一個資料報的編號是1, 那麼第二個資料報的編號就是101,第三個的編號是201,以此類推。
Acknowledgment Number: 確認序號。對於發送端來講,這個序號表示下一個tcp報文的起始序號,對於接收端來講,表示下一個希望接收到報文的序號。
Data Offset:該欄位佔用4個位元組,用來表示報文首部的長度,單位是4byte。例如:0x05 表示 報文的首部長度是 5 * 4 = 20個位元組。
Reserved:該欄位佔用6個位元組,作為保留欄位,暫時沒有什麼用處。
後面是六個標識位(uaprsf,記得每個單詞的首字母):
- URG(ent): 如果該位置為1,表示該報文比較緊急,要趕緊傳輸。
- ACK:確認序號。跟上面的Acknowledgment Number有點關係。只有該位置為1時,Acknowledgment Number才有效。
- PSH:push,推。表示接收到接到報文後,要趕緊傳遞給應用程式層。
- RST: reset,重設串連。
- SYN: 同步。在建立串連的時候,用到該標識位。
- FIN:終止。在釋放串連的時候,用到該標識位。
Window:滑動視窗的大小。用於通訊雙方的流量控制。為了保證通訊的可靠性,TCP對報文進行編號,然後發送。接收到接到報文後,要向發送方進行確認。一般情況下,發送方不是在收到確認訊息之後才發下一個報文,這些網路的利用率太低,而是在沒有收到確認訊息時,可以發送的資料是有個最大上限。
Checksum:對報文進行校正。如果校正失敗,就丟棄該報文。
Urgent Pointer:智能針針。具體我還不清楚,網上一些資料的解釋是:指向後面是優先資料的位元組。
Options:選項。當前tcp只定義了一個選項:最大報文段長度。它用於告訴通訊的另一方,當前協議框緩衝區所能接收到報文段的最大長度。
Padding:填充段。確保報文頭的長度能為32整除。