【问题标题】:C# TLS session disconnectsC# TLS 会话断开连接
【发布时间】:2019-09-24 01:31:13
【问题描述】:

我有一个使用 C# 编写的 TLS 连接的客户端/服务器 TCP 场景。

客户端在安静并恢复后无法传递消息(不活动时间约 25 分钟)。但如果我让客户聊天(每 30 秒一次)就没有问题。

客户端和服务器都没有看到断开连接,但流量停止流动(TLS 会话中断???我只是在这里猜测)。

我需要保持连接,因为服务器需要随时回复。

一旦 TCP 套接字连接并且 TLS 进行身份验证,服务器每 5 分钟进行一次 KeepAlives

Q1) 有没有办法在 C# 中配置 SslStream 或套接字以使用 TicketKeys 并重用会话?

Q2) 如果问题不是会话重用,如果我使用 WireShark 或 NetMonitor,我应该寻找什么来确定为什么流量不再流动,即使各方认为他们连接了吗?

谢谢

【问题讨论】:

  • 这没有回答 Q1 和 Q2,但可能会解释您所看到的:它可能是一些防火墙或有状态的数据包过滤器或 NAT 路由器,它们之间有一个短暂的状态超时。一旦状态关闭,此连接上的流量将不再通过中间盒。要使其保持打开状态,您需要应用程序级别保持活动或短 TCP 保持活动。
  • 感谢 Steffen,您所说的有道理,但如果我使用没有 TLS 的 TCP 套接字,问题就不会出现。我不知道我的服务器(Azure VM)是否保留了会话密钥缓存,但我怀疑这是超时的原因。
  • 会话缓存用于跨越多个 TCP 连接的 SSL 会话,即恢复在另一个 TCP 连接中启动的会话。因此,在超时位于单个 TCP 连接内的情况下,它应该没有影响。
  • 至于 Q2:查看数据包是否在一侧发送并在另一侧接收。如果它在一侧发送而另一侧未收到,则问题是由某些中间盒引起的。

标签: c# session ssl


【解决方案1】:
  • 不要在服务器和客户端设置超时

    sslStream.ReadTimeout = 5000;
    sslStream.WriteTimeout = 5000;
    
  • 设置大超时

  • 实现类似:Ping/Pong heartbeat 命令并在客户端,在单独的线程中,每 X 秒向服务器发送一次 Ping

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-01-24
    • 1970-01-01
    • 1970-01-01
    • 2021-09-25
    • 2012-11-22
    • 1970-01-01
    • 2010-11-06
    • 2019-10-25
    相关资源
    最近更新 更多