參考網址 :https://blog.csdn.net/zhouzhenhe2008/article/details/71075969
tcp頭部格式如下圖所示:
1.源端口號,16位,發送方的端口號。
2.目標端口號,16位,發送方的目標端口號。
3. 32為序列號,sequence number,保證網絡傳輸數據的順序性。
4. 32位確認號,acknowledgment number,用來確認確實有收到相關封包,內容表示期望收到下一個報文的序列號,用來解決丟包的問題。
5. 頭部大小,4位,偏移量:最大值為0x0F,即15,
單位為32位(bit),單位也就是4個字節,給出頭部占32bit的數目。沒有任何選項字段的TCP頭部長度為20字節;最多可以有60(15*4)字節的TCP頭部。
6. Reserved 4位 ,預留字段,都為0
7. TCP標志位
(1)CWR:Congestion window reduced,擁塞窗口減少。擁塞窗口減少標志被發送主機設置,用來表明它接收到了設置ECE標志的TCP包。擁塞窗口是被TCP維護的一個內部變量,用來管理發送窗口大小。
(2)ECN-Echo:顯式擁塞提醒回應。當一個IP包的ECN域被路由器設置為11時,接收端而非發送端被通知路徑上發生了擁塞。ECN使用TCP頭部來告知發送端網絡正在經歷擁塞,並且告知接收端發送段已經受到了接收端發來的擁塞通告,已經降低了發送速率。
(3)URG:為1時,緊急指針(urgent pointer)有效,配合緊急指針使用
(4)ACK:為1時,確認號有效
(5)PSH: 為1時,接收方應該盡快將這個報文段交給應用層
(6)RST:為1時,釋放連接,重連。
(7)SYN:為1時,發起一個連接。
(8)FIN:為1時,關閉一個連接。
8. 16位窗口大小:占16bit。此字段用來進行流量控制,主要用於解決流控擁塞的問題。單位為字節數,這個值是本機期望一次接收的字節數。
9. 16位校驗值: 占16bit。對整個TCP報文段,即TCP頭部和TCP數據進行校驗和計算,並由目標端進行驗證。
10. 16位緊急指針:占16bit。它是一個偏移量,和序號字段中的值相加表示緊急數據最后一個字節的序號。
11. 32位Tcp選項:一般包含在三次握手中。
抓包解析:
1.tcp頭部標志位:
比如客戶端第一次syn連接的時候,也就是第一次握手的時候。Syn標志被置為1
第二次握手的時候,服務端發的報文設置了ACK,SYN標志位
3.關於tcp選項
tcp選項一般出現在三次握手的報文中。
第一次握手
第二次握手
在建立連接的時候,通信雙方要互相確認對方的最大報文長度(MSS),以便通信,一般這個SYN長度是MTU減去固定IP首部和TCP首部長度,
對於以太網,一般可以達到1460字節,當然如果對於非本地的IP,這個MSS可能就只有536字節,而且如果中間的傳輸網絡的MSS更小的話,這個
值會更加的小。(在tcp報文中選項看出)
(1)TCP首部選項字段多達40B,記下一些常用的東西:
(2)選項結束字段(EOP,0x00),占1B,一個報文段僅用一次。放在末尾用於填充,用途是說明:首部已經沒有更多的消息,應用數據在下一個32位字開始處
(3)無操作字段(NOP, 0x01),占1B,也用於填充,放在選項的開頭
(4)MSS(最大報文段長度),格式如下:種類(1B,值為2),長度(1B,值為4),數值(2B)
用於在連接開始時確定MSS的大小,如果沒有確定,就用默認的(一般實現是536B)
(5)窗口擴大因子,格式如下:種類(1B,值為3),長度(1B,值為3),數值(1B)
新窗口值 = 首部窗口值 * 2的(擴大因子)次方
當通信雙方認為首部的窗口值還不夠大的時候,在連接開始時用這個來定義更大的窗口。僅在連接開始時有效。一經定義,通信過程中無法更改。
(6)時間截(應用測試RTT和防止序號繞回),略,以后補充
(7)允許SACK和SACK選項,略,以后補充