您好,登錄后才能下訂單哦!
這篇文章將為大家詳細講解有關如何解決ConnectionError的問題,小編覺得挺實用的,因此分享給大家做個參考,希望大家閱讀完這篇文章后可以有所收獲。
如何解決ConnectionError
例如我們線上的網關日志就會拋該錯誤:
155739_bWFp_1990220.png
從日志中可以看到是Socket套接字在read數據時拋出了該錯誤。
導致“Connectionreset”的原因是服務器端因為某種原因關閉了Connection,而客戶端依然在讀寫數據,此時服務器會返回復位標志“RST”,然后此時客戶端就會提示“java.net.SocketException:Connectionreset”。
可能有同學對復位標志“RST”還不太了解,這里簡單解釋一下:
TCP建立連接時需要三次握手,在釋放連接需要四次揮手;例如三次握手的過程如下:
第一次握手:客戶端發送syn包(syn=j)到服務器,并進入SYN_SENT狀態,等待服務器確認;
第二次握手:服務器收到syn包,并會確認客戶的SYN(ack=j+1),同時自己也發送一個SYN包(syn=k),即SYN+ACK包,此時服務器進入SYN_RECV狀態;
第三次握手:客戶端收到服務器的SYN+ACK包,向服務器發送確認包ACK(ack=k+1),此包發送完畢,客戶端和服務器進入ESTABLISHED(TCP連接成功)狀態,完成三次握手。
可以看到握手時會在客戶端和服務器之間傳遞一些TCP頭信息,比如ACK標志、SYN標志以及揮手時的FIN標志等。
除了以上這些常見的標志頭信息,還有另外一些標志頭信息,比如推標志PSH、復位標志RST等。其中復位標志RST的作用就是“復位相應的TCP連接”。
Connectionreset異常的一種解決辦法
最近壓測時,服務端系統出現了“Connectionreset”的異常,原因是服務器關閉了Connection[調用了Socket.close()方法]。當檢查了應用中沒有顯示關閉的鏈接的代碼后,調系統內核的參數后壓測再無報錯:
a.進入:vim/etc/sysctl.conf
b.添加:net.core.somaxconn=2048該參數默認為128,根據實際場景調大
c.執行sysctl-p命令
d.(可選)查看sysctl-a|grepsomaxconn
關于“如何解決ConnectionError的問題”這篇文章就分享到這里了,希望以上內容可以對大家有一定的幫助,使各位可以學到更多知識,如果覺得文章不錯,請把它分享出去讓更多的人看到。
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。