La domanda implicita è: se Linux blocca la chiamata send()
quando il buffer di invio del socket è pieno, perché dovrebbero esserci dei pacchetti persi?In Linux, perché perdo i pacchetti UDP se chiamo send() il più velocemente possibile?
Ulteriori dettagli: Ho scritto una piccola utilità in C per inviare pacchetti UDP il più velocemente possibile a un indirizzo unicast e una porta. Invio un payload UDP di 1450 byte ogni volta e i primi byte sono un contatore che incrementa di 1 per ogni pacchetto. Lo eseguo su un Fedora 20 all'interno di VirtualBox su un PC desktop con un nicot da 1 Gb (= abbastanza lento).
Quindi ho scritto una piccola utilità per leggere i pacchetti UDP da una determinata porta che controlla il contatore del pacchetto contro il proprio contatore e stampa un messaggio se sono diversi (vale a dire 1 o più pacchetti sono stati persi). Lo eseguo su un server bi-xeon Fedora 20 con un ethernet nic da 1 Gb (= super veloce). Mostra molti pacchetti persi.
Entrambe le macchine sono su una rete locale. Non conosco esattamente il numero di hop tra di loro, ma non credo che ci siano più di 2 router tra di loro.
cose che ho provato:
- aggiungere un ritardo dopo ogni
send()
. Se imposto un ritardo di 1 ms, non si perde più alcun pacchetto. Un ritardo di 100us inizierà a perdere pacchetti. - Aumentare la dimensione del buffer del socket di ricezione a 4MiB utilizzando
setsockopt()
. Questo non fa alcuna differenza ...
Per favore mi illumini!
Non penso che questa sia davvero una domanda di programmazione. È un po 'torbido, però. – unwind