2010-06-25 11 views
6

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

9

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.

+0

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

+0

@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. –

+1

@tylernol: Forse questo ti aiuterà: http://lkml.indiana.edu/hypermail/linux/net/0211/0036.html –

0

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.

+0

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

+0

@ 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

+0

molto vero, ora se posso convincere solo l'autore di questa particolare interfaccia nell'app a fare quello che dovrebbero fare .. grazie! – tylernol

Problemi correlati