Многопоточность
Содержание
. Могут ли клиенты с медленным соединением сломать сервер на основе блокирующих сокетов?
спросил
Изменено
1 год, 10 месяцев назад
Просмотрено
109 раз
По определению блокирующих сокетов все вызовы send() или recv() блокируются до завершения всей сетевой операции. Это может занять некоторое время, особенно при использовании tcp и разговоре с клиентом с медленным соединением. Это, конечно, решается введением потоков и пулов потоков. Но что произойдет, если все потоки будут заблокированы каким-то медленным клиентом? Например, ваш сервер хочет обслуживать более 10 000 клиентов с помощью 100 потоков, отправляющих данные всем пользователям каждую секунду. Это означает, что каждый поток должен будет вызывать send() 100 раз в секунду. Что произойдет, если в какой-то момент 100 клиентов будут подключены к таким медленным соединениям, что один вызов send()/recv() займет для них 5 секунд (или, возможно, злоумышленник, который делает это намеренно). В этом случае все 100 потоков блокируются, а все остальные ждут. Как это вообще решается? Добавление большего количества потоков в пул потоков, вероятно, не является решением, поскольку всегда могут быть более медленные клиенты, а использование действительно большого количества потоков приведет к еще большим проблемам с потреблением ресурсов при переключении контекста и т. д.
- многопоточность
- сокеты
- блокировка
4
Могут ли клиенты с медленным соединением сломать сервер на основе блокирующих сокетов?
Да, могут. И это потребляет ресурсы на стороне сервера. И если этого происходит слишком много, вы можете получить форму «отказа в обслуживании».
Обратите внимание, что хуже всего, если вы используете блокировку ввода-вывода на стороне сервера, потому что вы связываете поток во время отправки ответа. Но это все еще проблема с неблокирующим вводом-выводом. В последнем случае вы используете сокеты на стороне сервера, номера портов и память для буферизации ответов, ожидающих отправки.
Если вы хотите защитить свой сервер от воздействия медленных клиентов, необходимо реализовать тайм-аут при отправке ответов. Если сервер обнаружит, что для написания ответа требуется слишком много времени… по какой-либо причине… он должен просто закрыть сокет.
Типичные веб-серверы делают это по умолчанию.
Наконец, как отмечает Дэвид, использование неблокирующего ввода-вывода сделает ваш сервер более масштабируемым. Вы можете обрабатывать больше одновременных запросов с меньшими ресурсами. Но все еще существуют ограничения на масштабирование одного сервера. После определенного момента вам нужен способ распределить нагрузку запросов на несколько серверов.
Зарегистрируйтесь или войдите в систему
Зарегистрируйтесь с помощью Google
Зарегистрироваться через Facebook
Зарегистрируйтесь, используя адрес электронной почты и пароль
Опубликовать как гость
Электронная почта
Требуется, но никогда не отображается
Опубликовать как гость
Электронная почта
Требуется, но не отображается
Блокировать подключения к вашему Mac с помощью брандмауэра
Искать в этом руководстве
Брандмауэр может защитить ваш Mac от нежелательных контактов, инициированных другими компьютерами, когда вы подключены к Интернету или сети. Однако ваш Mac по-прежнему может разрешать доступ через брандмауэр для некоторых служб и приложений. Например:
Если вы включите службу общего доступа, например общий доступ к файлам, macOS откроет определенный порт для связи службы.
Приложение или служба в другой системе могут запрашивать и получать доступ через брандмауэр или могут иметь доверенный сертификат и, следовательно, иметь доступ.
Для большего контроля вы можете выбрать приложения и службы и указать, могут ли они иметь доступ через брандмауэр.
Включить защиту брандмауэра
На Mac выберите меню Apple > Системные настройки, нажмите «Сеть» на боковой панели, затем нажмите «Брандмауэр». (Возможно, вам придется прокрутить вниз.)
Открыть настройки сети для меня
Включить брандмауэр.
Чтобы указать дополнительные параметры безопасности, нажмите «Параметры» и выполните любое из следующих действий:
Разрешить подключение только указанным приложениям и службам: Нажмите кнопку «Добавить» , затем выберите приложение или службу в появившемся диалоговом окне. .
Разрешить подключение только важным приложениям и службам: Включите «Блокировать все входящие подключения».
Автоматически разрешать встроенному ПО принимать входящие подключения: Включите «Автоматически разрешать встроенному ПО принимать входящие подключения».
Автоматически разрешать загруженному подписанному программному обеспечению принимать входящие соединения: Включите «Автоматически разрешать загруженному подписанному программному обеспечению принимать входящие соединения».
Чтобы хакерам и вредоносным программам было сложнее найти ваш Mac: Включите «Включить скрытый режим».
Настройка доступа через брандмауэр для служб и приложений
На Mac выберите меню Apple > Настройки системы, нажмите «Сеть» на боковой панели, затем нажмите «Брандмауэр». (Возможно, вам придется прокрутить вниз. )
Откройте настройки сети для меня
Нажмите «Параметры».
Если кнопка «Параметры» отключена, сначала включите брандмауэр.
Нажмите кнопку «Добавить» под списком служб, затем выберите службы или приложения, которые хотите добавить. После добавления приложения щелкните его стрелки вверх и вниз и выберите, разрешать или блокировать подключения через брандмауэр.
Блокирование доступа к приложению через брандмауэр может помешать или повлиять на производительность приложения или другого программного обеспечения, которое может от него зависеть.
Важно: Некоторые приложения, которых нет в списке, могут иметь доступ через брандмауэр. Это могут быть системные приложения, службы и процессы, а также приложения с цифровой подписью, которые автоматически открываются другими приложениями. Чтобы заблокировать доступ для этих программ, добавьте их в список.
Когда ваш Mac обнаруживает попытку подключения к приложению, которое вы не добавили в список и к которому не предоставили доступ, появляется предупреждающее сообщение с вопросом, хотите ли вы разрешить или запретить подключение по сети или через Интернет.