Джоб Снейдерс (Job Snijders), известен като разработчик на OpenBSD, ръководител на един от комитетите в IETF (Internet Engineering Task Force), автор на 11 RFC, свързани с маршрутизацията и RPKI, и създател на IRRd (Internet Routing Registry Daemon), публикува набор от пачове за OpenBSD, които добавят новия sysctl параметър „net.inet.tcp.nodelay“ за деактивиране на алгоритъма Нейгла на системно ниво. Параметърът освобождава разработчиците на приложения от необходимостта да задават TCP_NODELAY флага за отделни сокети.
Алгоритъмът Нейгла се използва за агрегация на малки съобщения с цел намаляване на трафика. Алгоритъмът спира изпращането на нови TCP сегменти до получаването на потвърждение за прием на по-рано изпратените данни или до изтичането на таймаута. Например, без приложение на агрегацията, при изпращане на 1 байт се изпращат допълнително 40 байта с TCP и IP заглавията на пакета, а с прилагането на алгоритъма Нейгла — съобщенията, изпратени до получаването на потвърждение от отдалечената страна, се натрупват и се изпращат в един пакет. Поради наличието на оптимизационната функция „delayed ACK“, която забавя изпращането на ACK пакети, сигнализацията чрез пакети с потвърждение всъщност не работи, и изпращането на натрупаните съобщения се извършва при изтичането на таймаута.
Снейдерс смята, че в съвременните условия алгоритъмът Нейгла, разработен в епохата, когато няколко потребители са се конкурирали за пропускателната способност от 1200 ваща, е остарял и в високоскоростни мрежи от него има повече вреда отколкото полза. Наскоро подобно становище изрази и Марк Брукер (Marc Brooker) от компанията Amazon Web Services (AWS). С аргументите за деактивиране на алгоритъма Нейгла по подразбиране можете да се запознаете в публикуваната преди няколко дни бележка.
За деактивиране на алгоритъма Нейгла е предвидена опцията TCP_NODELAY, която може да бъде зададена за отделни мрежови сокети. Режимът TCP_NODELAY отдавна се задава в много приложения на OpenBSD, сред които openssh, httpd, iscsid, relayd, bgpd и unwind, и според Снейдерс, настъпва времето да се предостави възможност за активиране на него за всички TCP сокети на системно ниво. Снейдерс също предлага да се обсъди въпросът за включването на TCP_NODELAY по подразбиране и преминаването на алгоритъма Нейгла към статута на опция, която може да бъде активирана.
Източник: opennet.ru
