Pagina 1 di 1

Enigma su errori TCP (x esperti)

Inviato: lun 28 ago 2006, 3:07
da bhackerozzo
Allora, ho scritto un'applicativo in java che si connette a un server tramite una semplice connessione tcp. E' attivo 24 ore su 24.
Il problema è che spesso (almeno una volta al giorno) accade che la connessione viene chiusa dal server, infatti java genera una eccezione "SocketException: connection reset".
Siccome so che, in base alle specifiche, il server non è cosi scortese da buttarmi fuori "gratuitamente", ho indagato piu a fondo sniffando il traffico con ethereal (eseguito nello stesso client).

Ebbene dall'analisi dei pacchetti scambiati è emersa una situazione inquietante: la totalità dei pacchetti tcp inviati dal client (esclusi solo gli ack) hanno checksum tcp sbagliato (Il checksum ip invece è a posto). Ecco quindi che ogni tanto il server si scoccia di ricevere errori e chiude la connessione con un pacchetto RST.

Secondo voi dove può essere il problema? la scheda di rete, il sistema operativo, java??

Grazie per qualunque idea.

Inviato: lun 28 ago 2006, 11:46
da 5m0k3r
Un bug nel tuo sorgente? :D

Inviato: lun 28 ago 2006, 11:56
da useless
mah, il problema dei checksum tcp sbagliato, secondo me, è fuorviante. nel senso che, da quanto noto runnando ethereal, anche qui capita la stessa cosa, ma tutto funziona come deve.

quindi:
- o linux sbaglia volutamente a calcolare il checksum (magari nella pratica si guarda solo quello di ip, e non quello di tcp).
- o ethereal sbaglia a valutarlo.

quale sia la risposta giusta non lo so ancora, ma presto ci guarderò, per la tesi. nel frattempo ti consiglierei di cercare il tuo bug altrove, dato che questo comportamento pare normale.

Inviato: lun 28 ago 2006, 15:24
da bhackerozzo
5m0k3r ha scritto:Un bug nel tuo sorgente? :D
L'ho escluso a priori non perchè sia il migliore programmatore al mondo :) ma perchè usando i socket con java non si possono modificare i campi tcp/ip.
useless ha scritto:mah, il problema dei checksum tcp sbagliato, secondo me, è fuorviante. nel senso che, da quanto noto runnando ethereal, anche qui capita la stessa cosa, ma tutto funziona come deve.

quindi:
- o linux sbaglia volutamente a calcolare il checksum (magari nella pratica si guarda solo quello di ip, e non quello di tcp).
- o ethereal sbaglia a valutarlo.
grazie per la tua risposta,
per quanto ne so i vari checksum vengono calcolati dal kernel, ma mi sembra molto strano che linux sbagli a calcolarlo e poi che quello ip sia sempre corretto e quello tcp sempre sbagliato, e che gli ack invece siano sempre a posto. non sono errori casuali.

in realtà ho sniffato il traffico con tcpdump e poi analizzato offline con ethereal, ma dovrebbero essere compatibili, poichè usano entrambi libcap...

qui ho messo la parte più significativa, se vuoi dargli un'occhiata..per favore...

http://marlon80.interfree.it/boh/tcp.cap

Inviato: lun 28 ago 2006, 15:40
da useless
mah no, appunto. magari, x rispamiare tempo, il checksum tcp non lo calcola nessuno, intanto se è giusto quello IP, è ovvio che il suo contenuto (tcp appunto) non può essere sbagliato. magari linux si adegua a questo.

ora non ho tempo di informarmi, ma fra qualche giorno indago.

Inviato: lun 28 ago 2006, 16:34
da bhackerozzo
Ho provato a collegarmi da telnet e ottengo esattamente la stessa situazione.
Almeno ora ho escluso anche java.

ah, la connessione passa attraverso un tunnel vpn che parte dal primo router, ma client e server si vedono quindi il tunnel non è cieco...e funziona bene.

ma ancora piu strano: se mi collego via https al router (dalla macchina client), i pacchetti vengono trasmessi tutti correttamente, non c'è nessun errore!! ma allora la colpa non è nemmeno di tcpdump & ethereal???

devo pensare che linux si sta divertendo a farmi impazzire...?!

:scratch:

Inviato: sab 9 set 2006, 1:36
da gianogli
useless ha scritto:mah no, appunto. magari, x rispamiare tempo, il checksum tcp non lo calcola nessuno, intanto se è giusto quello IP, è ovvio che il suo contenuto (tcp appunto) non può essere sbagliato.
Ehm....
Non e' proprio esatto... ;)
Il checksum IP riguarda solo l'header del pacchetto IP e non dice assolutamente nulla sulla correttezza o meno dei dati in trasportati dal protocollo TCP.
Il checksum TCP, al contrario, e' un po' piu' complesso e viene calcolato utilizzando l'header TCP, i dati e anche una parte dell'header IP.

Per essere sicuri quindi che un pacchetto TCP/IP sia corretto in base ai checksum bisogna:
1) controllare il checksum IP per capire se l'header IP puo' essere considerato corretto
2) se l'header IP e' corretto si usano le informazioni in esso contenute per identificare il protocollo utilizzato a livello superiore (ad esempio TCP) e i vari offset, ...
3) controllare il checksum TCP per verificare che l'header TCP e i dati in esso contenuti siano coretti...
4) solo a questo punto e' possibile dire che tutto il pacchetto ricevuto (o spedito) sia corretto

Ciao ciao... :D
GiAn

Per info:

http://en.wikipedia.org/wiki/IPv4#Header
http://en.wikipedia.org/wiki/Transmissi ... col#Header

Inviato: mar 12 set 2006, 2:07
da useless
ottimo, in effetti era un po' strana come spiegazione :lol:, eh che al momento non mi è venuto in mente nessun altro motivo per cui succeda una cosa del genere... e non ho ancora avuto tempo di indagare.