簡述TCP三次握手、四次揮手

一、基礎概念

1、什麼是TCP?

TCP是面向連接、可靠的進程到進程通信的協議。TCP提供雙全工服務,即數據可在同一時間雙向傳輸,每一個TCP都有發送緩存和接受緩存,用來臨時存儲數據。

2、TCP套接字

TCP協議規定,端口號拼接到IP地址即構成套接字——TCP連接的端點。
套接字(socket)=[IP地址:端口號】
TCP連接用式子表示爲
TCP連接::={socket1,socket2}={(IP1:port1) ,(IP2:port2)}

3、TCP中客戶與服務器

在面向連接通信中,連接的建立和斷開是非常頻繁的過程。TCP連接的建立採用客戶服務器方式,主動發起連接建立的應用進程成爲客戶,而被動等待連接的應用進程成爲服務器。

4、TCP報文協議

在這裏插入圖片描述

源端口號:數據發起者的端口號,16bit。
目的端口號:數據接收者的端口號,16bit。
序號:32bit的序列號,由發送方使用。
確認序號:32bit的確認號,是接收數據方期望收到發送方的下一個報文段的序號,因此確認序號應當是上次已成功收到數據字節序號加1。
首部長度:首部中32bit字的數目,可表示15*32bit=60字節的首部。一般首部長度爲20字節
保留:6bit, 均爲0
緊急URG:當URG=1時,表示報文段中有緊急數據,應儘快傳送。
確認比特ACK:ACK = 1時代表這是一個確認的TCP包,取值0則不是確認包。
推送比特PSH:當發送端PSH=1時,接收端儘快的交付給應用進程。
復位比特(RST):當RST=1時,表明TCP連接中出現嚴重差錯,必須釋放連接,再重新建立連接。
同步比特SYN:在建立連接是用來同步序號。SYN=1, ACK=0表示一個連接請求報文段。SYN=1,ACK=1表示同意建立連接。
終止比特FIN:FIN=1時,表明此報文段的發送端的數據已經發送完畢,並要求釋放傳輸連接。
窗口:用來控制對方發送的數據量,通知發放已確定的發送窗口上限。
檢驗和:該字段檢驗的範圍包括首部和數據這兩部分。由發端計算和存儲,並由收端進行驗證。
緊急指針:緊急指針在URG=1時纔有效,它指出本報文段中的緊急數據的字節數。
選項:長度可變,最長可達40字節.。

5、TCP報文的序列號Seq和確認號Ack

序列號(sequence number):Seq序號,佔32位,用來標識從TCP源端向目的端發送的字節流,發起方發送數據時對此進行標記。
確認號(acknowledgement number):Ack序號,佔32位,只有ACK標誌位爲1時,確認序號字段纔有效,Ack=Seq+1。

二、TCP連接建立三握手、連接斷開四揮手理論步驟

1、連接三握手

<1>由客戶端向服務器發送一段TCP報文:
●控制位爲SYN,SYN置“1”,表示“請求建立新連接”;
●序號爲Seq=X(X一般爲0);
隨後客戶端進入SYN-SENT階段。

<2>服務器端接收到來自客戶端的TCP報文之後,結束LISTEN階段。並向客戶端發送一段TCP報文:
●控制位爲SYN和ACK,SYN、ACK置“1”,表示“確認客戶端的報文Seq序列號有效,服務器能正常接收客戶端發送的數據,並同意創建新連接”(即告訴客戶端,服務器收到了你的數據);
●序列號爲Seq=y(y一般爲0);
●確認號爲Ack=x+1,表示收到客戶端的序列號Seq並將其值加1作爲自己確認號Ack的值;
隨後服務器端進入SYN-RCVD階段。

<3>客戶端接收到來自服務器端的確認收到數據的TCP報文之後,明確了從客戶端到服務器的數據傳輸是正常的,結束SYN-SENT階段。並返回最後一段TCP報文:
●控制位爲ACK,ACK置“1”,表示“確認收到服務器端同意連接的信號”。
●序列號爲Seq=x+1,表示收到服務器端的確認號Ack,並將其值作爲自己的序列號值;
●確認號爲Ack=y+1,表示收到服務器端序列號Seq,並將其值加1作爲自己的確認號Ack的值;
隨後客戶端進入ESTABLISHED階段。

服務器收到來自客戶端的“確認收到服務器數據”的TCP報文之後,明確了從服務器到客戶端的數據傳輸是正常的。結束SYN-SENT階段,進入ESTABLISHED階段。此後客戶端和服務器端進行正常的數據傳輸。這就是“三次握手”的過程。
在這裏插入圖片描述

2、斷開四揮手

<1>首先客戶端想要斷開連接,向服務器端發送一段TCP報文:
●控制位爲FIN,FIN置“1”,表示“請求釋放連接“;
●序列號爲Seq=W;
隨後客戶端進入FIN-WAIT-1階段,即半關閉階段。並且停止在客戶端到服務器端方向上發送數據,但是客戶端仍然能接收從服務器端傳輸過來的數據。

<2>服務器端接收到從客戶端發出的TCP報文之後,確認了客戶端想要釋放連接,隨後服務器端結束ESTABLISHED階段,進入CLOSE-WAIT階段(半關閉狀態)並返回一段TCP報文:
●控制位爲ACK,ACK置“1”,表示“接收到客戶端發送的釋放連接的請求”;
●序列號爲Seq=Z;
●確認號爲Ack=W+1,表示是在收到客戶端報文的基礎上,將其序號Seq值加1作爲本段報文確認號Ack的值;
隨後客戶端結束FIN-WAIT-1階段,進入FIN-WAIT-2階段。

<3>服務器端自從發出ACK確認報文之後,再次向客戶端發出一段TCP報文:
●控制位爲FIN、ACK,FIN、ACK置“1”,表示“已經準備好釋放連接了”。注意:這裏的ACK並不是確認收到服務器端報文的確認報文。
●序列號爲Seq=Z;
●確認號爲Ack=W+1;表示是在收到客戶端報文的基礎上,將其序號Seq值加1作爲本段報文確認號Ack的值。
隨後服務器端結束CLOSE-WAIT階段,進入LAST-ACK階段。

<4>客戶端收到從服務器端發出的TCP報文,確認了服務器端已做好釋放連接的準備,結束FIN-WAIT-2階段,進入TIME-WAIT階段,並向服務器端發送一段報文:
●控制位爲ACK,ACK置“1 ”,表示“接收到服務器準備好釋放連接的信號”。
●序列號爲Seq=W+1;表示是在收到了服務器端報文的基礎上,將其確認號Ack值作爲本段報文序號的值。
●確認號爲Ack=Z+1;表示是在收到了服務器端報文的基礎上,將其序號Seq值增加1作爲本段報文確認號的值。
隨後客戶端結束TIME-WAIT階段,進入CLOSED階段,由此完成“四次揮手”。
在這裏插入圖片描述

三、用Wireshark抓包工具分析TCP協議在真實環境數據通訊中的“三握手、四揮手”

1、連接三握手

mu在這裏插入圖片描述
#####第一個包#######PC1##########
192.168.100.5###源IP###
192.168.100.6###目標IP###
63659###源端口號###
22###目標端口###
Seq=0、SYN=1
在這裏插入圖片描述#####第二個包#######PC2##########
192.168.100.6###源IP###
192.168.100.5###目標IP###
22###源端口號###
63659###目標端口###
Seq=0、ACK=1、SYN=1
在這裏插入圖片描述
#####第三個包#######PC1##########
192.168.100.5###源IP###
192.168.100.6###目標IP###
63659###源端口號###
22###目標端口###
Seq=1、ACK=1

2、斷開四揮手

在這裏插入圖片描述#####第一個包#######PC1##########
192.168.100.5###源IP###
192.168.100.6###目標IP###
55426###源端口號###
22###目標端口###
ACK=1、FIN=1在這裏插入圖片描述
#####第二個包#######PC2##########
192.168.100.6###源IP###
192.168.100.5###目標IP###
22###源端口號###
55426###目標端口###
ACK=1在這裏插入圖片描述
#####第三個包#######PC2##########
192.168.100.6###源IP###
192.168.100.5###目標IP###
22###源端口號###
55426###目標端口###
ACK=1、FIN=1
在這裏插入圖片描述
#####第四個包#######PC1##########
192.168.100.5###源IP###
192.168.100.6###目標IP###
55426###源端口號###
22###目標端口###
ACK=1

PS:在實際抓包操作中,連接釋放四揮手進程並不一定需要完整的四層,其中RST包郵強制斷開連接的作用

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章