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

三次握手:服務器

  • 第一次握手:創建鏈接時,客戶端發送syn包(syn=j)到服務器,並進入SYN_SENT狀態,等待服務器確認;SYN:同步序列編號(Synchronize Sequence Numbers)。
  • 第二次握手:服務器收到syn包,必須確認客戶的SYN(ack=j+1),同時本身也發送一個SYN包(syn=k),即SYN+ACK包,此時服務器進入SYN_RECV狀態;
  • 第三次握手:客戶端收到服務器的SYN+ACK包,向服務器發送確認包ACK(ack=k+1),此包發送完畢,客戶端和服務器進入ESTABLISHED(TCP鏈接成功)狀態,完成三次握手。

完成三次握手,客戶端與服務器開始傳送數據。開發

 

四次揮手:同步

  • 客戶端A發送一個FIN,用來關閉客戶A到服務器B的數據傳送
  • 服務器B收到這個FIN,它發回一個ACK,確認序號爲收到的序號加1
  • 服務器B關閉與客戶端A的鏈接,發送一個FIN給客戶端A
  • 客戶端A發回ACK報文確認,並將確認序號設置爲收到序號加1

 

爲何三次握手,倒是四次揮手呢?請求

  這是由於服務端的LISTEN狀態下的SOCKET當收到SYN報文的建連請求後,它能夠把ACK和SYN(ACK起應答做用,而SYN起同步做用)放在一個報文裏來發送。但關閉鏈接時,當收到對方的FIN報文通知時,它僅僅表示對方沒有數據發送給你了;但未必你全部的數據都所有發送給對方了,因此你能夠未必會立刻會關閉SOCKET,也即你可能還須要發送一些數據給對方以後,再發送FIN報文給對方來表示你贊成如今能夠關閉鏈接了,因此它這裏的ACK報文和FIN報文多數狀況下都是分開發送的。數據

 

通俗理解三次握手和四次揮手:客戶端

  三次握手流程
    客戶端發個請求「開門吶,我要進來」給服務器
    服務器發個「進來吧,我去給你開門」給客戶端
    客戶端有很客氣的發個「謝謝,我要進來了」給服務器服務端

  四次揮手流程
    客戶端發個「時間不早了,我要走了」給服務器,等服務器起身送他
    服務器聽到了,發個「我知道了,那我送你出門吧」給客戶端,等客戶端走
    服務器把門關上後,發個「我關門了」給客戶端,而後等客戶端走(尼瑪~矯情啊)
    客戶端發個「我知道了,我走了」,以後本身就走了時間

相關文章
相關標籤/搜索