Качество TCP соединения в .NET - PullRequest
3 голосов
/ 16 октября 2008

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

Я бы хотел знать, куда указывать пальцем. Это клиент или сервер? Аппаратное или программное обеспечение? Это что-то про Ethernet-связь? Конечным результатом было бы показать пользователю индикатор работоспособности соединения, чтобы плохая ссылка могла быть исследована и исправлена.

Есть ли какие-либо показатели, которые я могу извлечь из TcpClient, Socket или чего-либо еще, что скажет мне о работоспособности соединения? Возможно, среднее время подтверждения, количество повторных попыток и т. Д.

Я специально хочу знать о TCP-соединении, а не только о Ethernet-соединении в целом (ваше LAN-соединение может быть модным, но может быть проблема при переходе на внешний сервер).

Конечно, я мог бы пропинговать удаленный хост, но я не думаю, что это действительно дало бы мне такую ​​статистику, которую я ищу. Во-первых, я мог бы пропинговать маршрутизатор, если сервер скрывается за NAT.

Ответы [ 2 ]

5 голосов
/ 16 октября 2008

Во-первых, вы должны проверить детали получаемых вами исключений SocketException. Я не знаю, что они содержат в .Net, но в Java подробное сообщение содержит полезную подсказку, такую ​​как «Соединение закрыто одноранговым узлом» или «Сброс соединения».

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

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

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

1 голос
/ 16 октября 2008

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

Добавьте также некоторые счетчики .NET, например, GC, использование памяти и ЦП.

Последнее, что вы можете сделать, это увеличить время ожидания TCP и другие настройки. Они в реестре

Вам придется контролировать оба конца, если это действительно проблема с удаленным сервером, но начните с просмотра счетчиков и посмотрите, не выскакивает ли что-нибудь на вас.

...