Domanda

Durante la lettura di questo articolo, ho avuto un dubbio.

Ho capito che durante il trasferimento di piccoli dati, l'algoritmo Nagle è abilitato per impostazione predefinita che riunisce piccoli pacchetti. Ciò comporta la memorizzazione nella cache di alcuni dati prima della trasmissione. Credo che Winsock Kernel Buffer sia il luogo in cui si verifica la memorizzazione nella cache. Correggimi se sbaglio.

Significa che se il buffer del kernel Winsock è impostato su zero con l'opzione SO_SNDBUF, l'algoritmo Nagle sarà disabilitato?

In caso contrario, dove WINSOCK memorizza nella cache i piccoli dati?

È stato utile?

Soluzione

L'articolo KB a cui fai riferimento fornisce le tue risposte in questo modo ...

  

Per ottimizzare le prestazioni a livello di applicazione, Winsock copia i buffer di dati dall'applicazione inviando chiamate a un buffer del kernel Winsock . Quindi, lo stack utilizza la propria euristica (come l'algoritmo Nagle) per determinare quando posizionare effettivamente il pacchetto sul filo.

e, l'impostazione di TCP_NODELAY o SO_SNDBUF = 0 disabiliterà l'algoritmo Nagle come di seguito,

  

L'opzione TCP_NODELAY socket viene applicata per disabilitare l'algoritmo Nagle in modo che i piccoli pacchetti di dati vengano consegnati all'host remoto senza indugio.

     

È possibile modificare la quantità di buffer del kernel Winsock allocata al socket usando l'opzione SO_SNDBUF (per impostazione predefinita è 8K). Se necessario, Winsock può bufferizzare significativamente più della dimensione del buffer SO_SNDBUF. Nella maggior parte dei casi, il completamento dell'invio nell'applicazione indica che il buffer di dati in una chiamata di invio dell'applicazione viene copiato nel buffer del kernel Winsock e non indica che i dati hanno raggiunto il supporto di rete. L'unica eccezione è quando si disabilita il buffering di Winsock impostando SO_SNDBUF su 0 .


Leggendo il tuo commento qui sotto, mi rendo conto che potresti essere confuso perché l'impostazione TCP_NODELAY o l'impostazione SO_SNDBUF = 0 sembrano entrambi fare la stessa cosa. In tal caso, si noti che Nagle è applicabile solo su flussi TCP (che segmenta i dati in pacchetti), mentre SO_SNDBUF è applicabile anche ai socket UDP.

L'impostazione di SO_SNDBUF su zero interrompe esplicitamente tutto il buffering di output e si tenta un dispacciamento immediato per ogni 'scrittura' sul socket (almeno nelle normali implementazioni di socket).

L'impostazione di TCP_NODELAY interromperà esplicitamente l'algoritmo Nagle sui socket TCP sebbene il buffer di invio possa essere disponibile e utilizzato per l'invio ritardato (dopo che l'invio riuscito è stato riconosciuto nell'applicazione).

Altri suggerimenti

SO_SNDBUF impostato su 0 NON forza un invio immediato sul filo.

Impostando SO_SNDBUF su zero non disabiliterà implicitamente nagle; lo stato nagle gestito da WSK è indipendente dalla posizione del buffer. È tua mantenere validi i buffer che pubblichi fino a quando il trasporto non lo consuma.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top