代码之家  ›  专栏  ›  技术社区  ›  user3675334

HTTP2服务器发送FIN/ACK,然后发送RST,而不会产生巨大流量

  •  0
  • user3675334  · 技术社区  · 7 年前

    我在HTTP2上使用Jersey。当流量稍高时,会引发异常。我得到了pcap发现服务器发送FIN/ACK而没有接收FIN。我不确定这是一个单一的FIN关闭连接从服务器端。或单个FIN组合ACK到以前的数据包。看起来是后者,因为客户没有发送FIN。所以问题是为什么服务器只在较小的流量下发送FIN。我发现rece\u q和send\u q非常低。CPU使用率不高。我已经调整了一些TCP参数,结果是一样的。这种行为不稳定,有时正常,有时不正常。当我添加更多请求(使用相同的TPS)时,则不正常。看起来服务器完成了连接,但不知道确切原因。它与HTTP2有关吗?我们有什么地方可以看到确切的原因吗?

    pcap snapshot


    更新2017-07-30

    Sun Jul 30, 2017 8:31:35.591 PM org.glassfish.grizzly.http2.Http2FrameCodec parse
    FINE: Rx [2]: connection=TCPNIOConnection{localSocketAddress={localhost/127.0.0.1:80}, peerSocketAddress={/127.0.0.1:57802}}, frame=DataFrame {streamId=277, type=0, flags=[none], length=42, data=BuffersBuffer (154351355) [pos=0 lim=42 cap=42 bufferSize=1 buffers=[HeapBuffer (165674143) [pos=0 lim=42 cap=8391], null, null, null]]}
    Sun Jul 30, 2017 8:31:35.673 PM org.glassfish.grizzly.http2.Http2BaseFilter processFrames
    FINE: Http2ConnectionException occurred on connection=TCPNIOConnection{localSocketAddress={localhost/127.0.0.1:80}, peerSocketAddress={/127.0.0.1:57802}} during Http2Frame processing
    Sun Jul 30, 2017 8:31:35.684 PM org.glassfish.grizzly.http2.Http2FrameCodec serializeAndRecycle
    FINE: Tx: connection=TCPNIOConnection{localSocketAddress={localhost/127.0.0.1:80}, peerSocketAddress={/127.0.0.1:57802}}, frame=GoAwayFrame {streamId=0, type=7, flags=[none], length=64{lastStreamId=199, errorCode=REFUSED_STREAM}

    pcap快照中的流277

    pcap contains stream 277 from No 270,271 and 272

    269数据包中有一个设置数据包。在运输途中发送设置是否正常?在269之后,有三个数据包270271和272正在使用steam 277。

    奇怪的是,大约8:31:35.684我没有找到GOWAY包。但仅在8:31:36.035 RST/ACK中发送。调试日志如下:

    Sun Jul 30, 2017 8:31:36.020 PM org.glassfish.grizzly.http2.Http2FrameCodec parse
    FINE: Rx [2]: connection=TCPNIOConnection{localSocketAddress={localhost/127.0.0.1:80}, peerSocketAddress={/127.0.0.1:57802}}, frame=DataFrame {streamId=465, type=0, flags=[END_STREAM], length=0, data=ByteBufferWrapper (1101850112) [visible=[java.nio.HeapByteBuffer[pos=0 lim=0 cap=0]]]}
    Sun Jul 30, 2017 8:31:36.023 PM org.glassfish.grizzly.http2.Http2BaseFilter processDataFrame
    FINE: Data frame received for non-existent stream: connection=TCPNIOConnection{localSocketAddress={localhost/127.0.0.1:80}, peerSocketAddress={/127.0.0.1:57802}}, frame=DataFrame {streamId=277, type=0, flags=[END_STREAM], length=0, data=ByteBufferWrapper (1101850112) [visible=[java.nio.HeapByteBuffer[pos=0 lim=0 cap=0]]]}, stream=277
    Sun Jul 30, 2017 8:31:36.024 PM org.glassfish.grizzly.http2.Http2BaseFilter processFrames
    FINE: Http2StreamException occurred on connection=TCPNIOConnection{localSocketAddress={localhost/127.0.0.1:80}, peerSocketAddress={/127.0.0.1:57802}} during Http2Frame processing
    Sun Jul 30, 2017 8:31:36.025 PM org.glassfish.grizzly.http2.Http2BaseFilter processFrames
    FINE: Http2ConnectionException occurred on connection=TCPNIOConnection{localSocketAddress={localhost/127.0.0.1:80}, peerSocketAddress={/127.0.0.1:57802}} during Http2Frame processing

    顺便说一句,这次没有FIN/ACK。

    1 回复  |  直到 7 年前
        1
  •  0
  •   sbordet    7 年前

    这个 pcap 显示服务器上的异常终止。

    您应该查看服务器日志以了解发生这种情况的更多详细信息。

    一个可能的原因是服务器错误。

    HEADERS GOAWAY 框架,而不仅仅是关闭连接。

    这个 RST at数据包17是正常的,因为客户端发送了一个 标题 在处理数据之前,在数据包16处的帧 FIN RST公司 表明发送的数据没有到达用户代码层。

    服务器日志(可能在调试级别)应该告诉您更多关于发生了什么。