1. 程式人生 > >【網路】TCP通訊協議裡面的三次握手和四次揮手的流程!!

【網路】TCP通訊協議裡面的三次握手和四次揮手的流程!!

  • 伺服器初始化的一般過程:
    • 呼叫socket 函式獲取建立的檔案描述符
    • 使用bind函式對IP和port進行繫結
    • 呼叫listen函式監聽socket建立的檔案描述符
    • 呼叫accept函式對客戶端進行連線

客戶端和伺服器建立連線和斷開連線的過程:
這裡寫圖片描述

  • 三次握手
    過程:

     - 使用`socket`建立檔案描述符
     - 呼叫connect向伺服器發起連線請求
     - connect向伺服器傳送SYN段,並阻塞式等待伺服器迴應(第一次)
     - 伺服器接收到客戶段的SYN,會答應SYN+ACK段表示同意連線(第二次)
     - 客戶端接收到伺服器端傳送的SYN+ACK段,同時迴應一個ACK段(第三次)
    
  • 四次揮手
    過程:

     - 客戶端如果請求關閉,呼叫`close`關閉檔案描述符,同時客戶端會向伺服器傳送FIN報文(第一次)
     - 伺服器接收到客戶端的FIN,會迴應ACK報文,同時`read`返回0(第二次)
     - 伺服器的`read`返回之後會呼叫`close`關閉檔案描述符,同時向客戶端傳送FIN報文(第三次)
     - 客戶端接收到伺服器的FIN報文之後,迴向伺服器傳送ACK報文(第四次)
    
  • 為什麼連線是三次握手而斷開連線是四次揮手?

因為當Server端收到Client端的SYN連線請求報文後,可以直接傳送SYN+ACK報文。其中ACK報文是用來應答的,SYN報文是用來同步的。但是關閉連線時,當Server端收到FIN報文時,很可能並不會立即關閉SOCKET,所以只能先回復一個ACK報文,告訴Client端,”你發的FIN報文我收到了”。只有等到我Server端所有的報文都發送完了,我才能傳送FIN報文,因此不能一起傳送。故需要四步握手。