原文地址:http://www.cnblogs.com/Jessy/p/3535612.htmlhtml
深刻理解TCP鏈接的釋放: 服務器
因爲TCP鏈接是全雙工的,所以每一個方向都必須單獨進行關閉。這原則是當一方完成它的數據發送任務後就能發送一個FIN來終止這個方向的鏈接。收到一個 FIN只意味着這一方向上沒有數據流動,一個TCP鏈接在收到一個FIN後仍能發送數據。首先進行關閉的一方將執行主動關閉,而另外一方執行被動關閉。
TCP協議的鏈接是全雙工鏈接,一個TCP鏈接存在雙向的讀寫通道。
簡單說來是 「先關讀,後關寫」,一共須要四個階段。以客戶機發起關閉鏈接爲例:
1.服務器讀通道關閉
2.客戶機寫通道關閉
3.客戶機讀通道關閉
4.服務器寫通道關閉
關閉行爲是在發起方數據發送完畢以後,給對方發出一個FIN(finish)數據段。直到接收到對方發送的FIN,且對方收到了接收確認ACK以後,雙方的數據通訊徹底結束,過程當中每次接收都須要返回確認數據段ACK。
詳細過程:
第一階段 客戶機發送完數據以後,向服務器發送一個FIN數據段,序列號爲i;
1.服務器收到FIN(i)後,返回確認段ACK,序列號爲i+1,關閉服務器讀通道;
2.客戶機收到ACK(i+1)後,關閉客戶機寫通道;
(此時,客戶機仍能經過讀通道讀取服務器的數據,服務器仍能經過寫通道寫數據)
第二階段 服務器發送完數據以後,向客戶機發送一個FIN數據段,序列號爲j;
3.客戶機收到FIN(j)後,返回確認段ACK,序列號爲j+1,關閉客戶機讀通道;
4.服務器收到ACK(j+1)後,關閉服務器寫通道。
這是標準的TCP關閉兩個階段,服務器和客戶機均可以發起關閉,徹底對稱。
FIN標識是經過發送最後一塊數據時設置的,標準的例子中,服務器還在發送數據,因此要等到發送完的時候,設置FIN(此時可稱爲TCP鏈接處於半關閉狀態,由於數據仍可從被動關閉一方向主動關閉方傳送)。若是在服務器收到FIN(i)時,已經沒有數據須要發送,能夠在返回ACK(i+1)的時候就設置FIN(j)標識,這樣就至關於能夠合併第二步和第三步。.net
https://blog.csdn.net/ctrl_qun/article/details/52518479htm