问题场景
某日线上登录出现故障,排查日志发现HttpClient请求时随机分配到的端口被占用,导致第三方登录拉取信息时无法拉取成功,错误如下:
java.net.BindException: Address...CLOSE_WAIT状态不会自己消失,除非对应的应用进程死掉,不会消失就意味着一直占用服务器资源,端口总数又只有65535,因此这里的服务器作为连接的发起者就会造成大量端口被占用,一旦占用完就导致后面的请求都发不出去...,也就是一开始图上另一个项目发请求出现的Address already in use (Bind failed)错误....那么为什么HttpClient访问时端口会分配到CLOSE_WAIT对应的端口?...因为TCP是可靠的通信,在主动方回复ACK时如果由于网络问题该包发送失败,那么被动方就会进行FIN重传,此时重传会遇到两个场景:
主动方已关闭,旧的TCP连接已经消失,那么系统只能回复RST包.