N * (соединить + отправить + закрыть) против (отключить Nagle + соединить + N * отправить + закрыть), N> 1 - PullRequest
14 голосов
/ 03 июня 2011

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

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

Есть ли другие решения, не оставляя розеток?

Спасибо.

Ответы [ 2 ]

12 голосов
/ 03 июня 2011

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

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

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

2 голосов
/ 03 июня 2011

@ Немо дал отличный совет по TCP.

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...