“Socket hang up” 是一个常见的网络错误,第一次是在项目的限流测试中遇到这个问题,hang up 有挂断、挂起之意,通常表示在客户端和服务端建立连接或者数据传输过程中,连接被意外地关闭了。
什么原因
导致这个问题的原因有很多:
- 服务端关闭连接: 服务器可能因为各种原因决定关闭连接,比如服务器错误、资源耗尽、配置的超时时间已到等
- 客户端关闭连接:客户端可能因为完成请求、检测到错误或用户中断操作而关闭连接
- 网络问题:网络不稳定或中断可能导致连接被异常关闭
- 超时:如果网络操作耗时过长,超过了设定的超时时间,系统可能会关闭socket
- 请求错误:请求的头部信息、参数、方法等不正确也会导致连接异常关闭
可以通过检查网络连接、查看日志、检查客户端和服务器的配置(超时时间等)、审查网络连接的代码等方面定位错误。
ECONNRESET VS ETIMEDOUT
经过排查,与"Socket hang up"同步出现的报错信息还有"ECONNRESET"和"ETIMEDOUT",两者都是网络错误代码且都与请求超时有关,但需要区分一下两者的区别。
ECONNRESET
“ECONNRESET"代表"Connection reset by peer”,即在TCP/IP网络通信中,连接被对等方(通常是服务器)重置。
常见原因:
- 服务器内部错误或资源不足,无法继续处理请求
- 服务器崩溃或重启
- 服务器处理超时,没有数据传输
- TCP连接中的一方发送了不符合协议的数据包
…
Server处理超时或kill,Client没有得到响应,认为当前socket已结束
ETIMEDOUT
“ETIMEDOUT"代表"Connection timed out”,即在TCP/IP网络通信中,连接尝试因超时而失败。
常见原因:
- 客户端尝试连接超时
- 客户端传输数据超时
- 客户端或服务端的网络超时设置过短
…
Client与Server建立连接超时
总结:当网络环境、请求信息无误、设备资源充足时,产生问题的主要原因即超时时间设置过短。
由于是在接口的限流与超时测试中遇到这个问题,所以很容易能够定位到问题产生的原因,写下这篇文章做一个问题记录,便于读者遇到相同问题时明确排查方向。