Diciamo che il mio programma invia 1000 byte sulla rete (UDP). È garantito che il ricevitore riceverà i 1000 byte in un "lotto"? O forse dovrà eseguire sevral "letture" fino a quando non riceverà l'intero messaggio? se il più tardi è vero, come posso garantire che l'ordine dei pacchetti per lo stesso messaggio non venga "mescolato" (nell'ordine), o forse il protocollo lo garantisce?
Modifica: è possibile che il mio messaggio venga diviso in pacchetti sevral? (cosa succede se provo a inviare un messaggio da 10000mb, cosa succede allora?)Ricezione di pacchetti in UDP
risposta
Otterrai tutto o niente.
Ma non vi è alcuna garanzia particolare che riceverai pacchetti esattamente una volta nell'ordine in cui sono stati trasmessi; perdita di pacchetti, riordino e (meno spesso) duplicazione sono tutti possibili.
C'è una dimensione massima del frame (di 65.507 byte), send() i pacchetti di dimensioni maggiori restituiscono un errore.
È necessario fornire un buffer sufficiente per ricevere l'intero frame in una chiamata.
Pacchetti UDP Possono essere frammentati in più frammenti IP, ma il sistema operativo eliminerà un pacchetto incompleto. Questo è quindi trasparente per l'applicazione.
I dati inviati tramite UDP sono raggruppati in packets, quindi se si invia x quantità di byte allora SE il destinatario riceve il pacchetto riceverà x importo di byte.
Tuttavia, i pacchetti potrebbero non arrivare nemmeno, oppure potrebbero arrivare fuori servizio.
UDP, a differenza del protocollo TCP, non è un protocollo affidabile. Non fornisce alcun meccanismo integrato per garantire che i pacchetti arrivino nell'ordine corretto, o addirittura arrivino a destinazione. Detto questo, è possibile scrivere le routine di invio/ricezione in modalità blocco, in cui ogni volta che viene inviato un pacchetto, il mittente deve attendere di ricevere un ACK prima di inviare nuovamente. Se un ACK non viene ricevuto dopo un determinato timeout specificato, il pacchetto deve essere reinviato. In questo modo si garantisce che i pacchetti vengano ricevuti nell'ordine corretto. (Per ulteriori informazioni, consulta lo RFC for the TFTP protocol, che utilizza questa strategia.)
Infine, se possibile, potresti prendere in considerazione l'utilizzo di TCP.
Il destinatario riceverà l'intero pacchetto in una chiamata. La lunghezza del pacchetto è limitata, anche in theory:
intera un campo a 16 bit che specifica la lunghezza in byte dell'intera datagramma: intestazione ei dati. La lunghezza minima di è di 8 byte poiché è la lunghezza dell'intestazione . La dimensione del campo stabilisce 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 viene imposto dal protocollo IPv4 sottostante è 65.507 byte.
Tuttavia il limite reale è molto più basso, di solito è sicuro assumere 512 byte. Vedi What is the largest Safe UDP Packet Size on the Internet.
quindi cosa succederà se mal tentativo di inviare 1024 byte? ricevo un messaggio di errore o il mio messaggio verrà diviso in pacchetti diversi? (e l'ordine da tenere tra di loro?) –
Il 512 è di dimensioni minime * sicure *. 1024 può avere successo. O errore durante l'invio al meglio. Peggio ancora, il pacchetto verrà abbandonato da alcuni router nel traffico e non lo saprai mai. Non c'è frammentazione e ricostruzione con UDP, questo è ciò che il TCP è per. –
Remus: È sbagliato. La frammentazione e il rimontaggio avvengono a livello IP, il che significa che si applica a UDP. Con UDP, vedrai l'intero datagramma correttamente assemblato come è stato inviato, o niente del tutto. TCP aggiunge inoltre ordinamento e riconoscimento/ritrasmissione. – caf
ma è possibile che il programma prima veda solo 500 byte disponibili e dopo un po 'riceve gli altri 500 byte? –
e cosa succede se il mio messaggio ha una dimensione di 1 milione di byte? (grazie) –
No, non lo è! – Charles