三次握手
第一次握手:客户端先开始给服务器发送一个报文,这个报文带有序列号和标志位SYN。序列号是系统随机分配,比如设为x,则seq = x,SYN置为1:SYN = 1。这个报文不包含应用层数据,之后客户端处于SYN-SENT状态。
第二次握手:服务端收到客户端的请求报文后,会做出应答。给客户端发送确认报文,报文带有确认应答号ack = x+1,应答标志位ACK = 1,服务端自己的序列号seq = y,SYN = 1。该报文不包含应用层的数据,之后服务端进入SYN-RCVD状态。
第三次握手:客户端收到服务端的应答,也做出应答,则给服务端发送带有ACK = 1、 seq = x+1、ack = y+1 的报文,这个报文可以携带数据,之后就可以进行数据传输了。
四次挥手
第一次挥手:客户端想断开连接,给服务端发送一个带有FIN=1标志位
和经过递增后的序列号
seq = u的报文,然后客户端进入FIN_WAIT_1状态。
第二次握手:服务端接收到后,会应答一个带ACK = 1、seq = v、ack = u+1的报文。服务端进入FIN_WAIT状态,客户端收到应答后进入FIN_WAIT_2状态
第三次握手:等服务器准备好,已经把要传的数据都传完了,给客户端发送一个带FIN = 1、ACK = 1、seq = w、ack = u+1断开请求报文。
第四次握手:客户端收到服务端的FIN报文后,回一个ACK应答报文,之后进入TIME_WAIT状态。服务器收到了ACK应答报文后,就进入了CLOSED状态,至此服务器已经完成连接断开。客户端再经过2MSL一段时间后,自动进入CLOSED状态,至此客户端也完成连接的关闭。
TCP连接的断开为什么需要四次挥手
关闭连接时,客户端向服务器端发送FIN报文,只是告诉服务端不再给你发数据了,但是还可接收数据。
当服务端接收到FIN报文断开请求时,会先回一个ACK应答报文,告诉客户端我知道了,但是我可能还有数据没传完,等我一下。当数据传完之后再发送FIN报文给客户端说OK了,可以断开了。在接到客户端回应时服务端就断开结束了。
从此可知,服务端往往需要等待数据的发送和处理完成才断开连接,所以服务端的ACK和FIN一般会分开发送,所以比三次握手多一次。