2015-06-25 1 views
1

Мое понимание TCP в Java заключается в том, что, хотя вы можете многопоточно обрабатывать передачи данных в сокете, вы можете установить только одно соединение за раз. Это правда? Если нет, как бы вы реализовали сервер, который может одновременно устанавливать несколько соединений на одном и том же адресе и порту.Установление нескольких TCP-соединений одновременно

ie Если клиент должен был установить соединение с сервером, но подключается через очень нестабильную сеть, сервер должен дождаться завершения установления соединения, прежде чем сможет принять соединение от другого клиента ?

+0

Стандартный шаблон для сервера - это то, что код прослушивает соединение, а затем, когда он его получает, он вилки нового потока. Новый поток взаимодействует с клиентом, а основной поток сервера возвращается и прослушивает другое соединение. Так я всегда видел это в Unix/Linux. Это не специфично для Java. Вероятно, это очень похоже на системы Windows, но я не помню, как это было сделано. – ajb

+0

P.S. Я не знаю ответа на второй вопрос, но я предполагаю, что да, серверу придется подождать, пока одно соединение будет установлено (или оставлено) до принятия другого. Это функция базовой ОС и/или самого протокола TCP, и снова не имеет ничего общего с Java. – ajb

+0

@ajb Основная ОС может отправлять пакеты одновременно нескольким получателям, поэтому одновременно инициирует несколько подключений. Были бы ужасные последствия для работы, если бы такое последовательное общение. – Kayaman

ответ

1

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

Этот аспект протокола TCP адресуется listen backlog. По крайней мере по Linux, полуоткрытые соединения для сервера находятся в очереди в ожидании завершения, после чего они готовы принять. Максимальное количество полуоткрытых соединений, которые может обрабатывать сервер, ограничено ОС. В Linux вы можете увидеть, что такое кепка, рассмотрев запись /proc. Например на RHEL 6 VM:

$ cat /proc/sys/net/core/somaxconn 
128 

Вредоносный объект может использовать это, начав SYN_FLOOD атаку, которая пополнит слушать накопившуюся и предотвратить ваш сервер от принятия новых подключений. Смягчение такого типа атаки (особенно, когда оно выполняется бот-сетью) чрезвычайно сложно, но есть некоторые basic defences, а также некоторые дорогостоящие платные сервисы.

0

Если вы ссылаетесь на архитектуру потока реализаций сервера на основе JAVA, большая часть сервера использует поток на основе пула и очереди. Мы не можем создать N количество потоков для каждого запроса. Но сервер поддерживает очередь запросов с архитектурой пула потоков и обрабатывает запросы один за другим.

Поэтому Если вы думаете о создании своего собственного сервера на базе JAVA. Затем планируйте создание настраиваемых очередей потоков и обрабатывайте запрос.

См How many concurrent request can tomcat handle by Default

0

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

Раньше был недостаток в TCP, который допускал простую атаку DOS, только инициируя соединения, не заканчивая их, но даже для этого требовалось множество соединений.