TCP / IP и проектирование сетевых приложений - PullRequest
1 голос
/ 22 декабря 2009

Я читаю о том, как наиболее эффективно реализовать клиент-сервер, и натолкнулся на эту ссылку: http://msdn.microsoft.com/en-us/library/ms740550(VS.85).aspx

высказывание:

"Число одновременных подключений не должно превышать двух, за исключением приложений специального назначения. Превышение двух одновременных подключений приводит к потере ресурсов. Хорошее правило - иметь до четырех краткосрочных подключений или два постоянных подключения на пункт назначения"

Я не совсем понимаю, что они имеют в виду под 2 ... и что они подразумевают под постоянными?

скажем, у меня есть сервер, который слушает много клиентов, которые, как предполагается, выполняют некоторую работу с сервером, как я могу оставить только 2 открытых соединения? Каков наилучший способ реализовать это в любом случае? Я немного прочел о порте завершения, но не смог найти ни хороших примеров кода, ни хотя бы достойного объяснения.

спасибо

Ответы [ 4 ]

5 голосов
/ 22 декабря 2009

Читали ли вы последнее предложение:

Хорошее правило - иметь до четырех недолговечные связи или два постоянные соединения в назначения.

Трудно сказать из статьи, но по назначению я думаю, что они имеют в виду клиента. Это не очень хорошая статья.

2 голосов
/ 22 декабря 2009

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

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

Как сервер, реализующий конец прослушивания соединения, вы можете установить параметры в сокете TCP / IP прослушивания, чтобы ограничить количество соединений, которые будут удерживаться на уровне сокета, и решить, сколько из этих соединений вы хотите принять. - это позволит вам принять 2 постоянных соединения или 4 недолговечных соединения, как требуется.

0 голосов
/ 22 декабря 2009

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

Это означает, что каждая передача будет медленнее, чем могла бы быть, и сервер должен выделять больше ресурсов для более длительного времени - структуры данных для каждого соединения.

Поскольку установление tcp-соединения "занимает много времени", имеет смысл разрешить установить второе соединение во времени, когда вы обслуживаете первое, так что они перекрывают друг друга. для коротких соединений время установки может быть таким же, как и для обслуживания самого соединения (см. пример низкой производительности), поэтому для эффективного заполнения всей полосы пропускания требуется больше соединений.

(извините, я пока не могу размещать гиперссылки) Здесь msdn.microsoft.com/en-us/library/ms738559%28VS.85%29.aspx вы можете увидеть, что такое низкая производительность.

здесь msdn.microsoft.com/en-us/magazine/cc300760.aspx - это пример многопоточного сервера, который работает достаточно хорошо.

Вы можете ограничить количество открытых соединений, ограничив количество вызовов accept(). Вы можете ограничить количество соединений из одного источника, просто отменив соединение, когда вы обнаружите, что у вас уже есть более двух соединений из этого местоположения (просто посчитайте их).

Например, SMTP работает аналогичным образом. Когда слишком много соединений, он возвращает код 4xx и закрывает ваше соединение.

Также смотрите этот вопрос: Какой лучший эквивалент для epoll / kqueue / select в Windows?

0 голосов
/ 22 декабря 2009

То, что они подразумевают под «постоянным», - это соединение, которое открывается, а затем удерживается открытым. Довольно распространенная проблема - определить, стоит ли связывать ресурсы с подключением «всегда включено», или нести издержки на открытие и закрытие подключения каждый раз, когда вам это нужно.

Возможно, стоит сделать шаг назад.

Если у вас есть сервер, который должен прослушивать запросы от множества клиентов, у вас может быть идеальный вариант использования для архитектуры на основе сообщений. Если вы используете тесно связанные соединения, подобные тем, которые сделаны с TCP / IP, ваши клиенты и серверы должны будут много знать друг о друге, и вам придется писать много низкоуровневого кода соединения.

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

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

Промежуточное программное обеспечение, ориентированное на обмен сообщениями, такое как Apache ActiveMQ и Weblogic, предлагает API-интерфейсы, которые вы можете использовать из C ++ для управления очередями и другими объектами обмена сообщениями и их использования. ActiveMQ имеет открытый исходный код, а Weblogic продается Oracle (который купил BEA). Существует множество других отличных серверов обмена сообщениями, поэтому используйте их в качестве примеров, чтобы начать работу, если обмен сообщениями звучит так, как будто его стоит изучить.

...