远程主机强迫关闭了一个现有的连接

本文分析了一起服务端报远程主机强迫关闭现有连接的问题,通过Wireshark抓包对比发现客户端Content-Length设置错误,最终提供了三种解决方案。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

问题现象
服务端报远程主机强迫关闭了一个现有的连接,抓包发现,返回给客户端RST
问题分析,从抓包看是服务端返回给客户端RST,是服务端主动关闭了连接,但是服务端实际上是报错,关闭了连接。

java.io.IOException: 远程主机强迫关闭了一个现有的连接。
	at sun.nio.ch.SocketDispatcher.read0(Native Method) ~[?:1.8.0_222]
	at sun.nio.ch.SocketDispatcher.read(SocketDispatcher.java:43) ~[?:1.8.0_222]
	at sun.nio.ch.IOUtil.readIntoNativeBuffer(IOUtil.java:223) ~[?:1.8.0_222]
	at sun.nio.ch.IOUtil.read(IOUtil.java:192) ~[?:1.8.0_222]
	at sun.nio.ch.SocketChannelImpl.read(SocketChannelImpl.java:380) ~[?:1.8.0_222]
	at io.netty.buffer.PooledByteBuf.setBytes(PooledByteBuf.java:253) ~[netty-all-4.1.63.Final.jar:4.1.63.Final]
	at io.netty.buffer.AbstractByteBuf.writeBytes(AbstractByteBuf.java:1132) ~[netty-all-4.1.63.Final.jar:4.1.63.Final]
	at io.netty.channel.socket.nio.NioSocketChannel.doReadBytes(NioSocketChannel.java:350) ~[netty-all-4.1.63.Final.jar:4.1.63.Final]
	at io.netty.channel.nio.AbstractNioByteChannel$NioByteUnsafe.read(AbstractNioByteChannel.java:151) [netty-all-4.1.63.Final.jar:4.1.63.Final]
	at io.netty.channel.nio.NioEventLoop.processSelectedKey(NioEventLoop.java:719) [netty-all-4.1.63.Final.jar:4.1.63.Final]
	at io.netty.channel.nio.NioEventLoop.processSelectedKeysOptimized(NioEventLoop.java:655) [netty-all-4.1.63.Final.jar:4.1.63.Final]
	at io.netty.channel.nio.NioEventLoop.processSelectedKeys(NioEventLoop.java:581) [netty-all-4.1.63.Final.jar:4.1.63.Final]
	at io.netty.channel.nio.NioEventLoop.run(NioEventLoop.java:493) [netty-all-4.1.63.Final.jar:4.1.63.Final]
	at io.netty.util.concurrent.SingleThreadEventExecutor$4.run(SingleThreadEventExecutor.java:989) [netty-all-4.1.63.Final.jar:4.1.63.Final]
	at io.netty.util.internal.ThreadExecutorMap$2.run(ThreadExecutorMap.java:74) [netty-all-4.1.63.Final.jar:4.1.63.Final]
	at io.netty.util.concurrent.FastThreadLocalRunnable.run(FastThreadLocalRunnable.java:30) [netty-all-4.1.63.Final.jar:4.1.63.Final]
	at java.lang.Thread.run(Thread.java:748) [?:1.8.0_222]

从报错堆栈看,应该是服务端解析客户端发送的数据异常,所以关闭了连接,因此还是要从客户端发送的报文入手。
因为是https协议的连接,因此修改服务端使用的加密套件,获取服务使用的jks证书,导入wireshark解析出报文,发现客户端header、body都有。
由于通过postman发送的请求可以正常解析,因此通过比对postman发送的报文,发现区别主要是在Content-Length这个头上。
又因为指定了使用HTTP 1.1,并且指定了keep alive,因此服务端是根据content-length来解析的body的,错误的content-length导致了服务端解析失败。
解决办法:
1、可以修改content-length,使用正确的值
2、也可以使用短连接,这样就不用通过content-length来判断要读取的报文大小了
3、指定Transfer-Encoding头,来使content-length失效

评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值