【Wireshark抓包】:TCP的狀態型別
承接上篇:https://blog.csdn.net/hxcaifly/article/details/85339299
1. 前言
在分析wireshark抓包時,封包詳情資訊裡展現出了TCP的狀態型別。除了我們比較熟悉的SYN, ACK的三次握手時見到的狀態之外。突然見到PSH,RST等狀態,這些比較陌生。所以覺得有必要對TCP的狀態型別做一次總結。
2. TCP的六大狀態
TCP的六大狀態包括SYN,FIN, ACK, PSH,RST和URG。
在TCP層,有個FLAGS欄位,這個欄位有以下幾個標識:SYN, FIN, ACK, PSH, RST, URG.
這六大狀態的含義:
- SYN表示建立連線,
- FIN表示關閉連線,
- ACK表示響應,
- PSH表示有 DATA資料傳輸,
- RST表示連線重置。
3. 具體用法
ACK是可能與SYN,FIN等同時使用的,比如SYN和ACK可能同時為1,它表示的就是建立連線之後的響應。 如果只是單個的一個SYN,它表示的只是建立連線。TCP的幾次握手就是通過這樣的ACK表現出來的。
但SYN與FIN是不會同時為1的,因為這兩個狀態互相矛盾,前者表示的是建立連線,而後者表示的是斷開連線。
RST一般是在FIN之後才會出現為1的情況,表示的是連線重置。 一般地,當出現FIN包或RST包時,我們便認為客戶端與伺服器端斷開了連線;而當出現SYN和SYN+ACK包時,我們認為客戶端與伺服器建立了一個連線。
PSH為1的情況,一般只出現在 DATA內容不為0的包中,也就是說PSH為1表示的是有真正的TCP資料包內容被傳遞。
TCP的連線建立和連線關閉,都是通過請求-響應的模式完成的。
4. 概念補充三次握手
概念補充-TCP三次握手:
TCP(Transmission Control Protocol)傳輸控制協議
TCP是主機對主機層的傳輸控制協議,提供可靠的連線服務,採用三次握手確認建立一個連線:
位碼即tcp標誌位,有6種標示:SYN(synchronous建立聯機) ACK(acknowledgement 確認) PSH(push傳送) FIN(finish結束) RST(reset重置) URG(urgent緊急)Sequence number(順序號碼) Acknowledge number(確認號碼)
第一次握手:主機A傳送位碼為syn=1,隨機產生seq number=1234567的資料包到伺服器,主機B由SYN=1知道,A要求建立聯機;
第二次握手:主機B收到請求後要確認聯機資訊,向A傳送ack number=(主機A的seq+1),syn=1,ack=1,隨機產生seq=7654321的包;
第三次握手:主機A收到後檢查ack number是否正確,即第一次傳送的seq number+1,以及位碼ack是否為1,若正確,主機A會再發送ack number=(主機B的seq+1),ack=1,主機B收到後確認seq值與ack=1則連線建立成功。
完成三次握手,主機A與主機B開始傳送資料。
5. 重置(RST)
幾種TCP連線中出現RST的情況
- 埠未開啟
- 請求超時
- 提前關閉
- 在一個已關閉的socket上收到資料
TCP重置是一個好的事情,如果沒有reset,我們將會遇到各種各樣的TCP網路連線問題。需要注意的是導致reset的原因是多種多樣的,不僅僅是兩端的節點還有可能是應用程式,追查問題時最重要的是檢視包的狀態以及其重傳。