2010-11-12 11 views
21

Mentre si utilizza il comportamento predefinito (bloccante) su un socket UDP, nel qual caso verrà effettuata una chiamata a sendto()? Mi interessa essenzialmente il comportamento di Linux.Quando fa un blocco sendto() UDP?

Per TCP, capisco che il controllo della congestione rende il blocco delle chiamate send() se la finestra di invio è piena, ma per quanto riguarda UDP? A volte blocca anche o lascia i pacchetti scartati ai livelli inferiori?

risposta

14

Questo può accadere se si riempie il buffer del socket, ma è il altamente dipendente dal sistema operativo. Poiché UDP non fornisce alcuna garanzia, il sistema operativo può decidere di fare tutto ciò che desidera quando il buffer del socket è pieno: blocco o rilascio. Puoi provare ad aumentare SO_SNDBUF per un sollievo temporaneo.

Questo può anche dipendere dalla regolazione fine del sistema, ad esempio può anche dipendere dalla dimensione dell'anello TX nel driver dell'interfaccia di rete. Ci sono alcune discussioni a riguardo nello iperf mailing list, ma si vuole davvero discuterne con gli sviluppatori del proprio sistema operativo.

+1

Ok, seguendo il link ho trovato spiegazioni specifiche per Linux su [questo thread] (http://www.mail-archive.com/[email protected]/msg00113.html).Risposta breve così breve: _Linux fa bloccare sendto su un buffer di invio completo. –

+2

OK, ma ora la domanda viene spinta solo un ulteriore passo: in quali condizioni Linux riempirà il buffer del socket? (invece di lasciar cadere i pacchetti fuori da esso). Questa è sfortunatamente una domanda molto difficile. – MarcH

+0

@MarcH, che ne dici di recv, invia quando il socket sta bloccando? Penso che in questo caso send e recv bloccheranno comunque? – Bionix1441

9

Ciò potrebbe essere dovuto al fatto che il sistema operativo sta tentando di eseguire una richiesta ARP per ottenere l'indirizzo hardware dell'host remoto.

Fondamentalmente, quando un pacchetto esce, l'intestazione richiede l'indirizzo IP dell'host remoto e l'indirizzo MAC dell'host remoto. 192.168.1.34 e AB: 32: 24: 64: F3: 21.

Il tuo comportamento di "blocco" potrebbe essere che ARP funzioni.

Ho sentito nelle versioni precedenti di Windows (2k penso), che il 1 ° pacchetto a volte veniva scartato se la richiesta richiedeva troppo tempo e si inviano troppi dati. Un service pack probabilmente lo ha risolto da allora.

+0

Ok, buon elemento di risposta, interessante; ma quello che mi interessa è principalmente il blocco (o l'assenza di blocco) relativo alla congestione/buffer completo. –

+0

ARP viene utilizzato solo per l'individuazione di host sulla stessa subnet, in genere il router. E i risultati vengono memorizzati nella cache per le successive mandate. – selbie

+2

Quando un pacchetto IP si spegne richiede l'indirizzo IP dell'host remoto e l'indirizzo MAC dell' ** hop successivo ** ... –

Problemi correlati