Wanneer moet ik TCP_NODELAY gebruiken en wanneer TCP_CORK?

Ik heb begrepen dat ze allgoritme van Nagle uitschakelen.

Wanneer moet / mag ik niet elk van hen gebruiken?


Antwoord 1, Autoriteit 100%

Allereerst schakelt niet allebei het algoritme van Nagle uit.

Algoritme van Nagle is voor het verminderen van meer aantal kleine netwerkpakketten in draad. Het algoritme is: als gegevens kleiner zijn dan een limiet (meestal MSS), wacht dan tot het ontvangen van ACK voor eerder verzonden pakketten en in de tussentijd de gegevens van de gebruiker accumuleren. Stuur vervolgens de geaccumuleerde gegevens.

if [ data > MSS ]
    send(data)
else
    wait until ACK for previously sent data and accumulate data in send buffer (data)
    And after receiving the ACK send(data)

Dit zal helpen bij toepassingen zoals Telnet. Wachten op de ACK kan echter de latentie verhogen bij het verzenden van streaming-gegevens. Bovendien, als de ontvanger het ‘vertraagde ACK-beleid’ implementeert, zal het een tijdelijke impasse-situatie veroorzaken. In dergelijke gevallen is het uitschakelen van het algoritme van Nagle een betere optie.

Dus TCP_NODELAY wordt gebruikt voor het uitschakelen van het algoritme van Nagle.

TCP_CORK accumuleert agressief gegevens. Als TCP_CORK in een socket is ingeschakeld, wordt deze geen gegevens verzonden totdat de buffer vult tot een vaste limiet. Vergelijkbaar met het algoritme van Nagle, accumuleert het ook gegevens van de gebruiker, maar totdat de buffer tot een vaste limiet vult, pas pas bij het ontvangen van ACK. Dit is handig tijdens het verzenden van meerdere gegevensblokken. Maar je moet voorzichtiger zijn tijdens het gebruik van TCP_CORK.

Tot 2,6 kernel zijn beide opties wederzijds exclusief. Maar in latere kernel kunnen allebei samen bestaan. In dat geval krijgt TCP_CORKER meer voorkeur.

Ref:


Antwoord 2, autoriteit 31%

TCP_NODELAY

Gebruikt om het algoritme van Nagle uit te schakelen om TCP/IP-netwerken te verbeteren en het aantal pakketten te verminderen door te wachten tot een bevestiging van eerder verzonden gegevens is ontvangen om de verzamelde pakketten te verzenden.

//Van de tcp(7) handleiding:

TCP_CORK(of TCP_NOPUSHin FreeBSD)

Als dit is ingesteld, verzendt u geen gedeeltelijke frames. Alle gedeeltelijke frames in de wachtrij worden verzonden wanneer de optie weer wordt gewist. Dit is handig voor het toevoegen van headers voordat sendfile(2)wordt aangeroepen, of voor het optimaliseren van de doorvoer. Zoals momenteel geïmplementeerd, is er een **plafond van 200 milliseconden** voor de tijd waarvoor de output wordt gekurkt door TCP_CORK. Als dit plafond wordt bereikt, worden gegevens in de wachtrij automatisch verzonden. Deze optie kan alleen worden gecombineerd met TCP_NODELAYsinds Linux 2.5.71. Deze optie mag niet worden gebruikt in code die bedoeld is om draagbaar te zijn.


Antwoord 3, autoriteit 10%

Het is een optimalisatie, dus zoals elke optimalisatie:

  1. Gebruik het niet
  2. Wacht tot de prestaties een probleem worden, en als je hebt vastgesteld dat de latentie van de socket hier zeker de oorzaak van is, en testen bewijst dat dit het zeker zal oplossen, EN dit is de gemakkelijkste manier om het op te lossen, doe het.

In principe is het doel om te voorkomen dat u meerdere frames moet verzenden waar een enkel frame kan worden gebruikt, met sendfile() en zijn vrienden.

Dus in een webserver verzend je bijvoorbeeld de headers gevolgd door de bestandsinhoud, de headers worden in het geheugen geassembleerd, het bestand wordt dan rechtstreeks door de kernel verzonden. Met TCP_CORK kun je de headers en het begin van het bestand in een enkel frame laten verzenden, zelfs met TCP_NODELAY, omdat anders de eerste chunk onmiddellijk zou worden verzonden.


Antwoord 4

TCP_CORK is het tegenovergestelde van TCP_NODELAY. De eerste forceert een vertraging van de accumulatie van pakketten; de laatste schakelt het uit.

Other episodes