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