Tcp 連線,Socket異常

2022-01-12 14:16:00 字數 1165 閱讀 4109

背景:前些天團隊在進行終端裝置和伺服器端長連線業務的測試時,發現了這麼乙個情況:在拔掉裝置端的網線後,再插上網線,有時可以繼續正常的進行長接連請求,而且用的還是拔掉網線之前的那個長連線。但是有時卻不能繼續正常的長連線請求,需要重新建立乙個新的長連線。讓我尤感詫異的是第一種網線斷開再插上後長連線可以恢復的情況,徹底顛覆了我一直抱有的乙個所謂的「物理連線」的觀念。究竟怎麼回事,我們來探個究竟。

首先說說我自己發明的「物理連線」這個名詞,不管怎麼說我都是乙個網路程式設計的"老手"。經常會給新人和其他有問題諮詢我的同事灌輸乙個觀念,只要網線拔掉了,說明物理連線都斷了,更別提邏輯上的tcp長連線,再插上網線也只能再建立乙個新的連線來繼續進行請求。我做個簡單的比喻:我理解的tcp長連線好比以前我們用的有線**,甲和乙通話的過程中,倘若其中一人的**線被拔掉了,連線就徹底斷了。即使再插上**線也不可能自動恢復通話,我們不得不重新撥通。

發現了插上網線後連線還會恢復的情況,我起初以為是簡單的tcp套接字復用的情況,但是發現裝置端並未編寫自動重連的邏輯,這就太讓我好奇和疑慮了。於是我找了乙個同事配合我進行了多次測試,發現了拔掉網線後針對此tcp長連線可能會出現的 兩種情況。

首先做下鋪墊,做過網路程式設計的朋友應該都知道這麼乙個情況

當客戶端與伺服器建立起正常的tcp連線後,如果客戶主機網線斷開、電源掉電、或系統崩潰,伺服器程序將永遠不會知道(通過我們常用的select,epoll監測不到斷開或錯誤事件),如果不主動處理或重啟系統的話對於服務端來說會一直維持著這個連線,任憑服務端程序如何望穿秋水,也永遠再等不到客戶端的任何回應。這種情況就是半開連線,浪費了伺服器端可用的檔案描述符。

說明網線斷開對端是不能做任何感知的,除非我們配置作業系統的so_keepalive選項,或者進行應用層心跳檢測。請參考文章《網路程式設計釋疑之:tcp半開連線的處理》。

如果網線斷開的時間短暫,在so_keepalive設定的探測時間間隔內,並且兩端在此期間沒有任何針對此長連線的網路操作。當連上網線後此tcp連線可以自動恢復,繼續進行正常的網路操作。

如果網線斷開的時間很長,超出了so_keepalive設定的探測時間間隔,或者兩端期間在此有了任何針對此長連線的網路操作。當連上網線時就會出現etimedout或者econnreset的錯誤。你必須重新建立乙個新的長連線進行網路操作。

這件事後,我再也不敢隨便發明名詞了,嗚嗚......

Tcp 連線,Socket異常

背景 前些天團隊在進行終端裝置和伺服器端長連線業務的測試時,發現了這麼乙個情況 在拔掉裝置端的網線後,再插上網線,有時可以繼續正常的進行長接連請求,而且用的還是拔掉網線之前的那個長連線。但是有時卻不能繼續正常的長連線請求,需要重新建立乙個新的長連線。讓我尤感詫異的是第一種網線斷開再插上後長連線可以恢...

TCP連線 Http連線與Socket連線

網路由下往上分為 物理層 資料鏈路層 網路層 傳輸層 會話層 表示層和應用層。通過初步的了解,我知道ip協議對應於網路層,tcp協議對應於傳輸層,而http協議對應於應用層,三者從本質上來說沒有可比性,socket則是對tcp ip協議的封裝和應用 程式設計師層面上 也可以說,tpc ip協議是傳輸...

socket連線和TCP連線的關係

我們在傳輸資料時,可以只使用 傳輸層 tcp ip協議,但是那樣的話,如果沒有應用層,便無法識別資料內容,如果想要使傳輸的資料有意義,則必須使用到應用層協議,應用層協議有很多,比如http ftp telnet等,也可以自己定義應用層協議。web使用http協議作應用層協議,以封裝http文字資訊,...