咱們知道tcp創建鏈接要進行「三次握手」,即交換三個分組。大體流程以下:服務器
一、客戶端向服務器發送一個SYN Jsocket
二、服務器向客戶端響應一個SYN K,並對SYN J進行確認ACK J+1tcp
三、客戶端再想服務器發一個確認ACK K+1函數
只有就完了三次握手,可是這個三次握手發生在socket的那幾個函數中呢?請看下圖:spa
從圖中能夠看出,當客戶端調用connect時,觸發了鏈接請求,向服務器發送了SYN J包,這時connect進入阻塞狀態;服務器監聽到鏈接請求,即收到SYN J包,調用accept函數接收請求向客戶端發送SYN K ,ACK J+1,這時accept進入阻塞狀態;客戶端收到服務器的SYN K ,ACK J+1以後,這時connect返回,並對SYN K進行確認;服務器收到ACK K+1時,accept返回,至此三次握手完畢,鏈接創建。進程
總結:客戶端的connect在三次握手的第二個次返回,而服務器端的accept在三次握手的第三次返回。服務器端
如今咱們介紹socket中的四次握手釋放鏈接的過程,請看下圖:請求
圖示過程以下:im
某個應用進程首先調用close主動關閉鏈接,這時TCP發送一個FIN M;總結
另外一端接收到FIN M以後,執行被動關閉,對這個FIN進行確認。它的接收也做爲文件結束符傳遞給應用進程,由於FIN的接收意味着應用進程在相應的鏈接上再也接收不到額外數據;
一段時間以後,接收到文件結束符的應用進程調用close關閉它的socket。這致使它的TCP也發送一個FIN N;
接收到這個FIN的源發送端TCP對它進行確認。
這樣每一個方向上都有一個FIN和ACK。