TCP連線意外中斷

2021-09-25 06:20:47 字數 1839 閱讀 1925

如何及時有效地檢測到一方的非正常斷開,一直有兩種技術可以運用。一種是由tcp協議層實現的keepalive,另一種是由應用層自己實現的心跳包。tcp預設並不開啟keepalive功能,因為開啟keepalive功能需要消耗額外的寬頻和流量

建立連線以後用kill殺死伺服器程序,作為程序終止處理的部分工作,子程序中所有開啟著的描述字都被關閉。這就導致向客戶傳送乙個fin,而客戶tcp則響應以乙個ack。這就是tcp連線終止的前一半工作。

此時客戶端程序處於fin_wait2狀態,客戶端處於close_wait狀態。當客戶端再向伺服器傳送資料時,由於伺服器開啟的套接字埠已經終止,則響應乙個rst給客戶端。

1:當伺服器主機崩潰時,已有的網路連線上發不出任何東西。這裡我們假設的是主機崩潰,而不是執行了關機命令。

2:我們在客戶上輸入一行文字,它由write寫入核心,再由客戶tcp作為乙個資料分節送出。客戶隨後阻塞於read呼叫,等待伺服器的應答。

3:這種情況下,客戶tcp持續重傳資料分節,試圖從伺服器上接受乙個ack。(源自berkeley的實現重傳該資料分節12次,共等待約9分鐘才放棄重傳。)當客戶tcp最終放棄時(假設這段時間內,伺服器主機沒有重新啟動或者如果是伺服器主機為崩潰但從網路上不可達的情況,那麼假設主機仍然不可達),返回客戶程序乙個錯誤。既然客戶阻塞在readline呼叫上,該呼叫將返回乙個錯誤。假設伺服器已崩潰,從而對客戶的資料分節根本沒有響應,那麼所返回的錯誤是etimedout。然而如果某個中間路由器判定伺服器主機已不可達,從而響應以乙個「destination unreachable」,那麼所返回的錯誤是ehostunreach或enetunreach。

另外我們剛討論的情形只有在向伺服器主機傳送資料時,才能檢測出它已經崩潰,如果我們不主動傳送主句也想檢測出伺服器主機的崩潰,那麼就需要用到so_keepalive這個套介面選項。

so_keepalive 保持連線檢測對方主機是否崩潰,避免(伺服器)永遠阻塞於tcp連線的輸入。設定該選項後,如果2小時內在此套介面的任一方向都沒有資料交換,tcp就自動給對方 發乙個保持存活探測分節(keepalive probe)。這是乙個對方必須響應的tcp分節.它會導致以下三種情況:對方接收一切正常:以期望的ack響應。2小時後,tcp將發出另乙個探測分節。對方已崩潰且已重新啟動:以rst響應。套介面的待處理錯誤被置為econnreset,套接 口本身則被關閉。對方無任何響應:源自berkeley的tcp傳送另外8個探測分節,相隔75秒乙個,試圖得到乙個響應。在發出第乙個探測分節11分鐘15秒後若仍無響應就放棄。套介面的待處理錯誤被置為etimeout,套介面本身則被關閉。如icmp錯誤是「host unreachable(主機不可達)」,說明對方主機並沒有崩潰,但是不可達,這種情況下待處理錯誤被置為 ehostunreach。

在前一節的分析中,當我們傳送資料時,伺服器主機仍然處於崩潰狀態;這節,我們將在傳送資料前重新啟動崩潰了的伺服器主機。模擬這種情況的簡單方法就是:建立連線,再從網路上埠伺服器主機,將它關機後再重啟,最後把它重新連線到網路中。

當伺服器主機崩潰後重啟時,它的tcp丟失了崩潰前的所有連線資訊,因此伺服器tcp對於所收到的來自客戶的資料分節響應以乙個rst。當客戶tcp收到該rst時,客戶正阻塞於read呼叫,導致該呼叫返回econnreset錯誤。

unix系統關機時,init程序通常先給所有程序傳送sigterm訊號(該訊號可**獲),再等待一段固定的時間(一般在5~20秒之間),然後給所有仍在執行的程序傳送sigkill訊號(該訊號不能**獲)。這麼做是留給所有執行中的程序一小段時間來清除和終止。如果我們不捕獲sigterm訊號並終止,我們的伺服器將由sigkill訊號終止。當伺服器程序終止時,它的所有開啟著的描述字都被關閉,隨後發生的步驟與第一節中討論過的一樣。正如第一節中所述的情形,我們必須在客戶中使用select或poll函式,使得伺服器程序的終止已經發生,客戶馬上檢測到。

svn 意外中斷

在遇到svn提交時候意外中斷的情況下,下次提交會被鎖住,提示進行clean up 在專案上右鍵也提示svn cleanup failed previous operation has not finished run cleanup if it was interrupted,死迴圈 解決方式 1 ...

TCP連線被意外重置的原因

今天在做伺服器壓力測試的時候,出現了很奇怪的情況,與伺服器建立連線會成功,但是很快會被重置 reset 掉。花了半天時間,終於找到原因所在,我把過程和結果寫下來與大家分享。伺服器正常邏輯是 接受連線,等待使用者註冊報文,處理其他請求,如果連線一段時間沒有活動,則主動關閉連線。客戶端邏輯是 與伺服器建...

oracle連線中斷

tns 00505 operation timed out tns 12535 tns operation timed out nt secondary err code 110 ns secondary err code 12560 nt os err code 0 nt main err cod...