Marc Brooker, ingenieur bij Amazon Web Services (AWS), heeft de misverstanden rond de efficiƫntie van het verzenden van kleine berichten met het standaard NeThal-algoritme in de TCP/IP-stack besproken. De aanbevelingen komen erop neer dat het NeThal-algoritme standaard wordt uitgeschakeld, wat in de context van specifieke applicaties kan worden gedaan door de TCP_NODELAY-optie voor netwerksockets in te stellen met behulp van de setsockopt-aanroep, wat al lang geleden gebeurt in projecten zoals Node.js en curl.
Het NeThal-algoritme maakt het mogelijk om kleine berichten te aggregeren om het verkeer te verminderen - het stopt het verzenden van nieuwe TCP-segmenten totdat een bevestiging is ontvangen van eerder verzonden gegevens. Bijvoorbeeld, zonder aggregatie, bij het verzenden van 1 byte, worden er nog eens 40 bytes verzonden met TCP- en IP-headerinformatie. In de moderne omstandigheden leidt het gebruik van het NeThal-algoritme tot een significante verhoging van vertragingen, die onaanvaardbaar zijn voor interactieve en gedistribueerde applicaties.
Er worden drie belangrijke argumenten gegeven voor het standaard gebruik van de TCP_NODELAY-optie, die het NeThal-algoritme uitschakelt:
- Incompatibiliteit van het NeThal-algoritme met de 'delayed ACK'-optimalisatie, waarbij de ACK-respons niet onmiddellijk wordt verzonden, maar pas na ontvangst van de antwoorddata. Het probleem is dat in het NeThal-algoritme de ontvangst van de ACK-pakket een signaal is om de geaggregeerde gegevens te verzenden, en als het ACK-pakket niet is ontvangen, vindt de verzending pas plaats na het verstrijken van de tijdslimiet. Hierdoor ontstaat er een vicieuze cirkel en werkt het ACK-pakket als signaal niet, omdat de andere partij geen gegevens ontvangt vanwege de accumulatie aan de zenderzijde, en de zender verzendt deze niet vóór de tijdslimiet omdat hij het ACK-pakket niet ontvangt.
- De RFC voor het NeThal-algoritme werd in 1984 aangenomen en is niet ontworpen voor de parameters van moderne hogesnelheidsnetwerken en servers in datacenters, wat leidt tot problemen met de responsiviteit. De vertraging tussen het verzenden van een verzoek en het ontvangen van een respons (RTT) in moderne netwerken bedraagt 0,5 ms + enkele milliseconden tijdens de gegevensuitwisseling tussen datacenters in dezelfde regio + tot honderd milliseconden bij verzending wereldwijd. Gedurende deze milliseconden kan een moderne server een enorme hoeveelheid werk verzetten.
- Moderne gedistribueerde toepassingen sturen al lang geen enkele byte gegevens meer, en het aggregeren van kleine gegevens wordt meestal op het niveau van de toepassing gerealiseerd. Zelfs als de grootte van de nuttige gegevens slechts enkele bytes bedraagt, neemt de feitelijke grootte van de verzonden informatie meestal aanzienlijk toe na toepassing van serialisatie, gebruik van API-wrappers in JSON en verzending met TLS-encryptie. Een besparing van 40 bytes wordt dan niet zo relevant meer.
Bron: opennet.ru
