TCP-Handshake in i-Telex "kaputt"

Fachforen für Entwickler und Bastler
Benutzeravatar

Topic author
ProgBernie
Rank 5
Rank 5
Beiträge: 422
Registriert: Sa 27. Okt 2018, 17:51
Hauptanschluß: 898906 laeng d

TCP-Handshake in i-Telex "kaputt"

#1

Beitrag: # 19550Beitrag ProgBernie »

Moin,

nachdem ich den Bufferoverflow in i-Telex offenbar gefunden und behoben habe, will ich mir die defekte Implementierung des TCP-Handshakes beim Verbindungsabbau ansehen. Der Fehler tritt nur dann auf, wenn i-Telex die Verbindung schliesst, nicht im umgekehrten Fall.
Das ist auch der Grund warum die Webseiten der Karte so lahm sind, hier kommen nach meiner Analyse 2 Themen zusammen:

1. Der "Webserver" sendet "connection: close" im HTTP-Header mit, damit wird angezeigt daß nach diesem Element die Verbindung geschlossen wird und nicht über den gleichen socket weitere Daten ausgetauscht werden.
2. Der Webserver beendet dann nach Auslieferung eines Elementes die Verbindung durch senden von "FIN, ACK" (schliessen des sockets). Der Browser bestätigt mit ACK, beendet seinerseits die Verbindung durch schliesssen seines sockets und sendet damit seinerseits FIN, ACK, was der IP-Stack im i-Telex mit ACK zu bestätigen hat. Diese Bestätigung fehlt, sodaß clientseitig mehrere Retransmissions erfolgen bis der IP-Stack im i-Telex offenbar aufgibt und mit RST die Verbindung zwangsweise trennt.

Am ersten Punkt kann man nichts drehen, die Struktur ist mit Sicherheit nicht darauf ausgelegt, die Verbindung für mehrere Requests zu halten. Die Verzögerung dadurch ist wegen der relativ geringen Anzahl an Elementen auf den ausgelieferten Webseiten eher gering.
Der zweite Punkt führt zu langen Wartezeiten beim Aufbau der Seiten, denn es handelt sich hier um Zeiten im Bereich 15s. Gemessen dauert der Aufruf der Sartseite bis alles sich wieder beruhigt hat 25s, davon ist nur ein Teil am Browser für den Benutzer sichtbar, der Rest erfolgt im Hintergrund, blockiert aber Ressourcen.

Das gleiche tritt bei telnet auf und vermutlich auch beim i-Telex-Protokoll auf Port 134.
Folgende Benutzer bedankten sich beim Autor ProgBernie für den Beitrag (Insgesamt 2):
380170JFKBjoernS
Gruß Bernd
--
Fernschreibstelle Labenz
898906 laeng d
Benutzeravatar

FredSonnenrein
Founder
Founder
Beiträge: 2320
Registriert: Fr 3. Jun 2016, 13:49
Wohnort: Braunschweig
Hauptanschluß: 8579924 hawe d

Re: TCP-Handshake in i-Telex "kaputt"

#2

Beitrag: # 19551Beitrag FredSonnenrein »

Über dieses Problem bin ich bereits vor 8 Jahren gestolpert und habe mit extrem begrenztem Wissen (vorsichtig ausgedrückt) buxfixes versucht.
Die meisten davon sind mit // HACK Son gekennzeichnet. Möglicherweise habe ich manches verschlimmbessert.

An den Leser des Quellcodes von net/tcp.c und .h:
Das "OverflowTest" diente auch mal zum Erkennen von Puffer-Overflow...
Folgende Benutzer bedankten sich beim Autor FredSonnenrein für den Beitrag:
380170JFK
Grüße,
Fred Sonnenrein, Braunschweig
i-Telex 952741 (Lo133), 8579924 (T100s), 781272 (T100), 792911 (T68d) oder 531072 (T.typ.72)
Bei besetzt oder gestört bitte 531002 versuchen.
Benutzeravatar

Topic author
ProgBernie
Rank 5
Rank 5
Beiträge: 422
Registriert: Sa 27. Okt 2018, 17:51
Hauptanschluß: 898906 laeng d

Re: TCP-Handshake in i-Telex "kaputt"

#3

Beitrag: # 19563Beitrag ProgBernie »

Ich habe den bereits im chat von mir verdächtigten Teil jetzt mal probeweise eingebaut, das scheint sehr gut zu funktionieren. Jedenfalls kann ich jetzt viel weniger Protokollungereimtheiten ausmachen, das scheint die richtige Richtung zu sein. Auch sind die Seiten jetzt schneller abgerufen (wo vorher oft noch die Uhr drehte).

