TCP之異常關(guān)閉的意義
終止一個連接的正常方式是發(fā)送FIN,
TCP之異常關(guān)閉的意義
。在發(fā)送緩沖區(qū)中所有排隊數(shù)據(jù)都已發(fā)送之后才發(fā)送FIN,正常情況下沒有任何數(shù)據(jù)丟失。但我們有時也有可能發(fā)送一個RST報文段而不是FIN來中途關(guān)閉一個連接。這稱為異常關(guān)閉。
進程關(guān)閉socket的默認方式是正常關(guān)閉,如果需要異常關(guān)閉,利用SO_LINGER選項來控制。
異常關(guān)閉一個連接對應(yīng)用程序來說有兩個優(yōu)點:
(1)丟棄任何待發(fā)的已經(jīng)無意義的數(shù)據(jù),并立即發(fā)送RST報文段;
(2)RST的接收方利用關(guān)閉方式來區(qū)分另一端執(zhí)行的是異常關(guān)閉還是正常關(guān)閉,
電腦資料
《TCP之異常關(guān)閉的意義》(http://www.msguai.com)。值得注意的是RST報文段不會導(dǎo)致另一端產(chǎn)生任何響應(yīng),另一端根本不進行確認。收到RST的一方將終止該連接。程序行為如下:
阻塞模型下,內(nèi)核無法主動通知應(yīng)用層出錯,只有應(yīng)用層主動調(diào)用read()或者write()這樣的IO系統(tǒng)調(diào)用時,內(nèi)核才會利用出錯來通知應(yīng)用層對端RST。
非阻塞模型下,select或者epoll會返回sockfd可讀,應(yīng)用層對其進行讀取時,read()會報錯RST。
haproxy的實現(xiàn)中用到了這個選項。