網絡編程中的connection reset by peer

 網絡開發中,常常遇到的一種異常錯誤是connection reset by peer。這種異常通常是調用的底層庫中拋出的,咱們開發應用程序的不會直接拋出。今天從底層簡單分析一下,這種錯誤的產生狀況。
       從socket底層來講,通常是連接雙方中一方給另外一方返回RST報文形成。那何時會產生RST報文呢?
       一、客戶端請求連接一個服務器進程沒有使用的端口,雖然此時服務器會給客戶端返回RST報文,但通常底層庫會將這種封裝爲「connection refused」錯誤拋出;
       二、鏈接雙方中的一方可使用RST報文來異常關閉一個鏈接,具體狀況以下:
             2.1 客戶端發送過來m(m>0)個字節,可是服務器只接收了n(n<m)個字節後,就調用了close()函數,此時linux系統中              
                   的close函數,發送的是RST報文,而不是FIN報文;
             2.2 客戶端將SO_LINGER選項的l_onoff設置爲1, l_linger設置爲0,當客戶端調用close()函數關閉鏈接時,就會給服務器發
                   送RST報文;
       三、雙方已經創建鏈接,忽然有一方悄無聲息的「關閉」了鏈接,好比忽然斷電、拔掉網線後關機等等,若是此時另外一方不發送數據,是檢查不到對方已經關閉了(除非套接字設置keepalive選項)。此時「關閉」的一方再從新啓動,另外一方再發送數據,此時因爲以前忽然「關閉」的一方已經丟失原來的鏈接信息,就會給另外一方發送RST報文。linux

相關文章
相關標籤/搜索