与http1 keep-alive连接相比,为什么http2连接立即关闭?

时间:2017-04-04 14:33:13

标签: sockets nginx tcp http2

因为我们的浏览器游戏服务器在停机后很难为所有客户端服务(许多玩家刷新页面直到它再次运行)我试图减少套接字连接。我们使用nginx 1.10.3为页面提供服务,并使用了http 1.1 keep-alive连接。游戏的后端也使用nginx 1.10.3并使用http 1.1连接(没有保持活着!)。在此设置期间,我看到很多TCP-Sockets在TIME_WAIT状态最终关闭之前。这是正确的(见https://vincent.bernat.im/en/blog/2014-tcp-time-wait-state-linux)。

根据http://caniuse.com/#feat=http2每个大浏览器都支持http2,因此我尝试了它。据我所知,http2重用TCP连接,因此它更快,因为当已经有一个工作的TCP连接到接收器时,跳过整个握手部分(其他一些功能使http2也更快)。

我使用netstat监控所有活动的互联网连接,发现有时只与我的电脑和服务器建立了一个连接。所有文件(jpg,css,html,js)都通过此连接传输。但有时候我会看到两三个连接。这是否意味着http2可能会打开多个TCP连接,但它会尝试优化它们的重用?

我也等了几分钟再次检查netstat,看到只有一个TCP连接处于打开状态(所有其他连接都已关闭)。我关闭了浏览器,刷新了netstat并且TCP-Connection消失了。但这不应该是可能的,对吧?连接/套接字仍应存在,但现在处于TIME_WAITFIN_WAITCLOSED状态。或者http2是否允许/添加极快的套接字关闭机制?

1 个答案:

答案 0 :(得分:0)

根据https://http2.github.io/http2-spec/

任一对等方都可以关闭TCP连接。 END_STREAM标志 DATA帧上的数据被视为等同于TCP FIN位。一种 客户端应发送设置了END_STREAM标志的DATA帧 在收到带有END_STREAM标志的帧之后。一个代理 收到设置了END_STREAM标志的DATA帧,发送附件 在最后一个TCP段上设置FIN位的数据。一个代理 接收到带有FIN位置1的TCP段发送带有 END_STREAM标志集。请注意,最后的TCP段或DATA帧 可能是空的。

另请参阅5.1 Stream States。因此,基本上不需要TCP TIME_WAIT状态,因为可以在更高的OSI级别确保流的结束。