TCP包頭字段簡介和TCP options介紹


一、TCP 層協議包格式圖


從上面的圖可以看到,前5層(從上至下數)是默認的必須要有的那些字段,這些字段加起來總共有20 Bytes(120 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是很有益的。

更多網絡相關內核參數:TCP/IP Socket內核參數


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM