tcp之異常關閉的意義
終止乙個連線的正常方式是傳送fin。在傳送緩衝區中所有排隊資料都已傳送之後才傳送fin,正常情況下沒有任何資料丟失。
但我們有時也有可能傳送乙個rst報文段而不是fin來中途關閉乙個連線。這稱為異常關閉。
程序關閉socket的預設方式是正常關閉,如果需要異常關閉,利用so_linger選項來控制。
異常關閉乙個連線對應用程式來說有兩個優點:
(1)丟棄任何待發的已經無意義的資料,並立即傳送rst報文段;
(2)rst的接收方利用關閉方式來區分另一端執行的是異常關閉還是正常關閉。
值得注意的是rst報文段不會導致另一端產生任何響應,另一端根本不進行確認。收到rst的一方將終止該連線。程式行為如下:
阻塞模型下,核心無法主動通知應用層出錯,只有應用層主動呼叫read()或者write()這樣的io系統呼叫時,核心才會利用出錯來通知應用層對端rst。
非阻塞模型下,select或者epoll會返回sockfd可讀,應用層對其進行讀取時,read()會報錯rst。
haproxy的實現中用到了這個選項。
異常謎題之關閉流
static void copy string src,string dest throws ioexception finally 上面這個方法會不會出現意外?會!問題就在close方法上面,如果in.close方法出現異常,下面的根本就沒法執行了。所以改正如下 finally catch ioe...
TCP之種種連線異常
1.connect出錯 1 若tcp客戶端沒有收到syn分節的響應,則返回etimeout錯誤 呼叫connect函式時,核心傳送乙個syn,若無響應則等待6s後再傳送乙個,若仍然無響應則等待24s後在傳送乙個,若總共等待75s後仍未收到響應則返回本錯誤 2 若對客戶的syn響應是rst,則表明該伺...
TCP之種種連線異常
1.connect出錯 1 若tcp客戶端沒有收到syn分節的響應,則返回etimeout錯誤 呼叫connect函式時,核心傳送乙個syn,若無響應則等待6s後再傳送乙個,若仍然無響應則等待24s後在傳送乙個,若總共等待75s後仍未收到響應則返回本錯誤 2 若對客戶的syn響應是rst,則表明該伺...