Einzelnen Beitrag anzeigen

idontknow

Registriert seit: 21. Apr 2008
Ort: Schleswig-Holstein
60 Beiträge
 
Delphi 11 Alexandria
 
#1

Stabile TCP-Verbindung mit ICS, ich kriegs nicht hin...

  Alt 13. Aug 2020, 14:29
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
Angehängte Dateien
Dateityp: 7z Test Overbyte ISC Client und Server.7z (1,08 MB, 9x aufgerufen)
Oliver
  Mit Zitat antworten Zitat