在TCP/IP协议中,TCP是提供可靠连接的协议,建立连接的过程采用了三次握手:
第一次握手:
客户端向服务器发送SYN包(SYN = 1,seq = j),并进入SYN_SEND状态,等待服务器确认;
SYN:同步序列编号(Synchronize Sequence Number)
第二次握手:
服务器收到客户端所发送的SYN包(SYN = 1,seq = j)后,返回一个ACK包(ACK = 1,ack = j+1)表示确认收到,同时发送SYN包(SYN = 1,seq =k)给客户端,即向客户端发送SYN + ACK包,此时服务器进入SYN_RECIEVE状态;
ACK:确认字符(ACKnowledgement)
第三次握手:
客户端收到服务端发送的SYN+ACK包(SYN = 1,seq =k--ACK = 1,ack = j+1)后,验证ack是否等于(j+1)向服务器发送ACK包(ACK = 1,ack = k+1)进行确认,服务器收到后验证ack是否等于(k+1)后,服务器和客户端进入ESTABLISHED状态,完成握手。
由于TCP连接是全双工形式的,一方断开连接后,另一个方向仍能发送数据,因此TCP连接的断开需要四次挥手来确认断开:
第一次挥手:
客户端向服务器发送FIN包(Fin = 1, seq = m)(m为最后一次发送数据的序列号+1),用来关闭客户端->服务器方向上的连接,此时客户端进入FIN_WAIT1 状态;
第二次挥手:
服务器收到客户端所发送的FIN包(Fin = 1, seq = m)后,向客户端发送ACK包(ACK = 1,ack = m+1),此时服务器进入CLOSE_WAIT状态,而客户端收到服务器发送的ACK包后验证序号是否为(m+1),进入FIN_WAIT2状态;
第三次挥手:
当服务器->客户端方向的数据发送完之后,服务器向客户端发送FIN包(Fin = 1,seq = n),进入LAST_ACK状态,等待客户端发送的ACK包;
第四次挥手:
客户端收到服务器发送的FIN包(Fin = 1,seq = n)后,向服务器发送ACK包(ACK = 1,ack = n+1)进行确认,进入TIME_WAIT状态。服务器收到客户端发送的ACK包后验证ack是否为n+1,确认后进入CLOSE状态,而客户端处于TIME_WAIT状态时开始计时,2*MSL(报文最长生存时间)后,进入CLOSE状态,至此,四次挥手结束,TCP连接断开。
客户端等待2MSL的原因:
MSL指报文最大生存时间,超过这个时间后报文将被丢弃,等待2MSL时间的原因是防止最后发送的ACK包没有被对方收到确认,此时对方检测超时后将会重新发送第三次挥手的FIN包,客户端收到后将重新发送ACK包,并重置计时器,直到2MSL后确认对方已收到, 关闭连接。
本文整理自:
https://blog.csdn.net/younglao/article/details/79453777
https://blog.csdn.net/yeweilei/article/details/79279963
另附TCP三次握手四次挥手详解:https://blog.csdn.net/qzcsu/article/details/72861891