1. 程式人生 > 實用技巧 >TCP包頭欄位簡介和TCP options介紹

TCP包頭欄位簡介和TCP options介紹

TCP包頭欄位簡介和TCP options介紹


一、TCP 層協議包格式圖

從上面的圖可以看到,前5層(從上至下數)是預設的必須要有的那些欄位,這些欄位加起來總共有20 Bytes(160 bits),所以在網路中所有的裝置都必須至少要支援20 Bytes的TCP header;與此同時在最下面一層是可選項和填充項,這些就是預留給TCP options的;TCP header最大可以有60 Bytes,所以 TCP options + 填充欄位 最多隻有40 Bytes,填充是為了使TCP首部為4位元組(32bit)的整數倍。


二、各欄位欄位解析

【源埠】- 16bit
來源處的埠號;
【目的埠】- 16bit


目的處的埠號;
【序號】- 32bit
每一個TCP報文段都會有一個序號,序號欄位的值其實是本報文段所傳送的資料的第一個位元組的序號。這是因為TCP是面向連線的可靠服務,其每一個位元組都會對應一個序號,通過序號來確保服務的可靠性和有序性。
【確認號】- 32bit
確認號,是期望收到對方的下一個報文段的資料的第一個位元組的序號。(這句話有些拗口,但是在後面我們講解三次握手和四次揮手時,大家會更深刻的理解這句話的含義)
【資料偏移】- 4bit
其實它本質上就是“首部長度”,因為“資料偏移”是指TCP報文段的資料部分的起始處距離TCP報文段的起始處的距離。(仍然很拗口,但相信你能明白)。
資料偏移總共佔4bit,因此最大能表示的數值為15。而資料偏移的單位是“4位元組”,此處的設計和IP資料報的設計是完全相同的,所以說TCP報文段首部的長度最長為15×4=60位元組,且首部長度必須為4位元組的整數倍。
【保留欄位】- 6bit

這6bit在標準中是保留欄位,我猜測,有兩個目的,第一個是預留除URG/ACK/PSH/RST/SYN/FIN/之外的冗餘功能位;第二個是為了對其位元組位。
【緊急欄位URG】- 1bit
此欄位告訴系統此報文段中有緊急資料,應儘快傳送。當URG=1時,
【確認欄位ACK】- 1bit
當ACK=1時,表示確認,且確認號有效;當ACK=0時,確認號欄位無效。
【推送欄位PSH】- 1bit
當PSH=1時,則報文段會被儘快地交付給目的方,不會對這樣的報文段使用快取策略。
【復位欄位RST】- 1bit
當RST為1時,表明TCP連線中出現了嚴重的差錯,必須釋放連線,然後再重新建立連線。
【同步欄位SYN】- 1bit

當SYN=1時,表示發起一個連線請求。
【終止欄位FIN】- 1bit
用來釋放連線。當FIN=1時,表明此報文段的傳送端的資料已傳送完成,並要求釋放連線。
【視窗欄位】- 16bit
此欄位用來控制對方傳送的資料量,單位為位元組。
一般TCP連線的其中一端會根據自身的快取空間大小來確定自己的接收視窗大小,然後告知另一端以確定另一端的傳送視窗大小。
【校驗和欄位】- 16bit
這個校驗和是針對首部和資料兩部分的。
【緊急指標欄位】- 16bit
緊急指標指出在本報文段中的緊急資料的最後一個位元組的序號

以在Wireshark裡抓到的包為示例,我們能很好的看到上面所說的:

依次點選各欄位就能發現它們所佔用的欄位大小。


三、TCP Options介紹

根據上文我們可以知道TCP Options欄位的最大長度為40位元組。TCP Options欄位的一般資料結構如圖所示:

Kind(1位元組) Length(1位元組) Info(n位元組)

TCP報文頭部選項欄位(TCP Options欄位)的一般結構選項的第一個欄位kind說明選項的型別。有的TCP選項沒有後面兩個欄位,僅包含1位元組的kind欄位。第二個欄位length(如果有的話)指定該選項的總長度,該長度包括kind欄位和length欄位佔據的2位元組。第三個欄位info(如果有的話)是選項的具體資訊。常見的TCP options詳見 TCP協議

常見的TCP options介紹:

  • 第一個kind= 2,表示最大報文段長度(Max Segment Size,MSS),TCP模組通常將MSS設定為(MTU-40)位元組(減掉的這40位元組包括20位元組的TCP頭部和20位元組的IP頭部)。這樣攜帶TCP報文段的IP資料報的長度就不會超過MTU(假設TCP頭部和IP頭部都不包含選項欄位,並且這也是一般情況),從而避免本機發生IP分片。對乙太網而言,MSS值是1460(1500-40)位元組。而圖中最大報文長度為1320位元組,這當然也是可以的。
  • kind= 4,表示支援SACK,詳情見連結
  • kind = 8,代表Timestamps,即時間戳,啟用Timestamp Option後,每個TCP Segment中都會帶有Timestamp Option,其中包含了兩個32bit的Timestamp也就是各四個位元組的Timestamp Value(TSval)和Timestamp Echo Reply(TSecr)。傳送方在傳送報文段時把當前時鐘的時間值放入時間戳欄位,接收方在確認該報文段時把時間戳欄位值複製到時間戳回送回答欄位。因此,傳送方在收到確認報文後,可以準確計算出RTT。

其中是否要開啟SACK是可以有核心引數可以控制:

cat /etc /sysctl.conf
net.ipv4.tcp_sack = 1

同時檢視核心引數檔案
/proc/sys/net/ipv4/tcp_sack 對應net.ipv4.tcp_sack
管理TCP的選擇性應答,允許接收端向傳送端傳遞關於位元組流中丟失的序列號,減少了段丟失時需要重傳的段數目,當段丟失頻繁時,sack是很有益的。