TCP四次挥手
"挥手"是终止连接,TCP四次挥手的流程图如下
1,第一次挥手:client发送一个FIN,用来关闭client到server的数据传送,client进入FIN_WAIT_1的状态
2,第二次挥手:server收到FIN后,发送一个ACK给client,确认序号为收到序号+1(与SYN相同,一个FIN占用一个序号),server进入CLOSE_WAIT状态
3,第三次挥手:server发送一个FIN,用来关闭server到client的数据传送,server进入LAST_ACK状态
4,第四次挥手:client收到FIN后,client进入TIME_WAIT状态,接着发送一个ACK给server,确认序号为收到序号+1,server进入CLOSED状态,完成四次挥手
为什么会有TIME_WAIT状态?
1,第一是为了保证最后一个的一个ACK报文能到达server。这个ACK报文有可能丢失,因而使得处在LAST_ACK状态得不到对已发送的FIN+ACK报文的确认,server会超时重传这个FIN+ACK ,而A就能在这TIME_WAIT时间(2MSL)里收到这个重传的报文,client就可以重传一次确认,如果没有这个TIME_WAIT, 那server重传的FIN_ACK,可client早就走了,自然不会再重发确认,这样server就无法按照正常步骤进入CLOSE状态。
2,第二是防止“已失效的报文连接请求”,client在TIME_WAIT中,经过这2MSL的时间,就可以使本链接持续的时间内产生的所有连接消失,这样就可以使下一个新的连接中不会出现这样旧的连接请求报文段。
为什么需要四次挥手才能断开连接?
因为全双工,发送方和接收方都需要FIN报文和ACK报文
服务器出现大量CLOSE_WAIT状态的原因?
对方关闭连接,我方忙于读或写,没有及时关闭连接
1,检查代码,特别是释放资源的代码
netstat -n | awk '^tcp/{++S[$NF]}END{for(a in S) print a,S[a]}'
查看服务器连接状态: