2010-09-19 14 views
7

im utilizzando 2 computer con un'applicazione per inviare e ricevere datagrammi udp.
non v'è alcun controllo di flusso (ICMP disattivato)
frequentemente quando i inviare un file come datagrammi UDP attraverso l'applicazione, ottengo 2 pacchetti che cambiano il loro ordine e per questo - packetloss.assicurare l'ordine dei pacchetti in UDP

c'è un modo per assicurarsi che winsock e send() inviino i pacchetti nello stesso modo in cui li hanno ricevuti?
o il sistema operativo lo sta facendo? Ive disabilitato e tipo di firewall e non vi è alcun interruttore hardware collegato tra i computer (sono collegati direttamente). necessaria la configurazione del dispositivo di rete?
grazie

risposta

10

UDP è un protocollo leggero che, in base alla progettazione, non gestisce cose come il sequenziamento dei pacchetti. TCP è una scelta migliore se si desidera una consegna e un sequenziamento dei pacchetti affidabili.

UDP è generalmente progettato per le applicazioni in cui la perdita di pacchetti è accettabile o preferibile al ritardo che TCP comporta quando deve ri-richiedere i pacchetti. Pertanto UDP è comunemente usato per lo streaming multimediale.

Se si è limitati a utilizzare UDP, è necessario sviluppare un metodo per identificare i pacchetti fuori sequenza e renderizzarli.

+0

si può spiegare che cosa è questo [UDP per gli ordini] (http://www.nasdaqtrader.com/ contenuto/supporto tecnico/specifiche/Prodotti commerciali/UFO.pdf)? – Sajuuk

+0

@Sajuuk. Sembra un documento pdf. Se hai una domanda, potrebbe essere meglio fare una nuova domanda. – PaulG

7

UDP non garantisce che i pacchetti arriveranno in ordine. (Non garantisce nemmeno che i tuoi pacchetti arriveranno a tutti.) Se hai bisogno di quel livello di robustezza stai meglio con TCP. In alternativa potresti aggiungere marcatori di sequenza ai tuoi datagrammi e riorganizzarli dall'altra parte, ma perché reinventare la ruota?

+0

da una ragione pratica che non posso descrivere sono limitato solo a udp. un raro packetloss una volta e poi è accaptable.è solo che 1 dei 3 file subisce una perdita. Ho solo bisogno di trovare un modo per il mittente di inviare i pacchetti nel giusto ordine, il resto non ha importanza per me. grazie – Davidallencoe

+1

Non è tanto una questione del mittente che invia i pacchetti nel giusto ordine, quanto al ricevitore per rimontarli nell'ordine corretto. Come ho detto, aggiungi marcatori di sequenza ad un livello appropriato. – crazyscot

+0

UDP garantisce che un pacchetto arriverà intatto o non lo è affatto (cioè ha un checksum) e aggiunge anche i numeri di porta all'IP raw. Non garantisce la consegna o il sequenziamento; quelli sono ciò che aggiunge TCP (praticamente urlando un pacchetto fino a quando l'altra estremità dice che è arrivato). È anche sufficiente garantire una consegna in-order corretta, sufficiente per far finta di avere un flusso di dati (quindi TCP è un socket di streaming, dal momento che è abbastanza comune). –

4
c'è un modo per assicurarsi che winsock e send() inviino i pacchetti nello stesso modo in cui li hanno ricevuti?

Si chiama TCP.

In alternativa, provare un protocollo UDP affidabile come UDT. Immagino che potresti trovarti su una piccola piattaforma integrata, quindi desideri un protocollo più compatto come quello di Bell Lab RUDP.

0

non v'è alcun controllo di flusso (ICMP disattivato)

È possibile implementare il proprio controllo di flusso utilizzando UDP:

  • Invia uno o più pacchetti UDP
  • attendere una conferma (inviato come un altro pacchetto UDP dal destinatario al mittente)
  • Ripetere come sopra

Vedere Sliding window protocol per ulteriori dettagli.

[Questo sarebbe oltre ad avere un numero di sequenza nei pacchetti che si inviano.]