Сомнение в отношении Winsock Kernel Buffer и алгоритма Nagle - PullRequest
3 голосов
/ 19 июня 2009

Читая эту статью, у меня возникло сомнение.

Я понял, что при передаче небольших данных по умолчанию включен алгоритм Nagle, который объединяет небольшие пакеты. Это приводит к кешированию некоторых данных перед передачей. Я считаю, что Winsock Kernel Buffer - это место, где происходит кэширование. Поправь меня, если я ошибаюсь.

Означает ли это, что если буфер ядра Winsock установлен в ноль с параметром SO_SNDBUF, будет ли отключен алгоритм Nagle?

Если нет, то где WINSOCK кеширует небольшие данные?

Ответы [ 3 ]

5 голосов
/ 19 июня 2009

В статье базы знаний, на которую вы ссылаетесь, ответы даны таким образом ...

Чтобы оптимизировать производительность на уровне приложений, 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, хотя буфер отправки может быть доступен и использоваться для отложенной отправки (после подтверждения успешной отправки приложению).

0 голосов
/ 04 марта 2010

Установка SO_SNDBUF на ноль приведет к не неявному отключению nagle; состояние nagle, поддерживаемое WSK, не зависит от того, где находится буфер. Это ваша ответственность за поддержание буфера, который вы публикуете, действительным, пока транспорт не использует его.

0 голосов
/ 09 сентября 2009

SO_SNDBUF, установленный в 0, НЕ вызывает немедленную отправку по проводам.

...