proxyee icon indicating copy to clipboard operation
proxyee copied to clipboard

连接建立一段时间后,会稳定出现HTTP2超时异常

Open Cricin opened this issue 2 years ago • 3 comments

大佬你好。我的使用场景是不开启ssl解码,直接connect转发。 Proxyee版本是1.7.4,客户端是OkHttp,版本3.12.0。 连接建立之后可以正常访问。但是大概20到30秒之后继续请求,就会稳定出现超时异常。 堆栈信息是这样的

java.net.SocketTimeoutException: timeout
	at okhttp3.internal.http2.Http2Stream$StreamTimeout.newTimeoutException(Http2Stream.java:656)
	at okhttp3.internal.http2.Http2Stream$StreamTimeout.exitAndThrowIfTimedOut(Http2Stream.java:664)
	at okhttp3.internal.http2.Http2Stream.takeHeaders(Http2Stream.java:153)
	at okhttp3.internal.http2.Http2Codec.readResponseHeaders(Http2Codec.java:131)
	at okhttp3.internal.http.CallServerInterceptor.intercept(CallServerInterceptor.java:88)
	at okhttp3.internal.http.RealInterceptorChain.proceed(RealInterceptorChain.java:147)
	at okhttp3.internal.connection.ConnectInterceptor.intercept(ConnectInterceptor.java:45)
	at okhttp3.internal.http.RealInterceptorChain.proceed(RealInterceptorChain.java:147)
	at okhttp3.internal.http.RealInterceptorChain.proceed(RealInterceptorChain.java:121)
	at okhttp3.internal.cache.CacheInterceptor.intercept(CacheInterceptor.java:93)
	at okhttp3.internal.http.RealInterceptorChain.proceed(RealInterceptorChain.java:147)
	at okhttp3.internal.http.RealInterceptorChain.proceed(RealInterceptorChain.java:121)
	at okhttp3.internal.http.BridgeInterceptor.intercept(BridgeInterceptor.java:93)
	at okhttp3.internal.http.RealInterceptorChain.proceed(RealInterceptorChain.java:147)
	at okhttp3.internal.http.RetryAndFollowUpInterceptor.intercept(RetryAndFollowUpInterceptor.java:126)
	at okhttp3.internal.http.RealInterceptorChain.proceed(RealInterceptorChain.java:147)
	at okhttp3.internal.http.RealInterceptorChain.proceed(RealInterceptorChain.java:121)
	at okhttp3.internal.http.RealInterceptorChain.proceed(RealInterceptorChain.java:147)
	at okhttp3.internal.http.RealInterceptorChain.proceed(RealInterceptorChain.java:121)
	at okhttp3.RealCall.getResponseWithInterceptorChain(RealCall.java:254)
	at okhttp3.RealCall.execute(RealCall.java:92)

基本是稳定复现,修改超时大小好像也没用,貌似是连接挂掉了?直连的话是不会出现这问题的。 WebSocket我也在用,是没有问题的,连几个小时都可以正常工作。 对了,强制OkHttp使用HTTP1.1貌似可以解决,是不是Proxyee对HTTP2有什么特殊限制的。

另外感谢大佬做的这个库。真的很好用!

Cricin avatar Jun 08 '23 21:06 Cricin

没做啥限制,我看看能不能复现下吧,是一直有在请求吗

monkeyWie avatar Jun 09 '23 15:06 monkeyWie

好像是okhttp只要复用连接就会稳定出这个问题,http1.1也会有,如果不指定connection: closed的话。我的复现方法是一秒请求一次百度首页(http1.1 keeplive), 大概30秒之后就会稳定出现超时,后续请求okhttp又会自动创建新的连接,这时候又可以了,然后就开始循环这个过程。但是websocket完全没这问题,就很奇怪。

Cricin avatar Jun 17 '23 14:06 Cricin

应该是netty http客户端默认的keepalive时间比你的小导致的,你把okhttp的时间调小点再试试呢

monkeyWie avatar Jun 19 '23 01:06 monkeyWie