Connection reset原因分析和解決方案

導致“Connection reset”的原因是服務器端因爲某種原因關閉了Connection**,而客戶端依然在讀寫數據,此時服務器會返回復位標誌“RST”,然後此時客戶端就會提示“java.net.SocketException: Connection reset”。
可能有同學對復位標誌“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標誌等。

前面談到了導致“Connection reset”的原因,而具體的解決方案有如下幾種:
1、出錯了重試;
2、客戶端和服務器統一使用TCP長連接;
3、客戶端和服務器統一使用TCP短連接。

除了以上這些常見的標誌頭信息,還有另外一些標誌頭信息,比如推標誌PSH、復位標誌RST等。
其中復位標誌RST的作用就是“復位相應的TCP連接”。

參考資料
Connection reset by peer的常見原因
https://blog.51cto.com/hope1/1880049

Connection reset原因分析和解決方案
https://my.oschina.net/xionghui/blog/508758

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章