构造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错。