上面的圖是阻塞式socket進行通信的過程,阻塞的時候是操作系統內核網絡協議棧在工作
調用 connect 函數將激發 TCP 的三次握手過程,而且僅在連接建立成功或出錯時才返回。其中出錯返回可能有以下幾種情況:
1、三次握手無法建立,客戶端發出的 SYN 包沒有任何響應,于是返回 TIMEOUT 錯誤。這可能是對應的服務端 IP 寫錯
2、客戶端收到了 RST(復位)回答,這時候客戶端會立即返回 CONNECTION REFUSED 錯誤。。這可能是客戶端發送連接請求時的請求端口寫錯。
產生 RST 的三個條件是:
目的地為某端口的 SYN 到達,然而該端口上沒有正在監聽的服務器。
TCP 想取消一個已有連接。
TCP 接收到一個根本不存在的連接上的分節。
3、客戶發出的 SYN 包在網絡上引起了"destination unreachable",即目的不可達的錯誤。這可能是客戶端和服務器端路由不通
關于三次握手問題的本質是, 信道不可靠, 但是通信雙發需要就某個問題達成一致. 而要解決這個問題, 無論你在消息中包含什么信息, 三次通信是理論上的最小值. 所以三次握手不是TCP本身的要求, 而是為了滿足"在不可靠信道上可靠地傳輸信息"這一需求所導致的。
客戶端第一次發送握手消息到服務端,
服務端接收到握手消息后把ack和自己的syn一同發送給客戶端,這是第二次握手,
當客戶端接收到服務端發送來的第二次握手消息后,客戶端可以確認“服務端的收發能力OK,客戶端的收發能力OK”,但是服務端只能確認“客戶端的發送OK,服務端的接收OK”,
所以還需要第三次握手,客戶端收到服務端的第二次握手消息后,發起第三次握手消息,服務端收到客戶端發送的第三次握手消息后,就能夠確定“服務端的發送OK,客戶端的接收OK”,
至此,客戶端和服務端都能夠確認自己和對方的收發能力OK,,tcp連接建立完成。