【问题标题】:SslStream Delays after inactivity不活动后 SslStream 延迟
【发布时间】:2010-09-08 19:51:52
【问题描述】:

我编写了一个客户端应用程序来与第三方服务器应用程序通信。它的通信是通过使用 SslStream 类的 SSL 自定义端口进行的。

服务器允许永久连接,但我发现我必须在 60 秒内使用命令 ping 服务器以保持合理的响应水平。 60 秒后,通讯仍然有效,但收到响应时有明显延迟。它不会断开连接并重新连接。只是比平时需要更长的时间。在 60 秒内发送另一个命令又快了。 60 秒后发送另一个命令会导致延迟。

就好像在 60 秒后 SslStream 与服务器重新协商,传输时间加倍。我知道 SSL 是基于会话的,这可能是原因吗?除了向服务器 App 发送不必要的命令以使其保持活动状态之外,我还能做些什么吗?

我的代码如下(截图):

 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 上

谢谢

【问题讨论】:

    标签: c# sockets ssl sslstream


    【解决方案1】:

    一般情况下,SSL 支持重新协商,因此确实如此。 另一个原因可能是服务器执行的部分代码在不活动一分钟后被交换到磁盘,以释放操作内存。当您发送请求时,应再次读取此内存。如果块很大,这可能需要一些时间。

    【讨论】:

    • 感谢您的 cmets - 我看不到它这么快就被转移到交换区。套接字/占用空间非常小,两者之间的数据通信只有几 kb。您对如何检查 .NET 中的内存情况有什么建议吗?
    • 你的意思是一分钟后的数据通讯只有几kb? IE。您是否检查过重新谈判的情况,在一分钟不活动后进行(或不进行)?
    • @DaveHogan 在 .NET 中有用于跟踪内存管理活动的工具,但我不知道特定的标题(不是我的专业领域)。此外,SSL/TLS 本身是在 CryptoAPI 中实现的,而不是在 .NET 中实现,因此如果 CryptoAPI / CNG 级别发生任何事情,.NET 工具很可能不会跟踪它。
    【解决方案2】:

    如果您想了解低级别发生的情况,请尝试使用来自Mentalis.org 的开源 SSL 库,而不是使用 SslStream

    他们提供了一个名为 SecureTcpClient 的类,您可以将其替换为 TcpClient。

    警告:此库专为 .NET 1.0 和 1.1 框架而设计。它不适用于 .NET 2.0 框架;该框架支持安全库提供的大部分功能。我只会用它来弄清楚发生了什么。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-08-21
      • 1970-01-01
      相关资源
      最近更新 更多