Vorschlag zur standardmäßigen Aktivierung des TCP_NODELAY-Modus

Marc Brooker, ein Ingenieur von Amazon Web Services (AWS), hat Missverständnisse im Zusammenhang mit der Effizienzsteigerung beim Versand kleiner Nachrichten untersucht, die durch den standardmäßig in der TCP/IP-Implementierung verwendeten Nagle-Algorithmus verursacht werden. Die Empfehlungen beinhalten, den Nagle-Algorithmus standardmäßig zu deaktivieren, was im Kontext einzelner Anwendungen durch Setzen der TCP_NODELAY-Option für Netzwerk-Sockets über den Aufruf von setsockopt erfolgen kann, wie es bereits in Projekten wie Node.js und curl gemacht 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 eingeht. Ohne Aggregation werden beispielsweise bei der Übertragung von 1 Byte zusätzlich 40 Bytes mit den TCP- und IP-Headern des Pakets gesendet. Unter modernen Bedingungen führt die Verwendung des Nagle-Algorithmus zu deutlich erhöhten Latenzen, die für interaktive und verteilte Anwendungen unakzeptabel sind.

Es werden drei Hauptargumente für die standardmäßige Verwendung der TCP_NODELAY-Option, die den Nagle-Algorithmus deaktiviert, angeführt:

  • Inkompatibilität des Nagle-Algorithmus mit der "delayed ACK"-Optimierung, bei der die ACK-Antwort nicht sofort, sondern nach dem Erhalt der Antwortdaten gesendet wird. Das Problem besteht darin, dass der Empfang des ACK-Pakets im Nagle-Algorithmus ein Signal zum Senden aggregierter Daten ist; wenn jedoch kein ACK-Paket empfangen wird, erfolgt das Senden nach Ablauf der Zeitüberschreitung. Dadurch entsteht ein Teufelskreis, und das ACK-Paket funktioniert als Signal nicht, da die andere Seite aufgrund der Ansammlung von Daten auf der Absenderseite keine Daten erhält, und der Absender sie bis zur Zeitüberschreitung nicht sendet, da er kein ACK-Paket erhält.
  • Der RFC für den Nagle-Algorithmus wurde 1984 verabschiedet und ist nicht für die Parameter moderner Hochgeschwindigkeitsnetze und Server Rechenzentren ausgelegt, was zu Problemen mit der Reaktionsfähigkeit führt. Die Verzögerung zwischen dem Senden einer Anfrage und dem Erhalt der Antwort (RTT) in modernen Netzwerken beträgt 0,5 ms + mehrere 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 leisten.
  • Moderne verteilte Anwendungen senden schon lange keine einzelnen Bytes mehr. Die Aggregation kleiner Daten wird normalerweise auf Anwendungsebene durchgeführt. Selbst wenn die Größe der nützlichen Daten nur einige Bytes beträgt, steigt die tatsächlich gesendete Informationsmenge in der Regel erheblich an, nachdem Serialisierung, die Verwendung von API-Bindings in JSON und der Versand unter TLS-Verschlüsselung angewendet wurden. Eine Einsparung von 40 Bytes wird somit weniger relevant.

Quelle: opennet.ru

Erwerben Sie zuverlässiges Hosting für Websites mit DDoS-Schutz, VPS VDS-Server 🔥 Kaufen Sie zuverlässiges Hosting für Websites mit DDoS-Schutz, VPS VDS-Server | ProHoster