Подтвердить что ты не робот

Когда следует использовать TCP_NODELAY и TCP_CORK?

Я понял, что оба они отключили алгоритм Нагле.

Когда/не следует использовать каждый из них?

4b9b3361

Ответ 1

Прежде всего, оба из них не отменяют алгоритм Нагле.

Алгоритм Nagle предназначен для уменьшения количества небольших сетевых пакетов в проводе. Алгоритм: если данные меньше предела (обычно MSS), дождитесь получения ACK для ранее отправленных пакетов и в среднем время накапливает данные от пользователя. Затем отправьте накопленные данные.

if [ data > MSS ]
    send(data)
else
    wait until ACK for previously sent data and accumulate data in send buffer (data)
    And after receiving the ACK send(data)

Это поможет в таких приложениях, как telnet. Однако ожидание ACK может увеличить задержку при отправке потоковых данных. Кроме того, если получатель реализует "задержанную политику ACK", это приведет к временной ситуации взаимоблокировки. В таких случаях лучше всего отключить алгоритм Nagle.

Таким образом, TCP_NODELAY используется для отключения алгоритма Nagle.

TCP_CORK агрессивно накапливает данные. Если TCP_CORK включен в сокете, он не будет отправлять данные, пока буфер не заполнит фиксированный предел. Подобно алгоритму Нагле, он также накапливает данные от пользователя, но до тех пор, пока буфер не заполнит фиксированный предел до получения ACK. Это будет полезно при отправке нескольких блоков данных. Но вы должны быть более осторожными при использовании TCP_CORK.

До ядра 2.6 оба этих параметра являются взаимоисключающими. Но в более позднем ядре обе они могут существовать вместе. В этом случае предпочтение будет отдаваться TCP_CORK.

Ref:

Ответ 2

TCP_NODELAY

Используется для отключения алгоритма Nagle для улучшения сетей TCP/IP и уменьшения количества пакетов, ожидая, пока не будет получено подтверждение ранее отправленных данных для отправки накопленных пакетов.

//Из руководства tcp (7):

TCP_CORK (или TCP_NOPUSH во FreeBSD)

Если установлено, не отправляйте частичные кадры. Все поставленные в очередь частичные кадры отправляются при повторной очистке опции. Это полезно для добавления заголовков перед вызовом sendfile(2) или для оптимизации пропускной способности. Как в настоящее время реализовано, существует ** 200-миллисекундный потолок ** времени, в течение которого выходные данные TCP_CORK. Если этот потолок достигнут, данные в очереди передаются автоматически. Эта опция может быть объединена с TCP_NODELAY только начиная с Linux 2.5.71. Эта опция не должна использоваться в коде, предназначенном для переносимости.

Ответ 3

Это оптимизация, так что любая оптимизация:

  • Не используйте его
  • Подождите, пока производительность не станет проблемой, а затем определит, что задержка сокета определенно является причиной этого, и тестирование доказывает, что это определенно устранит его, и это самый простой способ его исправления. Сделайте это.

В основном цель состоит в том, чтобы не отправлять несколько кадров, где может использоваться один кадр, с sendfile() и его друзьями.

Так, например, на веб-сервере вы отправляете заголовки, за которыми следует содержимое файла, заголовки будут собраны в памяти, тогда файл будет отправлен непосредственно ядром. TCP_CORK позволяет иметь заголовки и начало файла, отправленного в одном кадре, даже с помощью TCP_NODELAY, что в противном случае немедленно отправило бы первый кусок.

Ответ 4

TCP_CORK - это противоположность TCP_NODELAY. Бывшая задержка пакетного накопления; последний отключает его.