我在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。
这个 pcap 显示服务器上的异常终止。
pcap
您应该查看服务器日志以了解发生这种情况的更多详细信息。
一个可能的原因是服务器错误。
HEADERS GOAWAY 框架,而不仅仅是关闭连接。
HEADERS
GOAWAY
这个 RST at数据包17是正常的,因为客户端发送了一个 标题 在处理数据之前,在数据包16处的帧 FIN RST公司 表明发送的数据没有到达用户代码层。
RST
标题
FIN
RST公司
服务器日志(可能在调试级别)应该告诉您更多关于发生了什么。