幾個常見的 Socket 連線錯誤及原因

2021-07-27 09:41:51 字數 1971 閱讀 9150

**

下面列出了幾個在客戶與服務程序連線中常見的幾個 socket 錯誤,並分析了原因。後續再逐漸補充吧。

該錯誤被描述為「software caused connection abort」,即「軟體引起的連線中止」。原因在於當服務和客戶程序在完成用於 tcp 連線的「三次握手」後,客戶 tcp 卻傳送了乙個 rst (復位)分節,在服務程序看來,就在該連線已由 tcp 排隊,等著服務程序呼叫 accept 的時候 rst 卻到達了。posix 規定此時的 errno 值必須 econnaborted。源自 berkeley 的實現完全在核心中處理中止的連線,服務程序將永遠不知道該中止的發生。伺服器程序一般可以忽略該錯誤,直接再次呼叫accept。

accept(2) man page 寫道

[econnaborted] a connection arrived, but it was closed while waiting on the listen queue.

該錯誤被描述為「connection reset by peer」,即「對方復位連線」,這種情況一般發生在服務程序較客戶程序提前終止。當服務程序終止時會向客戶 tcp 傳送 fin 分節,客戶 tcp 回應 ack,服務 tcp 將轉入 fin_wait2 狀態。此時如果客戶程序沒有處理該 fin (如阻塞在其它呼叫上而沒有關閉 socket 時),則客戶 tcp 將處於 close_wait 狀態。當客戶程序再次向 fin_wait2 狀態的服務 tcp 傳送資料時,則服務 tcp 將立刻響應 rst。一般來說,這種情況還可以會引發另外的應用程式異常,客戶程序在傳送完資料後,往往會等待從網路io接收資料,很典型的如 read 或 readline 呼叫,此時由於執行時序的原因,如果該呼叫發生在 rst 分節收到前執行的話,那麼結果是客戶程序會得到乙個非預期的 eof 錯誤。此時一般會輸出「server terminated prematurely」-「伺服器過早終止」錯誤。

錯誤被描述為「broken pipe」,即「管道破裂」,這種情況一般發生在客戶程序不理會(或未及時處理)socket 錯誤,繼續向服務 tcp 寫入更多資料時,核心將向客戶程序傳送 sigpipe 訊號,該訊號缺省會使程序終止(此時該前台程序未進行 core dump)。結合上邊的 econnreset 錯誤可知,向乙個 fin_wait2 狀態的服務 tcp(已 ack 響應 fin 分節)寫入資料不成問題,但是寫乙個已接收了 rst 的 socket 則是乙個錯誤。

錯誤被描述為「connect time out」,即「連線超時」,這種情況一般發生在伺服器主機崩潰。此時客戶 tcp 將在一定時間內(依具體實現)持續重發資料分節,試圖從服務 tcp 獲得乙個 ack 分節。當最終放棄嘗試後(此時伺服器未重新啟動),核心將會向客戶程序返回 etimedout 錯誤。如果某個中間路由器判定該伺服器主機已經不可達,則一般會響應「destination unreachable」-「目的地不可達」的icmp訊息,相應的客戶程序返回的錯誤是 ehostunreach 或enetunreach。當伺服器重新啟動後,由於 tcp 狀態丟失,之前所有的連線資訊也不存在了,此時對於客戶端發來請求將回應 rst。如果客戶程序對檢測伺服器主機是否崩潰很有必要,要求即使客戶程序不主動傳送資料也能檢測出來,那麼需要使用其它技術,如配置 so_keepalive socket 選項,或實現某些心跳函式。

該錯誤不是乙個 socket 連線相關的錯誤。errno 給出該值可能由於,通過 getsockopt 系統呼叫來獲得乙個套接字的當前選項狀態時,如果發現了系統不支援的選項引數就會引發該錯誤。

一定要檢查 write 方法的返回值,尤其是服務端程式,當返回 -1 的時候很有可能是「connection reset by peer」(econnreset 104)。如果服務程式沒有處理 sigpipe 訊號的話,第二次程式在這條已經 close 的 socket 再次 write 時 sigpipe 訊號就傳送到 socket 關聯的 owen 程序,也就是上面說的管道破裂,而該訊號的預設處理是結束程序。今天不小心又因為這個浪費了兩小時,在客戶程式連續通訊的時候,直接結束客戶程序就造成服 務程序也同時退出。開來還是太粗心。

REST的幾個常見錯誤

過去幾年我的工作和學習一直圍繞restful api,我在不同的專案和社群中見過很多相同的錯誤,於是我就決定,將我在網上讀到的和我自身的經驗整理一下。下面這些,是常見的一些設計錯誤 解釋以及例子。你的uri沒有反應相應資源的用途。restful的api是基於資源的,當我們設計uri的時候,要時刻銘記...

Socket 連線錯誤及原因

econnaborted 該錯誤被描述為 software caused connection abort 即 軟體引起的連線中止 原因在於當服務和客戶程序在完成用於 tcp 連線的 三次握手 後,客戶 tcp 卻傳送了乙個 rst 復位 分節,在服務程序看來,就在該連線已由 tcp 排隊,等著服務...

幾個常見的雲配置錯誤

毫無疑問,雲計算可以改善安全性的某些方面。畢竟,雲計算具有巨大的規模經濟,可為客戶提供專用的安全團隊和技術,而這對於絕大多數組織而言都是不可行的。當客戶沒有在雲計算環境中正確配置和保護自己的工作負載和儲存桶時,就會發生壞訊息。保證資料在雲中安全是企業與雲計算 產商共同的責任。而雲計算安全措施是雲計算...