Назад | Перейти на главную страницу

Брандмауэр Windows вызывает дросселирование подключения

У меня есть приложение, работающее на Win8.1 (или WinServer2012, это не имеет значения), которое предоставляет два прослушивателя HTTP-сервера в отдельных процессах (один использует HTTP.SYS через .NET HttpListener, другой использует Microsoft OWIN и автономный ASP.NET WebAPI).

В брандмауэре настроены правила разрешения, позволяющие подключаться к двум серверам (через правила на основе портов TCP) в локальной подсети.

Каждый клиент устанавливает три соединения LongPoll с сервером (два к HTTP.SYS и одно к OWIN) в дополнение к любым соединениям, необходимым для загрузки исходных ресурсов HTML / JS / изображений. Он использует браузер на основе WebKit в Linux для всего.

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

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

Наблюдение с помощью Wireshark на сервере показывает, что HTTP-запрос получен на сетевом уровне, но серверное приложение его не видит. Каждые две минуты из сетевого стека клиента наблюдается повторная передача TCP, которая пытается повторно отправить исходный запрос. Примерно через 15 минут клиент сдается и сообщает об ошибке клиентскому приложению, которое затем отключается и снова подключается; иногда запускает цикл ретрансляции снова, а иногда работает отлично.

Проблема воспроизводится путем физического отключения и повторного подключения кабелей Ethernet на всех клиентских устройствах - некоторые пройдут, а другие войдут в петли повторной передачи, как указано выше. Как ни странно, отключение питания на всех клиентских устройствах и их одновременный запуск обычно не вызывает проблемы.

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