【網路】TCP通訊協議裡面的三次握手和四次揮手的流程!!
阿新 • • 發佈:2018-12-31
- 伺服器初始化的一般過程:
- 呼叫
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報文,因此不能一起傳送。故需要四步握手。