Tomcat 8.0.x Websockets、SSL 和 Windows --> 最后一帧延迟

Tomcat 8.0.x Websockets, SSL and Windows --> last frame delayed

1/ 在 java 8 上安装最新版本的 tomcat (8.0.28) 和 运行(我使用的是 1.8.0_45 / 64 位版本)。 我 运行 在 Windows 7 64 位

上安装 Tomcat

2/ 在 Tomcat 上启用 SSL: 通过创建密钥库并取消注释 server.xml 文件中的 https 连接器来激活 SSL,添加 keystoreFile="" keystorePass="" 到连接器。 仅供参考:这是我的连接器:

   <Connector port="8443" protocol="org.apache.coyote.http11.Http11NioProtocol"
               maxThreads="150" SSLEnabled="true" scheme="https" secure="true"
               clientAuth="false" sslProtocol="TLS"  
               keystorePass="password" 
               keystoreFile="/path/to/my/keystore" />

3/ 安装 Fiddler (www.telerik.com/fiddler) 或任何其他工具来嗅探您的主机和服务器之间的流量,fiddler 应该 运行 在您的主机上。我用 Fiddler 做了屏幕截图。

4/ 转到 tools/options/https 并检查 "enable decrypt"。

5/ 使用 Internet Explorer 11(chrome 也可以,但由于它压缩了 websocket 流量,因此很难达到 8KB 的数据),使用 https 远程访问您的 tomcat 并在 [=14= 打开示例应用程序]

选择"Programmatic API",点击"Connect",然后发送一条小测试消息

在 fiddler 上,双击 websocket 会话并在 websocket 选项卡中查看结果。

现在,尝试发送 20KB 的大文本,您会看到回复被分割成标记为 "Continuation" 的 8KB 帧。此时应该有一个标记为 "Final" 的框架丢失了。

发送另一条小消息,以便刷新丢失的帧。

重要:

如果我在主机上本地连接到 Tomcat 运行ning,我不会重现此问题。 如果我不使用 SSL,我不会重现这个问题。

问题: - 为什么这样的行为,有没有人经历过同样的事情? - 如何正确解决此问题? - 我尝试启用 Tomcat 日志记录,但在日志记录中没有任何有趣的内容:org.apache.tomcat.websocket.level = FINE

这个问题显然与 OS 相关: 当 Tomcat 为 Windows 7 时,它不起作用 当 Tomcat 为 Windows 10 时有效 当 Tomcat 在 Windows Server 2012 R2 上运行时

简而言之,这个问题结合了 OS(windows 的某些版本)/SSL 和 WebSockets。

我现在找到的 "dirty" 解决方法是发送最后一条消息来刷新缓冲区,因为我可以访问服务器端的代码。

如果您遇到这样的问题,请告诉我,因为这可能与某些特定 windows 版本的 SSL 握手有关,我不知道如何解决这个问题。