PDA

Visualizza la versione completa : [c++] quantità massima di byte da mettere su socket


misterx
18-03-2015, 10:42
ciao,
leggevo in merito alla MTU che il payload massimo su ethernet, è di cira 1500 byte ai quali ne vanno sottratti 14 per l'header di ethernet e quindi ne rimangono 1486.

Ora, avendo a disposizione una rete da 100 Mbit/s mi chiedevo quanti byte al secondo posso inviare prima di "saturare" completamente la banda a disposizione.

100 Mbit/s = 12.5 MB/s = 12500000 Byte/s

12500000 : 1486 = 8411 pacchetti da 1486 byte/s


possibile che si riesce ad inviare così tanti pacchetti?

Xaratroom
18-03-2015, 13:55
Devi dividere per la dimensione del pacchetto, non del payload....
Comunque il metodo di accesso al canale, per l'ethernet, utilizza una politica di collision detect (CSMA/CD)... ovvero i client trasmettono sul mezzo fisico e, in caso di collisioni, attendono un intervallo di tempo random prima di ritrasmettere.
Quando il traffico aumenta, aumentano anche le collisioni, e quindi diminuisce anche il rendimento del mezzo fisico....
Ho cercato di buttartela giù in modo semplice.

Xaratroom
18-03-2015, 14:02
EDIT (purtroppo non mi fa modificare il messaggio precedente)
Comunque, il numero dei dati scambiati nell'unità di tempo, in una situazione reale, dipende da molti altri fattori, tra cui:
- architettura di rete
- dispositivi di rete
- messaggi di controllo, handshake, etc

misterx
18-03-2015, 14:08
grazie per la risposta. Per dimensioni dell'intero pacchetto intendi quella che ha nel momento in cui viene messa al livello più basso nel modello iso/osi??

misterx
18-03-2015, 14:19
stavo leggendo qui http://users.lilik.it/~mirko/gapil/gapilsu209.html delle dimensioni dei pacchetti, nel mio caso la dimensione massima dovrebbe essere di 65535 byte?
Ma a quanto ammonterebbe il payload?

Xaratroom
18-03-2015, 19:21
grazie per la risposta. Per dimensioni dell'intero pacchetto intendi quella che ha nel momento in cui viene messa al livello più basso nel modello iso/osi??
Sì... o, in un caso pratico, dello stack TCP/IP.

Immagina come se ogni livello dello stack di protocolli aggiungesse un header al "pacchetto" passatogli dal livello superiore (che prende il nome di payload).


stavo leggendo qui http://users.lilik.it/~mirko/gapil/gapilsu209.html delle dimensioni dei pacchetti, nel mio caso la dimensione massima dovrebbe essere di 65535 byte?
Dipende dal tuo mezzo di comunicazione... per l'ethernet solitamente è di 1500 byte.


Ma a quanto ammonterebbe il payload?
Dipende dalla grandezza "dell'header" dei vari pacchetti e del frame di livello fisico.

Considera infine che, in una rete con mezzi trasmissivi misti, a livello IP, per rispettare i diversi MTU, potrebbero verificarsi delle frammentazioni, che vanno a ridurre ulteriormente il numero di byte trasmessi nell'unità di tempo.

misterx
19-03-2015, 06:50
per quanto riguarda le collisioni non dovrebbero esserci, siamo su una lan swtched

Xaratroom
19-03-2015, 09:23
per quanto riguarda le collisioni non dovrebbero esserci, siamo su una lan swtched
Se i nodi sono connessi con link full duplex, direttamente allo switch e dopo che la tabella di instradamento è stata popolata.

misterx
19-03-2015, 16:34
Se i nodi sono connessi con link full duplex, direttamente allo switch e dopo che la tabella di instradamento è stata popolata.

grazie per le tue risposte.
Entro nel vivo della questione; ho costruito un piccolo simulatore in codice Borland Builder. Quello che fa è lanciare un thread che crea alcuni pacchetti e li invia alla funzione SpedisciDati().
In tale funzione ho implementato una sorta di timer il quale invia effettivamente i dati quando è trascorso 1 secondo=1000 ms.
Studiando le variabili relative al tempo, effettivamente il codice nell'if viene eseguito sempre ogni secondo invece, la dimensione del buffer che io ho chiamat stringa varia da 500000 caratteri a 1500000.

A questo punto mi chiedo se l'uso di un thread porta fuori strada se si desidera capire quanti byte/secondo (utili) si riesce ad inviare in quanto intervengono i ritardi dello scheduler di windows o altro?

Grazie




// creazione dei pacchetti
DWORD WINAPI ThreadTest( LPVOID lpParameter )
{
char msgbuf[40];

while(!bAbort)
{
for(int i=0; i < 127; i++)
{
sprintf(msgbuf, "B%d_5,1,xxx.xxx.xxx.xxx;", i);
SpedisciDati(msgbuf);
}
}

return 0;
}

//---------------------------------------------------------------------------

// i pacchetti vengono inviati al client trascorso 1 secondo
void SpedisciDati(char *msg)
{
stringa+=msg;

if(GetTickCount() - tempo >= 1000 || tempo == 0)
{
ServerSocket1->Socket->Connections[actconn]->SendText(stringa);
printf("%d",stringa.Length());
stringa="";
tempo=GetTickCount();

}
}
//---------------------------------------------------------------------------

misterx
20-03-2015, 10:27
ciao,
in base al codice che ho postato mi sono venuti in mente i seguenti dubbi: quando viene chiamata la sendtext() decide windows quando inviare il pacchetto sulla rete, giusto?
Quindi riempie il suo buffer e quando lo ritiene giusto lo invia.

Allora potrebbe accadere che richiamando la sendtext() per inviare 1 solo carattere alla volta sia più penalizzante in termini di performance che accumulare in un buffer ad esempio 1000 caratteri e richiamare la sendtext()?

Oppure è indifferente?

grazie

Loading