三次握手和四次揮手詳解


為什么是三次握手?
為了防止已經失效的連接請求報文段突然又傳到服務端,因而產生錯誤。
建立很多無效的連接,浪費資源
客戶端收到來自服務端的報文后,還需要再次發送確認報文來建立連接。
 
三次握手

第一次握手

Client將標志位SYN置1,隨機產生一個值seq=J,並將數據包發給Server
Client進入SYN_SENT狀態,等待Server確認

第二次握手

Server收到數據包后標志位SYN=1知道Client請求建立連接,Server將標志位SYN和ACK都置1,隨機產生一個值,並將數據包發給Client確認連接請求,Server進入SYN_RCVD狀態

第三次握手

Client收到確認后若ACK為1,則將該數據包發送給Server,Server檢查ACK為1則連接建立成功,Client與Server進入ESTABLISHED狀態完成三次握手,可以傳輸數據

第一次握手:
 
    Client什么都不能確認   
    Server確認了對方發送正常
 
第二次握手:
 
      Client確認:自己發送/接收正常,對方發送/接收正常
      Server確認:自己接收正常 ,對方發送正常
 
第三次握手:
 
    Client確認:自己發送/接收正常, 對方發送/接收正常
    Server確認:自己發送/接收正常,對方發送/接收正常
 
 
 
四次揮手
 
第一次揮手:
 
Clien發送一個FIN,用來關閉Client到Server的數據傳送,Client進入FIN_WAIT_1狀態。
 
第二次揮手:
 
Server收到FIN后,發送一個ACK給Client,Server進入CLOSE_WAIT狀態。
 
第三次揮手:
 
Server發送一個FIN,用來關閉Server到Client的數據傳送,Server進入LAST_ACK狀態。
 
第四次揮手:
 
Client收到FIN后,Client進入TIME_WAIT狀態,發送ACK給Server,Server進入CLOSED狀態,完成四次握手。
建立連接
 
因為服務端在LISTEN狀態下,收到建立連接請求的SYN報文后,把ACK和SYN放在一個報文里發送給客戶端。
 
關閉連接
 
當收到對方的FIN報文時,僅表示對方不再發送數據但還能接收收據,我們也未必把全部數據都發給了對方,所以我們可以立即close,也可以發送一些數據給對方后,再發送FIN報文給對方表示同意關閉連接。因此我們的ACK和FIN一般會分開發送。
 
上面是一方主動關閉,另一方被動關閉的情況,實際中還會出現同時發起主動關閉的情況,具體流程如下圖 
 
 
為什么需要TIME_WAIT狀態 
1、可靠的終止TCP連接 
2、保證讓遲來的TCP報文段有足夠的時間被識別並丟棄
參考資料:
https://blog.csdn.net/yu876876/article/details/81560122?ivk_sa=1024320u


免責聲明!

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



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