TCP協議的三次握手和四次揮手過程

學習記錄來源:《32個Java面試必考點》

三次握手建連過程:

在這裏插入圖片描述

  1. 首先在建立連接前需要讓Server端先監聽端口。因此,Server端建立連接前的初始狀態是listen狀態
  2. 這時Client端準備建立連接,先發送一個SYN同步包,發送完同步包後,Client端的連接狀態爲syn_sent狀態
  3. Server端收到SYN後,同意建立連接,會向Client端回覆一個ACK,由於TCP是雙工傳輸,Server端也會向Client端同時發送一個同步請求SYN,申請Server端向Client端建立連接。發送完ACK和SYN後,Server端的狀態就變成了syn_rcvd(syn_received)
  4. Clinet收到Server的ACK後,Client的連接狀態就變成了established的狀態。同時,Client端向Server端發送ACK響應,回覆Server端的SYN請求。
  5. Server端收到Client端的ACK後Server端的連接狀態就變成了established的狀態。
    此時,建連完成,雙方隨時進行數據傳輸。
  • 三次握手是爲了建立雙向連接
  • 需要記住Client端和Server端的連接狀態變化
  • 回答SYN洪水衝擊發生的原因:Server端在收到Client端的SYN請求後,發送了ACK和SYN,但是Client端不進行回覆,導致Server端大量的連接處在syn_rcvd狀態,進而影響其它正常請求的建連
  • 上面解決:可以設置Linux的TCP參數,syc_ack_retries=0來加快半連接的回收速度.或者調大max_syn_backlog來應對少量的SYN洪水攻擊。
四次揮手斷連過程:

在這裏插入圖片描述

  1. 首先通信的雙方(Server和Client)起初都是established的狀態
  2. 然後Client端先發起了關閉鏈接請求。Client端向Server端發起了一個FIN包,表示Clinet端已經沒有數據要發送了,然後Client端就進入了fin_wait_1狀態。
  3. Server端收到FIN後,返回ACK。然後進入close_wait狀態,此時,Server處於半關閉狀態。因爲此時Client向Server方向已經不會發起數據了,但是Server向Client可能還有數據要發送。當Server端數據發送完畢後,Server端會向Client端發送FIN,表示Server端也沒有數據要發送了,這時,Server進入last_ack階段,就等待Clinet端的應答就可以關閉連接了。
  4. Client端收到Server端的FIN後,回覆ACK,然後進入time_wait狀態。time_wait狀態下,需要等待兩倍的MSL,就是最大報文段生存時間,來保證連接的可靠關閉,之後纔會進入到closed狀態
  5. 而Server端在收到ACK後就直接可以進入到closed狀態。
  • 爲什麼要等待兩倍的MSL之後才能關閉連接?
    原因有2個:
    1.要保證TCP協議的全雙工連接能夠可靠關閉
    2.要保證這次連接中重複的數據段能夠從網絡中消失,防止端口被重用的時候,可能會產生數據混淆
  • 大量Socket處於time_wait或者close_wait狀態的問題?
    一般開啓Linux的TCP參數tw_reuse和tw_recycle能夠加快time_wait的回收
    而出現在量的close_wait狀態,一般是被動關閉的一方,可能存在代碼的bug,沒有正確關閉連接所導致的
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章