A.TCP建立連接要進行"三次握手",也就是交換三個分組。大致流程如下:
>客戶端向服務器發送一個SYN J
>服務器向客戶端響應一個SYN K,並對SYN J進行確認ACK J+1
>客戶端再向服務器發一個確認ACK K+1
當客戶端調用connect時,觸發連接請求,向服務器發送了SYN J包,這時候connect進入阻塞狀態(等待服務器回復應答);
服務器監聽到連接請求,也就是收到了SYN J包,服務器調用accept函數接收請求向客戶端發送SYN K,ACK+1,這時accept進入阻塞狀態;
客戶端收到服務器的SYN K,ACK J+1之后,這時connect返回,並對SYN K進行確認;
服務器接收到ACK K+1時,accept返回,至此三次握手完畢,連接建立
總結:客戶端的connect在三次握手的第二次返回,而服務器端的accept在三次握手的第三次返回
三次握手發生的時間點就是在客戶端與服務器端建立連接的時候發生的
B.socket中TCP的四次握手釋放連接詳解
前提一定客戶端的進程與服務器端的進程建立了連接(這話說的比較多余--!)
>某個應用進程首先調用close主動關閉連接,這時候這個應用程序的一側發送FIN M包;
>另一端接收到FIN M之后,執行被動關閉,對這個FIN進行確認。它的接收也作為文件結束符傳遞給應用進程,因為FIN的接收意味着應用進程在相應的連接上再也接收不到額外數據;同事會回復一個ACK M+1
>一段時間之后,接收到文件結束符的應用進程調用close關閉它的socket。這導致它的TCP也發送了一個FIN N;
>接收到這個FIN的源發送端TCP對其確認,確認后回復ACK N+1