连接建立失败并不仅仅包含无响应问题,还有一种常见的情况,即RST(Reset)包的发送。RST包是TCP协议中用来进行“连接重置”的数据包,本文将围绕RST包进行详细展开讨论。
服务器端口未开放:服务器在该端口未运行网络服务,或服务器上客户所请求的服务失效,则服务器会通过RST拒绝新连接。
服务器TCP连接数达到极限:如果服务器设置了tcp_abort_on_overflow=1,那么服务器在队列满时会发送RST包拒绝连接。
Time_Wait状态:如果客户端使用的当前socket在上一个连接刚刚结束,且服务器当前socket处于time_wait状态,则此时使用该socket的新连接请求会被服务器拒绝,返回RST包。
SYN包格式错误:客户端发送的SYN包携带了其它未经允许的标记(例如FIN、URG或其他标记),则服务器会拒绝连接并直接返回RST
防火墙策略不允许:如果客户端IP被禁止连接,则会话中会出现RST包,此种情况在后文中具体讨论。
重传次数超限:TCP具有重传机制,当TCP尝试多次重传而无法收到对方的确认(或对方发来的确认无法被接收处理,例如序列号错误、校验和错误等种种字段错误)后,重传的一方将会认为连接出现错误,停止重传并发送RST包重置连接。如图5所示。
连接长时间无数据交互:当客户端和服务器之间长时间(例如120秒)无数据交互时,其中一方可能认为会话超时,会向发送RST包重置连接。如图6所示。在客户端和服务器中间流量经过负载均衡或防火墙的场景,RST包也可能由负载或防火墙发出。