Разъем разъединяется на одном конце, брандмауэр? - PullRequest
1 голос
/ 10 сентября 2009

У меня есть приложение на C #, которое работает нормально в течение нескольких лет. Он подключается через сокет TCP / IP к машине, которая отправляет мне биржевые сделки.

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

Когда происходит разъединение, в моем приложении (на стороне клиента) я не вижу ничего необычного, кроме того, что я прекращаю получать данные через сокет. Wireshark подтверждает, что данные не доходят до сокета, и поток получения моего приложения блокирует вызов Receive (), когда я останавливаю его в отладчике. Сокет отображается как УСТАНОВЛЕННЫЙ в netstat.

Но со стороны сервера похоже, что мой клиент отключается. Глядя на их журналы, похоже, что сокет на их конце обычно заканчивается либо (nRecvd = -1, errno = 104), либо (nRecvd = 0, errno = 11). (104 - это сброс соединения по пиру).

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

Сначала я подумал, что проблема в аппаратном брандмауэре. Это вызывало таймаут сокета после бездействия. Но ответственный за брандмауэр утверждает, что время ожидания подключения к этому порту (8887) составляет 2160 минут.

Я использую Windows Server 2003 и .NET 3.5. Торговый сервер - это машина Linux (sles9, хотя я не уверен).

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

Спасибо, Mike

Ответы [ 2 ]

1 голос
/ 10 сентября 2009

То, что вы описываете, является распространенным явлением, и обычно реализуется пульс для поддержания работы сокетов TCP через такие брандмауэры / шлюзы, как вы.

У этого оборудования могут быть жесткие тайм-ауты на 2160 минут (по моему опыту, хотя обычно это 20-30 минут), но соединения обычно разрываются гораздо агрессивнее, если есть какая-либо нагрузка. Такие брандмауэры имеют ограниченные ресурсы, и когда им нужно больше отслеживания подключений, они склонны отбрасывать самое старое отслеживаемое подключение без какой-либо активности независимо от установленного жесткого тайм-аута.

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

0 голосов
/ 10 сентября 2009

Я бы настроил wiresharp по обе стороны брандмауэра, чтобы посмотреть, что происходит по TCP (и более низкому уровню). И когда админ говорит, что «тайм-аут для подключений» это что-то. Это время ожидания простоя установленного соединения? Все остальное не имеет никакого смысла, я думаю.

Кроме того, вы используете опцию KeepAlive для TCP? И это пересылается брандмауэром или нет?

Как я уже сказал, возможно, вы хотите запустить wireshark по обе стороны брандмауэра ...

...