計算機網路 之 TCP協議報文結構

scutwang發表於2014-09-01

前言:上學期實訓課,由於要做一個網路通訊的應用,期間遇到各種問題,讓我深感計算機網路知識的薄弱。於是上網查詢大量的資料,期間偶然發現了roc大神的部落格,很喜歡他簡明易懂的博文風格。本文受roc的《計算機網路協議包頭賞析-TCP》的啟發,希望根據自己所學以及IETF的相關文件,在原有基礎上,進行相應知識的擴充,特別地將針對大部分欄位的用途進行分析。

 

(1)TCP報文格式圖示:

 

  TCP報文段也分為首部和資料兩部分,首部預設情況下一般是20位元組長度,但在一些需求情況下,會使用“可選欄位”,這時,首部長度會有所增加,但最長不超過60位元組。

 

(2)固定頭部的各欄位的功能解說:

【源埠】- 16bit

  來源處的埠號;埠號有65536個,即2^16。我也寫了一篇關於埠號的範圍的分類的 《計算機網路 之 TCP和UDP的埠解析》,供大家參考。

【目的埠】- 16bit

  目的處的埠號;

【序號】- 32bit

  TCP在對資料進行分段的時候,會給每一個TCP報文段新增一個序號,序號欄位的值其實是該文段所傳送的資料的第一個位元組的序號。這麼做的原因是,TCP是面向連線的可靠服務,這個序號可以保證資料在傳輸過程中保持有序性,接受端可以通過這個序號確認收到的資料的完整性和先後順序;

【確認號】- 32bit

  確認號,是期望收到對方的下一個報文段的資料的第一個位元組的序號;(後續將會提供一片關於如何使用序號和確認號保證資料的完整性和有序性的文章供大家參考。)

【資料偏移】- 4bit

  其實它本質上就是“首部長度”,因為“資料偏移”是指TCP報文段的資料部分的起始處距離TCP報文段的起始處的距離。(仍然很拗口,但相信你能明白)。

  資料偏移總共佔4bit,因此最大能表示的數值為15。但TCP的報文頭部至少為20位元組。因此資料偏移的單位是“4位元組”,此處的設計和IP資料包的設計是完全相同的,所以說TCP報文段首部的長度最長為15×4=60位元組,且首部長度必須為4位元組的整數倍。

【保留欄位】- 6bit

  IETF文件指出,這6bit在標準中是保留欄位,留待以後使用,必須為0。我猜測,有兩個目的,第一個是預留除URG/ACK/PSH/RST/SYN/FIN/之外的冗餘功能位;第二個是為了對齊位元組位。

【控制位】- 6bit

  又稱為TCP flag,該欄位從左到右分為以下六個欄位,指明包的型別。同時用於控制TCP的狀態機,同時ACK和SYN與三次握手協議有關,FIN與四次揮手協議有關。

  ① 緊急欄位URG - 1bit

    當URG=1時,此欄位告訴系統此報文段中有緊急資料,應儘快傳送。

  ② 確認欄位ACK - 1bit

    當ACK=1時,表示確認,且確認號有效;當ACK=0時,確認號欄位無效。

  ③ 推送欄位PSH - 1bit

    當PSH=1時,則報文段會被儘快地交付給目的方,不會對這樣的報文段使用快取策略。關於URG和PSH,有一篇博文的擴充套件:《TCP標誌中的URG和PSH位》

  ④ 復位欄位RST - 1bit

    當RST為1時,表明TCP連線中出現了嚴重的差錯,必須釋放連線,然後再重新建立連線。

  ⑤ 同步欄位SYN - 1bit

    當SYN=1時,表示發起一個連線請求。

  ⑥ 終止欄位FIN - 1bit

    用來釋放連線。當FIN=1時,表明此報文段的傳送端的資料已傳送完成,並要求釋放連線。

【視窗欄位】- 16bit

  此欄位用來控制對方傳送的資料量,單位為位元組。

  一般TCP連線的其中一端會根據自身的快取空間大小來確定自己的接收視窗大小,然後告知另一端以確定另一端的傳送視窗大小。該欄位與TCP的流量控制服務有關。

【校驗和欄位】- 16bit

  與IP協議的檢驗和不同,TCP的這個校驗和是針對首部和資料兩部分的。

【緊急指標欄位】- 16bit

  緊急指標指出在本報文段中的緊急資料的最後一個位元組的序號。

  

(3)TCP報文的可選項

  在TCP報文頭部的前20個位元組是固定的。有時TCP報文也會在報文頭部增加一些選項,該部分的長度不固定,不同的應用場景會有所變化。

  該部分的可選項常用的包含但不僅限於有以下幾種:

  ① 最大報文傳輸段(即常提到的MSS): 用於確定每一個TCP報文段中科傳輸的最大的資料長度(注意,不包括頭部)

  ② 視窗擴大選項:TCP的視窗大小最大為64K,在大多數時候這是夠用的,但有時候為了提高吞吐量,就需要對視窗擴大,這個時候,就需要使用該選項對視窗進行擴大。

  ③ 時間戳選項:可以用來計算RLL,進而可以用於TCP的擁塞控制。

相關文章