TCP建立連接和斷開連接


 建立TCP連接需要三次握手才可以建立,斷開連接則需要四次握手。
 圖1:

 

第一次握手:建立連接時,客戶端發送syn包(syn=j)到服務器,進入SYN_SENT狀態,等待服務器確認,
第二次握手:服務器收到syn包,必須確認客戶的SYN(ack=j+1),同時自己也發送一個SYN包(syn=k),即SYN+ACK包,此時服務器進入SYN_RECV狀態,
第三次握手:客戶端收到服務器的SYN+ACK包,向服務器發送確認包ACK(ack=k+1),此包發送完畢,客戶端和服務器進入ESTABLISHED(TCP連接成功)狀態,完成三次握手。
注:

SYN_RECV:一個連接請求已經到達,等待確認
 

SYN_SENT:應用已經開始,打開一個連接

ESTABLISHED:正常數據傳輸狀態    

首先Client端發送連接請求報文,Server段接收連接后回復ACK報文(Acknowledgement,確認發來的數據已經接收完畢),為此次連接分配資源。Client端在收到ACK報文后也向Server端發送ACK報文,並分配資源,如此TCP連接就建立了。

補充知識

在TCP層,有個FLAGS字段,這個字段有以下幾個標識:SYN, FIN, ACK, PSH, RST, URG.其中,對於我們日常的分析有用的就是前面的五個字段。它們的含義是:SYN表示建立連接,FIN表示關閉連接,ACK表示響應,PSH表示有 DATA數據傳輸,RST表示連接重置。其中,ACK是可能與SYN,FIN等同時使用的,比如SYN和ACK可能同時為1,它表示的就是建立連接之后的響應,如果只是單個的一個SYN,它表示的只是建立連接。  

斷開連接詳解圖如下(關閉連接可以是 Client 也可以是 Server
圖2:
 
我們假設 Client 發送中斷請求( Fin ), Server 接到請求后表示關閉連接,但可以不必着急關閉通信(Socket),可以繼續發送數據,所以 Server 先發送 ACK ,表明關閉請求已收到,但為了保證數據接收完成,請等待,稍后會給 client 消息,此時 Client 進入 FIN_WAIT1 狀態,等待 server FIN

 
(這里講一下 FIN_WAIT 狀態, Client 發出 FIN ,同時進入 FIN_WAIT1 狀態, Server 響應 ACK ,從而使 Client 變成 FIN_WAIT2 狀態,接着 Server 會發出 FIN Client 響應 ACK ,同時變成 TIME_WAIT 狀態,這就是關閉連接時 FIN_WAIT 狀態的變化)

Server 端確定數據已經發送完成,則會向 Clinet 發送 FIN 報文,意思是告訴 Client ,我這邊已經准備完畢,可以關閉連接, Client 接收到 FIN 報文以后就明白可以關閉連接了,但為了防止網絡問題,所以發送 ACK 后進入 FIN_WAIT 狀態, Server 如果沒有收到 ACK 也可以重傳,當 Server 收到 ACK 后就可以斷開連接了, Client 等待 2MSL 后沒有收到重傳則證明 Server 已經正常關閉

(再講一下
2MSL Maximum Segment Lifetime ,譯為報文最大生存時間,是用來補救的,確認無誤 ACK 沒有丟失,如果 TCP client 端最后一次發送的 ACK 丟失了,它將在等待時間內重新發送。)

這樣 Client 端也會關閉, OK ,  TCP 連接經過四次握手后也正常關閉。


免責聲明!

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



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