2010-06-18 13 views
9

Ho un piccolo programma di test che invia molti pacchetti udp tra client-> server-> client (test ping/pong). I pacchetti hanno dimensioni fisse per ogni esecuzione (l'ultima esecuzione è la dimensione massima consentita del pacchetto udp) Sto riempiendo i pacchetti con dati casuali tranne che per l'inizio di ogni pacchetto che contiene il numero di pacchetto. Quindi mi interessa solo vedere se ricevo tutti i pacchetti dal client.lettura parziale dalle prese

Sto usando sendto() e recvfrom() e leggo solo la sizeof (numero_pacchetto) (che in questo caso è un int). Cosa succede al resto dei dati? Finisce nel paese delle fate (viene scartato)? o il nuovo pacchetto che arriva viene aggiunto a questi "vecchi" dati?

(usando linux)

+0

Grazie per tutte le risposte! – NomadAlien

risposta

13

Ogni lettura dalle code di scarico UDP un intero datagramma il socket del kernel riceve il buffer indipendentemente dalla dimensione del buffer dell'utente. Ovvero:

  • Se il buffer è più grande del prossimo datagramma in attesa, si leggerà meno della dimensione del buffer.
  • Se il buffer è più piccolo, leggerai le dimensioni del buffer e il resto dei dati verrà scartato.
  • È possibile impostare l'opzione MSG_TRUNC nello flags, quindi recv(2) restituirà l'intera lunghezza del datagramma, non solo la parte che si legge nel buffer del proprio userland.

Spero che questo aiuti.

3

non ho ancora testato questo, ma dalla mia interpretazione della pagina man, sarà sempre scartato. Ciò sembra ragionevole poiché altrimenti non ci sarebbe modo di rilevare l'inizio del prossimo pacchetto.

Ci sono due modi per rilevare troncamento:

utilizzare il flag MSG_TRUNC. recvfrom restituirà quindi la dimensione reale del pacchetto anche se non si adatta al buffer fornito. Quindi puoi semplicemente controllare se il valore di ritorno è più grande di quello fornito da len come argomento.

Utilizzare recvmsg e controllare la struttura restituita per il flag MSG_TRUNC.

Per evitare la trunaction, utilizzare un buffer da 64k. I pacchetti UDP non possono essere più grandi di quello (campo di lunghezza 16 bit nel protocollo).

7

Per rispondere alla prima domanda, i dati vengono scartati? Sì, sì. I protocolli ARP & entrano in gioco quando il pacchetto è più grande della MTU di percorso. Il percorso MTU è l'unità di trasmissione massima del percorso tra il client e il server. Supponendo che la tua scheda NIC sia una scheda Ethernet standard, allora il tuo MTU massimo è 1500. Ora, assumiamo che l'intera MTU di percorso tra il client e il server sia 1500. In questo scenario, se invii un pacchetto superiore a 1472 byte (1500 - (20 intestazione ip a byte) - (intestazione UDP a 8 byte)) quindi si verificherà la frammentazione IP. Quello che succederà allora è che il livello IP taglierà il pacchetto in frammenti per soddisfare la MTU del collegamento ethernet. Ora, prima che i dati possano essere inviati, l'indirizzo MAC della destinazione deve essere risolto. Quindi, all'improvviso, il protocollo ARP riceverà più frammenti IP che richiedono lo stesso IP alla risoluzione dell'indirizzo MAC. Quello che succederà allora è che ARP avvierà una richiesta ARP per il primo pacchetto ricevuto e attenderà la risposta ARP.Durante l'attesa, ARP scarterà tutti i frammenti che fanno la stessa richiesta ARP e accoderà solo l'ultimo frammento arrivato. Pertanto, se si invia un pacchetto superiore a 1472 byte, non aspettarsi di ricevere l'intero pacchetto dall'altra parte se la cache ARP è vuota.

Vuol il pacchetto appena arrivato ottenere allegato al No, non viene aggiunto. UDP è un protocollo di datagramma con rigidi limiti di messaggio. Pertanto, ogni pacchetto in arrivo è considerato come un completo datagramma autonomo; i dati non verranno aggiunti.

+0

La domanda non ha nulla a che fare con MTU: riguarda interamente l'API socket (e l'effetto di una lettura breve). – caf

+0

@caf - Se rileggere la domanda, afferma che: (l'ultima esecuzione è la dimensione massima consentita del pacchetto udp), ovvero che la lunghezza è impostata sulla dimensione massima "teorica" ​​del pacchetto UDP. Per favore leggi il libro di Richard Stevens, illustrato in TCP/IP: I protocolli. Sezione 11.9 - L'interazione tra UDP e ARP. Capiresti perché ho menzionato MTU e ARP. – WindsurferOak

+0

Leggere davvero interessante! Grazie. – mtahmed