Auch hierfür meinen patch:

Code: Alles auswählen

diff --git a/system/net/tcp.c b/system/net/tcp.c
index 90f3309..2438603 100644
--- a/system/net/tcp.c
+++ b/system/net/tcp.c
@@ -33,6 +33,7 @@
 ///         (z.B. bei Abfrage von checkip.dyndns.com) noch auslesbar sind.
 /// \date	12-11-2012: Fred Sonnenrein: GetSocketData liefert vernünftigen Rückgabewert, wenn mehr Daten im Fifo als
 ///         im Puffer Platz sind.
+/// \date	15-07-2020: Bernd Laengerich: Korrektur TCP-Handshake Verbindungsabbau
 //****************************************************************************/
 /*
  *  This program is free software; you can redistribute it and/or modify
@@ -362,6 +363,15 @@ void tcp( int packet_lenght, char * ethernetbuffer)
 
 		if ( TCP_packet->TCP_ControllFlags == ( TCP_FIN_FLAG | TCP_ACK_FLAG) )
 		{
+			// 20201016 BLH fix missing ACK?
+			if ( TCP_sockettable[ socket ].ConnectionState == SOCKET_WAIT2FIN )
+			{
+				TCP_sockettable[ socket ].AcknowledgeNumber = ntohl ( TCP_packet->TCP_SequenceNumber ) + 1;
+				MakeTCPheader( socket, TCP_ACK_FLAG, 0 , ( MAX_RECIVEBUFFER_LENGHT - Get_Bytes_in_FIFO ( TCP_sockettable[ socket ].fifo ) ) , ethernetbuffer );
+				TCP_sockettable[ socket ].Timeoutcounter = 0 ;
+				TCP_sockettable[ socket ].ConnectionState = SOCKET_NOT_USE ;
+			}
+			// 20201016 BLH fix missing ACK?
 			if ( TCP_sockettable[ socket ].ConnectionState == SOCKET_WAIT2FINACK )
 			{
 				TCP_sockettable[ socket ].AcknowledgeNumber = ntohl ( TCP_packet->TCP_SequenceNumber ) + 1;
Das ganze sollte noch beobachtet werden, alle Browser und IP stacks verhalten sich leicht unterschiedlich und je nach Netzwerk kommen da auch noch unterschiedliche Zeiten hinzu, die ebenfalls verschiedenes Verhalten bewirken können.

Ich habe mich im code an den copy&paste-Stil gehalten, da sehr viele Teile exakt identisch sind und manchmal nur einzelne Zeilen unterschiedlich, könnte man den ganzen codeabschnitt deutlich kompakter schreiben, wenn man wenige Verzweigungen zulassen würde. Allerdings könnte der flache code um wenige Mikrosekunden schneller sein...
Gruß Bernd
--
Fernschreibstelle Labenz
898906 laeng d
Benutzeravatar

FredSonnenrein
Founder
Founder
Beiträge: 2320
Registriert: Fr 3. Jun 2016, 13:49
Wohnort: Braunschweig
Hauptanschluß: 8579924 hawe d

Re: TCP-Handshake in i-Telex "kaputt"

#4

Beitrag: # 19564Beitrag FredSonnenrein »

Ich habe Bernds Zuarbeit mal eingepflegt, wer mag kann sich die aktuelle Hex hier ziehen und auch mit Testen...

https://svn.code.sf.net/p/itelex/code-0/trunk/main.hex
Folgende Benutzer bedankten sich beim Autor FredSonnenrein für den Beitrag:
ProgBernie
Grüße,
Fred Sonnenrein, Braunschweig
i-Telex 952741 (Lo133), 8579924 (T100s), 781272 (T100), 792911 (T68d) oder 531072 (T.typ.72)
Bei besetzt oder gestört bitte 531002 versuchen.
Benutzeravatar

Topic author
ProgBernie
Rank 5
Rank 5
Beiträge: 422
Registriert: Sa 27. Okt 2018, 17:51
Hauptanschluß: 898906 laeng d

Re: TCP-Handshake in i-Telex "kaputt"

#5

Beitrag: # 19655Beitrag ProgBernie »

Fred,

hast Du die Version auch im Test? Kannst Du bzgl. der Webseiten etwas dazu sagen?
Gruß Bernd
--
Fernschreibstelle Labenz
898906 laeng d
Benutzeravatar

FredSonnenrein
Founder
Founder
Beiträge: 2320
Registriert: Fr 3. Jun 2016, 13:49
Wohnort: Braunschweig
Hauptanschluß: 8579924 hawe d

Re: TCP-Handshake in i-Telex "kaputt"

#6

Beitrag: # 19662Beitrag FredSonnenrein »

Ja, ich habe den Eindruck dass der Seitenaufbau jetzt "flüssiger" ist.
Grüße,
Fred Sonnenrein, Braunschweig
i-Telex 952741 (Lo133), 8579924 (T100s), 781272 (T100), 792911 (T68d) oder 531072 (T.typ.72)
Bei besetzt oder gestört bitte 531002 versuchen.
Benutzeravatar

Topic author
ProgBernie
Rank 5
Rank 5
Beiträge: 422
Registriert: Sa 27. Okt 2018, 17:51
Hauptanschluß: 898906 laeng d

Re: TCP-Handshake in i-Telex "kaputt"

#7

Beitrag: # 19666Beitrag ProgBernie »

Ok, zumindest keine Verschlechterung. Ich fürchte es gibt nicht viele weitere Tester die etwas dazu beitragen.
Gruß Bernd
--
Fernschreibstelle Labenz
898906 laeng d
Benutzeravatar

FredSonnenrein
Founder
Founder
Beiträge: 2320
Registriert: Fr 3. Jun 2016, 13:49
Wohnort: Braunschweig
Hauptanschluß: 8579924 hawe d

Re: TCP-Handshake in i-Telex "kaputt"

#8

Beitrag: # 19667Beitrag FredSonnenrein »

ProgBernie hat geschrieben: Di 21. Jul 2020, 12:13 Ok, zumindest keine Verschlechterung. Ich fürchte es gibt nicht viele weitere Tester die etwas dazu beitragen.
Wahrscheinlich weil kaum jemand diese technischen Details nachvollziehen möchte. Ich möchte auch zunächst in begrenzen Kreis testen, bevor ich bei solchen "tiefgehenden" Änderungen ins breite Feld streue.
Grüße,
Fred Sonnenrein, Braunschweig
i-Telex 952741 (Lo133), 8579924 (T100s), 781272 (T100), 792911 (T68d) oder 531072 (T.typ.72)
Bei besetzt oder gestört bitte 531002 versuchen.
Benutzeravatar

detlef
Rank 12
Rank 12
Beiträge: 3623
Registriert: Do 28. Mär 2019, 09:10
Wohnort: Marburg
Hauptanschluß: 7822222 hael d

Re: TCP-Handshake in i-Telex "kaputt"

#9

Beitrag: # 19670Beitrag detlef »

ProgBernie hat geschrieben: Di 21. Jul 2020, 12:13 Ok, zumindest keine Verschlechterung. Ich fürchte es gibt nicht viele weitere Tester die etwas dazu beitragen.
Ich würde schon gerne mittesten, habe es aber zeitlich noch nicht geschaft, meine Ethernetkarten zu aktualisieren.
Gruß, Detlef

i-Telex: 7822222 (T1000), 114288 (F1300), 211230 (T100Z), 96868 (T37), 24394 (T68d)
Konf.-Dienst: 11160/11161, Rundsender: 11162/11163 , Baudot-Bilder: 11166, Chat-GPT: 11168
Mail-/Fax-Dienst: 11170/11171, hist. Ausk.: 40140, Wetter: 717171
Benutzeravatar

detlef
Rank 12
Rank 12
Beiträge: 3623
Registriert: Do 28. Mär 2019, 09:10
Wohnort: Marburg
Hauptanschluß: 7822222 hael d

Re: TCP-Handshake in i-Telex "kaputt"

#10

Beitrag: # 19675Beitrag detlef »

Ich habe jetzt mal eine Ethernetkarte mit der Testversion aktualisiert.
Kann es sein, dass das Verbindungsende ein Problem macht?

Ich kann jetzt nur mit WinTlx testen, weil ich gerade nur eine TW39-Karte habe, aber wenn ich da einen Disconnect mache, bleibt der Fernschreiber an. Er scheint nicht mitzubekommen, dass die Verbindung beendet wurde.

Mit der Version 837 der anderen Ethernetkarte, geht der Fernschreiber sofort aus, wenn ich einen Disconnect mache.
Gruß, Detlef

i-Telex: 7822222 (T1000), 114288 (F1300), 211230 (T100Z), 96868 (T37), 24394 (T68d)
Konf.-Dienst: 11160/11161, Rundsender: 11162/11163 , Baudot-Bilder: 11166, Chat-GPT: 11168
Mail-/Fax-Dienst: 11170/11171, hist. Ausk.: 40140, Wetter: 717171
Antworten

Zurück zu „Entwickler-Ecke“