Vorschlag zur standardmĂ€ĂŸigen Aktivierung des TCP_NODELAY-Modus

Marc Brooker, Ingenieur bei Amazon Web Services (AWS), hat MissverstĂ€ndnisse ĂŒber die Effizienzsteigerung der Übertragung kleiner Nachrichten mit dem Nagle-Algorithmus, der standardmĂ€ĂŸig im TCP/IP-Stack verwendet wird, aufgeklĂ€rt. Die Empfehlungen zielen darauf ab, den Nagle-Algorithmus standardmĂ€ĂŸig zu deaktivieren, was im Kontext bestimmter Anwendungen durch das Setzen der TCP_NODELAY-Option fĂŒr Netzwerksockets mittels des Aufrufs von setsockopt erreicht werden kann, wie es bereits in Projekten wie Node.js und curl seit langem praktiziert wird.

Der Nagle-Algorithmus ermöglicht die Aggregation kleiner Nachrichten zur Reduzierung des Datenverkehrs – er pausiert das Senden neuer TCP-Segmente, bis eine BestĂ€tigung fĂŒr den Empfang zuvor gesendeter Daten vorliegt. Beispielsweise werden bei der Übertragung von 1 Byte ohne Aggregation zusĂ€tzlich 40 Bytes mit TCP- und IP-Headern des Pakets gesendet. Unter modernen Bedingungen fĂŒhrt die Verwendung des Nagle-Algorithmus zu einer spĂŒrbaren Erhöhung der Latenz, die fĂŒr interaktive und verteilte Anwendungen inakzeptabel ist.

Es gibt drei Hauptargumente fĂŒr die standardmĂ€ĂŸige Verwendung der TCP_NODELAY-Option, die den Nagle-Algorithmus deaktiviert:

  • InkompatibilitĂ€t des Nagle-Algorithmus mit der Optimierung „delayed ACK“, bei der die ACK-Antwort nicht sofort, sondern erst nach Erhalt von Antwortdaten gesendet wird. Das Problem besteht darin, dass im Nagle-Algorithmus der Eingang eines ACK-Pakets ein Signal zum Senden aggregierter Daten ist, und wenn das ACK-Paket nicht eintrifft, erfolgt das Senden bei Ablauf eines Timeouts. Somit entsteht ein Teufelskreis, und das ACK-Paket funktioniert nicht als Signal, da die andere Seite die Daten aufgrund der Ansammlung auf der Senderseite nicht erhĂ€lt, und der Sender sie nicht sendet, bevor der Timeout eintritt, da er kein ACK-Paket erhĂ€lt.
  • Der RFC fĂŒr den Nagle-Algorithmus wurde 1984 angenommen und ist nicht auf die Parameter moderner Hochgeschwindigkeitsnetze angepasst und Server in Rechenzentren, was zu Problemen mit der ReaktionsfĂ€higkeit fĂŒhrt. Die Verzögerung zwischen dem Senden einer Anfrage und dem Erhalten einer Antwort (RTT) in modernen Netzwerken betrĂ€gt 0,5 ms + einige Millisekunden beim Datenaustausch zwischen Rechenzentren in derselben Region + bis zu hundert Millisekunden beim globalen Versand. In diesen Millisekunden kann ein moderner Server eine enorme Menge an Arbeit verrichten.
  • Moderne verteilte Anwendungen senden lĂ€ngst keine einzelnen Bytes mehr, und die Aggregation kleiner Daten wird normalerweise auf der Anwendungsebene realisiert. Selbst wenn die GrĂ¶ĂŸe der nĂŒtzlichen Daten nur einige Bytes betrĂ€gt, steigt in der Regel die tatsĂ€chlich gesendete InformationsgrĂ¶ĂŸe erheblich an, nachdem die Serialisierung, die Verwendung von API-Wrappern in JSON und die Übertragung mit TLS-VerschlĂŒsselung angewendet wurden. Eine Einsparung von 40 Byte wird weniger relevant.

Quelle: opennet.ru

ZuverlĂ€ssiges Hosting fĂŒr Websites mit DDoS-Schutz kaufen, VPS VDS Server đŸ”„ ZuverlĂ€ssiges Hosting fĂŒr Websites mit DDoS-Schutz kaufen, VPS VDS Server - ProHoster