Н*(подключение + отправить + закрыть) против (Нэгл отключение + подключение + Н*отправить + закрыть), где N> 1
Я новичок в программировании сокетов (как вы уже поняли по моему глупому вопросу), но, оставляя в стороне свой стыд, я пишу программу с использованием TCP posix. Мое ограничение заключается в следующем: сообщение, которое будет отправлено от клиента к серверу, должно быть прочитано как поток байтов, и хотя мое приложение не отличается высокой производительностью, сообщение должно быть доставлено как можно скорее. Я написал клиентский класс TCP с намерением сделать следующее: 1 подключить-много отправить-и 1 закрыть в конце струящийся. Проблема в том, что сообщения не доставляются в режиме реального времени (я предполагаю, что его ожидание будет иметь больший пакет для лучшего после проведения некоторых исследований в Интернете я обнаружил, что, хотя вы можете отключить алгоритм Нэгла (NA), это очень плохая идея. Поскольку я новичок в программировании сокетов, я не хочу отключать функции, которые я не полностью понимаю. Так что я остался с двумя (плохими?) варианты:
- соединение-отправка-закрытие на сообщение
- 1 Подключение - отправьте несколько раз и сделайте 1 закрытие в конце с отключенным NA. В то время как я читаю последствия отключения NA, мне кажется, что открытие и закрытие сокета каждый раз только для отправки сообщения-это дорогая цена, которую нужно заплатить.
Существуют ли другие решения, не выходя из сокетов?
Спасибо.
2 ответа:
В вашем случае отключение Нэгла-это именно то, что вы хотите сделать.
Просто помните, что каждый вызов write () будет передавать ваши данные немедленно. Поэтому убедитесь, что вы упаковываете все ваше сообщение вместе, а затем вызываете write() (или writev()) один раз, когда вы готовы отправить; не вызывайте write() повторно с небольшими полезными нагрузками, потому что это будет медленно.
Ситуации, подобные вашей, именно поэтому они позволяют вам отключить Нэгла.
@Nemo дал отличный совет для TCP.
Но я предлагаю вам вместо этого посмотреть на UDP. TCP может ввести произвольную задержку во время потери пакета, и "справедливость TCP" работает на основе принуждения к потере пакета произойти. Он не идеален для передачи данных с низкой задержкой. Желание отключить Нэгла-это сильный признак того, что вы используете неправильный протокол.