如何构造connection reset错误

构造connection reset错误

connection reset错误由RST信号引发,在开发环境上要构造client端的RST异常关闭,目前找到2种方法:

1、强杀server端进程,这时server端底层的TCP协议栈会发RST信号给client。可以装一个wireshark观察到此情况。

2、设置server端监听socket的SO_LINGER选项为true和0(这个选项默认是false),强制server端关闭连接时不发FIN而是发RST信号。

这时,一般会出现错误:

java.net.SocketException: Connection reset by peer: socket write error

构造Software caused connection abort 错误

客户端使用apache连接池,禁掉重试选项,同时设置validateAfterInactivity=0;服务端使用fastapi,设置timeout_keep_alive=10s,这样发送第一个请求10s后,server就会发送FIN信号给client。在11s的时候,发送第二个请求,就会报错:

java.net.SocketException: Software caused connection abort: recv failed

注意,发送第二个请求本身不会出错,只是在接收其响应的时候报错。

如果我们想构造socket write error,那么就不要在第一个请求发送后11s发送第二个请求,而是等10+120=130s,再发送第二个请求。此时,server端会因为得不到client端的FIN信号超时(超时时长为120s),强制发送RST关闭整个连接。这时再发送第二个请求,就会报错:

java.net.SocketException: Software caused connection abort: socket write error

因为整个连接被重置,所以发送的时候就会报错socket write error。

connection abort和connection reset的区别

很明显,区别就在于server端有没有发送FIN信号。若server端发送了FIN,之后client再在该连接上有所动作,都会报connection abort错。若server端未发送FIN,而是直接发送RST信号,之后client端的任何动作就会报connection reset错。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值