Domanda

Supponiamo che il mio programma invii 1000 byte sulla rete (UDP). Garantisce che il destinatario riceverà i 1000 byte in un "batch"? O forse dovrà eseguire sevral " reads " fino a quando non riceverà l'intero messaggio? se è vero in seguito, come posso garantire che l'ordine dei pacchetti per lo stesso messaggio non venga "mischiato"? (in ordine), o forse il protocollo lo garantisce?
Modifica : cioè, è possibile che il mio messaggio venga suddiviso in pacchetti sevral? (cosa succede se provo a inviare un messaggio da 10000mb, cosa succede dopo?)

È stato utile?

Soluzione

Otterrai tutto o niente.

Ma non vi è alcuna garanzia particolare che riceverai i pacchetti esattamente una volta nell'ordine in cui sono stati trasmessi; perdita di pacchetti, riordino e (meno spesso) duplicazione sono tutti possibili.

Esiste una dimensione massima del frame (di 65.507 byte), send () ing pacchetti di dimensioni maggiori restituiranno un errore.

È necessario fornire un buffer sufficiente per ricevere l'intero frame in una chiamata.

I pacchetti UDP POSSONO essere frammentati in più frammenti IP, ma il sistema operativo rilascerà un pacchetto incompleto. Questo è quindi trasparente per l'applicazione.

Altri suggerimenti

Il destinatario riceverà l'intero pacchetto in una chiamata. La lunghezza del pacchetto è limitata, anche nella teoria :

  

Lunghezza       Un campo a 16 bit che specifica la lunghezza in byte dell'intero   datagramma: intestazione e dati. Il minimo   la lunghezza è di 8 byte poiché questa è la   lunghezza dell'intestazione. La dimensione del campo   fissa un limite teorico di 65.535   byte (intestazione 8 byte + 65527 byte di   dati) per un datagramma UDP. Il   limite pratico per la lunghezza dei dati   che è imposta dal sottostante   Il protocollo IPv4 è 65.507 byte.

Tuttavia il limite reale è molto più basso, di solito è sicuro assumere 512 byte. Vedi Qual è la dimensione più grande del pacchetto UDP sicuro su Internet .

I dati inviati tramite UDP sono raggruppati in pacchetti , quindi se invii x quantità di byte quindi SE il destinatario riceve il pacchetto riceverà x quantità di byte.

Tuttavia, i pacchetti potrebbero anche non arrivare o potrebbero non funzionare.

UDP, a differenza di TCP, non è un protocollo affidabile. Non fornisce alcun meccanismo incorporato per garantire che i pacchetti arrivino nell'ordine corretto o addirittura arrivino affatto. Detto questo, è possibile scrivere le routine di invio / recv in un modo di blocco, in cui ogni volta che viene inviato un pacchetto, il mittente deve attendere di ricevere un ACK prima di inviarlo di nuovo. Se un ACK non viene ricevuto dopo un determinato timeout, è necessario inviare nuovamente il pacchetto. In questo modo si garantisce che i pacchetti vengano ricevuti nell'ordine corretto. (Per ulteriori informazioni, consulta RFC per il protocollo TFTP , che utilizza questa strategia .)

Infine, se possibile, potresti prendere in considerazione l'idea di utilizzare TCP.

Con UDP Lite puoi richiedere di ricevere pacchetti parzialmente danneggiati. Questo può essere utile per i servizi video e VoIP.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top