2010-09-08 2 views
1

Я написал клиентское приложение, чтобы поговорить с сторонним серверным приложением. Его comms находится над настраиваемым портом с SSL, использующим класс SslStream.SslStream Задержки после неактивности

Сервер разрешает постоянные подключения, однако я обнаружил, что мне нужно выполнить ping-сервер командой в течение 60 секунд, чтобы поддерживать разумный уровень отзывчивости. Через 60 секунд связь все еще работает, но есть заметная задержка в получении ответа. Это не удаление соединения и повторное подключение. Это займет больше времени, чем обычно. Отправка другой команды в течение 60 секунд выполняется снова. Отправка другой команды через 60 секунд вызывает задержки.

Как бы через 60 секунд SslStream повторно согласовывает с сервером, удваивающим время транзита. Я знаю, что SSL основан на сеансе, может ли это быть причиной? Есть ли что-нибудь, что я могу сделать, кроме отправки ненужных команд серверному приложению, чтобы сохранить его в живых?

Мой код ниже (пропущено):

var client = new TcpClient(); 
client.NoDelay = true; 
client.Connect("111.111.111.111", 6969); 
var sslStream = new SslStream(client.GetStream(), true, new RemoteCertificateValidationCallback(ValidateServerCertificate), null); 
sslStream.AuthenticateAsClient("111.111.111.111"); 

...

// The following method is invoked by the RemoteCertificateValidationDelegate. 
private bool ValidateServerCertificate(object sender, X509Certificate cert, X509Chain chain, SslPolicyErrors policyErrors) 
{ 
    if (policyErrors == SslPolicyErrors.None) 
     return true; 
    else 
     return false; 
} 

Надежда кто-то может пролить некоторый свет на это!

Мой клиент приложение написано в: C#/.NET 2.0 & 4.0 Хостинг на Windows 2003 и 2008

Благодаря

ответ

1

В общем, SSL поддерживает перезаключение так что это может быть действительно так. Другая причина может заключаться в том, что часть кода, выполняемая сервером, заменяется на диск после минуты бездействия, чтобы освободить операционную память. Когда вы отправляете запрос, эту память следует читать снова. Если блок большой, это может занять некоторое время.

+0

Спасибо за ваши комментарии - я не вижу, чтобы он был скоро перемещен в своп. Разъем/след очень мал, и данные между ними составляют всего несколько килобайт. Есть ли у вас какие-либо предложения о том, как проверить, что происходит с памятью в .NET? – DaveHogan

+0

Вы имеете в виду, что данные передают через минуту всего несколько килобайт? То есть вы проверяли вопрос о пересмотре, принимая (или не принимали) место после минуты бездействия? –

+0

@DaveHogan Есть инструменты для отслеживания активности управления памятью в .NET, но я не знаю конкретных названий (а не моей области знаний). Кроме того, сам SSL/TLS реализован в CryptoAPI, а не в .NET, поэтому, если что-либо происходит на уровне CryptoAPI/CNG, инструменты .NET, скорее всего, не будут отслеживать его. –

1

Если вы хотите знать, что происходит на низком уровне, то вместо того, чтобы использовать SslStream попробуйте использовать открытую библиотеку источник SSL из Mentalis.org

Они обеспечивают класс под названием SecureTcpClient который можно заскочить заменить TcpClient.

ВНИМАНИЕ: Эта библиотека была разработана для рамок .NET 1.0 и 1.1. Он не предназначен для использования в среде .NET 2.0; эта платформа поддерживает большинство функций, которые предлагает библиотека безопасности. Я бы использовал это только для выяснения того, что происходит.

Смежные вопросы