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


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

  1. соединение-отправка-закрытие на сообщение
  2. 1 Подключение - отправьте несколько раз и сделайте 1 закрытие в конце с отключенным NA. В то время как я читаю последствия отключения NA, мне кажется, что открытие и закрытие сокета каждый раз только для отправки сообщения-это дорогая цена, которую нужно заплатить.

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

Спасибо.

2   14  

2 ответа:

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

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

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

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

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