Прежде всего, не оба они отключают алгоритм Нейгла.
Алгоритм 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», это приведет к временной тупиковой ситуации. В таких случаях лучше отключить алгоритм Нейгла.
Таким образом, TCP_NODELAY используется для отключения алгоритма Нейгла.
TCP_CORK активно накапливает данные. Если в сокете включен TCP_CORK, он не будет отправлять данные, пока буфер не заполнится до фиксированного предела. Подобно алгоритму Nagle, он также накапливает данные от пользователя, но до тех пор, пока буфер не заполнится до фиксированного предела, а не до получения ACK. Это будет полезно при отправке нескольких блоков данных. Но вы должны быть более осторожны при использовании TCP_CORK.
До версии 2.6 оба эти параметра являются взаимоисключающими. Но в более позднем ядре они оба могут существовать вместе. В таком случае TCP_CORK будет отдано больше предпочтений.
Ref: