su un progetto su cui sto lavorando, in alcune circostanze stiamo riscontrando problemi fuori ordine in un sistema SMP quando stiamo leggendo un flusso UDP dalla rete. Possiamo vederlo arrivare dalla rete in ordine annusando un hub collegato tra il mittente e il ricevitore. Tuttavia a volte sembra arrivare fuori ordine quando letto dalla presa. Esiste una garanzia per i pacchetti UDP in questo caso o l'applicazione dovrebbe implementare un buffer di riordino? Non stiamo impostando l'affinità CPU qui, ho il sospetto che potrebbe aiutare ma idealmente vorrei tutti i thread CPU/hw per gestire il traffico di rete.il kernel linux in un sistema SMP garantisce che i pacchetti UDP provenienti da una rete in ordine verranno letti da un socket in ordine?
risposta
UDP non garantisce alcun tipo di ordinamento. È responsabilità dell'applicazione. In realtà non garantisce nemmeno che i pacchetti non vengano ripetuti/scartati ecc. Suggerisco di leggere: http://en.wikipedia.org/wiki/User_Datagram_Protocol
Non ha senso che il kernel fornisca tali garanzie, specialmente se i pacchetti in ingresso potrebbero essere fuori uso, in quanto il kernel può (ragionevolmente) aspettarsi che l'applicazione si occupi di esso, se l'applicazione richiede l'ordine.
Non è possibile garantire che un pacchetto UDP non venga eliminato durante la trasmissione, quindi non è possibile avere garanzie di ordinazione. Quando il sistema riceve, ad esempio, il pacchetto n. 14 e il pacchetto n. 16, non ha modo di sapere se attendere il pacchetto n. 15 prima di consegnare il pacchetto n. 16, o se il pacchetto n. 15 è stato eliminato e non verrà mai in. Il sistema ti consegnerà solo un mucchio di pacchetti, e spetta a te metterli in ordine.
sì, questo è ciò che otteniamo con UDP, lo maneggia come li ottiene, ma il kernel dovrebbe introdurre sequenziamento fuori ordine mentre gestisce i pacchetti uscire dalla rete? – tylernol
@ tylernol: importa se il kernel cambia l'ordine? La tua app non conosce l'ordine con cui il kernel ha ricevuto i pacchetti, quindi la domanda è irrilevante. Tutta la tua app sa che dovrebbe essere pronto a riordinare i pacchetti, indipendentemente dal motivo per cui potrebbero essere fuori ordine. – bta
molto vero, ora se posso convincere solo l'autore di questa particolare interfaccia nell'app a fare quello che dovrebbero fare .. grazie! – tylernol
- 1. readdir() garantisce un ordine?
- 2. L'invio di pacchetti UDP dal Linux Kernel
- 3. IBOutletCollection garantisce un ordine corretto?
- 4. Il ciclo foreach in C# garantisce un ordine di valutazione?
- 5. posso leggere esattamente un pacchetto UDP da un socket?
- 6. Ottenere prodotti da un ordine in Magento
- 7. Perché Socket.BeginRece perde i pacchetti da UDP?
- 8. Ricezione di pacchetti in UDP
- 9. assicurare l'ordine dei pacchetti in UDP
- 10. OpenGL garantisce che le primitive in un buffer di vertici vengano disegnate in ordine?
- 11. Ricezione di pacchetti broadcast UDP su Linux
- 12. In Linux, perché perdo i pacchetti UDP se chiamo send() il più velocemente possibile?
- 13. Does Type.GetProperties() garantisce un determinato ordine per il risultato PropertyInfo []?
- 14. Ordine in un elenco
- 15. boost :: asio async_read garantisce che tutti i byte siano letti
- 16. Kernel Linux: Spinlock SMP: Perché esiste una versione preventiva() nella versione SMP spin_lock_irq?
- 17. Ordine entro gruppo da?
- 18. "group by" garantisce automaticamente "ordine per"?
- 19. Gruppo SQL con un ordine da
- 20. SQL Server/ordine da
- 21. Come utilizzare "ordine composto da" in sqlalchemy
- 22. gruppo LINQ da, ordine da
- 23. In che ordine si verificano i filtri?
- 24. php ordine casuale da un foreach
- 25. Più chiamate Control.BeginInvoke/Invoke verranno eseguite in ordine?
- 26. Come ottenere i dettagli del cliente da ordine in WooCommerce?
- 27. ordine automatico in un prescelto
- 28. MySql ordine condizionato da
- 29. MySQL ordine da stringa con i numeri
- 30. Come utilizzare i socket UDP in Android?
Lo capisco e capisco che ci dovrebbe essere un buffer di riordino, ma quello che sto dicendo è che stanno arrivando in ordine, ma sembra che il kernel stia procedendo nell'ordine. È accettabile per il kernel? – tylernol
@tylernol: Sì, è accettabile che il kernel sia in grado di fornire all'app i pacchetti udp in qualsiasi ordine. Perché dovremmo aspettarcelo? Il protocollo stesso non lo garantisce, e il fatto che il kernel garantisca che esso fornisce i pacchetti nell'ordine in cui ottiene complicherebbe solo le cose (nel kernel) senza alcun uso. –
@tylernol: Forse questo ti aiuterà: http://lkml.indiana.edu/hypermail/linux/net/0211/0036.html –