內容:記錄tcp連線異常關閉的幾種情況
一、伺服器程序異常終止:
服務程序提前終止了,系統進行程序善後處理:將所有開啟的檔案描述符關閉,這導致傳送fin給
客戶端,客戶端tcp響應ack。客戶端此時正阻塞在輸入io函式,這導致客戶端不知道服務端tcp已經
關閉連線。客戶端在接收輸入的io呼叫返回後呼叫write向服務端發資料,由於服務端已經終止,
所以服務端tcp會傳送乙個rst給客戶端tcp。如果客戶端在傳送完資料後立即呼叫read讀取資料,由於
有第一步的fin,read立即返回0
(表示eof
),便知道連線已經終止了。但是如果客戶端沒有呼叫read,
那麼此時是不知道服務端已經終止,也不知道這個連線現在處於什麼狀態;繼續往服務端發資料,此時
將會收到sigpipe訊號,若沒有設定處理方法,那麼會異常終止。原因:向接收到rst的套介面寫資料
都會收到此訊號.
問題的本質 :客戶端同時處理兩個描述字--套介面和使用者輸入,程式被單純地阻塞在乙個源上
解決方法:為阻塞io設定超時
二、伺服器主機奔潰: 關閉TCP連線的學問
從tcp協議角度來看,乙個已建立的tcp連線有兩種關閉方式,一種是正常關閉,即四次揮手關閉連線 還有一種則是異常關閉,我們通常稱之為連線重置 reset 首先說一下正常關閉時四次揮手的狀態變遷,關閉連線的主動方狀態變遷是fin wait 1 fin wait 2 time wait,而關閉連線的被動...
關閉TCP連線的學問
從tcp協議角度來看,乙個已建立的tcp連線有兩種關閉方式,一種是正常關閉,即四次揮手關閉連線 還有一種則是異常關閉,我們通常稱之為連線重置 reset 首先說一下正常關閉時四次揮手的狀態變遷,關閉連線的主動方狀態變遷是fin wait 1 fin wait 2 time wait,而關閉連線的被動...
關閉TCP連線的學問
從tcp協議角度來看,乙個已建立的tcp連線有兩種關閉方式,一種是正常關閉,即四次揮手關閉連線 還有一種則是異常關閉,我們通常稱之為連線重置 reset 首先說一下正常關閉時四次揮手的狀態變遷,關閉連線的主動方狀態變遷是fin wait 1 fin wait 2 time wait,而關閉連線的被動...