在使用HttpClient调用后台resetful服务时,Connection reset是一个比较常见的问题。

导致“Connection reset”的原因是服务器端因为某种原因关闭了Connection,而客户端依然在读写数据,此时服务器会返回复位标志“RST”,然后此时客户端就会提示“java.net.SocketException: Connection reset”。

专栏
Spring Cloud Alibaba微服务实战
作者:软件架构
29.8币
59人已购
查看

服务器关闭了Connection为什么会返回“RST”而不是返回“FIN”标志?

原因在于Socket.close()方法的语义和TCP的“FIN”标志语义不一样:发送TCP的“FIN”标志表示我不再发送数据了,而Socket.close()表示我不再发送也不接受数据了。

问题就出在“我不接受数据” 上,如果此时客户端还往服务器发送数据,服务器内核接收到数据,但是发现此时Socket已经close了,则会返回“RST”标志给客户端。当然,此时客户端就会提示:“Connection reset”。

另外还有一种比较常见的错误“Connection reset by peer”,该错误和“Connection reset”是有区别的:

* 服务器返回了“RST”时,如果此时客户端正在从Socket套接字的输出流中读数据则会提示Connection reset”;

* 服务器返回了“RST”时,如果此时客户端正在往Socket套接字的输入流中写数据则会提示“Connection reset by peer”。

专栏
SkyWalking分布式链路追踪和监控
作者:软件架构
18.8币
71人已购
查看

声明:本站为非盈利性赞助网站,本站所有软件来自互联网,版权属原著所有,如有需要请购买正版。如有侵权,敬请来信联系我们,我们立即删除。