Job Snijders, uznawany programista OpenBSD i przewodniczący jednego z komitetów IETF (Internet Engineering Task Force), autor 11 RFC dotyczących routingu i RPKI oraz twórca IRRd (Internet Routing Registry Daemon), opublikował zestaw poprawek do OpenBSD, które dodają nowy parametr sysctl „net.inet.tcp.nodelay” do wyłączenia algorytmu Nagla na poziomie całego systemu. Parametr ten zwalnia programistów aplikacji z konieczności ustawiania flagi TCP_NODELAY dla poszczególnych gniazd.
Algorytm Nagla jest używany do agregacji małych wiadomości w celu zmniejszenia ruchu. Algorytm wstrzymuje wysyłanie nowych segmentów TCP do momentu otrzymania potwierdzenia odbioru wcześniej wysłanych danych lub do upływu limitu czasu. Na przykład, bez stosowania agregacji podczas wysyłania 1 bajta, dodatkowo wysyłane jest 40 bajtów z nagłówkami TCP i IP pakietów, a przy zastosowaniu algorytmu Nagla — wiadomości wysyłane przed przybyciem potwierdzenia zdalnej strony są gromadzone i wysyłane w jednym pakiecie. Z powodu optymalizacji „opóźnione ACK”, która opóźnia wysyłanie pakietów ACK, sygnał poprzez pakiety z potwierdzeniem w praktyce nie działa, a wysyłanie zgromadzonych wiadomości odbywa się po upływie limitu czasu.
Snijders twierdzi, że w dzisiejszych realiach algorytm Nagla, opracowany w czasach, gdy kilku użytkowników konkurowało o pasmo 1200 bodów, jest przestarzały i w sieciach wysokiej przepustowości przynosi więcej szkody niż pożytku. Niedawno podobne stanowisko wyraził Marc Brooker z firmy Amazon Web Services (AWS). Argumenty na rzecz domyślnego wyłączenia algorytmu Nagla można znaleźć w notatce opublikowanej kilka dni temu.
Aby wyłączyć algorytm Nagla, przewidziano opcję TCP_NODELAY, która może być ustawiana dla poszczególnych gniazd sieciowych. Tryb TCP_NODELAY jest już od dawna stosowany w wielu aplikacjach OpenBSD, takich jak openssh, httpd, iscsid, relayd, bgpd i unwind, a zdaniem Snijdersa nadszedł czas na zapewnienie możliwości jego włączenia dla wszystkich gniazd TCP na poziomie całego systemu. Snijders proponuje również omówić kwestię domyślnego włączenia TCP_NODELAY oraz przekształcenia algorytmu Nagla w osobną, opcjonalną funkcję.
Źródło: opennet.ru
