Hallo Community,
ich versuche seit letzter Woche einen TsslWSocket und einen TsslWSocketServer miteinander kommunizieren zu lassen.
Ziel ist eine langzeitstabile Verbindung zwischen einem
TCP-Client und einem
TCP-Server, die mit TLS1.3 abgesichert ist. Nach einigen Minuten Laufzeit bricht die Datenübertragung jedoch ab.
Es gibt einen ClientThread und einen ServerThread. In der jeweiligen Execute-Methode erzeuge ich den Socket und initialisiere ihn, rufe Listen (Server) bzw. Connect (Client) auf und lasse den Thread
dann die MessageLoop ausführen.
Nach erfolgreichem SSL-Handshake sendet mein Client 128KB große Datenpakete an den Server. Dort kommen sie auch an, TwSocketClient.onDataAvailable wird getriggert, die Bytes lassen sich dort mit TwSocketClient(Sender).Receive(pBuffer...) einlesen.
Wenn der Server 128KB empfangen hat, sende er ein ein "ACK"-Paket an den Client (Den AnsiString "ACK", 3 Bytes). Wenn der Client ein Paket empfängt, sendet dieser erneut 128KB Daten.
Dieses Spiel klappt einige tausend, manchmal auch einige zehntausend Male, bis dann TwSocketClient.onDataAvailable plötzlich nicht mehr aufgerufen wird. Es gibt kein OnSessionClosed, kein onError, kein onException und auch kein onBgException, daß auf ein Problem hindeuten würde.
Offenbar ist das Problem auf Client-Seite: Ein mitlaufendes Wireshark zeigt als letztes ein [ACK]-Paket vom Server zum Client. Weitere Clicks auf den "Manual Send"-Button führen zu keinen weiteren Zeilen im Wireshark Log.
Wenn dieser Zustand erreicht ist (eben nach etwa 4900 Paketen, beim Versuch zuvor nach etwa 590 Paketen) kann sich ein anderer Client problemlos mit dem Server verbinden.
Ich will nicht ausschliessen, daß der Fehler bei mir liegt, bzw. nehme das sogar an, ich habe aber überhaupt keine Idee, was ich falsch machen könnte...
Ist es vielleicht nicht ok, aus einem anderen Thread zu senden? Aber wie soll das sonst gehen, wenn der ClientThread nur noch die MessageLoop ausführt und somit selbst nicht senden kann?
Gleichzeitiges Web-Browsen führt schneller zum Problem. Wenn ich mir irgendwelche Webseiten anschaue dauert es meist keine halbe Minute bis zum Problem.
Anhängend ist mein Testprojekt. Mich würde mal interessieren, ob ihr dasselbe Problem beobachtet und ob jemand eine Vermutung hat, woran es liegen könnte...
Das Projekt ist vollständig, im
Win32-Ordner ist auch das zum Testen verwendete Zertifikat enthalten...
Benutzung: Eigene
IP-Adresse eingeben, auf den Button "btCreateStart" drücken, dann auf den Button "btSendData Manual Send". Im Programmverzeichnis wächst nun die Datei "logICStest.log" an, bis das Problem auftritt...
Schon mal vielen Dank im voraus...
P.S: Habe auch schon versucht, nicht nach dem Empfang des ACK-Pakets zu senden, sondern zyklisch per Timer oder Thread. Kann man beides im Testprojekt mit Checkboxen wählen, das Resultat ist das gleiche.
Das Problem tritt nicht nur bei TLS1.3 auf, auch mit TLS1.2. Ich glaube sogar, es taucht auch ohne Verschlüsselung auf, dauert nur länger...
Die verwendeten Versionen:
Delphi 10.4 Update 3, ICS 8.64, OpenSSL 1.1.1g