Я понял, что оба они отключили алгоритм Нагле.
Когда/не следует использовать каждый из них?
Я понял, что оба они отключили алгоритм Нагле.
Когда/не следует использовать каждый из них?
Прежде всего, оба из них не отменяют алгоритм Нагле.
Алгоритм 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:
TCP_NODELAY
Используется для отключения алгоритма Nagle для улучшения сетей TCP/IP и уменьшения количества пакетов, ожидая, пока не будет получено подтверждение ранее отправленных данных для отправки накопленных пакетов.
//Из руководства tcp (7):
TCP_CORK
(или TCP_NOPUSH
во FreeBSD)
Если установлено, не отправляйте частичные кадры. Все поставленные в очередь частичные кадры отправляются при повторной очистке опции. Это полезно для добавления заголовков перед вызовом sendfile(2)
или для оптимизации пропускной способности. Как в настоящее время реализовано, существует ** 200-миллисекундный потолок ** времени, в течение которого выходные данные TCP_CORK
. Если этот потолок достигнут, данные в очереди передаются автоматически. Эта опция может быть объединена с TCP_NODELAY
только начиная с Linux 2.5.71. Эта опция не должна использоваться в коде, предназначенном для переносимости.
Это оптимизация, так что любая оптимизация:
В основном цель состоит в том, чтобы не отправлять несколько кадров, где может использоваться один кадр, с sendfile() и его друзьями.
Так, например, на веб-сервере вы отправляете заголовки, за которыми следует содержимое файла, заголовки будут собраны в памяти, тогда файл будет отправлен непосредственно ядром. TCP_CORK позволяет иметь заголовки и начало файла, отправленного в одном кадре, даже с помощью TCP_NODELAY, что в противном случае немедленно отправило бы первый кусок.
TCP_CORK - это противоположность TCP_NODELAY. Бывшая задержка пакетного накопления; последний отключает его.