socket中TCP的三次握手建立連接詳解
我們知道tcp建立連接要進(jìn)行“三次握手”梳虽,即交換三個(gè)分組末贾。大致流程如下:
- 客戶端向服務(wù)器發(fā)送一個(gè)SYN J
- 服務(wù)器向客戶端響應(yīng)一個(gè)SYN K憔辫,并對(duì)SYN J進(jìn)行確認(rèn)ACK J+1
- 客戶端再想服務(wù)器發(fā)一個(gè)確認(rèn)ACK K+1
只有就完了三次握手,但是這個(gè)三次握手發(fā)生在socket的那幾個(gè)函數(shù)中呢?請(qǐng)看下圖:
socket中發(fā)送的TCP三次握手
從圖中可以看出,當(dāng)客戶端調(diào)用connect時(shí)析恋,觸發(fā)了連接請(qǐng)求,向服務(wù)器發(fā)送了SYN J包盛卡,這時(shí)connect進(jìn)入阻塞狀態(tài)助隧;服務(wù)器監(jiān)聽(tīng)到連接請(qǐng)求,即收到SYN J包滑沧,調(diào)用accept函 數(shù)接收請(qǐng)求向客戶端發(fā)送SYN K 并村,ACK J+1,這時(shí)accept進(jìn)入阻塞狀態(tài)滓技;客戶端收到服務(wù)器的SYN K 哩牍,ACK J+1之后,這時(shí)connect返回令漂,并對(duì)SYN K進(jìn)行確認(rèn)膝昆;服務(wù)器收到ACK K+1時(shí),accept返回洗显,至此三次握手完畢外潜,連接建立。
總結(jié):客戶端的connect在三次握手的第二個(gè)次返回挠唆,而服務(wù)器端的accept在三次握手的第三次返回。
socket中TCP的四次握手釋放連接詳解
上面介紹了socket中TCP的三次握手建立過(guò)程嘱吗,及其涉及的socket函數(shù)⌒椋現(xiàn)在我們介紹socket中的四次握手釋放連接的過(guò)程滔驾,請(qǐng)看下圖:
socket中發(fā)送的TCP四次握手
圖示過(guò)程如下:
某個(gè)應(yīng)用進(jìn)程首先調(diào)用close主動(dòng)關(guān)閉連接,這時(shí)TCP發(fā)送一個(gè)FIN M俄讹;
另一端接收到FIN M之后哆致,執(zhí)行被動(dòng)關(guān)閉,對(duì)這個(gè)FIN進(jìn)行確認(rèn)患膛。它的接收也作為文件結(jié)束符傳遞給應(yīng)用進(jìn)程摊阀,因?yàn)镕IN的接收意味著應(yīng)用進(jìn)程在相應(yīng)的連接上再也接收不到額外數(shù)據(jù);
一段時(shí)間之后踪蹬,接收到文件結(jié)束符的應(yīng)用進(jìn)程調(diào)用close關(guān)閉它的socket胞此。這導(dǎo)致它的TCP也發(fā)送一個(gè)FIN N;
接收到這個(gè)FIN的源發(fā)送端TCP對(duì)它進(jìn)行確認(rèn)跃捣。
這樣每個(gè)方向上都有一個(gè)FIN和ACK漱牵。