SslStream Задержки после бездействия - PullRequest
1 голос
/ 08 сентября 2010

Я написал клиентское приложение для общения со сторонним сервером. Его связь через пользовательский порт с SSL с использованием класса SslStream.

Сервер допускает постоянные соединения, однако я обнаружил, что мне нужно пропинговать сервер командой в течение 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

Спасибо

Ответы [ 2 ]

1 голос
/ 18 сентября 2010

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

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

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

1 голос
/ 09 сентября 2010

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

...