Общие издержки создания TCP-соединения

Я хотел бы узнать общую стоимость создания нового соединения по сравнению с UDP. Я знаю, что TCP требует первоначального обмена пакетами (трехстороннее квитирование). Какие будут другие расходы? Например, есть ли какая-то магия в ядре, необходимая для настройки буферов и т.д.?

Причина, по которой я спрашиваю, я могу сохранить существующее соединение открытым и повторно использовать его по мере необходимости. Однако, если есть небольшое перенапряжение, это уменьшит сложность.

Ответ 1

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

Ответ 2

Как только пакет UDP был сброшен на провод, стек протокола UDP может полностью забыть об этом. С TCP, на минимальном уровне сведения о подключении (исходный/удаленный порт и источник/удаленный IP), порядковый номер, размер окна для подключения и т.д. Это не огромный объем данных, но быстро складывается на занятый сервер с множеством подключений.

И тогда есть трехстороннее рукопожатие. Некоторые braindead (и/или вредоносные системы) могут злоупотреблять процессом (смотрите "syn flood" ) или просто удаляйте соединение с их конца, оставляя вашу систему в ожидании ответа или уведомления о закрытии, которое никогда не появится. Плюсом является то, что с помощью TCP система сделает все возможное, чтобы пакет попадал туда, где он должен. В UDP нет никаких гарантий.

Ответ 3

ВАРИАНТ 1: Общая стоимость создания TCP-соединения:

  • Создание соединения сокетов
  • Отправить данные
  • Разрыв соединения сокета

Шаг 1: Требуется обмен пакетами, поэтому он задерживается на время ожидания и обратно из сети, а также время обслуживания целевого сервера. Никакое существенное использование ЦП в любом ящике не задействовано.

Шаг 2: зависит от размера сообщения.

Шаг 3: IIRC, просто отправляет пакет "закрыть сейчас", w/no wait для адресата назначения, поэтому не требуется латентность.

ВАРИАНТ 2: Затраты UDP: *

  • Создать объект UDP
  • Отправить данные
  • Закрыть объект UDP

Шаг 1: требуется минимальная настройка, без задержек, очень быстро.

Шаг 2: БУДЬТЕ ОСТОРОЖНЫ РАЗМЕРА, в UDP нет повторной передачи, так как это не волнует, был ли пакет получен кем-либо или нет. Я слышал, что чем больше сообщение, тем большая вероятность получения данных повреждена, и что эмпирическое правило состоит в том, что вы потеряете определенный процент сообщений более 20 МБ.

Шаг 3: Минимальная работа, минимальное время.

ВАРИАНТ 3: Вместо этого используйте ZeroMQ

Вы сравниваете TCP с UDP с целью сокращения времени повторного подключения. У НАСЛЕДУЮЩЕГО КОМПРОМИССА: гнезда ZeroMQ.

ZMQ позволяет вам настроить сокет публикации, где вас не волнует, если кто-то слушает (например, UDP), и имеет несколько слушателей в этом сокете. Это не сокет UDP - это альтернатива обеим этим протоколам.

Подробнее см. ZeroMQ.org.

Это очень высокая скорость и отказоустойчивость, и в этих целях все чаще используется в финансовой отрасли.