PDA

View Full Version : Divide Et Impera 0.9.1 beta


Cimmo
07-11-2002, 02:06
Ragazzi e' pronta la prima beta pubblica del mio programmino...le istruzioni e le regole sono un po' lunghette, spero ci capiate...non c'e' bisogno che testiate il programma al di fuori delle regole, vi dico gia' io che non funzia. Mi interessa che facciate tante prove su diverse reti vere o no.

Siete pronti al beta-testing?

Ecco le regole...le ho scritte per un mio amico quindi sono rivolte a un "lui"...

Regole:
- ci sara' UNA sorgenta (source) che la farai partire con ./source <numero porta> <nome file> dove il primo parametro e' il numero della porta su cui il TCP appoggera' e il secondo parametro e' il nome del file di configurazione della rete (te ne ho messo uno di esempio in network.map e uno piu' ridotto piu' avanti per spiegartelo).
- ci possono essere da 1 a N (dopo ti diro' quanti al max) host che possono essere sia destinazioni (del messaggio) che computer collegati alla rete che possono duplicare il messaggio per accelerare l'arrivo alle destinazioni, li fai partire con ./host <numero porta> stessa cosa per questo parametro a quanto detto prima.
- c'e' un file chiamato pacchetto.dat dove ci sta il messaggio da spedire. Il messaggio non puo' superare i 20000 caratteri.
- c'e' un file di configurazione, puoi farne quanti te ne pare, tanto gli passi il nome alla sorgente quando la fai partire:

ti faccio un esempio cosi' capisci:

[ALL HOSTS]
127.0.0.1:5000:0
127.0.0.1:5001:2
127.0.0.1:5002:1
[HOST CONNECTIONS]
127.0.0.1:5000 to 127.0.0.1:5001/2
127.0.0.1:5000 to 127.0.0.1:5002/4
[HOST CONNECTIONS]
127.0.0.1:5001 to 127.0.0.1:5000/2
127.0.0.1:5001 to 127.0.0.1:5002/2
[HOST CONNECTIONS]
127.0.0.1:5002 to 127.0.0.1:5000/4
127.0.0.1:5002 to 127.0.0.1:5001/2
[END NETWORK INFO]

- le parti tra parentesi [quadre] non devi toccarle
- dopo ALL HOSTS ci stanno tutti gli indirizzi degli host (non piu' di 1000 compresa la sorgente), il primo deve essere quella della sorgente, gli altri possono essere a caso, pero' sappi che dopo l'ordine che dai deve rimanere per tutto il file, poi capirai.
- c'e' prima l'ip, poi i due punti obbligatori, la porta e un numero. Quel numero funzia cosi': 0 per la sorgente e' fisso, poi tutte le destinazioni che hai prescelto (quelli che dovranno ricevere il msg nel piu' breve tempo possibile) gli dai 1, se un host non e' ne' sorgente, ne' destinazione, ma e' collegato ad una destinazione ha il n. 2. Se un host e' collegato ad un 2 ma non ad un 1 (e non e' destinazione ovvio) e' un n. 3 e cosi' via...capito?
- Dopo tutti gli host ci sono le interconnessioni, prima la sorgente con tutti gli host (la sorgente e' collegata a TUTTI gli host per forza) devi mantenere l'ordine che hai dato in [ALL HOSTS] e poi devi fare tutte le interconnessioni, se un host non e' collegato con un altro ci metti bandwith uguale a 0, dopo capirai qual'e' la bandwith.
- la parte prima della "/" viene ignorata, serve a te per ricordarti di quale connessione si parla, pero' puoi scriverci quello che ti pare. Dopo la "/" invece c'e' la bandwith, ovvero la velocita' della interconnessione in caratteri al secondo.
- Se A e' collegato a B con bandwith 5 allora quando andrai a settare il collegamento tra B e A dovrai mettere sempre 5.

Devi cercare di creare delle mappe di reti complicatine e tenere i file di configurazione, cosi' me li spedisci sia che funzioni tutto sia che no.

Quando hai settato tutto per bene e lanciato gli host, ogni host ti scrivera' che cosa sta facendo e cosi' pure la sorgente che prima ti scrivera' tutta la rete come e' stata caricata e poi parte con la spedizione delle regole e dei dati.

Cimmo
07-11-2002, 02:08
Divide Et Impera 0.9.1 beta parte 1/2

questo e' il file per la sorgente da scompattare...

Cimmo
07-11-2002, 02:08
Divide Et Impera 0.9.1 beta parte 2/2

questo e' il file per gli host...

cionci
07-11-2002, 10:00
Mi spighi com'è secondo te fisicamente un host che è raggiungbile da due perscorsi diversi ?

Ad esempio :

A è connesso a B, bandwidth 10
B è connesso a C, bandwidth 10
A è connesso a C, bandwidth 5

Mi spieghi come funzionerebbe il tuo programma in questo caso ?

Cimmo
07-11-2002, 10:24
Originariamente inviato da cionci
[B]Mi spighi com'è secondo te fisicamente un host che è raggiungbile da due perscorsi diversi ?

Ad esempio :

A è connesso a B, bandwidth 10
B è connesso a C, bandwidth 10
A è connesso a C, bandwidth 5

Mi spieghi come funzionerebbe il tuo programma in questo caso ?
Chi e' la sorgente e chi la/le destinazioni? Comunque stai violando la regola che la sorgente deve essere collegata a tutti gli host sia che siano di destinazione che no. Comunque si, un host puo' essere raggiungibile o direttamente o tramite un altro host che a sua volta e' collegato alla destinazione...cosi' intendo.

cionci
07-11-2002, 10:39
Per connessione intendevo connessione fisica...
A è la sorgente e C è la destinazione...

Il fatto è che nessuno ti garantisce che il messaggio che vuoi mandare logicamente direttamente a C non passi fisicamente dalla conenttività A-B e poi vada sulla connettività B-C... Quindi il discorso della bandwidth va a farsi benedire...capito ciò che intendo ?

Cimmo
07-11-2002, 10:45
Originariamente inviato da cionci
[B]Per connessione intendevo connessione fisica...
A è la sorgente e C è la destinazione...

Il fatto è che nessuno ti garantisce che il messaggio che vuoi mandare logicamente direttamente a C non passi fisicamente dalla conenttività A-B e poi vada sulla connettività B-C... Quindi il discorso della bandwidth va a farsi benedire...capito ciò che intendo ?
Perche' il TCP/IP gia' segmenta di suo senza dirti niente? Non c'e' modo di forzare il passaggio?

cionci
07-11-2002, 10:59
Originariamente inviato da Cimmo
[B]
Perche' il TCP/IP gia' segmenta di suo senza dirti niente? Non c'e' modo di forzare il passaggio?
La segmentazione non sempre avviene...solitamente con send piccole (intorno al Kb) non segmenta quasi mai (ma non è assicurato)... Se la send supera il valore del MTU (Maximum Transfer Unit) settata su una qualsiasi macchina che replica il pacchetto su una qualsiasi rete che trovi durante il percorso allora avviene la frammentazione...
C'è un opzione dell'header del protocollo IP che si chiama Don't fragment...ma in pratica non funziona...
Comunque con pacchetti dell'ordine dei centinaia di byte non ci dovrebbe essere frammentazione (MTU è solitamente >= 1500)...

Ma non è questo il problema principale... Metti che tu stia mandando 10 pacchetti...può succedere che 2 di essi passino da un determinato percorso...altri 5 da un altro...e altri 5 da un altro ancora...
E questo per definizione del IP che non è un protocollo orientato alla connessione...
Il percorso non predicibile...come la bandwidth quindi...

Magari il discorso è più proponibile su connessioni punto-punto...ma anche in quel caso basta spegnere un router ed ecco che il percorso diventa automaticamente un altro...

Cimmo
07-11-2002, 11:07
Originariamente inviato da cionci
[B]
La segmentazione non sempre avviene...solitamente con send piccole (intorno al Kb) non segmenta quasi mai (ma non è assicurato)... Se la send supera il valore del MTU (Maximum Transfer Unit) settata su una qualsiasi macchina che replica il pacchetto su una qualsiasi rete che trovi durante il percorso allora avviene la frammentazione...
C'è un opzione dell'header del protocollo IP che si chiama Don't fragment...ma in pratica non funziona...
Comunque con pacchetti dell'ordine dei centinaia di byte non ci dovrebbe essere frammentazione (MTU è solitamente >= 1500)...

Ma non è questo il problema principale... Metti che tu stia mandando 10 pacchetti...può succedere che 2 di essi passino da un determinato percorso...altri 5 da un altro...e altri 5 da un altro ancora...
E questo per definizione del IP che non è un protocollo orientato alla connessione...
Il percorso non predicibile...come la bandwidth quindi...

Magari il discorso è più proponibile su connessioni punto-punto...ma anche in quel caso basta spegnere un router ed ecco che il percorso diventa automaticamente un altro...
Qual'e' questa opzione dell'header? Comunque per ora testate lo stesso, fate finta che tra logica e pratica non ci sia differenza...:(

cionci
07-11-2002, 11:17
Don't fragment...non so se puoi settare questa opzione con setsockopt... Ma in ogni caso Don't fragment non viene rispettato...
E comunque la frammentazione non sarebbe un problema...il problema princiapale è l'instradamento...che non è una costante come la bandwidth...
Secondo me una cosa più indicativa della bandwidth (che ha significato solo come massimo thrughput del singolo nodo) è il ping... Potresti misurare il ping come indicatore della qualità di un connessione virtuale del TCP... E misuararlo dinamicamente durante la connessione cercando di ricavarti una sorta QoS della connessione come rapporto bandwidth/ping...

A quel punto puoi sicuramente farci qualcosa...

Cimmo
07-11-2002, 11:35
Originariamente inviato da cionci
[B]Don't fragment...non so se puoi settare questa opzione con setsockopt... Ma in ogni caso Don't fragment non viene rispettato...
E comunque la frammentazione non sarebbe un problema...il problema princiapale è l'instradamento...che non è una costante come la bandwidth...
Secondo me una cosa più indicativa della bandwidth (che ha significato solo come massimo thrughput del singolo nodo) è il ping... Potresti misurare il ping come indicatore della qualità di un connessione virtuale del TCP... E misuararlo dinamicamente durante la connessione cercando di ricavarti una sorta QoS della connessione come rapporto bandwidth/ping...

A quel punto puoi sicuramente farci qualcosa...
Nel senso che lui instrada come gli pare? Lasciamo perdere il segmentation, lui puo' scegliere una strada diversa dalla connessione fisica diretta se c'e'? Comunque non penso che lo cambiero'...l'obiettivo di questo progetto e' basso per ora...se me lo daranno per la tesi sara' un altro paio di maniche.

cionci
07-11-2002, 15:49
Originariamente inviato da Cimmo
[B]
Nel senso che lui instrada come gli pare? Lasciamo perdere il segmentation, lui puo' scegliere una strada diversa dalla connessione fisica diretta se c'e'?
Non è garantito che durante la stessa connessione TCP i dati passino tutti da uno stesso percorso...
Il discorso della connessione diretta fisica è un poì più complesso... Solitamente c'è un default gateway all'interno di una rete...e questo a meno di congestione (altri utenti usano il router per uscire e saturano la connessione punto-punto) instrada sempre i pacchetti sulla stessa connessione punto-punto...
Nel caso di congestione il router può pensare di inviare i pacchetti verso un router alternativo che li instrada su un'altra connessione punto-punto...
Questo comunque avviene in modo completamente trasparente all'utente...quindi non ti puoi rendere conto se viene usato o meno il router secondario...

Il problema della congestione (può avvenire non solo sulla congestione, ma anche nel caso di un bilanciamento del carico fra due o più router) può avvenire a qualsiasi livello durante il percorso per raggiungere il destinatario... Infatti i pacchetti TCP molto spesso arrivano fuori sequenza...e ci pensa il TCP a riordinarli simulando una connessione...

Ti spego da dove nascono tutti questi problemi... In pratica Internet è nata come progetto della DARPA (Defense Advanced Research Project Agency) del ministero della difesa degli USA...
E funziona in questo modo perchè doveva garantire la consegna del pacchetto anche nel caso che una bomba atomica avesse distrutto parte delle infrastrutture di rete...
Ed ecco perchè non è orientata alla connessione (non c'è un percorso fisso)...ma viene detta a commutazione di pacchetto...

Cimmo
07-11-2002, 17:55
cionci ho capito perfettamente quello che mi hai detto...pero' se ti va' lo stesso di testarlo mi farebbe piacere...senno' fa lo stesso.
Questo vale per tutti...ho visto che fino ad adesso l'ha scaricato solo una persona :(

ciao e grazie
Cimmo

cionci
07-11-2002, 18:08
Purtroppo non lo posso provare xchè Linux su questa macchina mi è partito (Kernel Panic!)...

Cimmo
07-11-2002, 18:38
Originariamente inviato da cionci
[B]Purtroppo non lo posso provare xchè Linux su questa macchina mi è partito (Kernel Panic!)...
Peccato! Fammi sapere quando ti ritorna up che posto una versione piu' aggiornata eventualmente...a meno che a qualcuno non interessi subito...

Comunque oggi ho fatto la versione 0.9.2 beta

cambiamenti:
- risolto un bug dove anche tutti gli host che non erano destinazioni ricevevano tutto il messaggio anche se poi gliene serviva solo una piccola parte.

Cimmo
08-11-2002, 18:57
Ecco la nuova versione...

cambiamenti dalla v0.9.1 beta:

- nuova ottimizzazione: ora la sorgente spedisce agli host non di destinazione solo le informazioni che gli servono
- l'output della mappa della rete nella parte dell'host e' stata migliorata
- bug-fix: risolti alcuni segmentation fault che accadevano di rado
- bug-fix: ora la sorgente riprova a connettersi con l'host se fallisce
- bug-fix: ora la sorgente e gli host puliscono tutta la memoria dai jobs ancora vivi.


Dai ragazzi datevi da fare...please testatelo!

Cimmo
08-11-2002, 18:57
Ed ecco l'eseguibile per gli host...