PDA

Visualizza la versione completa : Sequence number server UDP in C


MadAlex
19-02-2008, 11:08
Sempre io che vi rompo le scatole.
Allora, se vi ricordate ho implementato un server concorrente UDP in C(causa utilizzo macchine virtuali), e grazie al vostro aiuto, ora funziona che una meraviglia.
Ora, ho montato le macchine virtuali uml e funzionanpo perfettamente con il server.
A questo punto, mi stato chiesto (il tutto per crearmi l'emulatore per lo studio dei ritardi per la mia tesi di laurea) di cercare di fare il sequence number dei pacchetti scambiati tra client/server.
Il problema che l'header UDP non ha un campo sequence number, a differenza di TCP.
Ora, prima di fare una figuraccia con il Prof., volevo gentilmente sapere se ho ragione io, quindi Sequence number impossibile con UDP, o se c'e' un modo per poterlo fare, e se si quale (sto diventando matto!!!!).
Grazie in anticipo.

oregon
19-02-2008, 11:27
Forse intendevano riferirsi al protocollo RUDP

http://www.javvin.com/protocolRUDP.html

MadAlex
19-02-2008, 11:39
Allora, ti spiego meglio. Ho dovuto utilizzare UDP perche' devo emulare una rete satellitare, quindi TCP a causa del three way handsnake praticamente mi triplicherebbe i ritardi (motivo x cui TCP fa schifo via satellite).
Ora non conosco questo RUDP, ma sto documentandomi.
Il problema che le socket in C sono DGRAM appunto perche' UDP. Cambia qualcosa con RUDP?
Nel senso, ho gia il mio servere ed i miei client implementati. Modificando con RUDP cambierebbe qualcosa?
Tutto li, ti ripeto, non lo conosco!!
Comunque grazie!

oregon
19-02-2008, 11:42
Neanche io conosco i dettagli di RUDP ma so che e' previsto il Sequence Number per migliorare l'affidabilita' del protocollo dato che viene utilizzato nel VoIp ... a te l'onere di approfondire ...

menphisx
19-02-2008, 19:33
Originariamente inviato da MadAlex
Sempre io che vi rompo le scatole.
Allora, se vi ricordate ho implementato un server concorrente UDP in C(causa utilizzo macchine virtuali), e grazie al vostro aiuto, ora funziona che una meraviglia.
Ora, ho montato le macchine virtuali uml e funzionanpo perfettamente con il server.
A questo punto, mi stato chiesto (il tutto per crearmi l'emulatore per lo studio dei ritardi per la mia tesi di laurea) di cercare di fare il sequence number dei pacchetti scambiati tra client/server.
Il problema che l'header UDP non ha un campo sequence number, a differenza di TCP.
Ora, prima di fare una figuraccia con il Prof., volevo gentilmente sapere se ho ragione io, quindi Sequence number impossibile con UDP, o se c'e' un modo per poterlo fare, e se si quale (sto diventando matto!!!!).
Grazie in anticipo.

Il quesito del prof insensato, ammeso che abbia capito.
UDP non ha nessun sequence number.
Se vuoi implementare un sequence number, beh fattibile.

:ciauz:

MadAlex
20-02-2008, 10:19
Si, infatti risulta insensato anche a me!!!
Implementarlo?
Hai qualche idea o esempio?
Grazie

billiejoex
20-02-2008, 11:06
Allora, ti spiego meglio. Ho dovuto utilizzare UDP perche' devo emulare una rete satellitare, quindi TCP a causa del three way handsnake praticamente mi triplicherebbe i ritardi (motivo x cui TCP fa schifo via satellite).
Il ritardo di TCP rispetto ad UDP non certamente imputabile al 3 way handshake, cosa che avviene solo a inizio connessione.
Sono altri i fattori che lo rendono pi lento.


Allora, se vi ricordate ho implementato un server concorrente UDP in C(causa utilizzo macchine virtuali), e grazie al vostro aiuto, ora funziona che una meraviglia.
Ora, ho montato le macchine virtuali uml e funzionanpo perfettamente con il server.
A questo punto, mi stato chiesto (il tutto per crearmi l'emulatore per lo studio dei ritardi per la mia tesi di laurea) di cercare di fare il sequence number dei pacchetti scambiati tra client/server.
Il problema che l'header UDP non ha un campo sequence number, a differenza di TCP.
Ora, prima di fare una figuraccia con il Prof., volevo gentilmente sapere se ho ragione io, quindi Sequence number impossibile con UDP, o se c'e' un modo per poterlo fare, e se si quale (sto diventando matto!!!!).
Grazie in anticipo.
Non ho capito cosa devi fare di preciso.
Se il sn non previsto nativamente gia in UDP non puoi certo inventartelo se il protocollo nato in quel modo.
Forse il prof vuole che tu implementi un sistema di verifica dell'ordine di arrivo dei pacchetti non nell'header di UDP (ovviamente) ma nel payload (il campo "dati", per capirci).

oregon
20-02-2008, 11:16
Originariamente inviato da billiejoex
Forse il prof vuole che tu implementi un sistema di verifica dell'ordine di arrivo dei pacchetti non nell'header di UDP (ovviamente) ma nel payload (il campo "dati", per capirci).

Concordo ...

MadAlex
20-02-2008, 12:16
Allora, concordo con voi su tutto. Il discorso semplice. Ho implementato un server in C UDP, che mi gestisce piu di 100 client ( che girano su delle virtual machine linux). Quindi si scambiano vari messaggi (dal logon, al first trasmission time, ecc..). Tutto c'ho l'ho implementato senza problemi, e funziona tutto alla grande. Ora, volevo vedere praticamente il "sequence number" dei vari pacchetti scambiati( per valutare eventuali perdite e per eventuali altre simulazioni future). Per far cio' ho praticamente creato per ogni client un int seq_num, inizializzato a zero, che viene incrementato per ogni invio di un pacchetto (ovviamente nel campo dati), quindi quando mi arriva un pacchetto al server, con una printf mi dice "Ricevuto pacchetto [i] dal client x.x.x.x" per capirci.
Ora volevo semplicemente sapere se c'era un altro modo un po' piu pulito per far cio', o se cosi' puo' andar bene.

billiejoex
20-02-2008, 13:23
Puoi stabilire un semplice protocollo per cui se noti una discrepanza del valore di sn lato ricevente (es: 1, 2, 3, 5) interrompi temporaneamente la ricezione (nel senso ignori i pacchetti marcati 6, 7, 8 che potrebbero arrivarti) e mandi un pacchetto al mittente chiedendo di ricominciare da sn 4.
E' pressapoco quello che fa TCP (molto pressapoco).

Il protocollo te lo inventi di sana pianta utilizzando il segmento dati per supplire alle mancanze dell'header.
Puoi ad esempio decidere che i caratteri da 1 a 3 li dedichi al sn, da 3 a 6 li tieni riservati (che so... eventuali comandi) e da 6 in avanti tutto dati.
Io avevo fatto una cosa molto simile utilizzando ICMP ma il principio lo stesso dato che entrambi i protocolli sono connection-less e dispongono di un campo dati:
http://billiejoex.altervista.org/Prj_Py_soicmp.shtml

Cmq chiederei al tuo professore una traccia precisa dato che non chiaro cosa si vuole emulare da TCP e come si intende farlo.
Il rischio di reinventare una ruota tutta sgangherata molto alto.

Loading