【发布时间】: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:查看数据包是否在一侧发送并在另一侧接收。如果它在一侧发送而另一侧未收到,则问题是由某些中间盒引起的。