В статье базы знаний, на которую вы ссылаетесь, ответы даны таким образом ...
Чтобы оптимизировать производительность на уровне приложений, Winsock копирует буферы данных из приложений, отправляет вызовы в буфер ядра Winsock . Затем стек использует свою собственную эвристику (такую как алгоритм Nagle), чтобы определить, когда на самом деле поместить пакет в провод.
и, установив TCP_NODELAY или SO_SNDBUF = 0, вы отключите алгоритм Nagle, как показано ниже,
Параметр сокета TCP_NODELAY применяется для отключения алгоритма Nagle , чтобы небольшие пакеты данных доставлялись на удаленный хост без задержки.
Вы можете изменить количество буфера ядра Winsock, выделенного сокету, используя опцию SO_SNDBUF (по умолчанию это 8 КБ). При необходимости Winsock может буферизовать значительно больше, чем размер буфера SO_SNDBUF. В большинстве случаев завершение отправки в приложении только указывает, что буфер данных в вызове отправки приложения копируется в буфер ядра Winsock и не указывает, что данные попали в сетевой носитель. Единственное исключение - когда вы отключаете буферизацию Winsock, устанавливая SO_SNDBUF в 0 .
Читая ваш комментарий ниже, я понимаю, что вы можете быть смущены, потому что установка TCP_NODELAY или установка SO_SNDBUF = 0, похоже, делают одно и то же. В этом случае обратите внимание, что Nagle применим только для потоков TCP (который разбивает данные на пакеты), тогда как SO_SNDBUF также применим для сокетов UDP.
Установка SO_SNDBUF в ноль явно останавливает всю буферизацию вывода и предпринимается немедленная диспетчеризация для каждой «записи» в сокет (по крайней мере, в обычных реализациях сокетов).
Установка TCP_NODELAY явным образом остановит алгоритм Nagle на сокетах TCP, хотя буфер отправки может быть доступен и использоваться для отложенной отправки (после подтверждения успешной отправки приложению).