Wireshark工作笔记-TCP的状态解析,以及建立连接与关闭连接
在TCP層,有個FLAGS字段,這個字段有以下幾個標識:SYN, FIN, ACK, PSH, RST, URG.
其中,對于我們日常的分析有用的就是前面的五個字段。
?它們的含義是:
SYN表示建立連接,
FIN表示關閉連接,
ACK表示響應,
PSH表示有 DATA數據傳輸,
RST表示連接重置。
?其中,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的連接建立和連接關閉,都是通過請求-響應的模式完成的。
?概念補充-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開始傳送數據。
?
?在TCP/IP協議中,TCP協議提供可靠的連接服務,采用三次握手建立一個連接。 ?第一次握手:建立連接時,客戶端發送syn包(syn=j)到服務器,并進入SYN_SEND狀態,等待服務器確認; ?第二次握手:服務器收到syn包,必須確認客戶的SYN(ack=j+1),同時自己也發送一個SYN包(syn=k),即SYN+ACK包,此時服務器進入SYN_RECV狀態;
?第三次握手:客戶端收到服務器的SYN+ACK包,向服務器發送確認包ACK(ack=k+1),此包發送完畢,客戶端和服務器進入ESTABLISHED狀態,完成三次握手。完成三次握手,客戶端與服務器開始傳送數據. 摘自中國云安網(www.yunsec.net) 原文:http://www.yunsec.net/a/school/wlcs/agreement/2012/0317/10262.html
下面這一篇轉載與https://www.cnblogs.com/grglym/p/7788175.html
一、報文結構介紹
在開始講TCP連接過程時,還是先看看TCP報文的格式如圖1所示。IP數據報此時由IP頭部+TCP頭部+TCP數據組成。不帶選項的TCP頭部是20字節長,而帶選項的,TCP頭部最長可達60字節。常見的選項包括最大的大小(MSS),時間戳(傳輸控制時使用)、窗口縮放(流量控制時使用)、選擇性ACK(傳輸控制時使用)。我們來具體看下TCP頭部字段如圖2所示。
圖1 IP數據報中TCP封裝
圖2所示的即是TCP頭部的詳細結構。源端口與目的端口和源IP及目的IP這四元組唯一標識每個TCP連接。序列號(Sequence Number)字段標識TCP的一端到另一端的數據流的第一個開始字節(例如發送端發送的數據總字節長度為1000字節,假定序列號從1開始,總的序列號是1-1000,TCP會給每個字節賦予一個序列號)。通過序列號來代表發送端到接收端的數據,接收端接收到數據后,即可通過確認號(ACK)來發送給發送端,讓發送端知道數據已被接受。這個ACK號是由接收到的數據的序列號加1,代表接收端希望接收的下一個數據的序列號。(注:ACK是不占用序列號的,原因是接收端發送ACK給發送端后,發送端的ISN是等于此時接收到的ACK號)。
圖2 TCP頭部結構
頭部長度的單位32bit,所以這也定義了TCP的長度最大為4*15=60字節。八個標志位中(CWR、ECE。。。等),這里先每個介紹,后面文章有用到時在另行介紹。我們來主要了解下ACK、SYN、FIN。ACK即確認,連接建立后一般都是啟用狀態。SYN用于初始化一個連接的同步序列號。當發送方已經結束數據的發送時,即發送FIN報文段給接收端。窗口大小在TCP流量控制中會重點講解。
二、TCP連接的建立與終止
如圖3所示即為TCP連接建立與終止的過程圖。
圖3 TCP連接的建立與終止
TCP建立的三次握手:
1、發送端發送一個SYN報文段(SYN位被置位),SYN中包含TCP目的端口和發送端的初始序列號(圖中ISN(c)),同時攜帶著TCP選項數據。
2、接收端收到發送端連接請求后,接收端發送自己SYN報文段(包含ISN(s)),同時對發送端的SYN進行確認,如前所述,接收端發送的ACK是ISN(c)+1。此時ACK位與SYN位都被置位。接收端發送SYN+ACK到發送端。
3、發送端接收到接收端的SYN+ACK數據后,對ISN(s)進行確認,發送ACK為ISN(s)+1的報文段給接收端。
TCP斷開的四次握手:
1、TCP協議規定通過發送一個FIN段(FIN被置位)來發起關閉操作,圖3中發送端發送FIN段給接收端,告知它數據已發送完畢,請求斷開TCP連接。同時FIN報文段還包含著對最近收到的數據進行ACK。
2、接收端接收端FIN報文段后,對FIN進行確認,發送ACK=k+1給發送端。
3、接收端將連接關閉發送給上層應用程序,由應用程序發起連接關閉操作。此時接收端由被動關閉連接壯成主動,并發送FIN報文段給發送端。報文的序列號為L(這里也可看出上一步驟中發送ACK序列號也為L,因為ACK不占用序列號,所以這里的FIN的序列號也為L)。
4、發送端接收到FIN后,發送回ACK給接收端后,TCP連接終止。如果FIN丟失,發送FIN的那端需要重新發送FIN,知道接收到ACK為止。
三:總結
如前所述,建立一個TCP連接需要3個報文段,而關閉TCP連接需要4個報文段。
總結
以上是生活随笔為你收集整理的Wireshark工作笔记-TCP的状态解析,以及建立连接与关闭连接的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: C++工作笔记-使用typeid获取对象
- 下一篇: Qt文档阅读笔记-Qt插件DECLARE