- 第一次握手:
客户端将TCP报文标志位SYN置为1,随机产生一个序号值seq=J,保存在TCP首部的序列号(Sequence Number)字段里,指明客户端打算连接的服务器的端口,并将该数据包发送给服务器端,发送完毕后,客户端进入SYN_SENT
状态,等待服务器端确认。 - 第二次握手:
服务器端收到数据包后由标志位SYN=1知道客户端请求建立连接,服务器端将TCP报文标志位SYN和ACK都置为1,ack=J+1,随机产生一个序号值seq=K,并将该数据包发送给客户端以确认连接请求,服务器端进入SYN_RCVD
状态。 - 第三次握手:
客户端收到确认后,检查ack是否为J+1,ACK是否为1,如果正确则将标志位ACK置为1,ack=K+1,并将该数据包发送给服务器端,服务器端检查ack是否为K+1,ACK是否为1,如果正确则连接建立成功,客户端和服务器端进入ESTABLISHED
状态,完成三次握手,随后客户端与 -
1.第一次断开
-
(注意,无论是作为客户端还是服务端,两者都能够主动去断开TCP连接)
这里我们假设为客户端要断开TCP连接。
首先,客户端会着服务器发送中断连接请求FIN(即完,终结的意思, 用来释放一个连接。 当 FIN = 1 时,表明此报文段的发送方的数据已经发送完毕,并要求释放连接。)报文。这是第一次挥手。
2.第二次断开
服务器在收到FIN报文后,这个时候因为你们原先建立着TCP传输协议,那么这个时候就有可能还有数据还在传输当中,此时服务器就会发一个ACK回应报文给客户端,告诉对方:我收到了你的请求,但是我还没准备好,请你等一等。这个时候客户端就进入了请求等待状态(FIN_WAIT),等待服务器的下一步消息。
3.第三次断开
当服务器确认没有数据在传输了,这个时候服务器就会向客户端发送关闭连接请求报文(FIN),来告诉对方:我已经准备好关闭连接了。
4.第四次断开
当客户端收到了来自服务端的FIN报文,这个时候他知道已经可以断开连接了,但是他还是不放心,担心服务端不去关闭连接,这个时候他就会再次发送ACK回应报文,去确认服务端是否关闭了连接(这个时候客户端进入TIME_WAIT状态,如果服务器没有收到ACK报文则可以重传)
服务端在接收到ACK后断开连接,而客户端则会在等待2MSL后,如果仍旧没有收到消息,则表明服务器已经关闭了连接,自己也可以关闭连接了。
至此,TCP连就关闭了。
三次握手和四次断开
最新推荐文章于 2024-08-09 11:03:09 发布