netty: Ursache für das Zurücksetzen der Verbindung

Verbindung zurücksetzen

Der Server schließt aus irgendeinem Grund die Verbindung, aber der Client liest und schreibt weiterhin Daten. Zu diesem Zeitpunkt gibt der Server das Reset-Flag „RST“ zurück und der Client fordert dann „java.net.SocketException: Verbindung zurückgesetzt“ auf. .

Ausnahmebeschreibung

java.net.SocketException: (Verbindung zurückgesetzt oder Verbindung durch Peer zurückgesetzt: Socket-Schreibfehler)。

  1. Diese Ausnahme kann sowohl auf der Client- als auch auf der Serverseite auftreten. Es gibt zwei Gründe für diese Ausnahme.
  2. Das erste ist, dass, wenn der Socket an einem Ende geschlossen ist (oder aufgrund eines abnormalen Ausgangs aktiv geschlossen oder geschlossen wird), das andere Ende weiterhin Daten sendet und das erste gesendete Datenpaket die Ausnahme auslöst (Connect-Reset durch Peer).
  3. Das andere Ende besteht darin, dass ein Ende beendet wird, die Verbindung jedoch beim Beenden nicht geschlossen wird. Wenn das andere Ende Daten aus der Verbindung liest, wird diese Ausnahme ausgelöst (Verbindung zurückgesetzt). 简单的说就是在连接断开后的读和写操作引起的.

TCP erfordert beim Verbindungsaufbau drei Handshakes

Der erste Handshake: Der Client sendet ein Syn-Paket (syn = j) an den Server, wechselt in den Status SYN_SENT und wartet auf die Bestätigung vom Server.

Zweiter Handshake: Der Server empfängt das Syn-Paket und bestätigt das SYN des Clients (ack=j+1). Gleichzeitig sendet er auch ein SYN-Paket (syn=k), also ein SYN+ACK-Paket. Zu diesem Zeitpunkt , der Server wechselt in den SYN_RECV-Status. ;

Der dritte Handshake: Der Client empfängt das SYN + ACK-Paket vom Server und sendet ein Bestätigungspaket ACK (ack = k + 1) an den Server. Nachdem das Paket gesendet wurde, geben der Client und der Server den Status ESTABLISHED (TCP-Verbindung erfolgreich) ein ) Zustand, abgeschlossen dreimal Hände schütteln.

Zusätzlich zu den oben genannten allgemeinen Flag-Header-Informationen gibt es weitere Flag-Header-Informationen, wie z. B. Push-Flag PSH, Reset-Flag RST usw. Die Funktion des Reset-Flags RST besteht darin, „die entsprechende TCP-Verbindung zurückzusetzen“.

Grund 1

服务器关闭了Connection为什么会返回“RST”而不是返回“FIN”标志

  1. Der Grund dafür ist, dass sich die Semantik der Socket.close()-Methode von der Semantik des TCP-Flags „FIN“ unterscheidet:Das Senden des TCP-Flags „FIN“ bedeutet, dass ich es tun werde keine Daten mehr senden< /span>Socket.close()表示我不在发送也不接受数据了. und
  2. Das Problem liegt in „Ich akzeptiere keine Daten“. Wenn der Client zu diesem Zeitpunkt noch Daten an den Server sendet, empfängt der Serverkern die Daten, stellt jedoch fest, dass der Socket zu diesem Zeitpunkt geschlossen wurde,< /span>. 则会返回“RST”标志给客户端。Natürlich此时客户端就会提示:“Connection reset”

Ausführliche Anweisungen finden Sie in den relevanten Dokumenten von Oracle:http://docs.oracle.com/javase/1.5.0/docs/guide/net/articles/connection_release .html

Referenzblog

Lösung

Das Problem, auf das ich gestoßen bin, wurde durch das Netzwerk verursacht. Diese Situation ist auf plötzliche Änderungen im Netzwerk zurückzuführen.
Ich habe online gesucht und festgestellt, dass es drei Lösungen gibt:< a i =2>Quelle

  1. Wenn etwas schief geht, versuchen Sie es erneut.
  2. Der Client und der Server verwenden einheitlich lange TCP-Verbindungen.
  3. Client und Server nutzen einheitlich TCP-Kurzverbindungen.

Dieser Blog erklärt sehr klar und erklärt, wie Protokolle analysiert werden. Sie können sich darauf beziehen:https://www.cnblogs.com/shoren/p/httpclient-connectionreset.html

Guess you like

Origin blog.csdn.net/yyuggjggg/article/details/127857755