N * (connect + send + close) vs (Нагл отключить + соединение + N * отправить + закрыть), N> 1

Я новичок в программировании сокетов (как вы уже выяснили мой глупый вопрос), но сохраняя мой позор в сторону, я пишу программу, использующую TCP posix. Мой ограничитель следующий: сообщение, которое должно быть отправлено клиентом на сервер, должно быть прочитано как поток байтов, и, хотя мое приложение не является высокопроизводительным, сообщение должно быть доставлено как можно скорее. Я написал клиентский класс TCP с намерением сделать следующее: 1 connect - many send - и 1 закрыть в конце потоковой передачи. Проблема в том, что сообщения не доставляются почти в реальном времени (я предполагаю, что он ждет, чтобы иметь больший пакет для улучшения пропускная способность). После некоторых исследований в Интернете я обнаружил, что, хотя вы можете отключить алгоритм Nagle (NA), это очень плохая идея. Поскольку я новичок в программировании сокетов, я не хочу отключать функции, которые я не совсем понимаю. Итак, у меня остались два (плохо?) Варианта:

  • connect - send-close для сообщения
  • 1 connect - отправить несколько раз и сделать 1 закрыть в конце с отключенным NA. Хотя я читал о последствиях отказа от NA, мне кажется, что открытие и закрытие сокета каждый раз только для отправки сообщения - это тоже дорогостоящая цена.

Существуют ли другие решения, не выходя из сокетов?

Спасибо.

Ответы

Ответ 1

В вашем случае отключение Nagle - это именно то, что вы хотите сделать.

Просто помните, что каждый вызов write() будет немедленно передавать ваши данные. Поэтому убедитесь, что вы упаковываете все свое сообщение вместе, а затем вызываете write() (или writev()) один раз, когда вы готовы отправить; не повторяйте write() несколько раз с небольшими полезными нагрузками, потому что это будет медленным.

Ситуации, подобные вашим, именно поэтому они позволяют вам отключить Nagle.

Ответ 2

@Nemo дал отличный совет для TCP.

Но я предлагаю вам вместо этого взглянуть на UDP. TCP может ввести произвольную задержку во время потери пакетов, а "справедливость TCP" работает на основе принудительной потери пакетов. Это не идеально подходит для передач с малой задержкой. Желание отключить Nagle - сильный знак того, что вы используете неправильный протокол.