代码之家  ›  专栏  ›  技术社区  ›  Dave Hogan

不活动后的SslStream延迟

  •  1
  • Dave Hogan  · 技术社区  · 14 年前

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

    服务器允许永久连接,但是我发现必须在60秒内用命令ping服务器以保持合理的响应级别。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 回复  |  直到 14 年前
        1
  •  1
  •   Eugene Mayevski 'Callback    14 年前

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

        2
  •  1
  •   wal    14 年前

    如果您想知道在低级别上发生了什么,那么不要使用SslStream,尝试使用来自 Mentalis.org

    它们提供了一个名为SecureTcpClient的类,您可以通过该类替换TcpClient。

    警告:此库是为.NET 1.0和1.1框架设计的。它不打算在.NET2.0框架上使用;此框架支持安全库提供的大部分功能。我只想用这个来搞清楚到底发生了什么。