TCP协议中三次握手和四次挥手整理

在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

猜你喜欢

转载自blog.csdn.net/noob_Cliam/article/details/84590886